Building it, every day.
A daily log of building this in public. Each entry is what shipped that day. The repo's private until v1 lands, but every architectural decision is here.
-
Editor top bar + billing portal + this page
- Owners get a top bar: view site, manage billing, sign out
- Stripe Customer Portal wired at /api/stripe/portal
- Privacy notice + this changelog page
- GitHub Actions CI — every push runs the test suite
-
Scraper + admin lead tool + public /start
- Linktree extractor (parses __NEXT_DATA__, falls back to DOM)
- Generic landing-page extractor (cheerio + OG/meta tags)
- OKLAB palette derivation in Node (mirrors the CSS color-mix)
- Admin /app/admin/leads — paste URL, get a preview link to send
- Public /start — same form, prospect-initiated, IP rate-limited
- Test suite: 26 tests passing (unit + live smoke)
-
Editor — React island with live preview
- shadcn admin scoped to /app/me, owner-only via Supabase session
- Form panel + live preview iframe, 1s debounce on edits
- POST /api/config/patch — Zod-validated, audit_log diff written
- postMessage refresh from parent to iframe on each save
-
Self-serve claim flow
- Stripe Checkout via the claim banner
- Webhook handles checkout.session.completed + subscription.updated/deleted
- Atomic tenant activation: status → active, user created, magic link sent
- Resend transactional email with editorial template
- Auth callback exchanges code for session, redirects to /app/me
-
DB-backed slug routing + status branching
- Public [slug] route reads from Supabase + Zod-validates before render
- Four render branches: preview / active / past_due / canceled
- Per-tenant theme via inline CSS vars; OKLAB palette derives at render
- JSON-LD schema.org emission per tenant
- Seeded 3 demo tenants across verticals (restaurant, salon, fitness)
-
Template — editorial color-saturated minimalism
- Fraunces + Inter Tight, OKLAB-derived 5-step palette per tenant
- 7 section types (Hero, About, Hours, Contact, Links, PricedList, Schedule)
- Asymmetric layouts, pill UI vocabulary, no stock-photo dependence
- Demo pages for restaurant + salon to stress the system across hues
-
Foundation
- Astro 5 SSR + Tailwind 4 + React (for shadcn islands) + Vercel adapter
- Supabase + Drizzle, 7 tables with RLS enabled on every one
- Service-role-only-on-server enforced by a pre-commit grep guard
- Initial migration: tables, RLS policies, storage bucket, rate-limit fn