✅ Merged & deployed — card-level expiration live on sendmy.cards
Merged 5efd624 (merge bc81dc4), deployed. Migration 008 applied cleanly on prod (slug_valid_until→valid_until, app…
#14 card-level expiration — done (shift-1)
Expiration is now a card-level property, settable on any card (no custom-link requirement), enforced server-side at /c/{token}.
Commit…
✅ Merged & deployed — layout regressions fixed
Merged 620069e (merge e8d6df3), deployed. CSS-only (style.css, +30/-7): section-header bleed fixed, margins consistent, „Gültig bis“ +…
Fixed — compose layout regressions (#13)
Reproduced all three issues with headless-chrome screenshots of the rendered compose form at 375 px (mobile) and 900 px (desktop), then fixed…
m's call (PWA): max-views also card-level, same as expiration — not slug-bound. So #14 covers BOTH valid_until and max_visits at card level (enforced on /c/{token}), available on any…
✅ Merged & deployed — compose UX polish live on sendmy.cards
Merged 8e931d6 (merge 9852264), deployed. Verified live:
- Unified media picker: one field, 1 PNG + 1 MP4 uploaded…
#12 done — compose UX polish (shift-1)
Branch mai/hermes/issue-12-ux-unify-media, commit 8e931d6. Not…
✅ Merged & deployed — password protection live on sendmy.cards
Merged 2118ace (merge 1e108ed), deployed. Migration 007 applied. Set a stable CARD_SESSION_SECRET in the Dokploy env (so…
#11 done — optional per-card password protection
Shipped on mai/hermes/issue-11-feat-optional (not yet merged/deployed — otto-head does that).
Commit: https://mgit.msbls.de/m/postcards…
✅ Merged & deployed — greeting-card broadening live on sendmy.cards
Merged a325d01 (merge 2354e70), deployed. Migration 006 applied. Verified live: landing now reads Grußkarte,…
#10 done — greeting-card broadening, depth (b)+Custom
Built to m's PWA decision (2026-06-16): **occasion selector (presets + free-text custom) driving copy/default-theme, persisted +…
✅ Merged & deployed — lifecycle live on sendmy.cards
Merged bd4ffde (merge 2365076), deployed. Migration 005 applied. Verified live e2e on sendmy.cards: a max_visits=1 slug → **1st…