Skip to content

Releases: wikar/dux

v0.15.0

Choose a tag to compare

@github-actions github-actions released this 30 Jul 19:31
Add real iterator context transition, correct relationship resolution…

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 30 Jul 15:01
Harden query semantics for with emitter correctness fixes, semi-addit…

DUX Sample v2

Choose a tag to compare

@wikar wikar released this 30 Jul 20:02

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 Stock snapshots by product and venue for every month from 2023 through 2025.
  • Semi-additive StockQuantity and StockValue measures that return the last available closing balance in the current date context.
  • Mixed Sales and Stock measures through their conformed Date, Product, Region, and Venue dimensions.
  • Club and ClubMembership tables 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.ps1

The 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:

  1. Stages and imports all nine Parquet files through POST /api/ducklake/imports.
  2. Refreshes the DuckLake schema.
  3. Loads dux.toml through POST /import.
  4. Copies the dashboard asset into the dashboards directory.
  5. 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:latest

run 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.sh

The 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 SHA256SUMS

On systems without sha256sum:

shasum -a 256 -c SHA256SUMS

Attribution

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

Choose a tag to compare

@github-actions github-actions released this 29 Jul 15:25
Web UI hardening

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 29 Jul 15:09
Time intelligence optimizations

v0.12.5

Choose a tag to compare

@github-actions github-actions released this 29 Jul 13:44
Emitter bug fixes and additions

v0.12.4

Choose a tag to compare

@github-actions github-actions released this 29 Jul 12:03
Updated default max connections and documentation

v0.12.3

Choose a tag to compare

@github-actions github-actions released this 29 Jul 11:16
Changed CMD into ENTRYPOINT

v0.12.2

Choose a tag to compare

@github-actions github-actions released this 29 Jul 10:52
Max connections / Threads config

DUX Sample v1

Choose a tag to compare

@wikar wikar released this 29 Jul 21:40

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.ps1

The 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:latest

run 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.sh

The 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 SHA256SUMS

Attribution

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.