Skip to content

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.

PathStatusWhat you need
The in-browser demoLiveA browser
The dogm CLIBuilt; build it from source until the first releaseRust, and access to the repository
Hosted runsLive in the early-access betaAn 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.

Shell
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:

Speccompiles with dogm 0.1.0
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#

Shell
dogm compile shop.yaml
Output
spec_hash 423ed75a1229058e25651e1ebe7ef456fe488d322c9175669af701c67f40c6ac
seed      0
table              rows  chunks  parent
customers            50       1
orders              105       1  customers
rules     1

Child 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:

Output
/tables/orders/columns/total_php E_EXPR_UNKNOWN_COLUMN: unknown column 'unit_pric'
    hint: did you mean 'unit_price'?
1 error

The 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#

Shell
dogm generate shop.yaml --seed 4242 --out ./data
Output
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:

Shell
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.