Introducing Weavori: FK-intact Postgres test data
Weavori is live: a zero-config CLI that turns any PostgreSQL schema into realistic, referentially intact synthetic data in one command. Free tier, flat-fee Pro, 14-day trial, no credit card.
Today we're launching Weavori: a zero-config CLI for PostgreSQL synthetic data. Point it at any Postgres database and it generates realistic, referentially intact test data in one command. No YAML. No DSL. No per-column mapping.
The problem: seed scripts rot
Every team has a version of this: a seed script that fills local and staging databases with mock data. It works at first. Then production data gets messy in ways the script never modeled, value distributions shift, columns appear, foreign keys multiply, and the script quietly starts producing data that lies to your tests.
The failure modes are predictable: dangling foreign keys, uniform random values that never exercise real query plans, and rows that are internally impossible (an invoice paid before it was issued). Each one is a bug that ships to production because the test environment didn't look like reality.
This community articulated the problem better than we could. From the Neosync Show HN thread last year:
"The problem is that production data is messy and it's very difficult to replicate that with mock data."
The two hardest parts people named in that thread, referential integrity and matching real value distributions, are exactly what Weavori solves by construction instead of by configuration.
One command, from schema to data
Weavori connects, introspects the schema, tables, foreign keys, column types, constraints, enums, defaults, triggers, and builds a generation plan. You review it, refine it, and approve. Then it streams production-shaped data to JSON/CSV on stdout or directly into a target database via COPY.
The interactive plan shows every table, row count, and generator choice before anything is written. --yes skips the prompt for CI.
How it works
- Schema-aware inference. Every column gets a generator chosen from its name and type: column-name rules across 25+ domains (
first_namebecomes a name,zipbecomes a ZIP, a status enum samples its own labels), with PostgreSQL type fallbacks. No config to write, nothing to maintain when the schema changes. - Referential integrity by construction. Foreign keys are resolved topologically: parents before children, with memory that stays flat as row counts grow. Composite primary keys work. Integrity is guaranteed by construction, never checked after the fact.
- Distribution-aware generation. By default Weavori samples
pg_statsand weights generated values accordingly. If 70% of your realstatusvalues areactive, ~70% of generated ones are.--fast,--sample-rows N, and--no-samplingtrade accuracy for speed. - Cross-column coherence. Timelines make sense (
created_atprecedesupdated_at), lifecycle states are coherent (paid_atis NULL unlessstatus = 'paid'), and multi-column CHECK constraints are honored. All detected from the schema, enforced per row.
What's different
- It reads your schema instead of asking you to describe it. Zero-config is the product, not a feature.
- Everything runs on your machine or CI. Source data never leaves your infrastructure.
- DDL paste mode. Generate from pasted
CREATE TABLEstatements, no database at all. - A built-in MCP server. AI assistants (Claude Desktop, Cursor, VS Code Continue, Qoder) can drive introspect, estimate, generate, doctor, and sync in-conversation. We don't know of another synthetic-data tool that offers this.
- Flat-fee pricing. No credit meters, no per-row charges.
- A schema cache. Repeated runs against the same database skip re-introspection and start in milliseconds.
How fast
- 100,000 rows across 14 tables in 12.4 seconds
- 25,000 rows in 2.1 seconds; 2,500 rows in 384 ms
- Typical schemas (under 200 tables) complete in under 2 minutes
- Constant memory regardless of row count, million-row tables stream without million-row buffers
- Stress-tested against a 500 GB benchmark database
Methodology
Benchmarks measured against PostgreSQL 17, generating into a target database via COPY. Numbers vary with hardware and schema shape.
What it costs
- Free: 2,000 rows/month, forever, unlimited tables and runs, direct database export, CSV datasets and formulas.
- Pro: $15/month flat: 1M rows, unlimited tables,
syncincluded. No per-table or credit charges at any tier. - 14-day full-Pro trial: server-side, no credit card required.
The upgrade trigger is scale, not time
The free tier never expires. You upgrade because you need a million rows, not because a countdown told you to.
Privacy by design
- Generation runs locally; only license activation and auth credentials touch the server.
- Telemetry is anonymous, command name, duration, success/failure, error category, version, OS. Never database names, hosts, schemas, SQL, or file contents.
- Licenses validate offline, so air-gapped CI works.
- No superuser, no extension installs, no data leaving your network.
What we deliberately don't do (yet)
Honest boundaries
PostgreSQL only: by design. No deterministic seeding yet (--seed is on the roadmap). No masking of existing data, we generate fresh rows, so no production value ever appears; sync copies real rows unmasked. The formula language (v1) covers concat, lower, upper, trim, substr, coalesce, length, and replace, but deliberately no arithmetic or regex.
Get started
- Install:
npx --yes @weavori/cli - Run:
weavori generate <dsn> - Review the plan, approve, and use the data
Join the discussion on Hacker News: we're reading every comment and shipping fixes as they surface.