Wedding planning · build status
A Hungarian-first wedding planner on top of a supplier marketplace. The ledger below is the authority; this page is generated from it.
V1 – V24 · 27 slices
18 complete · 4 in progress · 5 not started
| Slice | Name | Status | The ledger’s note |
|---|---|---|---|
| Cross-product couplings and the site | |||
| V1 | Foundation | complete | Next 15 App Router on Cloudflare Workers via OpenNext, Drizzle, Neon Postgres, Wrangler deploy. Five custom domains on one Worker |
| V2 | Identity and sessions | complete | identity.user, identity.session, hashed session tokens, actorForWedding resolving owner or collaborator |
| V3 | Authorisation | complete | @vela/auth can() over typed resources. Every server action re-checks — a page's check is not inherited |
| V4 | Copy catalogue | complete | content.message is the render-time source of truth, not the seed files. ICU MessageFormat, market-scoped keys, machine status renders |
| V5 | Hungarian couple lens | complete | Every non-operator surface localised. 1 314 keys, 1 169 messages |
| V6 | Couple overview and plan | complete | Countdown, health signals with a severity reduce, task timeline |
| V7 | Guests and households | complete | Households that split, plus-ones, child/infant/adult, side, dietary |
| V8 | RSVP | complete | Tokenised per-household links, no login, Hungarian-first |
| V9 | Invitations | complete | Compose, send, track. Real mail through the Worker |
| V10 | Seating | complete | Tables, drag-and-drop assignment, per-guest seating so a household can split, printing, capacity fit at 90% = tight |
| V11 | Accommodation | complete | Room blocks held not booked; release date is the loudest thing on the page. StayProvider seam for RateHawk / Booking.com |
| V12 | Marketplace (in-wedding) | partial | Venues and suppliers by region, photos, demo labelling on the row. Session-gated — no public surface exists |
| V13 | event.clinic directory client | complete | @vela/directory, three-state result (ok with items / ok empty / unavailable). Shape-checked, not cast |
| V14 | Enquiry flow | complete | Couple → supplier enquiry. Demo listings refuse at the write, not only in the UI |
| V15 | Supplier reply | partial | Tokenised link matching event.clinic's method: written reply, yes/no on the date, price range, visit date, attachments. No supplier inbox, so seen and replied are unreachable states |
| V16 | Enquiry email | complete | Brevo-backed send so the reply link actually arrives |
| V17 | Budget | complete | Four kinds kept apart, spend rows always add, per-category rollup, uncosted categories named. Verified at 4 690 000 Ft against the database |
| V18 | Astro site typecheck | complete | @astrojs/check had never once run — neither it nor typescript was installed. 7 errors found and fixed; astro check now gates verify |
| V19 | Couple-lens leak harness | complete | Drives the real server, signs in, sweeps rendered HTML for professional vocabulary. Coverage guard fails by name if a route is unswept |
| V20 | Revenue model | schema only | billing: vendor accounts, plans, subscriptions, agreements, placements, credit ledger, one append-only revenue_event. Nothing reads or writes it yet |
| V21 | Public marketplace | not started | The SEO surface and the whole acquisition story. Own route group — app/(marketing)/ belongs to another batch |
| V22 | Taxonomy expansion | not started | 14 → ~28 categories, market-scoped. Missing: szertartásvezető, vőfély, anyakönyvi hivatal, meghívó, nászút, ruha, táncoktatás |
| V23 | Accept a quote | not started | Where four axes of the mesh meet: fills a need, closes a task, writes a budget commitment, accrues commission. Highest-value thing outstanding |
| V24 | Supplier inbox | not started | Without it V15 cannot complete and lead credits cannot be metered |
| V-EC | event.clinic directory | partial | Real venues now published, but venue_type, capacity_max_pax and overview are null on every row — their plan is import-first-then-AI. VELA can show geography and photographs only until Phase B |
| V-SITE | Marketing site (apps/site) | complete | Astro, 15 pages, 78 tests, font-coverage and HTML checks in verify |
| V-MKTG | In-app marketing routes | not started | app/(marketing)/ is owned by a separate batch. Hands off |
scripts/
that exits 0 against the code as committed; a slice whose script has not
exited 0 in a single run is not complete here, whatever else was built.
pnpm verify does NOT run the couple-lens leak sweep — that needs a running server and a local database, and it refuses a remote URL because it mints a session.
pnpm verify
# 1 · the app (Next dev; pick a free port) cd ~/Documents/wedding/vela/apps/app && DATABASE_URL="postgresql://localhost:5433/vela_dev" pnpm exec next dev -p 5185 # 2 · marketing site (optional) cd ~/Documents/wedding/vela/apps/site && pnpm dev # prove the tree before believing any status above cd ~/Documents/wedding/vela && pnpm verify # sweep the couple lens for English leaks and non-200s DATABASE_URL="postgresql://localhost:5433/vela_dev" VELA_BASE_URL="http://localhost:5185" pnpm --filter @vela/app verify:couple-lens
Every couple route needs a signed-in session AND a wedding id, which is exactly the problem V21 exists to fix. Reach them by seeding (pnpm db:seed) and signing in as couple@vela.example; the ids below come from wedding.wedding_project.