-
v0.18.0 — the disk ceiling becomes a choice, and two silent losses stop
Some checks failedAudit / cargo audit (backend) (push) Failing after 9m2sAudit / npm audit (frontend) (push) Successful in 51sChecks / Backend — cargo test + clippy + fmt (push) Failing after 52sChecks / Frontend — vitest + svelte-check (push) Failing after 5m41sChecks / Keepsake viewer — builds, self-contained, committed artifact in sync (push) Failing after 5m5sChecks / E2E — typecheck + lint (push) Failing after 39sE2E / Playwright E2E (chromium + webkit) (push) Failing after 9m13sE2E / Cross-UA smoke matrix (push) Failing after 4m20sreleased this
2026-08-20 20:59:07 +00:00 | 8 commits to main since this releaseCut 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