DUX Sample v2
Sample data for DUX: 3,000,000 German beverage sales transactions, monthly closing stock balances, and customer club memberships, plus a semantic model and demo dashboard. Enough to go from an empty DuckLake instance to a working DUX 0.15 dashboard in one command.
This release supersedes dux-sample-v1.
Contents
*.parquet |
Nine tables: Sales (3,000,000 rows), Stock (169,199 monthly snapshots), Club, ClubMembership, Customer, Date, Product, Region, and Venue |
dux.toml |
27 formatted measures, 11 relationships including one bidirectional bridge, Date[Date] as the date table, and 27 hidden columns |
dashboards/sales/sales_test.json |
20-element demo dashboard — 8 KPI cards, bar chart, dual-axis line chart, mixed-fact table, map, 6 slicers, text, and image |
dashboards/assets/logo.png |
Dashboard asset |
install.ps1, install.sh |
Installers |
SHA256SUMS |
Checksums of every shipped file |
README.md, PROVENANCE.md, LICENSE |
Documentation, data lineage, and redistribution terms |
What is new in v2
- Monthly
Stocksnapshots by product and venue for every month from 2023 through 2025. - Semi-additive
StockQuantityandStockValuemeasures that return the last available closing balance in the current date context. - Mixed
SalesandStockmeasures through their conformedDate,Product,Region, andVenuedimensions. ClubandClubMembershiptables demonstrating a bidirectional many-to-many bridge from clubs through customers to sales.- Updated dashboard demonstrating mixed-fact queries, club filtering, semantic KPI threshold colors, and the DUX 0.15 dashboard theme controls.
Compatibility
Built and verified against the DUX 0.15.x line. Check your server with:
curl http://localhost:8080/version| DUX | Status |
|---|---|
| 0.15.x | Verified |
| 0.14.x | Not supported — KPI threshold coloring is ignored |
| 0.13.x and earlier | Not supported — the semi-additive Stock measures require LASTNONBLANK |
Some incompatibilities are not detected during installation: POST /import stores measure expressions without executing them, so an older server may accept the model and fail only when a Stock measure is queried.
DUX is pre-1.0, so a minor release may change the semantic-model or dashboard contracts. Later versions are not implied to be compatible; the release page carries the current compatibility record.
Install
Requires a running duxd and an empty DuckLake instance. This bundle is not an upgrade or merge tool: imports append to existing tables, while POST /import replaces the current semantic model.
Extract the bundle anywhere and keep its directory structure intact. The installers resolve the Parquet files and dashboards relative to themselves.
chmod +x install.sh && ./install.sh./install.ps1The zero-argument forms use repository-layout defaults: duxd at http://localhost:8080, with inbox/ and dashboards/ two levels above the extracted bundle. For any other layout, provide the server and filesystem paths explicitly.
The installer:
- Stages and imports all nine Parquet files through
POST /api/ducklake/imports. - Refreshes the DuckLake schema.
- Loads
dux.tomlthroughPOST /import. - Copies the dashboard asset into the dashboards directory.
- Restores the dashboard through
PUT /api/dash/dashboards/{path}.
Imports are idempotent per table, so rerunning the same installer against the same partially installed instance resumes completed work without importing those files again.
POST /import replaces the whole semantic model. Existing relationships, measures, hidden columns, and date-table configuration are cleared. Back up the current model with GET /export first if needed.
Pointing it at any server
| Setting | install.sh |
install.ps1 |
Default |
|---|---|---|---|
| Server URL | DUXD_URL |
-DuxdUrl |
http://localhost:8080 |
Import inbox (--import-dir) |
DUX_IMPORT_DIR |
-ImportDir |
inbox/ two levels up |
Dashboards root (--dash-dir) |
DUX_DASH_DIR |
-DashDir |
dashboards/ two levels up |
The inbox and dashboards root must be the same directories used by duxd. Because the installer copies dashboard assets directly, run it on the machine hosting duxd or against filesystem paths shared with that machine.
For a container started with:
docker run -d -p 9080:8080 \
-v dux-db:/app/db \
-v /vol/dux/inbox:/app/inbox \
-v /vol/dux/dashboards:/app/dashboards \
ghcr.io/wikar/dux:latestrun the installer against the host side of those mounts:
DUXD_URL=http://localhost:9080 \
DUX_IMPORT_DIR=/vol/dux/inbox \
DUX_DASH_DIR=/vol/dux/dashboards \
./install.shThe container sees the same files under /app/inbox and /app/dashboards. Prefix the command with sudo env if the container-created directories are root-owned.
Shape of the data
Sales contains 3,000,000 transactions across calendar years 2023–2025. Net sales grow 4% in 2024 and 9% in 2025 year over year; Friday and Saturday carry the volume peak; and B2B accounts for roughly three quarters of net sales and is the only channel that discounts.
Sales value columns are hidden behind formatted measures, including sales, quantity, profit, margin, rolling-seven-day, year-to-date, and prior-year calculations.
Stock contains 169,199 monthly closing balances at venue, product, region, and month-end grain. StockQuantity and StockValue are semi-additive over time: a year or broader date range returns its last available snapshot instead of summing every monthly balance.
ClubMembership is a factless fact table bridging nineteen regional beverage clubs to customers. Its bidirectional relationship with Customer lets a club filter Sales measures without joining the bridge into Sales and creating fanout.
The dashboard opens filtered to 2025. Its table combines Sales and Stock measures through conformed dimensions, while the Club slicer demonstrates filtering Sales through the bidirectional membership bridge.
Verify
dux-sample-v2.zip SHA-256:
343797f1cf1de9c6e79b00f9253d373d04393f8111676f33f6c7874a8dccf1d9
After extracting, verify every shipped file against the manifest:
cd dux-sample
sha256sum -c SHA256SUMSOn systems without sha256sum:
shasum -a 256 -c SHA256SUMSAttribution
A DUX-enriched derivative of Beverage Sales by SWillm (sebastianwillmann), published under the MIT License.
The original creator is not affiliated with or responsible for DUX or these enrichments. See LICENSE for redistribution terms and PROVENANCE.md for the complete data lineage and the synthetic Stock and Club additions.