A church for secular memory. Curated DJ mixtapes, archival video, and a daily scripture ritual — delivered through a 1995-PowerPoint-meets-Donda operating system.
- Next.js 14 (App Router)
- React 18, TypeScript
- Plain CSS (no Tailwind — the design is too disciplined for utility classes)
- Mixcloud iframe embeds for audio (no audio hosted)
- Resend for email signup (graceful fallback if no API key)
- One color: Pantone 14-4318 "Blue Atoll"
#00B7C3 - One typeface: Times New Roman (caps for display, italic for body, roman for technical)
- Brutal rigor: zero shadows, zero gradients, hard edges only
- Three sacraments: Player · Mixtapes · Daily Bread
References: Jesus Is King · Donda · Sunday Service merch.
npm install
npm run dev
# open http://localhost:3000The "Join the congregation" form uses Resend for email capture. Without env vars, the form gracefully degrades — it returns success but logs the email to console only (useful for local dev).
To turn on real capture:
- Sign up at resend.com (free tier: 3K emails/month, 100/day)
- Create an Audience in the Resend dashboard. Copy its ID.
- In Vercel project settings → Environment Variables, add:
RESEND_API_KEY— your Resend API keyRESEND_AUDIENCE_ID— the Audience ID from step 2
- Redeploy. Form is now live.
Once Resend is wired, the daily scripture send is a Vercel cron job that picks a verse and broadcasts to the audience. To wire:
- Create
app/api/cron/daily/route.tsthat callsresend.broadcasts.create() - Add to
vercel.json:(13:00 UTC ≈ sunrise EST){ "crons": [{ "path": "/api/cron/daily", "schedule": "0 13 * * *" }] } - Deploy.
Sacrament IV (the collection plate) uses Stripe Checkout for one-time gifts. Without env vars, the form gracefully degrades — clicking "give thanks" still routes through the success flow and fires the thank-you state, useful for local dev and demoing the UX.
To turn on real charging:
- Create a Stripe account at stripe.com
- From the Stripe Dashboard → API keys, copy your Secret key (starts with
sk_live_…orsk_test_…while you're testing) - In Vercel project settings → Environment Variables, add:
STRIPE_SECRET_KEY— your Stripe secret keyNEXT_PUBLIC_BASE_URL— your deployed site URL (e.g.https://sunday-os.vercel.app); used as the Stripe success/cancel return URL
- Redeploy. Offerings now charge real cards.
The success URL is /?offering=received; the modal auto-opens in thank-you mode and cleans the URL on mount. The cancel URL is /?offering=cancelled and silently returns the user to the desktop.
Stripe webhook (optional, v1.2): for guestbook of recent givers, set up a webhook on checkout.session.completed that writes the giver's name + amount to a Vercel KV / Postgres / Edge Config store. Then read on the server and render in the offering modal as a side column.
Vercel auto-deploys on push to main. Custom domain TBD.