Releases: wikar/dux
Release list
v0.15.0
v0.14.0
Harden query semantics for with emitter correctness fixes, semi-addit…
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.
v0.13.1
v0.13.0
v0.12.5
v0.12.4
Updated default max connections and documentation
v0.12.3
v0.12.2
DUX Sample v1
Sample data for DUX: 3,000,000 order lines of German beverage sales as a star schema, plus the semantic model and a demo dashboard built on it. Enough to go from an empty DuckLake instance to a working dashboard in one command.
Contents
*.parquet |
Sales (3,000,000 rows) joined by surrogate key to Customer, Date, Product, Region, Venue |
dux.toml |
23 formatted measures, 5 relationships, Date[Date] as the date table, 18 hidden columns |
dashboards/sales/sales_test.json |
19-element demo dashboard — 8 KPI cards, bar, line with a dual axis, table, map, 5 slicers, text, image |
dashboards/assets/logo.png |
dashboard asset |
install.ps1, install.sh |
installers |
SHA256SUMS |
checksums of every file above |
README.md, PROVENANCE.md, LICENSE |
docs, data lineage, redistribution terms |
Compatibility
Built and verified against the DUX 0.12.x and 0.13.x lines — check yours with curl http://localhost:8080/version.
| DUX | Status |
|---|---|
| 0.14.x | Should work |
| 0.13.x | Verified |
| 0.12.x | Verified |
| 0.11.x and earlier | Not supported — the dashboard sets slicer.sort, which 0.12.0 introduced, and the slicer schema rejects unknown keys, so the restore fails with 422 |
DUX is pre-1.0, so a minor release may change the semantic-model or dashboard contracts. This table is updated as later versions are tested; when a break makes this bundle obsolete a new dux-sample-vN release supersedes it, and this one is marked accordingly.
Install
Requires a running duxd and an empty DuckLake instance — imports append, so installing over existing Customer, Date, Product, Region, Sales, or Venue tables gives you a duplicate copy of every row.
Extract anywhere — the bundle has no required location. Keep the folder intact, since the installer reads the Parquet files and dashboards/ from beside itself, and invoke it by any path; it resolves everything relative to the script, not to your working directory.
chmod +x install.sh && ./install.sh./install.ps1The chmod is needed because a zip carries no Unix permission bits; sh install.sh works without it.
Those zero-argument forms only work when the bundle is extracted into a DUX checkout at samples/dux-sample/ — that is the one layout where the defaults, which look two levels up for inbox/ and dashboards/, land on the real ones. Anywhere else, name the three paths.
The installer stages the Parquet files in the controlled import inbox and imports each one through POST /api/ducklake/imports, refreshes the schema, loads dux.toml through POST /import, copies the dashboard asset to disk, and restores the dashboard through PUT /api/dash/dashboards/{path}. Imports are idempotent per table, so a re-run after a partial failure resumes rather than duplicating rows.
POST /import replaces the whole semantic model. Existing relationships, measures, hidden columns, and date-table configuration are cleared. Back yours up with GET /export first if you need it.
Pointing it at any server
Three settings, each with a shell and a PowerShell form:
| 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 ones duxd was started with, and the installer writes to both directly — assets are read-only over HTTP by design — so run it on the machine hosting duxd, or on a path that reaches the same directories.
A Docker deployment, for example. 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 on the host, against the host side of those bind 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 at /app/inbox and /app/dashboards. Prefix with sudo env if those directories are root-owned, which they will be if the container created them. Nothing needs to be installed inside the container — the image ships no shell HTTP client.
Shape of the data
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 is roughly three quarters of net sales and the only channel that discounts.
Sales value columns are prefixed with _ and hidden, so the model exposes measures rather than raw columns — including time intelligence (NetSalesYTD, NetSalesYoY%, NetSalesAmountR7D) against a 2000-2040 date table. Synthetic cost of goods sold yields blended margins from about 54% on water down to 35% on alcohol.
The dashboard opens filtered to 2025 so the year-over-year card reads a real figure on load.
Verify
dux-sample.zip SHA-256:
0b9a52af4e9fe376368d74584138e736d4d8982f76223748f7918f6baf2c4549
After extracting, verify the files against the shipped manifest:
cd dux-sample && sha256sum -c SHA256SUMS # or: 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 exactly what this bundle changes and adds on top of the source data.