Complete wedding + baptism website with personalized guest links, Supabase, and Resend email.
| Layer | Service | Cost |
|---|---|---|
| Hosting + API | Vercel | Free |
| Database | Supabase Cloud | Free |
| Resend | Free (3k/month) | |
| Domain | foreverasanin.com | Already owned |
foreverasanin/
├── pages/
│ ├── index.js ← Main website (exact original design)
│ ├── [slug].js ← Personalized guest page (e.g. /mueller)
│ ├── 404.js ← Branded 404
│ └── api/
│ ├── rsvp.js ← RSVP handler (Flow A + B)
│ ├── guest/[slug] ← Guest data lookup
│ └── send-invites ← Victoria's one-click email blast
├── lib/
│ ├── supabase.js ← Supabase client
│ └── email.js ← Resend email templates
├── styles/
│ └── globals.css
├── supabase-schema.sql ← Run this in Supabase SQL editor
└── .env.local.example ← Copy to .env.local and fill in
- Go to supabase.com → Create account → New project
- Choose region: Europe (Frankfurt) — closest to Belgrade
- Wait for project to spin up (~2 min)
- Go to SQL Editor → paste contents of
supabase-schema.sql→ Run - Go to Project Settings → API → copy:
Project URL→NEXT_PUBLIC_SUPABASE_URLanon publickey →NEXT_PUBLIC_SUPABASE_ANON_KEYservice_rolekey →SUPABASE_SERVICE_ROLE_KEY
- Go to resend.com → Create account
- Go to Domains → Add
foreverasanin.com - Add the DNS records they show you (usually 3 TXT records)
- Wait for verification (usually ~5 min)
- Go to API Keys → Create key → copy it →
RESEND_API_KEY
- Push this project to GitHub
- Go to vercel.com → Import repository
- Go to Settings → Environment Variables → add all from
.env.local.example:NEXT_PUBLIC_SUPABASE_URL NEXT_PUBLIC_SUPABASE_ANON_KEY SUPABASE_SERVICE_ROLE_KEY RESEND_API_KEY NEXT_PUBLIC_BASE_URL=https://foreverasanin.com ADMIN_SECRET=choose-a-long-random-string - Go to Domains → add
foreverasanin.com→ update DNS at your registrar
Prepare a CSV with these columns:
slug,vorname,nachname,email,tisch,personen,kinder,menu,hotel,transfer,sprache
mueller,Hans,Müller,hans@mueller.de,4,2 Personen,Keine,Standard,Nein ich habe eine Unterkunft,Nicht nötig komme selbst,de
clemencon,Jelena,Clémençon,jelena@example.com,7,4 Personen,2 Kinder,Vegetarisch,Nein ich habe eine Unterkunft,Shuttle vom Hotel,de
Import via: Supabase → Table Editor → guests → Import CSV
Then set vip = true for all imported rows:
UPDATE guests SET vip = true WHERE vip IS false;Once all guests are imported and verified, trigger the email blast:
curl -X POST https://foreverasanin.com/api/send-invites \
-H "Content-Type: application/json" \
-d '{"secret": "your-ADMIN_SECRET-here"}'Or build a simple admin page button that calls this endpoint.
- Victoria imports guest list → Supabase
- Victoria triggers
/api/send-invites - Guest receives email with link
foreverasanin.com/clemencon - Guest opens link → personal page with pre-filled data
- Guest confirms/adjusts → submits → confirmation email sent
- Guest visits
foreverasanin.com - Fills RSVP form from scratch → submits
- Slug auto-generated: e.g.
foreverasanin.com/hans-mueller-a7x2 - Saved to Supabase, confirmation email sent with personal link
- Guest can return anytime via their link
# Install dependencies
npm install
# Copy env file and fill in your keys
cp .env.local.example .env.local
# Run dev server
npm run dev
# → http://localhost:3000- Gallery — Supabase Storage + lightbox
- Guestbook — text/photo entries in Supabase
- Apple Wallet — Walletly API integration
- Live Mode — activate on July 12th, show seating plan
- Admin dashboard —
/adminpage for Victoria to see all RSVPs