DryFit
Synthetic analytics datasets with hidden ground truth — so you can benchmark signal-discovery agents deterministically.
DryFit is an open-source Python tool that generates PostHog-shape event data from a YAML config,
along with a ground_truth.json
listing the exact event_ids that make up each positive and negative signal path.
Point an agent at it, grade the output against the truth. Ships with 14 SaaS business-model scenarios and a Grafana inspection stack.
What's in the box
A generator, a truth file, and enough scenario diversity to stress-test any signal-detection pipeline.
Hidden ground truth
Every dataset ships with a ground_truth.json that maps each positive and negative signal back to the exact event_ids that produced it. Grade any detector output deterministically.
14 PostHog business-model scenarios
Seat-based, usage-based, transaction, storage, contact, feature-gated, marketplace, revenue-share, credits, hybrid, freemium, event-volume — plus a combined-coverage dataset exercising every event type.
Realistic noise, controlled
Missing events, duplicates, out-of-order arrivals, null properties, anonymous actors. Configurable probabilities per scenario — and noise never touches rows referenced by ground truth.
PostgreSQL native output
Writes an events table into PostgreSQL (local Unix-socket or dockerized). Reproducible with the same seed. No proprietary format — any SQL client works.
Grafana inspection built-in
docker compose up brings up Postgres, Grafana, a provisioned datasource, and a "Generated Event Inspection" dashboard. See the data you just generated in a browser.
MIT licensed
Python 3.12 with uv, typer, pydantic, psycopg. Fork it, extend it, wire it into CI. No license fees, no cloud dependency.
How it works
YAML in, events and ground truth out.
Pick a scenario config
Choose one of the 14 bundled scenarios or author your own YAML. Each declares the success event, positive and negative signal paths, scale, and noise parameters.
Run the generator
uv run dryfit -c configs/...yaml writes events to your Postgres instance and dumps ground_truth.json plus manifest.json.
Benchmark your detector
Run your agent, SQL query, or ML model against the events table. Score its output against ground_truth.json. Inspect the raw data in the provisioned Grafana dashboard while you iterate.
# Clone + bring up Postgres and Grafana
git clone https://github.com/getbeton/dryfit.git && cd dryfit
docker compose up -d
# Generate a dataset into the dockerized Postgres
uv run dryfit \
-c configs/posthog_seat_based_mvp.yaml \
--dsn postgresql://dryfit_writer:dryfit_writer@127.0.0.1:54329/dryfit \
--print-summary
# Inspect in Grafana at http://127.0.0.1:3000 (admin/admin) Bundled scenarios
Each scenario models a specific SaaS business motion — value metric, positive funnel, negative paths, and realistic noise. Click through for the full config breakdown.
PostHog Web (baseline)
→ purchase
Generic SaaS activation (baseline)
Telegram Chat
→ event_signup
Chat engagement / retention
Contact / record-based SaaS
→ contact_created
Contacts, leads, subscribers, accounts managed
Credits / token-based
→ credits_purchased
Credits consumed, tokens used, compute units
Event-volume SaaS
→ custom_event_tracked
Events tracked, data points ingested, log lines
Feature-gated (tiered) SaaS
→ upgrade_clicked
Plan tier / feature access level
Freemium-to-paid
→ trial_started
Free-tier limit hits that drive paid conversion
Hybrid (seat + usage)
→ compute_hours_used
Seats plus usage overage
Platform / marketplace
→ listing_published
Listings, storefronts, connected accounts, integrations
Revenue-share / take-rate
→ commission_calculated
Revenue processed, bookings, GMV through platform
Seat-based SaaS
→ seat_activated
Active seats / users
Storage-based SaaS
→ file_uploaded
GB stored, records managed, files hosted
Transaction / volume-based SaaS
→ payment_completed
Transactions processed, GMV, payments
Usage-based (metered) SaaS
→ job_completed
API calls, compute hours, messages, requests
Combined coverage (all models)
→ upgrade_clicked
Union of event types across all business models
Frequently Asked Questions
Does dryfit read from my production database?
Is this a signal-detection tool?
Who uses this?
What data layout does it produce?
How is this different from Faker or other synthetic-data libraries?
Is it deterministic?
Give your agents a benchmark to beat
Deterministic event data with machine-checkable ground truth. Open source, free forever.