Use casesCLI tools

Data migration and batch CLIs

Pipelines over CSV and SQL, progress on stderr, and pmap when you need parallelism - migrations as a typed program, not a one-off notebook.

The problem

Cutover weekend scripts are written under pressure, run once, and left in a gist. They use float for money, have no rollback story, and the person who wrote them left six months ago. Re-running against a staging snapshot is never tested.

Why Ecko

Pipeline stages
|> chains read, transform, validate, and write. Each stage is a function you can unit test in isolation.
Exact decimals
Migrate ledger balances as decimal, not float. The reconciliation check at the end actually closes.
pmap for throughput
Parallelise row transforms with a worker count flag. Cap AI calls with ECKO_AI_MAX_CALLS when enrichment is in the loop.

In practice

migrate.ecko
csv.read("export.csv")
  |> pmap(enrich_row, workers=flags.workers)
  |> sql.insert("staging.users")

Further reading

Try it on your workload.