For every star on GitHub, we'll donate $2 to clean up our waterways. Star us now!
This is an older, hidden page for Meltano UI. The UI is deprecated. Please see our troubleshooting page for more information.
Meltano is optimized for usage through the meltano CLI
and direct changes to the meltano.yml project file.
However, a web-based UI is also available for when you want to quickly check the status and most recent logs of your project’s scheduled pipelines, or if you want to give less technical team members or clients the option to configure their extractors, loaders, and pipelines themselves.
Various settings are available that let you configure the Meltano UI server, enable and disable features, and customize its appearance.
Basic functionality around managing and configuring plugins and monitoring pipelines is available, as is an experimental Analysis feature, but many (newer) features of the CLI do not yet have a UI equivalent.
Missing functionality and other improvements are being tracked in the “Pipeline management and monitoring UI” epic, and new issues and contributions from the community are more than welcome, but the team is not currently prioritizing improvements to the UI because of the heavy focus on the CLI.
Start the Meltano UI web server using meltano ui:
meltano ui
Unless configured otherwise, the UI will now be available at http://localhost:5000.
If you’d like to use Docker Compose to manage the Meltano UI application lifecycle,
you can add the appropriate docker-compose.yml file to your project by adding the
docker-compose file bundle:
# For these examples to work, ensure that
# Docker Compose has been installed
docker-compose --version
# Add Docker Compose files to your project
meltano add files files-docker-compose
# Start the `meltano-ui` service in the background
docker-compose up -d
Unless configured otherwise, the UI will now be available at http://localhost:5000.
For more details and instructions, refer to README contained in the file bundle.
To learn about deploying Meltano UI in production, refer to the “Meltano UI” section of the Deployment in Production guide.
These settings can be used to configure the Meltano UI server.
Meltano UI feature settings and customization settings have their own sections.
ui.bind_host #
MELTANO_UI_BIND_HOSTmeltano ui CLI option: --bind0.0.0.0The host to bind to.
Together with the ui.bind_port setting, this setting corresponds to
Gunicorn’s bind setting.
meltano config meltano set ui bind_host 127.0.0.1
export MELTANO_UI_BIND_HOST=127.0.0.1
meltano ui --bind=127.0.0.1
ui.bind_port #
MELTANO_UI_BIND_PORTmeltano ui CLI option: --bind-port5000The port to bind to.
Together with the ui.bind_host setting, this setting corresponds to
Gunicorn’s bind setting.
meltano config meltano set ui bind_port 80
export MELTANO_UI_BIND_PORT=80
meltano ui --bind-port=80
ui.server_name #
MELTANO_UI_SERVER_NAMEThe host and port Meltano UI is available at, e.g. <host>:<port>.
The port will usually match the ui.bind_port setting, and can be omitted when the default port for HTTP (80) or HTTPS (443) is used.
Unless the ui.session_cookie_domain setting is set, this setting will be used as the session cookie domain.
If the ui.notification setting is enabled, this setting will be used to generate external URLs in notification emails.
When set, Meltano UI will only respond to requests whose hostname (Host header) matches this setting.
If this is undesirable, you can set the ui.session_cookie_domain setting instead.
This may be the case when Meltano UI is situated behind a load balancer performing health checks without specifying a hostname.
If the ui.authentication setting is enabled,
meltano ui will print a
security warning if neither this setting or the ui.session_cookie_domain setting has been set.
This setting corresponds to Flask’s SERVER_NAME setting.
meltano config meltano set ui server_name meltano.example.com
export MELTANO_UI_SERVER_NAME=meltano.example.com
meltano ui setup <server_name> can be
used to generate secrets for the ui.secret_key and
ui.password_salt settings, that will be stored in a
your project’s .env file along with the specified server_name.
meltano ui setup meltano.example.com
ui.session_cookie_domain #
MELTANO_UI_SESSION_COOKIE_DOMAINThe domain match rule that the session cookie will be valid for.
If not set, the cookie will be valid for all subdomains of the configured ui.server_name.
If the ui.authentication setting is enabled,
meltano ui will print a
security warning if neither this setting or the ui.server_name setting has been set.
This setting corresponds to Flask’s SESSION_COOKIE_DOMAIN setting.
meltano config meltano set ui session_cookie_domain meltano.example.com
export MELTANO_UI_SESSION_COOKIE_DOMAIN=meltano.example.com
ui.session_cookie_secure #
MELTANO_UI_SESSION_COOKIE_SECUREfalseEnable the Secure flag on the session cookie, so that the client will only send it to the server in HTTPS requests.
The application must be served over HTTPS for this to make sense.
This setting corresponds to Flask’s SESSION_COOKIE_SECURE setting.
meltano config meltano set ui session_cookie_secure true
export MELTANO_UI_SESSION_COOKIE_SECURE=true
ui.secret_key #
MELTANO_UI_SECRET_KEYthisisnotapropersecretkeyA secret key that will be used for securely signing the session cookie.
If the ui.authentication setting is enabled,
meltano ui will print a
security warning if this setting has not been changed from the default.
This setting corresponds to Flask’s SECRET_KEY setting.
meltano config meltano set ui secret_key <randomly-generated-secret>
export MELTANO_UI_SECRET_KEY=<randomly-generated-secret>
meltano ui setup <server_name> can be
used to generate secrets for the this setting and ui.password_salt,
that will be stored in your project’s .env file
along with the specified ui.server_name.
meltano ui setup meltano.example.com
ui.password_salt #
MELTANO_UI_PASSWORD_SALTb4c124932584ad6e69f2774a0ae5c138The HMAC salt to use when hashing passwords.
If the ui.authentication setting is enabled,
meltano ui will print a
security warning if this setting has not been changed from the default.
This setting corresponds to Flask-Security’s SECURITY_PASSWORD_SALT setting.
meltano config meltano set ui password_salt <randomly-generated-secret>
export MELTANO_UI_PASSWORD_SALT=<randomly-generated-secret>
meltano ui setup <server_name> can be
used to generate secrets for the this setting and ui.secret_key,
that will be stored in your project’s .env file
along with the specified ui.server_name.
meltano ui setup meltano.example.com
ui.workers #
MELTANO_UI_WORKERS4The number of worker processes meltano ui will use to handle requests.
This setting corresponds to Gunicorn’s workers setting.
meltano config meltano set ui workers 1
export MELTANO_UI_WORKERS=1
ui.forwarded_allow_ips #
MELTANO_UI_FORWARDED_ALLOW_IPS127.0.0.1Comma-separated front-end (reverse) proxy IPs that are allowed to set secure headers to indicate HTTPS requests.
Set to * to disable checking of front-end IPs, which can be useful for setups where you don’t know in advance the IP address of front-end, but you still trust the environment.
This setting corresponds to Gunicorn’s forwarded_allow_ips setting.
meltano config meltano set ui forwarded_allow_ips "*"
export MELTANO_UI_FORWARDED_ALLOW_IPS="*"
These settings can be used to enable certain features of Meltano UI.
Meltano UI server settings and customization settings have their own sectionss
ui.readonly #
MELTANO_UI_READONLYfalseTo block all write actions in the Meltano UI, you can run it in in read-only mode.
If you’re enabling the ui.authentication setting and would
like to only use read-only mode for anonymous users, enable the ui.anonymous_readonly setting instead.
This setting differs from the project_readonly setting in two ways:
meltano config meltano set ui readonly true
export MELTANO_UI_READONLY=true
ui.authentication #
MELTANO_UI_AUTHENTICATIONfalseUse this setting to enable authentication and disallow anonymous usage of your Meltano instance.
Additionally, you will need to:
Ensure your configuration is secure by setting the ui.secret_key and ui.password_salt settings, as well as ui.server_name or ui.session_cookie_domain, manually or using meltano ui setup <server_name>.
Create at least one user using meltano user add.
meltano config meltano set ui authentication true
export MELTANO_UI_AUTHENTICATION=true
ui.anonymous_readonly #
MELTANO_UI_ANONYMOUS_READONLYfalseWhen the ui.authentication setting is enabled,
enabling this setting will allow anonymous users read-only access to Meltano UI.
Once a user is authenticated, write actions will be available again.
This setting is especially useful when setting up a publicly available demo instance of Meltano UI for anonymous users to interact with. These users will not be able to make any changes, but admins will once they sign in.
meltano config meltano set ui anonymous_readonly true
export MELTANO_UI_ANONYMOUS_READONLY=true
ui.notification #
MELTANO_UI_NOTIFICATIONfalseMeltano can send email notifications upon certain events.
Your outgoing mail server can be configured using the mail.* settings below.
To ease the development and testing, Meltano is preconfigured to use a local MailHog instance to trap all the outgoing emails.
Use the following docker command to start it:
docker run --rm -p 1025:1025 -p 8025:8025 --name mailhog mailhog/mailhog
All emails sent by Meltano should now be available at http://localhost:8025/
meltano config meltano set ui notification true
export MELTANO_UI_NOTIFICATION=true
These settings can be used to customize certain aspects of Meltano UI.
Meltano UI server settings and feature settings have their own sections.
ui.logo_url #
MELTANO_UI_LOGO_URLCustomize the logo used by Meltano UI in the navigation bar and on the sign-in page (when the ui.authentication setting is enabled).
meltano config meltano set ui logo_url https://meltano.com/meltano-logo-with-text.svg
export MELTANO_UI_LOGO_URL=https://meltano.com/meltano-logo-with-text.svg
Meltano uses Flask-Mail to send emails. Take a look at the documentation to properly configure your outgoing email server.
mail.server #
MELTANO_MAIL_SERVERlocalhostmeltano config meltano set mail server smtp.example.com
export MELTANO_MAIL_SERVER=smtp.example.com
mail.port #
MELTANO_MAIL_PORT1025meltano config meltano set mail port 25
export MELTANO_MAIL_PORT=25
mail.default_sender #
MELTANO_MAIL_DEFAULT_SENDER"Meltano" <bot@meltano.com>meltano config meltano set mail default_sender '"Example Meltano" <bot@meltano.example.com>'
export MELTANO_MAIL_DEFAULT_SENDER='"Example Meltano" <bot@meltano.example.com>'
mail.use_tls #
MELTANO_MAIL_USE_TLSfalsemeltano config meltano set mail use_tls true
export MELTANO_MAIL_USE_TLS=true
mail.username #
MELTANO_MAIL_USERNAMEmeltano config meltano set mail username meltano
export MELTANO_MAIL_USERNAME=meltano
mail.password #
MELTANO_MAIL_PASSWORDmeltano config meltano set mail password meltano
export MELTANO_MAIL_PASSWORD=meltano
mail.debug #
MELTANO_MAIL_DEBUGfalsemeltano config meltano set mail debug true
export MELTANO_MAIL_DEBUG=true
mail.sendgrid_unsubscribe_group_id #
If you are using the SendGrid SMTP API you may optionally set the SendGrid unsubscribe group ID.
MELTANO_MAIL_SENDGRID_UNSUBSCRIBE_GROUP_ID12751meltano config meltano set mail sendgrid_unsubscribe_group_id 42
export MELTANO_MAIL_SENDGRID_UNSUBSCRIBE_GROUP_ID=42
Meltano ships with an OAuth Service to handle the OAuth flow in the Extractors’ configuration.
To run this service, you **must** have a registered OAuth application on the [Authorization server](https://www.oauth.com/oauth2-servers/definitions/#the-authorization-server).
Most importantly, the Redirect URI must be set properly so that the OAuth flow can be completed.
This process is specific to each Provider.
The OAuth Service is bundled within Meltano, and is automatically started with meltano ui and mounted at /-/oauth for development purposes.
As it is a Flask application, it can also be run as a standalone using:
FLASK_ENV=production FLASK_APP=meltano.oauth python -m flask run --port 9999
oauth_service.url #
MELTANO_OAUTH_SERVICE_URLThe local OAuth service for development purposes is available at /-/oauth.
meltano config meltano set oauth_service url https://oauth.svc.meltanodata.com
export MELTANO_OAUTH_SERVICE_URL=https://oauth.svc.meltanodata.com
oauth_service.providers #
MELTANO_OAUTH_SERVICE_PROVIDERSallTo enable specific providers, use comma-separated oauth.provider names from discovery.yml. To enable all providers, use all.
meltano config meltano set oauth_service providers facebook,google_adwords
export MELTANO_OAUTH_SERVICE_PROVIDERS=facebook,google_adwords
oauth_service.facebook.client_id #
OAUTH_FACEBOOK_CLIENT_IDmeltano config meltano set oauth_service facebook client_id <facebook-client-id>
export OAUTH_FACEBOOK_CLIENT_ID=<facebook-client-id>
oauth_service.facebook.client_secret #
OAUTH_FACEBOOK_CLIENT_SECRETmeltano config meltano set oauth_service facebook client_secret <facebook-client-secret>
export OAUTH_FACEBOOK_CLIENT_SECRET=<facebook-client-secret>
oauth_service.google_adwords.client_id #
OAUTH_GOOGLE_ADWORDS_CLIENT_IDmeltano config meltano set oauth_service google_adwords client_id <google-adwords-client-id>
export OAUTH_GOOGLE_ADWORDS_CLIENT_ID=<google-adwords-client-id>
oauth_service.google_adwords.client_secret #
OAUTH_GOOGLE_ADWORDS_CLIENT_SECRETmeltano config meltano set oauth_service google_adwords client_secret <google-adwords-client-secret>
export OAUTH_GOOGLE_ADWORDS_CLIENT_SECRET=<google-adwords-client-secret>
These variables are specific to Flask-OAuthlib and work with OAuth authentication with GitLab.
These settings are used for single-sign-on using an external OAuth provider.
For more information on how to get these from your GitLab application, check out the integration docs from GitLab.
oauth.gitlab.client_id #
OAUTH_GITLAB_CLIENT_ID, alias: OAUTH_GITLAB_APPLICATION_IDmeltano config meltano set oauth gitlab client_id <gitlab-client-id>
export OAUTH_GITLAB_CLIENT_ID=<gitlab-client-id>
export OAUTH_GITLAB_APPLICATION_ID=<gitlab-client-id>
oauth.gitlab.client_secret #
OAUTH_GITLAB_CLIENT_SECRET, alias: OAUTH_GITLAB_SECRETmeltano config meltano set oauth gitlab client_secret <gitlab-client-secret>
export OAUTH_GITLAB_CLIENT_SECRET=<gitlab-client-secret>
export OAUTH_GITLAB_SECRET=<gitlab-client-secret>
ui #
meltano ui: Start the Meltano UI.start (default) #
Start the Meltano UI.
setup #
This command is only relevant for production-grade setup.
Generate secrets for the ui.secret_key
and ui.password_salt settings, that
will be stored in your project’s .env file along with the
specified value for the ui.server_name setting.
In production, you will likely want to move these settings to actual environment variables, since .env is in .gitignore by default.
Regenerating secrets will cause the following:
Use with caution!
The --bits flag can be used to specify the size of the secrets, default to 256.
# Format
meltano ui setup [--bits=256] <server_name>
meltano ui setup meltano.example.com
ui with Environments #
The ui command does not run relative to a Meltano Environment. The --environment flag and default_environment setting in your meltano.yml file will be ignored if set.
In the event you are contributing to Meltano UI and want to work with all of the frontend tooling (i.e., hot module reloading, etc.), you will need to run the following commands:
# Activate your poetry created virtual environment if needed.
# If you manage your virtualenv activation through other means you can omit this command.
poetry shell
# Create a new Meltano project
meltano init $PROJECT_DIRECTORY
# Change directory into your newly created project
cd $PROJECT_DIRECTORY
# Start the Meltano API and a production build of Meltano UI that you can ignore
meltano ui
# Open a new terminal tab and go to the directory you cloned meltano into
cd $WHEREVER_YOU_CLONED_MELTANO
# Install frontend infrastructure at the root directory
yarn setup
# Start local development environment
yarn serve
The development build of the Meltano UI will now be available at http://localhost:8080/.
A production build of the API will be available at http://localhost:5000/ to support the UI, but you will not need to interact with this directly. However, as mentioned in the API Development section above, users on MacOS may need to specify an alternate bind to port to prevent a port conflict with a MacOS system service also running on port 5000.
If you're developing for the _Embed_ app (embeddable iframe for reports) you can toggle MELTANO_EMBED:
# Develop for the embed app export MELTANO_EMBED=1 # Develop for the main app (this is the default) export MELTANO_EMBED=0 # Start local development environment yarn serve
If you need to change the URL of your development environment, you can do this by updating your project’s .env file with the following configuration:
# The URL where the web app will be located when working locally in development
# since it provides the redirect after authentication.
# Not require for production
export MELTANO_UI_URL = ""
The below level hierarchy defines the back to front depth sorting of UI elements. Use it as a mental model to inform your UI decisions.
Within each aforementioned depth level is an interactive color hierarchy that further organizes content while communicating an order of importance for interactive elements. This interactive color hierarchy subtly influences the user’s attention and nudges their focus.
$interactive-primary
$interactive-secondary
$interactive-navigation
After the primary, secondary, tertiary, or navigation decision is made, the button size decision is informed by:
is-small modifier if it is within a component that can have multiple instancesThere are three fundamental markup groups in the codebase. All three are technically VueJS single-file components but each have an intended use:
Here is a technical breakdown:
<router-view-layout> as root with only one child for the main view:
<div class="container view-body">
is-fluid class additionsrc/views directory<section> as root (naturally assumes a parent of <div class="container view-body">) with one type of child:
<div class="columns"> each with their needed <div class="column"> variationssrc/components/analyze/AnalyzeModels)src/components/analyze/ResultTable and src/components/generic/Dropdown)