Skip to main content
By the end of this page you will have run a reconciliation, seen it report a mismatch, and narrowed that mismatch down to the two rows responsible — all from your own machine. The walkthrough uses a self-contained dataset so you can follow it with no warehouse and no credentials. Point it at your own databases at the end is a two-line change.

Install the CLI

Run it with your working directory mounted, so it can read your suite file:
The image runs DuckDB, which is what the walkthrough below uses so it needs no warehouse. If a type: duckdb connection fails with a driver error, your image predates DuckDB support — pull :latest.
A public download channel for the binaries is on its way. Until it lands, the Docker image is the artifact available to everyone — get in touch if neither path works for you.
Check that it runs:

Sign in

Authentication is only needed once you want to save suites to your workspace or run them on our backend. A purely local comparison needs no credentials at all.
auth whoami prints the workspace your credential resolves to. Get into the habit of reading that line — it is the only thing that decides which workspace a command writes to.

Describe what to compare

A suite is a YAML file holding the connections and the comparisons. Save this as quickstart.yaml:
quickstart.yaml
That first line points your editor at the published JSON schema, which gives you completion and inline validation for every field. Keep it at the top of every suite you write.
The bisection block is tuned small here so the drill-down has something to do on a thousand rows. On real tables the defaults are the right starting point.

Validate before you run

This costs nothing and touches no database. Add --db to also connect, run every query through the database’s planner, and report table sizes, indexes and a suggested key column:
--db does not run the suite’s setup: SQL, so for this walkthrough it will report that app_orders does not exist. That is expected — the tables are created by setup when the comparison runs.

Compare

Two queries — one per side — and you know the datasets disagree. If they had agreed, this would be the entire run.
The command exits 1. For a comparison, a non-zero exit means “differences found”, which is a result rather than a failure. Exit codes has the full list.
--no-report keeps the run entirely local. Without it, a run reports its results to your workspace whenever it can find a credential, so they show up in the app alongside backend runs.

Locate the difference

Read that from the top. The whole dataset disagrees, so it is split into ten segments; eight of them match on the first comparison and are never looked at again. The two that differ get split again, and the run stops with two ten-row windows to inspect. Notice the shape of each finding. The segment around order 384 has one fewer row on the target — a missing row. The segment around order 617 has the same count but a different checksum — a value changed. You have not read a single row value yet.
Thirty-three queries to find two bad rows in a thousand. The saving grows with the table: the number of comparisons scales with the logarithm of the row count, not the row count. That is the whole point of the drill-down.

Get the rows

Every mismatch leaf comes with ready-to-run SQL for both sides:
Run those against the two databases and you are looking at the rows themselves. This is the point at which row values enter the picture — on your terms, in your SQL client, for ten rows rather than a million.
Redirect logs with 2>/dev/null, never 2>&1. Logs go to stderr and results to stdout; merging them makes -o json unparseable.

Point it at your own databases

Swap the connections: block for the real thing, drop the setup: block, and name your tables. Nothing else changes:
suite.yaml
Then run the same four commands. Two things to do before you trust the result:
  1. Keep the credentials out of the file. Move the connections: block to a git-ignored .connections.yaml — the CLI picks it up automatically. See keep credentials out of the suite.
  2. Run check-config --db. It confirms every connection and query, and warns if your key column is not indexed — which is the difference between a drill that takes seconds and one that takes minutes.

Next steps

Authoring suites

Datasets, column selection, key columns, and the validation loop in full.

Time windows and cutoffs

Comparing two live systems? Read this before you trust a mismatch.

Workspace suites

Save the suite, run it on our backend, put it on a schedule.

CLI reference

Every command, argument and flag, generated from the CLI itself.