Build MVP: virtual postcard web app (mobile-first) #1
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
A virtual-postcard web app. A sender composes a postcard (text message + images) and gets a unique shareable URL per recipient. Opening that URL renders the postcard (gallery or simple onepager layout). Mobile-first is a hard requirement, not an afterthought.
Provisional name postcards — final name/domain is still being chosen by m (candidates:
grues.se(favourite),gruessdich.com,winkepost.de). Do not block the build on the domain and keep the repo/name easily renamable (no hardcoded domain strings — read base URL from env/config).MVP scope
Stack (m's conventions)
msupabaseon mlake) with a dedicatedpostcardsschema — match the pattern used by fdbck/flexsiebels. Do not stand up a new database.~/dev/web/.Constraints / notes
m/postcards, local path~/dev/web/postcards, sibling under~/dev/web/like fdbck.Definition of done (MVP)
mai/otto-wawhen there's something showable so it can be relayed to m on his WhatsApp thread.Kicked off via otto-wa delegation from m (WhatsApp).
✅ MVP gebaut & verifiziert (shift-1)
Die virtuelle Postkarten-App ist end-to-end fertig und getestet.
Commit:
d2b6dd0544Branch:
mai/hermes/build-mvp-virtual(push)Flow (alle Punkte der DoD)
Stack (nach m's Konventionen)
net/http, Go-1.22-Router) — eine statische Binary, Templates + CSS viaembedpostcards-Schema (auto-migriert beim Start, idempotent)postcards, public; wird bei Bedarf automatisch angelegt). Zusätzlichlocal-Filesystem-Backend für die EntwicklungDockerfile(multi-stage) +docker-compose.ymlcommitted; Traefik-Labels als Template (Domain folgt)Wichtige Eigenschaften
crypto/rand→ base64url-Token (kein sequentielles ID)BASE_URLaus env ist die einzige Stelle. Domain-Binding ist ein 1-Zeilen-Change (POSTCARDS_DOMAINsetzen + Traefik-Labels einkommentieren)compose/Postkarten-Seiten sindnoindexVerifiziert
image/png), Render-Seite zeigt Nachricht/Empfänger/Absender/Share-Link, 404 bei unbekanntem Tokengo build/go vet/go testgrün (Unit-Tests für Token + Config)docker buildok + Container-Smoke-Test (startet, migriert,/health200)Offen (bewusst out-of-MVP / m's Entscheidung)
grues.se/gruessdich.com/winkepost.de) — Build nicht blockiert, jederzeit setzbarDATABASE_URL/SUPABASE_*in Dokploy-Env setzen, dann deploybarLäuft. Wird an
mai/otto-wazur Weiterleitung an m gemeldet.Merged to
mainand pushed: https://mgit.msbls.de/m/postcards/commit/8fb736cHead review before merge:
go build/go vet/go testall green from a clean checkout; token generation confirmed unguessable (128-bitcrypto/rand, base64url). MVP is mergeable and complete per the DoD.Not closing the issue (m closes). Open next steps remain m's call: final domain pick + Dokploy deploy (env secrets
DATABASE_URL/SUPABASE_*).🚀 Deployed & live: https://post.msbls.de
Deployed by otto-head per m's call (via otto-wa).
Setup: own Dokploy Application on mlake (
appName postcards-msbls-de), Gitea sourcem/postcards@main, Dockerfile build. Domainpost.msbls.de(wildcard*.msbls.de→ mlake, Let's Encrypt cert). Wired to shared msupabase:postcardsPostgres schema (DATABASE_URL→ pooler100.99.98.203:6789) + Supabase Storage bucketpostcardsviahttps://supa.flexsiebels.de.BASE_URL=https://post.msbls.de.Verified end-to-end over HTTPS: landing 200 (valid cert) → compose (text + image upload) → persist → unguessable
/c/{token}→ rendered postcard with image from Supabase Storage; unknown token → 404. Test postcard cleaned up afterwards (0 rows, empty bucket).Renamable: when m picks a final vanity domain, it's add-domain-in-Dokploy + set
BASE_URL— no rebuild.post.msbls.deis the home until then.One fix during deploy: first boot crash-looped — the
postcardsschema had been created under thesupabase_adminrole during shift-1 build-verification, so the app'spostgresrole lacked CREATE on it (migration runs every boot). Transferred schema + table ownership topostgres; clean since.