Build a CSV recipe once, replay it every month

A recipe is an ordered, declarative list of steps saved as JSON. Every change creates a new revision you can undo or roll back, and imported recipes are checked against the new file before anything runs.

Example data — not saved

Showing synthetic sample data: CRM export clean-up. Open or drop your own file to replace it — files are read in your browser and never uploaded.

Source AUpdating…
Loading…

Arrow keys move; Enter or double-click edits a cell (recorded as a replayable “Cell edits” step). ∅ = missing, · = edge whitespace, ↵ = line break inside a value. Row labels show source:record provenance.

What is stored in a recipe

Each step stores its operation, its options and the internal IDs of the columns it uses, plus the input header it was written against. No code is stored and nothing in a recipe file is executed: unknown operations, unknown keys and newer schema versions are rejected on import.

When you import a recipe onto a new file, columns are mapped by ID and name. Renamed or missing columns are listed, and the steps that need them stop at preflight with a clear message until you choose a column. Source files used by Append or Join are never selected automatically.

The recipe shows a revision number. Editing a step, adding, reordering, disabling or deleting all create new revisions. Undo and redo walk through them, and History lets you roll back to an earlier revision as a new one, so nothing is erased.

Reproducibility

Steps are deterministic: the same input and recipe give the same output, including seeded sampling. The run report records each step’s operation version, row counts and findings without including row values, so it is safe to share.

Questions

Where are recipes saved?

In this browser’s IndexedDB together with your files, unless Private session is on. Export the recipe JSON to keep or share it.

Can I parameterize a recipe?

Not yet. Typed parameters with defaults are on the roadmap. For now, edit the step options after importing.

What happens if a step fails?

The pipeline stops at that step, later steps show “not run”, and the last valid output stays available. Export of the final output is blocked until the recipe completes.