✅ Live — merged 3ae9684 (merge 9a8eda4), deployed. Theme stays on occasion change (themeTouched flag); default only applies until you pick a theme. Verified build green. Not closing — m…
✅ Live — merged 3ae9684 (merge 9a8eda4), deployed. Own 💌 favicon: /favicon.ico + /static/favicon.svg now served by the app (200 image/svg+xml, no longer Shlink's), link tags in all…
Admin session less annoying — TTL 12h → 30 days (sliding)
Per m's 'not annoying' note, the admin session in internal/server/adminauth.go was a short 12h. Bumped to 30 days, sliding:
-…
Fixed ✅
Changing the occasion no longer overwrites an explicitly chosen Farbwelt.
Approach (cleanest variant from the issue): a themeTouched flag in the compose JS. It starts false;…
Done ✅ — tightened header → form gap
CSS only. The gap under the brand header was driven by .card { margin-top: 1.25rem } plus the unstyled <header> flow.
- Added `header { margin-botto…
Done ✅ — own 💌 favicon
The app now serves its own love-letter favicon instead of falling through to Shlink's.
- Added
web/static/favicon.svg— a warm envelope-with-heart in the app's…
✅ Merged & deployed — admin overview live (gated)
Merged a5f353a (merge 13261ce), deployed. otto-head set ADMIN_PASSWORD in Dokploy env + added PathPrefix(/admin) to the live Traefik…
#19 — admin overview shipped (read view + delete)
Branch mai/hermes/issue-19-feat-admin, commit [a5f353a](https://mgit.msbls.de/m/postcards/commit/a5f353aa0ff9523c8d7460249ecd913f93434…
✅ Merged & deployed — live preview live on sendmy.cards
Merged 445ad45 (merge 7c4e39c), deployed. Frontend-only (compose JS + CSS, no schema). A live card preview now sits at the bottom…
#15 erledigt — Live-Vorschau am Ende von /compose
Die Karte wird jetzt ganz unten im Compose-Formular live aufgebaut und aktualisiert sich, während man tippt/auswählt.
Was umgesetzt…
Auth UX (m, PWA): well-protected but NOT annoying — m must not re-enter the password every time.
- Admin password (
ADMIN_PASSWORDenv) for the initial login, then a **long-lived signed…
✅ 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…