• v0.18.0 — the disk ceiling becomes a choice, and two silent losses stop
    Some checks failed
    Audit / cargo audit (backend) (push) Failing after 9m2s
    Audit / npm audit (frontend) (push) Successful in 51s
    Checks / Backend — cargo test + clippy + fmt (push) Failing after 52s
    Checks / Frontend — vitest + svelte-check (push) Failing after 5m41s
    Checks / Keepsake viewer — builds, self-contained, committed artifact in sync (push) Failing after 5m5s
    Checks / E2E — typecheck + lint (push) Failing after 39s
    E2E / Playwright E2E (chromium + webkit) (push) Failing after 9m13s
    E2E / Cross-UA smoke matrix (push) Failing after 4m20s

    fabi released this 2026-08-20 20:59:07 +00:00 | 8 commits to main since this release

    Cut after a full-dress event simulation: 945 real wedding photos and 150
    personas replayed at 30x speed against a container held to the production box's
    real limits — 2 vCPU, 4 GB, and a genuine 30 GB filesystem.

    Schema unchanged from v0.17.6 (31 migrations), so v0.17.6 remains a valid
    rollback target.

    FEATURE
    KEEPSAKE_ENABLED=false drops the keepsake term from the upload gate, taking
    usable media on a 30 GB volume from ~5.8 GB to ~20 GB. The event that prompted
    it stopped after ~780 of 945 photos with the disk 79% empty. Boot-time only;
    release and export routes refuse while it is off, and the host dashboard hides
    the release control instead of offering a button that answers 403.

    FIXES
    A NUL byte in a caption returned 500 and cost the guest the photo along with
    the caption. Now a 400 at the edge, narrower than the display-name rule so
    newlines and emoji still work.

    A client disconnecting inside the upload's COMMIT left the row at
    'pending' with no compression job and nothing to rescue it: the photo showed
    without a preview, forced full-original downloads, and was dropped from the
    diashow permanently. Closed with a drop-guard, plus a sweeper for the case no
    in-process guard can cover.

    TESTING
    The simulation harness is committed alongside, including the constrained
    compose stack that reproduces the box rather than asserting it.

    Downloads