Describe your domain once. Hose fills it with years of believable history — a few regulars who order every morning, a long tail who came in once, weekends that dip and Decembers that spike — then keeps writing new events in real time.
hose → postgres2023-09-01 00:000 rows writtenlive
A coffee chain filling up: customers arrive, order, come back, tell their friends.Slowed to reading speed — a real run writes this much in a blink.
The trouble with fake data
It falls apart the moment someone groups by month.
Seed scripts give every customer the same three orders, all timestamped last Tuesday. Point a dashboard at that and every chart is a flat line. Put it in front of a customer and they can tell. Copy production instead and you have taken on a compliance problem, a snapshot that goes stale in a week, and a database you are not allowed to share with anyone.
What you get instead
It holds up when you dig in
Populations behave like populations. A handful of regulars carry most of the revenue, most people show up once and never come back, mornings beat afternoons, and December is not March. Group by whatever you like — the numbers keep making sense.
The same database every time
Same seed, same data. The demo you record today still works a year from now, and a test that catches a bug catches it again tomorrow. Change one corner of your domain and the rest of the data stays exactly where it was, instead of every id in the warehouse reshuffling on you.
Years of history, then live
The first pass fills your warehouse with as much history as you ask for, as fast as the machine will go. Then it rolls into real time without a seam and keeps writing. Dashboards move while you watch them, which is hard to fake any other way.
Lands where you need it
Postgres when you want something live to point a BI tool at. SQLite when you want one file you can email. CSV or JSONL when the next tool would rather read it raw. Same data, same joins, whichever you pick.
Kill it, restart it, carry on
The target database remembers where the stream stopped. Restart after a crash, a deploy, or a laptop lid closing and it picks up exactly where it left off — no duplicate rows, no missing hour, nothing to tidy up by hand. Leave it running in a container and forget about it.
Your domain, not a coffee shop
A coffee chain comes with it and a railcar fleet runs on it, but neither is the point. Yours is a short description of what happens in your business and what causes what — written once, kept next to your own code, with no second language to learn.
Point it at a database, give it a start date, and let it run. A few minutes later you have something that looks like it has been in production for three years — and it keeps going.