Synthetic Data Studio — Realistic Test Data in Your Own Schema

A generator, not a fixed dataset. Six industries or the tables you declare yourself, every field the shape your system expects — ACC-000481, a UUID, a VARCHAR(12) — and the same seed always produces the same rows.

New — no reviews yet·by LaunchStock

Synthetic Data Studio — Realistic Test Data in Your Own Schema

What it does & who it's for

Everyone building software needs realistic data and nobody is supposed to use the real thing. So it gets improvised: a loop around a fake-name library, a spreadsheet somebody made in 2019, or — far too often — a slice of production on a laptop.

This is the tool that was meant to exist instead. It generates coherent businesses: six of them, each structurally different, each configurable down to the column names, and each checked against its own rules on every run.

Three things make it different from a loop around a fake-name library.

The same seed gives the same data. Every number comes from a seeded generator; nothing reads the clock, nothing calls Math.random. Run it twice, on two machines, a year apart, and the files are byte for byte identical. That is what turns generated data into test fixtures: your fixtures become a one-line command instead of a large file in the repository, and a failing test can be reproduced exactly by anyone who knows the seed. Streams are independent too, so generating ten more products does not change a single customer — a configuration change produces a diff the size of the change rather than a total one.

The data agrees with itself. Every foreign key resolves. Order totals equal the sum of their lines, and tax is charged on the discounted subtotal. A refund never exceeds what was paid for the line it refunds. A bank ledger's running balance reconciles to the cent, every transfer sums to zero, and no account passes its overdraft limit. A subscription stops being invoiced the month it is cancelled. A compensation history has no gaps and no overlaps and exactly one current row. Those are not claims in a README — they are checked on every run, and the suite that checks them ships with the product so you can point it at your own settings and run it in CI.

It can be dirty on purpose. Clean data tests nothing, and the bugs you are hunting all live in the handling of data that is not clean. Turn on the messiness dial and you get the specific problems real data arrives with: names that went through a spreadsheet and came out shouting, a postcode that lost its leading zero to something that read the column as a number, the same customer entered twice with a typo in the surname, three date formats in one column, mojibake from a file read as the wrong encoding. And every single change is recorded in a manifest — table, row, column, what was done, what the value was before — so you can score your cleaning pipeline against an exact answer key instead of eyeballing it.

The fields are the shape you say they are. Renaming a column does not help if the value inside it is the wrong shape, and loading the data into your columns is usually the whole point. So set the pattern — `ACC-######`, `SKU-@@@-####`, a UUID, ten unambiguous characters with no I, O, 0 or 1 — along with the length, the range, the null rate. Reshaping a primary key rewrites every foreign key pointing at it, so the references still resolve and the integrity check proves it. Ids generated this way cannot collide, because each row index is mapped through a permutation of the pattern's value space rather than filled with random characters; and if your pattern is too small for the rows, you are told the two numbers instead of being handed a duplicate key.

Or declare your own tables entirely. Nobody's schema is retail with the columns renamed. An insurer has policies and claims, a school has enrolments, a utility has meters and readings. Write your tables and fields in JSON — types, formats, ranges, vocabularies, relationships — and get data for them with the same guarantees: deterministic from a seed, every foreign key resolving to a real parent row, no child dated before the parent it belongs to, and the same messiness pass and integrity suite running over your columns.

The six models are different shapes, not different column names. Retail is discrete transactions in a star schema. SaaS is state over time — subscriptions, plan changes, monthly invoices that stop the month someone leaves. Healthcare is episodes hanging off a person, with age-appropriate conditions and clinically plausible vitals. Banking is an append-only ledger that has to balance. Logistics is an event trail where the order is the meaning. Workforce is slowly-changing records with contiguous compensation intervals. Code that copes with all six has met most of the shapes it will meet in production.

Making it your business takes a few lines. Replace the vocabularies and the data starts to read like your company — your product categories, your plan names, your departments. Rename columns to match your schema, drop the ones you do not have, add computed ones you do. Set exact row counts per table, the date window, the growth curve, the country. And when the business logic itself is what you are testing — an invoice that must equal the sum of its lines — write a model: one file, about two hundred lines, and the engine has no list of models built into it.

On privacy, the distinction that matters. Anonymised data starts as real data about real people and has identifying details removed — a process that can fail, and does, because the identifying power of a record is not in the name. Synthetic data never had a person behind it. There is no source record, no mapping, and nothing to re-identify. Names are common ones combined at random, every email is on a reserved example domain that cannot reach a mailbox, card numbers fail every scheme's check digit deliberately, and the clinical model emits its own codes rather than pretending to be ICD-10 or SNOMED.

