GitHub
04/28/2026, 1:44 AMmeltano config list displays settings in the order determined by plugin definition and inheritance, with no logical grouping by importance. For plugins with many settings, this produces a flat wall of text where user-configured settings are scattered among untouched defaults.
Here is real output from meltano config list tap-postgres after configuring host, user, database, and `filter_schemas`:
$ meltano config list tap-postgres — full output (~40 settings)
batch_config.encoding.compression [env: TAP_POSTGRES_BATCH_CONFIG_ENCODING_COMPRESSION] current value: None (default)
Batch Compression Format: Compression format to use for batch files.
batch_config.encoding.format [env: TAP_POSTGRES_BATCH_CONFIG_ENCODING_FORMAT] current value: None (default)
Batch Encoding Format: Format to use for batch files.
batch_config.storage.prefix [env: TAP_POSTGRES_BATCH_CONFIG_STORAGE_PREFIX] current value: None (default)
Batch Storage Prefix: Prefix to use when writing batch files.
batch_config.storage.root [env: TAP_POSTGRES_BATCH_CONFIG_STORAGE_ROOT] current value: None (default)
Batch Storage Root: Root path to use when writing batch files.
database [env: TAP_POSTGRES_DATABASE] current value: 'mydb' (from `meltano.yml`)
Database: Database name. Note if sqlalchemy_url is set this will be ignored.
dates_as_string [env: TAP_POSTGRES_DATES_AS_STRING] current value: False (default)
Dates As String: Defaults to false, if true, date, and timestamp fields will be Strings.
default_replication_method [env: TAP_POSTGRES_DEFAULT_REPLICATION_METHOD] current value: 'FULL_TABLE' (default)
Default Replication Method: Replication method to use if there is not a catalog entry to override this choice.
faker_config.locale [env: TAP_POSTGRES_FAKER_CONFIG_LOCALE] current value: None (default)
faker_config.seed [env: TAP_POSTGRES_FAKER_CONFIG_SEED] current value: None (default)
filter_schemas [env: TAP_POSTGRES_FILTER_SCHEMAS] current value: ['public'] (from `meltano.yml`)
Filter Schemas: If an array of schema names is provided, the tap will only process the specified Postgres schemas.
flattening_enabled [env: TAP_POSTGRES_FLATTENING_ENABLED] current value: None (default)
flattening_max_depth [env: TAP_POSTGRES_FLATTENING_MAX_DEPTH] current value: None (default)
flattening_max_key_length [env: TAP_POSTGRES_FLATTENING_MAX_KEY_LENGTH] current value: None (default)
host [env: TAP_POSTGRES_HOST] current value: 'localhost' (from `meltano.yml`)
Host: Hostname for postgres instance. Note if sqlalchemy_url is set this will be ignored.
json_as_object [env: TAP_POSTGRES_JSON_AS_OBJECT] current value: False (default)
max_record_count [env: TAP_POSTGRES_MAX_RECORD_COUNT] current value: None (default)
password [env: TAP_POSTGRES_PASSWORD] current value: None (default)
Password: Password used to authenticate. Note if sqlalchemy_url is set this will be ignored.
port [env: TAP_POSTGRES_PORT] current value: 5432 (default)
Port: The port on which postgres is awaiting connection.
replication_slot_name [env: TAP_POSTGRES_REPLICATION_SLOT_NAME] current value: 'tappostgres' (default)
sqlalchemy_url [env: TAP_POSTGRES_SQLALCHEMY_URL] current value: None (default)
SQLAlchemy URL: Example postgresql://[username]:[password]@localhost:5432/[db_name]
ssh_tunnel.enable [env: TAP_POSTGRES_SSH_TUNNEL_ENABLE] current value: False (default)
ssh_tunnel.host [env: TAP_POSTGRES_SSH_TUNNEL_HOST] current value: None (default)
ssh_tunnel.port [env: TAP_POSTGRES_SSH_TUNNEL_PORT] current value: 22 (default)
ssh_tunnel.username [env: TAP_POSTGRES_SSH_TUNNEL_USERNAME] current value: None (default)
ssh_tunnel.private_key [env: TAP_POSTGRES_SSH_TUNNEL_PRIVATE_KEY] current value: None (default)
ssh_tunnel.private_key_password [env: TAP_POSTGRES_SSH_TUNNEL_PRIVATE_KEY_PASSWORD] current value: None (default)
ssl_certificate_authority [env: TAP_POSTGRES_SSL_CERTIFICATE_AUTHORITY] current value: '~/.postgresql/root.crl' (default)
ssl_client_certificate [env: TAP_POSTGRES_SSL_CLIENT_CERTIFICATE] current value: '~/.postgresql/postgresql.crt' (default)
ssl_client_certificate_enable [env: TAP_POSTGRES_SSL_CLIENT_CERTIFICATE_ENABLE] current value: False (default)
ssl_client_private_key [env: TAP_POSTGRES_SSL_CLIENT_PRIVATE_KEY] current value: (redacted) (default)
ssl_enable [env: TAP_POSTGRES_SSL_ENABLE] current value: False (default)
ssl_mode [env: TAP_POSTGRES_SSL_MODE] current value: 'verify-full' (default)
ssl_storage_directory [env: TAP_POSTGRES_SSL_STORAGE_DIRECTORY] current value: '.secrets' (default)
stream_map_config [env: TAP_POSTGRES_STREAM_MAP_CONFIG] current value: None (default)
stream_maps [env: TAP_POSTGRES_STREAM_MAPS] current value: None (default)
stream_options [env: TAP_POSTGRES_STREAM_OPTIONS] current value: None (default)
use_singer_decimal [env: TAP_POSTGRES_USE_SINGER_DECIMAL] current value: None (default)
user [env: TAP_POSTGRES_USER] current value: 'postgres' (from `meltano.yml`)
User: User name used to authenticate. Note if sqlalchemy_url is set this will be ignored.
That's ~40 settings. The 4 the user actually configured (database, filter_schemas, host, user) are scattered at positions 5, 15, 19, and 40 — buried among 36 untouched defaults. There is no existing flag or option to control sort order (--extras filters to extra settings only).
Settings could be sorted into logical groups with section headers:
1. Configured (alphabetical) — settings where the source is not DEFAULT, i.e. explicitly set via meltano.yml, .env, env vars, system database, or inherited
2. Optional (alphabetical) — everything else still at defaults
3. Custom/extras — already shown in their own section today, no change needed
For plugins that define settings_group_validation, a Required group could appear first, ahead of Configured.
All the data needed is already available in `list_settings()`: required status from the setting_groups dict, source from config_metadata["source"] (SettingValueStore enum), and custom/extra status from `setting_def.is_custom`/`is_extra`. Adding section headers is consistent with the existing pattern of headers like Custom: and Custom extras, plugin-specific options handled by Meltano: already printed by list_settings.
This is a non-breaking change — same information, just reordered. No new flags needed.
This issue stems from a discsussion with @edgarrmondragon in PR #9849:
(We really need to figure out the stories for sorting the settings in some meaningful way, and how to display a sensible subset by default, and this is a great UX improvement in that direction).meltano/meltano
GitHub
04/28/2026, 1:44 AM