Architecture
Layers
- UI: Next.js App Router with React Server Components; marketing, auth, dashboard, blog, changelog, legal.
- APIs: Route handlers under
src/app/api/*for checkout, billing portal, downloads, GitHub access, webhooks, and OG images. - Server actions: Auth and dashboard actions for Supabase-backed reads/writes.
- Domain libs: Payments (
lib/payments), access control (lib/access), email (lib/email), license management (lib/license), SEO (lib/seo), rate limiter (lib/rate-limit), GitHub collaborator helper (lib/github). - Data: Supabase Postgres tables for subscriptions, one-time purchases, payment history, profiles, license keys, download history; Storage buckets for downloads and avatars.
- Integrations: Stripe (billing), Resend (email), PostHog (analytics), GitHub (collaborator access).
Request flows
- Marketing → Checkout: Landing pricing buttons POST to
/api/checkout_sessions→ Stripe Checkout with plan metadata → redirect to success; cancellation returns to marketing. - Webhook sync:
/api/webhooks/stripeverifies signature, upsertsuser_subscriptions/one_time_purchases/payment_history, mints license keys, and optionally sends purchase emails + PostHog events. - Downloads:
/api/downloadenforces Supabase auth + license validity, checks plan (Standard blocksversion=latest), generates a signed Storage URL, and records download history. - GitHub access:
/api/github-accesslets Ultimate users request collaborator invites via GitHub API and storesgithub_username. - Dashboard: Client-side context fetches profile + subscription via server actions, gated by Supabase session (middleware/proxy).
Access control
- Middleware (
lib/supabase/middleware) refreshes sessions, redirects unauthenticated users away from/dashboard, and prevents authed users from hitting auth routes. lib/access.tscentralizes checks: one-time purchase, lifetime, trialing/active subscription, feature gating by plan, and admin variants bypassing RLS.
SEO & OG
- Config in
lib/seo/config.ts; helpers for metadata and JSON-LD; dynamic OG images at/api/ogand/api/og/blog.
Analytics
- PostHog client/provider (disabled in development or without key).
- Server helpers to capture/identify events and track subscription outcomes.