Blog
AnnouncementPostgreSQLSynthetic Data

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.

The Weavori TeamAugust 18, 20266 min read

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

$npx --yes @weavori/cli generate postgres://localhost:5432/mydb

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: ~230 token-based rules across 25+ domains (first_name becomes a name, zip becomes 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, via Kahn's algorithm — with a streaming, constant-memory FK cache. Composite primary keys work. Integrity is guaranteed by construction, never checked after the fact.
  • Distribution-aware generation. By default Weavori samples pg_stats (most-common values + frequencies) and weights generated values accordingly. If 70% of your real status values are active, ~70% of generated ones are. --fast, --sample-rows N, and --no-sampling trade accuracy for speed.
  • Cross-column coherence. Timelines make sense (created_at precedes updated_at), lifecycle states are coherent (paid_at is NULL unless status = '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 TABLE statements — 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 fingerprint-keyed 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
i

Methodology

Benchmarks measured against Weavori's internal benchmark suite (pgbench-derived schema, PostgreSQL 17, generation 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, sync included. 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 are Ed25519-signed and 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

  1. Install: npx --yes @weavori/cli
  2. Run: weavori generate <dsn>
  3. 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.