Realistic mock data generator for retail analytics. Spins up a self-contained grocery store simulation — transactions, inventory, employee timeclock, supply chain, loyalty programs — with automatic 30-day backfill and real-time tick generation.
Built for analytics engineers who need a realistic, schema-rich data source to practice dbt, Airflow, Meltano, Superset, and similar tools. Pairs with data-lab for a full end-to-end analytics stack.
Docker Hub: smiti/verisim-grocery
docker run -d --name verisim-grocery \
-p 5499:5432 -p 8010:8000 -p 8501:8501 \
smiti/verisim-grocery:latestcurl -fsSL https://raw.githubusercontent.com/smitimus/verisim/main/install.sh | sudo bashInstalls Docker if needed, pulls the image, starts the container.
git clone https://github.com/smitimus/verisim.git
cd verisim
cp grocery/.env.example grocery/.env # edit YOUR_* values
./switch.sh dev| Service | URL | Purpose |
|---|---|---|
| Streamlit UI | http://localhost:8501 |
Dashboard · Generator Control · Scenarios · Promotions · Distributions · Table Explorer · Data Dictionary |
| FastAPI | http://localhost:8010/docs |
REST API + interactive docs |
| PostgreSQL | localhost:5499 |
Source database (user: verisim / pass: verisim / db: grocery) |
Data model: ~40 tables across 9 schemas — hr, pos, timeclock, ordering, fulfillment, transport, inv, pricing, control
On first start: the generator backfills 30 days of history, then switches to real-time simulation (15-minute ticks by default).
Edit grocery/config.yaml — changes take effect on the next tick, no restart needed.
Key settings:
tick_interval_seconds: 30 # wall-clock interval (= 15 min simulated)
locations:
store_count: 3
warehouse_count: 1
daily_volumes:
min_transactions: 800
max_transactions: 3000Trigger a scenario via API:
curl -X POST http://localhost:8010/grocery/generator/scenarios \
-H "Content-Type: application/json" \
-d '{"scenario_name": "rush_hour"}'Available scenarios: rush_hour, weekend, holiday_week, double_coupons, promotion
./switch.sh dev # start multi-container dev stack (build from source)
./switch.sh test # build standalone → run as single container
./switch.sh release # pull Docker Hub image
./switch.sh status # show current modeAfter code changes, rebuild just the affected service:
docker compose -f grocery/compose.yaml build generator
docker compose -f grocery/compose.yaml up -d generatorPublish to Docker Hub:
bash build-and-push.sh grocery 1.1.0The gas station generator source is preserved in gas-station/. It targets the shared verisim-base platform (postgres + api + ui) and generates fuel pump transactions, convenience store POS, and pricing data. Development is currently paused — grocery standalone is the active product.
┌──────────────────────────────────────────────────┐
│ Standalone Container │
│ supervisord manages 4 processes: │
│ ┌──────────┐ ┌─────────┐ ┌────────┐ ┌──────┐ │
│ │PostgreSQL│ │Generator│ │FastAPI │ │ UI │ │
│ │ :5432 │ │(daemon) │ │ :8000 │ │:8501 │ │
│ └──────────┘ └─────────┘ └────────┘ └──────┘ │
└──────────────────────────────────────────────────┘
The grocery standalone image is built from source with gas-station routes stripped at build time (see grocery/standalone/strip_gas_station.py). This keeps the image lean and branded without code duplication.
MIT — see LICENSE