A Windows desktop app and Python package by Michael Nocito.
🌐 recordforge website · Releases · Troubleshooting
⚠️ All output is synthetic and fictional. Never use for legal, financial, medical, regulatory, or identity purposes.
You can generate a folder full of realistic — but completely fictional — business documents and data sets in a few clicks. Invoices, purchase orders, contracts, offer letters, customer records, transactions, even intentionally messy spreadsheets for cleanup drills.
Pick what you need, how many, and where to save them. The app handles the rest. You end up with test files you can drop straight into a QA run, a demo, or a training session — no real customer data involved.
Pick whichever fits you. Both produce the same files.
- Desktop app (Windows installer) — You can run it without Python. Download, click, generate files. Jump to Download & Install.
- Python package — Install with pip, use the CLI or the Python API, extend it with your own types. Jump to Run from Python.
Open the app and you get a 3-step wizard: pick your file types, choose how many and what format, then generate. Names, addresses, and party details are randomized for every file. Output lands in the folder you choose, and you can open any file directly from the app the moment it finishes.
- Go to Releases
- Download
RecordForgeSetup.exe - Double-click the installer and follow the wizard (Next → Next → Finish)
- Launch from the Desktop shortcut or Start Menu
You do not need Python for this path. Works on Windows 10 and Windows 11.
Blank white screen after launch? Your machine may be missing the Microsoft Edge WebView2 Runtime — this is required by the app. Download it free from Microsoft and reinstall. See Troubleshooting for more help.
Three steps, one folder of test files at the end.
Step 1 — Mode & Type
- Choose Documents, Data Files, or Both
- Select the types you want (pick as many as you need)
Step 2 — Settings
- Set how many files per type (1–20)
- Choose a document format: PDF, Word .docx, or HTML
- Skip this if you are only generating data files
- Set your output folder (defaults to
~/Documents/recordforge)
Step 3 — Review & Generate
- Confirm your selections in the summary
- Click Generate Test Files
- Click any file or Open Output Folder when done
Documents (PDF / Word .docx / HTML)
- Invoice
- Purchase Order
- Intake Form
- SOP
- Contract
- Offer Letter
Data files (Excel .xlsx / CSV / JSON / JSONL in the app; SQL and Parquet also available from the CLI, with a configurable number of rows per file)
- Customer Records
- Vendor Master
- Transactions
- Employee Records
- Inventory
- Payments — checksum-valid but fake cards (Luhn), IBANs (mod-97), and non-routable routing numbers (ABA), for testing payment validators
- Messy Data — nulls, duplicates, bad formatting (great for cleanup testing)
- Edge Cases — an adversarial corpus (boundaries, unicode, injection, bad dates) for stress-testing parsers and validators
Linked data that actually joins (new in v2.1.0)
Generate several tables at once with real foreign keys, so the rows join with no orphans. This is the part no cloud-free, offline generator usually does.
- Relational bundle (
recordforge generate-related): customers, transactions, and payments generated together, where every transaction belongs to a real customer and every payment settles a real transaction. - Your own schema (
recordforge generate-schema): describe your tables, columns, and relationships in a small YAML or JSON file. RecordForge builds them in the correct order, handles self-references (like an employee's manager), and refuses impossible loops with a clear message. Ready-made examples live inexamples/. - SQL and Parquet output: export to ready-to-run
INSERTstatements (written parents-first so they load without breaking foreign keys) or to Parquet for data-engineering workflows. Parquet needs the optionalpip install "recordforge[parquet]"and is kept out of the desktop installer to keep it small.
Every org name, address, contact, and party detail is randomly generated per file. Pick an output folder, then open files directly from the app when generation finishes.
- QA engineers who want varied, realistic test files without scrubbing real data
- Sales and solutions teams building demos that can't use customer documents
- Trainers and bootcamps running data-cleaning, document-processing, or migration exercises
- Developers testing import pipelines, OCR, parsers, or doc workflows on safe sample data
If you build, test, or teach with documents and data, you can use this to skip the busywork of hand-crafting sample files and focus on the work that matters.
Requires Python 3.11+ and pip.
git clone https://github.com/michaelnocito/recordforge.git
cd recordforge
pip install -e .CLI:
recordforge generate --type invoice --format pdf --count 5
recordforge generate --type customers --format csv --rows 500
recordforge generate --type transactions --format jsonl --rows 10000 --seed 42
recordforge generate --type customers --format csv --rows 200 --dirty "nulls=0.1,case_drift=0.2,duplicates=0.05"
recordforge generate --type customers --format parquet --rows 1000
recordforge generate-related --format csv --customers 100 --transactions 500 --payments 200
recordforge generate-schema --schema examples/shop.yml --format sql --seed 1
recordforge list-types
Data types accept --format xlsx | csv | json | jsonl | sql | parquet and
--rows (records per file). Document types accept --format pdf | docx | html.
generate-related and generate-schema produce linked tables with real foreign
keys; with --format sql they write a single, foreign-key-ordered .sql file.
Induce errors on purpose with --dirty (or the "Induce errors" menu in the
app) to test data-cleaning pipelines: choose any of nulls, blanks,
whitespace, case_drift, format_drift, outliers, encoding, duplicates,
each at a rate you set.
Python API:
from recordforge import generate, generate_related, generate_schema
# One document/data type at a time
docs = generate(type="invoice", format="pdf", count=3, output="./out")
for doc in docs:
print(doc.path)
# Linked tables with real foreign keys, no orphans
generate_related(output="./out", format="csv", customers=100, transactions=500, payments=200)
# Your own tables and relationships from a schema file
generate_schema("examples/shop.yml", output="./out", format="sql", seed=1)Desktop UI:
python -m recordforge
To build your own EXE or installer, see INSTALL.md.
recordforge/
├── recordforge/
│ ├── __init__.py ← public Python API (generate, generate_related, generate_schema, list_types, set_seed)
│ ├── __main__.py ← python -m recordforge → desktop UI
│ ├── cli.py ← Typer CLI (generate, generate-related, generate-schema, list-types)
│ ├── core/ ← models, RNG, faker helpers, watermark engine
│ ├── generators/
│ │ ├── documents/ ← one module per document type
│ │ ├── data/ ← one module per data type
│ │ └── related.py ← built-in customers→transactions→payments bundle
│ ├── schema/ ← YAML/JSON schema loader, column types, FK graph + build engine
│ ├── renderers/ ← pdf, docx, html, xlsx, csv, json, jsonl, sql, parquet
│ └── ui/ ← pywebview API bridge + wizard HTML
├── examples/ ← sample schema files (shop.yml, org.json)
├── tests/
│ └── test_smoke.py
├── installer.iss ← Inno Setup script
├── requirements.txt
├── pyproject.toml
└── INSTALL.md ← EXE + installer build instructions
- No real personal data is ever used in generated output
- Generation is fully offline — nothing you create ever leaves your machine, no telemetry, no account. The app's only network request is the opt-in Check for Updates button, which reads the public Releases list to compare version numbers and sends no personal data
- User-entered output folder paths are not stored or transmitted
- Generated files stay on your machine in the folder you choose
- See PRIVACY.md for full details
🕵️ NEXUS — Learn SQL by Solving a Mystery — A free game where you investigate corporate fraud by writing real SQL against a live database. No slides, no exercises — every query is evidence. Two full seasons.
📊 Analyst Prep Kit — A free browser-based suite for breaking into data analytics — SQL, Excel, Python, Tableau, and Statistics. 12 lessons per module, real in-browser environments, honest readiness score. No install, no login.
🧼 Spreadsheet Cleaner — A beginner Python project where you build a real data-cleaning tool layer by layer. The Messy Data output from RecordForge pairs directly with this cleaner.
LinkedIn — data analyst · 8 years enterprise implementation
If this project saved you time, the best thing you can do is ⭐ star the repo — it helps others find it.
If you'd like to support the work, a coffee is always appreciated but never expected.
Built with 🐍 Python | Maintained by Michael Nocito