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 checks.
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. |
|
|
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. |
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).
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.