YAML configuration
PipelineWise projects define global settings, targets, and taps in YAML.
import_config validates these files, performs discovery, and generates the
connector JSON and state layout. Generated files below ~/.pipelinewise are
runtime artifacts, not configuration source.
Project files
File |
Quantity |
Purpose |
|---|---|---|
|
One |
Global alerts, resync limit, switchover file, and backend database. |
|
One per destination |
Target identity and connection. |
|
One per source pipeline |
Source, target reference, tables, replication, and optional transforms. |
Run pipelinewise init --name <project> to generate templates. Templates can
include legacy connectors; check Connectors before using one.
Global configuration
alert_handlers:
slack:
token: "{{ env_var['SLACK_BOT_TOKEN'] }}"
channel: "#pipeline-alerts"
allowed_resync_max_size:
table_mb: 50000
switch_over_data_file: "switch_over_data.json"
backend_db:
host: "backend.example.com"
port: 5432
user: "pipelinewise"
password: "{{ env_var['BACKEND_PASSWORD'] }}"
dbname: "pipelinewise"
sslmode: "verify-full"
connect_timeout: 10
ddl_user: "pipelinewise_ddl"
ddl_password: "{{ env_var['BACKEND_DDL_PASSWORD'] }}"
Setting |
Required |
Default |
Effect |
|---|---|---|---|
|
No |
None |
Configures Slack or VictorOps failure delivery. See Alerts. |
|
No |
No limit |
Blocks oversized MariaDB/MySQL or PostgreSQL-to-Snowflake FullSync unless
|
|
No |
None |
Supplies state mapping used by |
|
For data-diff |
Disabled |
Enables persisted data-diff definitions, runs, and coverage. |
|
No |
|
Limits application-role connection attempts. The migration connection does not currently inherit this timeout. |
The backend is a control-plane database, not a replication target. Separate its service, database, runtime role, DDL role, credentials, and storage from every target. See Data-diff backend database.
Tap configuration
id: "orders"
name: "Orders PostgreSQL"
type: "tap-postgres"
owner: "data-platform@example.com"
db_conn:
host: "postgres.example.com"
port: 5432
user: "pipelinewise"
password: "{{ env_var['POSTGRES_PASSWORD'] }}"
dbname: "orders"
target: "snowflake"
batch_size_rows: 20000
stream_buffer_size: 0
add_metadata_columns: true
hard_delete: true
schemas:
- source_schema: "public"
target_schema: "repl_orders"
target_schema_select_permissions:
- "analytics_reader"
tables:
- table_name: "orders"
replication_method: "INCREMENTAL"
replication_key: "updated_at"
Setting |
Required |
Default |
Effect |
|---|---|---|---|
|
Yes |
— |
Identify the pipeline and source connector. |
|
Operationally required |
None |
Identifies the source-data owner. |
|
Yes |
— |
Connector-specific source connection. See Taps (Data Sources). |
|
Yes |
— |
Must match a target YAML |
|
No |
|
Target batch size; schema accepts 1,000–5,000,000. |
|
No |
|
|
|
No |
None |
Flushes a partial Snowflake batch after the limit. |
|
No |
|
Suppresses tap and data-diff alerts when |
|
No |
Global channel |
Adds a tap-specific Slack destination; must start with |
|
No |
See metadata guide |
Controls target metadata and delete handling. See Metadata columns and deletes. |
Setting |
Default |
Effect |
|---|---|---|
|
|
Controls Singer target flush threads. |
|
Generated as |
Currently ineffective: PipelineWise emits this name, but the PostgreSQL
and Snowflake targets read |
|
|
Flushes every buffered stream when one stream reaches its batch boundary. |
|
|
Rejects streams without a target merge key when enabled. |
|
None |
Supplies a target schema for taps without database-style mappings. |
|
None |
Applies default target read roles when supported. |
|
Tap-specific or |
Expands nested objects into columns. |
|
Omitted |
Selects |
|
None |
Managed-Iceberg version discriminator. Its only supported value is integer
|
|
|
Validates Singer records against their emitted schema before loading. |
|
|
Splits FastSync export archives for Snowflake staging. |
|
|
Sets the split archive chunk size. |
|
|
Limits the number of generated chunks. |
|
|
Retains Snowflake target load files in a separate S3 archive. |
|
None |
Selects the archive destination when load-file archiving is enabled. |
Important
Any tap whose Singer output is compatible with target-snowflake can
select managed Iceberg v3. FastSync FullSync and PartialSync for managed v3
remain limited to tap-mysql (MariaDB/MySQL) and tap-postgres. Every
explicit v3 route requires hard_delete: true; those two FastSync-capable
taps also require data_flattening_max_level: 0. Singer-only sources retain
their normal flattening setting, including Salesforce’s default level 10.
Native remains the default, and PipelineWise does not convert an existing
table when the requested format conflicts. Every managed Iceberg version
other than v3 is rejected before mutation. See Snowflake Iceberg tables.
Managed Iceberg selection is tap-level. Target YAML rejects these keys and
the removed iceberg_create setting. Remove iceberg_create and
configure each managed Iceberg tap before upgrading.
Warning
The effective automatic Singer flush cap is currently 16, not 4. To change
it, set max_parallelism inside the target’s db_conn. Do not rely on
tap-level parallelism_max until the naming mismatch is fixed.
Schemas and tables
schemas maps source schemas into target schemas. Every table needs a
table_name. Database tables also select a replication method:
Setting |
Required |
Behaviour |
|---|---|---|
|
Database tables |
|
|
For |
Increasing source column used as the bookmark. |
|
No |
Routes explicit FastSync through PartialSync. See Configured PartialSync. |
|
No |
Applies load-time field protection. See Load-time transformations. |
|
No |
Configures independent aggregate reconciliation. See Data-diff checks. |
Connector-specific schema or table mappings, such as s3_csv_mapping, are
documented on their connector page.
Target configuration
id: "snowflake"
name: "Analytics Snowflake"
type: "target-snowflake"
db_conn:
account: "<ACCOUNT>"
dbname: "<DATABASE>"
user: "<USER>"
private_key: "/run/secrets/snowflake-key.pem"
warehouse: "<WAREHOUSE>"
s3_bucket: "<BUCKET>"
s3_key_prefix: "pipelinewise/"
stage: "<SCHEMA>.<STAGE>"
file_format: "<SCHEMA>.<FILE_FORMAT>"
id, name, type, and db_conn are required. Connection fields are
target-specific; see Targets (Destinations). A Snowflake target can set the optional
positive integer iceberg_query_history_poll_timeout_seconds in db_conn.
It defaults to 900 seconds and bounds query-history recovery after an
ambiguous FastSync Iceberg publication response.
Secrets and validation
Inject environment values with Jinja:
password: "{{ env_var['POSTGRES_PASSWORD'] }}"
Ansible Vault values are also supported; see Encrypt configuration values.
After every change:
pipelinewise validate --dir <project>
pipelinewise import_config --dir <project>
validate checks YAML and references but not connectivity. import_config
discovers the source and replaces generated runtime configuration only after the
project passes validation.
Warning
import_config treats a missing tap or target YAML file as a deletion. It
removes that connector’s generated directory, including every state.json
bookmark; removing a target removes all of its taps. Removing a PostgreSQL
tap also drops its replication slot. Renaming an id has the same effect
as deleting the old connector and adding a new one. Stop the pipeline, back
up its generated state, and plan a full initial sync before removing or
renaming imported configuration.