Seedfaker
Deterministic synthetic data generator for realistic, correlated, and noisy test records across 68 locales. Rust CLI/Python/Node.js/Browser WASM/Go/PHP/Ruby/MCP
Install / Use
/learn @opendsr-std/SeedfakerREADME
seedfaker
0.1.0-alpha.30 · sf0-158dc9f79ce46b43
Deterministic synthetic data generator. 200+ fields, 68 locales, native scripts.
CLI (crates.io) · CLI (npm) · Python · Node.js · Browser/WASM · Go · PHP · Ruby · MCP
$ seedfaker name email phone --ctx strict --locale en -n 5 --seed hero --until 2025
Janet Marsh janet.marsh@inbox.com +1 (957) 226-4272
Emma Hines hinesy2@caltech.edu (779) 640-3402
Amy Schwartz aschwartzl@yahoo.com +1-566-391-4136
Ronald Elliott elliottronaldr@wellsfargo.com 557-470-1277
Cruz Hoffman hot.hoffman65@slack.com (432) 491-2668
Same seed = identical output. Adding or removing fields does not change existing columns.
Install
brew install opendsr-std/tap/seedfaker # CLI (macOS / Linux)
cargo install seedfaker # CLI (from source)
npm install -g @opendsr/seedfaker-cli # CLI (npm)
pip install seedfaker # Python
npm install @opendsr/seedfaker # Node.js
npm install @opendsr/seedfaker-wasm # Browser (WASM)
go get github.com/opendsr-std/seedfaker-go # Go
composer require opendsr/seedfaker # PHP
gem install seedfaker # Ruby
What it does
Generation
200+ fields across 17 groups with modifiers, ranges, and transforms. 68 locales with native scripts:
$ seedfaker phone:e164 amount:usd credit-card:space -n 3 --seed readme --until 2025
+47412578114 $793.66 3715 236662 87984
+3118148237758 $123.30 4174 0785 8323 6433
+4901707888425 $473.87 3736 553912 88602
$ seedfaker name -l be --abc native -n 3 --seed readme --until 2025
Лявон Леўшкін
Валянціна Асіпенка
Камілія Анікееў
$ seedfaker name -l ja --abc native -n 3 --seed readme --until 2025
石本 和彦
楠木 康夫
川田 朋恵
Data quality
--ctx strict locks all fields in a record to one identity — email follows name, phone matches locale:
$ seedfaker name email phone --ctx strict --locale en -n 3 --seed docs --until 2025
Eric Martin eric.martin.xxy@okta.com 498-944-8646
Rayyan Shelton scroll.rayyan7721@aol.com 584-542-1839
Kimberly Harvey kimberlyloot03@aol.com 439-347-4269
--corrupt corrupts values — OCR errors, mojibake, truncation, field swaps:
$ seedfaker name email --corrupt mid -n 5 --seed demo --until 2025
Paulina Laca im.ivana@eunet.rso6Wzw
Irene MichaelidesFmfL Irene MichaelidesFm fL sigitas.staniulis@protonmail.com
Elv!ra C@stro Gonz@13z imhannes@omv.com
Workflows
Expressions — arithmetic between columns:
$ seedfaker price=amount:1..500:plain qty=integer:1..20 "total=price*qty" --seed shop --format csv -n 5 --until 2025
price,qty,total
424.49,14,5942.86
459.67,3,1379.01
309.44,12,3713.28
Templates — free-form output with conditionals and loops:
$ seedfaker name email -t '{{name}} <{{email}}>' --seed demo -n 3 --until 2025
Paulina Laca <im.ivana@eunet.rs>
Irene Michaelides <sigitas.staniulis@protonmail.com>
Elvira Castro Gonzalez <imhannes@omv.com>
13 presets for common formats. Replace PII in existing data. Stream to pipes:
seedfaker run nginx -n 0 --rate 5000 --seed demo | kafka-console-producer --topic logs
seedfaker name email --format sql=users -n 10000 --seed ci --until 2025 | psql mydb
Determinism
Each field is independently derived from (seed, record_number, field_name). Adding field B does not change field A. Output format does not affect values.
--until defaults to current time. Pin it with --seed for reproducibility:
seedfaker name email --seed demo --until 2025 -n 3
# Paulina Laca im.ivana@eunet.rs
# Run again — same output. Change seed — different output.
A warning is printed when --seed is set without --until (suppress with -q). See determinism.
How it compares
| | Traditional faker | seedfaker |
| -------------- | ------------------ | ------------------------------------------------------------ |
| Determinism | Random by default | Byte-identical with --seed |
| Correlation | Fields independent | Email follows name, phone follows locale |
| Distribution | Uniform | Realistic (names from dictionaries, tiered amounts) |
| Data quality | Always clean | 15 corruption types, 4 levels |
| Scale | Library calls | CLI streaming, configs, SQL/CSV/JSONL/template |
| Cross-language | Language-specific | Same output: CLI = Python = Node.js = WASM = Go = PHP = Ruby |
Performance
Rust core, native bindings (PyO3, NAPI, FFI, WASM).
| Runtime | 3 fields | 10 fields | 20 fields | | ------------- | -------- | --------- | --------- | | CLI (100K) | 0.049s | 0.142s | 0.304s | | Python (10K) | 0.010s | 0.028s | 0.058s | | Node.js (10K) | 0.015s | 0.064s | 0.194s |
Per-field benchmarks · CLI tiers · vs competitors · uniqueness
Documentation
| | | | ---------------- | ------------------------------------------------------------------------------------------------- | | Start here | Quick start | | CLI | Commands and flags · Determinism | | Fields | Syntax and modifiers · Full reference | | Configs | YAML configs · Presets · Expressions | | Output | Templates · Annotated · Streaming | | Data quality | Context · Corruption · Replace | | Integrations | Library (Python, Node.js, Go, PHP, Ruby, Browser/WASM) · MCP |
Safety
Generated data is synthetic. Not for authentication, identity verification, or compliance. Passwords are deterministic — never use them for real authentication. See password modifiers.
License
MIT
