Start
Quickstart
Try the demo, build the CLI and generate your first dataset.
On this page
There are three ways in. Pick the one that fits what you need today.
| Path | Status | What you need |
|---|---|---|
| The in-browser demo | Live | A browser |
The dogm CLI | Built; build it from source until the first release | Rust, and access to the repository |
| Hosted runs | Live in the early-access beta | An account: sign up |
Try the demo#
The demo on the home page runs the engine in your browser. Pick a scenario (shop, hiring or help desk), change the record count and the seed, turn masking on, and export CSV. Nothing is sent to a server, so it's a safe place to see what connected, seeded data looks like before you write a spec of your own.
Build the CLI from source#
The CLI is free on every plan and needs no account. Until the first cli-v release publishes binaries (Linux x64 and arm64, macOS x64 and arm64, Windows x64, with a SHA256SUMS file), build it from the repository. The source isn't public yet, so this step needs repository access.
cd dogm-engine
cargo build --release -p dogm-cli
./target/release/dogm --version
That prints dogm 0.1.0 for the current engine. Put target/release on your PATH, or copy the binary somewhere that is. The examples below call it dogm.
Write a spec#
Save this as shop.yaml. It describes 50 customers, up to four orders each, and a rule that every order total adds up:
spec_version: 1
locale: en-PH
tables:
customers:
rows: 50
primary_key: { column: customer_id, format: "CUS-{n:04}" }
columns:
full_name: { gen: person.full_name, pii: person.name }
email: { gen: person.email, from: full_name, unique: true, pii: person.email }
city: { gen: ph.city, weights: population }
orders:
rows_per_parent: { parent: customers, dist: uniform, min: 0, max: 4 }
primary_key: { column: order_id, format: "ORD-{n:05}" }
columns:
customer_id: { ref: customers.customer_id }
quantity: { gen: int, between: [1, 5] }
unit_price: { gen: choice, values: [249, 399, 1250], type: money }
total_php: { expr: "quantity * unit_price" }
rules:
- "orders.total_php == orders.quantity * orders.unit_price"
The spec language reference covers every field. orders.customer_id is a foreign key to the owning parent, so it's valid by construction, and the emails use RFC 2606 example domains, so none of them can reach a real inbox.
Compile it#
dogm compile shop.yaml
spec_hash 423ed75a1229058e25651e1ebe7ef456fe488d322c9175669af701c67f40c6ac
seed 0
table rows chunks parent
customers 50 1
orders 105 1 customers
rules 1Child row counts depend on the seed, and the summary uses seed 0 unless you pass --seed. A mistake comes back with its JSON path, a stable code and, often, a hint. Misspell unit_price in the expression and you get:
/tables/orders/columns/total_php E_EXPR_UNKNOWN_COLUMN: unknown column 'unit_pric'
hint: did you mean 'unit_price'?
1 errorThe exit code is 2 for compile errors, which is what a CI step should key on. The CLI reference lists the others.
Generate and validate#
dogm generate shop.yaml --seed 4242 --out ./data
wrote 2 parts, 145 rows, to ./data
output_sha256 560ff432f35c664b14692c0f673a17590c62f0e0cbc4fdeee6356cfb51915e2f
checks 16 passed, 0 failed./data now holds customers.part-00000.csv, orders.part-00000.csv, manifest.json, and the checks report as report.json, report.junit.xml and report.sarif. --format jsonl and --format sql write the other two formats.
dogm validate re-reads a directory and checks it against the spec again, which is how you check data that has been copied or loaded somewhere:
dogm validate shop.yaml ./data
Same seed, same bytes#
Run the same command again, on any machine, and output_sha256 comes out identical. That's the promise: the same spec, seed and row overrides give the same bytes within an engine minor version, whatever the worker count. Change the seed and you get a different, equally valid dataset. Scale it with --rows customers=5000 and the orders follow.
Hosted runs#
Sign up, let onboarding create your org and first project, start from a template (e-commerce, hiring or support) or your own spec, approve it, run it, and download the files. Each run records its seed and engine version and shows a Reproduce command that gives the same output_sha256 with the CLI. During the beta, every workspace has Pro limits at no cost.
From there, the GitHub Action runs a spec in CI, and the masking guide covers real data you already hold.