Zero dependencies, no build step, no network access at any point. A million rows takes about fifteen seconds. The demo on this page is the product: the generator running in your browser is the code in the download, unmodified.

Details

Formats
CSV, JSON, SQL
Records
1,000,000
Coverage
Six industry models plus your own declared tables, any date range — generated, not collected
Personal information
None
Data dictionary included
Yes

What's included

  • engine/ — the generator: seeded randomness, calendars and seasonality, locales, field shaping, the messiness pass, and CSV/JSON/NDJSON/SQL emitters
  • models/ — six industry models: retail, SaaS, healthcare, banking, logistics, workforce (34 tables in total), plus the declare-your-own one
  • cli/synth.mjs — the command line: models, volumes, dates, locales, formats, dirt, and JSON config files
  • cli/verify.mjs — the integrity suite, 95 checks, runnable against your own settings as a CI gate
  • samples/ — pre-generated data for all six models, a matched clean/dirty pair of the same seed, and one generated from a declared schema
  • documentation/ — getting started, shaping fields, declaring your own schema, customising, messiness, determinism and CI, privacy, and writing your own model, plus an example schema to copy
  • types/ — TypeScript definitions for the whole API
  • README.md, LICENCE.md and THIRD-PARTY.md

What's not included

  • Real data of any kind. Nothing here is collected, sampled or derived from a real business
  • A statistical replica of your data: there is no source dataset being fitted, no differential privacy budget, and no utility guarantee relative to an original
  • Clinical validation. The healthcare model is structurally realistic test data and nothing more
  • A hosted service, API or GUI — this is a library and a command line, run on your machine, offline
  • Parquet, Avro or Excel output. CSV, TSV, JSON, NDJSON and SQL only
  • Streaming generation: a dataset is built in memory before it is written, so past a few million rows per table you generate in slices
  • Exclusivity: this is a non-exclusive licence and other people buy the same generator

Requirements

  • Node.js 18 or later to run the generator or the CLI
  • Nothing else: no dependencies to install, no build step, no network access
  • To load the SQL output: Postgres, MySQL or SQLite, whichever you pointed --dialect at
  • To run it in a browser instead: any current browser (the engine has no Node-specific API)

Setup instructions

  1. Download and unzip the package.
  2. Run `node cli/synth.mjs --list` to see the six models and their tables.
  3. Run `node cli/synth.mjs retail --out ./data` — six CSV files, ready to load.
  4. For a database: `node cli/synth.mjs saas --format sql --dialect postgres --out ./db`, then load the file.
  5. Run `node cli/verify.mjs` to watch it check its own promises before you rely on any of them.
  6. Read documentation/customising.md when you want the data to look like your business rather than a generic one.

Version history

  1. v1.0Latest20 Sept 2026
  2. v1.120 Sept 2026
  3. v1.020 Sept 2026

Licence & terms

12 months email support

Licence terms

Non-exclusive commercial licence. Use the generator in unlimited projects: your own applications and internal tools; client work, including handing the generator to that client as part of it; products you sell; and in test suites, CI, demonstrations, teaching material and documentation. Run it at any scale on any number of machines. Modify anything — change the models, add your own, rewrite the emitters — and ship the code, changed or not, inside your application. The data it produces is yours unconditionally: every row generated belongs to whoever generated it, with no restriction, no attribution and no reporting, because it is output rather than licensed material. You may not resell or redistribute the generator itself as a generator — as a data generation tool, library, template resource or course download — or upload it to a package registry or code marketplace, or register any part of it as a trademark. No attribution required, no expiry, no revenue share. Full terms in LICENCE.md.

Refund policy

14-day refund if the product is materially not as described — for example files missing from the download, code that does not run on a supported Node version, or a generator that is not what this listing says it is. Change of mind is excluded: the demo on this page runs the actual generator on the actual models and you can inspect the data, the schemas, the SQL and the integrity checks before buying, so you can judge the real product rather than a description of it. Nothing here limits your rights under Australian Consumer Law. An approved refund ends the licence: stop using the generator and remove it from work not yet published. Data you already generated stays yours, because it always was.

Support terms

Email support for 12 months from purchase, for questions about using or configuring the generator and for defects in what this listing describes. Email support@launchstock.app or reply to your receipt, and a person answers. Defects are fixed free within that period. Help shaping a model to your schema is included within reason; writing bespoke models to order, building your pipeline, and changes to your own code are not.

These terms are snapshotted at purchase — what you see here is what applies to your order.

Reviews

No reviews yet

Reviews come from verified purchasers only, so you can trust what you read here.