Docs

Quickstart and file format

What you can use today: the local CLI and the file format. The API, the local MCP server and the web console are built but not live yet, and the hosted service is planned; see the status page. This page does not describe anything unbuilt as if it were live.

How do I run a pipeline locally?

The CLI is not published yet; in the prototype it is built from source. Create a pipeline, check it, run it:

terminal
waddle init orders-sync          # writes pipeline.toml and pipeline.sql
waddle validate orders-sync/pipeline.toml
waddle run orders-sync/pipeline.toml --state orders-sync/state

The state file stores the watermark between runs. It is written only after the sink succeeded and the checks passed.

How do secrets work?

Configs never contain secrets. A connector names an environment variable (dsn_env) and the runner reads it at start. A config with an inline password field is rejected.

environment
export SRC_DSN='host=db.example.com user=reader dbname=app'
export WADDLE_S3_ENDPOINT=<account>.r2.cloudflarestorage.com   # S3 or R2 sinks and sources
export WADDLE_S3_KEY_ID=...
export WADDLE_S3_SECRET=...

What goes in the pipeline file?

FieldMeaning
nameRequired. 1 to 64 characters of letters, digits, _ and -.
sqlRequired. Path to the SQL file, relative to the config. No absolute paths, no "..".
scheduleOptional. Five-field cron expression, used by the hosted service.
[source] kind = "file"url (https:// or s3://) and format (csv, json or parquet). Plain http and local paths are refused.
[source] kind = "postgres"dsn_env (the name of an environment variable holding the connection string) and table (name or schema.name).
[sink] kind = "file"url (https:// or s3://) and format.
[sink] kind = "postgres"dsn_env, table, mode (append, replace or upsert) and key (required for upsert).
[incremental]column (output column whose maximum becomes the next watermark) and initial (the value for the first run).
[[checks]]rule = not_null or unique (column), row_count (min, max) or reconcile (tolerance, default 0).

Unknown fields are errors. Table and column names must be plain SQL identifiers.

What are the rules for the SQL?

What do the checks do?

How do I test a pipeline without a source?

waddle test pipeline.toml --sample sample.csv runs the SQL and the checks over a small CSV file, which the SQL reads as src. No source, sink or secret is used, and the same lockdown applies.