This is the modernized version of the personal website with App Router, TailwindCSS, shadcn/ui, React Hook Form + Zod, i18n, and dark/light mode.
Requires Node.js 22 (see .nvmrc).
pnpm install
pnpm devCopy .env.example to .env.local and fill in values.
Required:
NEXT_PUBLIC_G_TAG(Google Analytics)GITHUB_TOKEN(read-only token for GitHub blog content)SUPABASE_URLSUPABASE_SECRET_KEY(preferred) orSUPABASE_PUBLISHABLE_KEYwith RLS enabledPOSTMARK_SERVER_TOKENPOSTMARK_FROMPOSTMARK_TO
Optional:
POSTMARK_MESSAGE_STREAMDEFAULT_REVALIDATE
Schema + RLS are managed with Supabase CLI migrations in supabase/migrations.
Apply migrations:
supabase link --project-ref <your-project-ref>
supabase db pushThe initial migration creates the comments table and RLS policies for read/insert.
- Deploys: Use Vercel GitHub integration (no deploy workflow required).
- Supabase migrations: GitHub Actions workflow
.github/workflows/supabase-migrate.yml.
Required GitHub secrets:
SUPABASE_ACCESS_TOKENSUPABASE_PROJECT_REFSUPABASE_DB_PASSWORD
Manual run:
npx supabase link --project-ref <project-ref>
npx supabase db pushLegacy sites are available under /archive/2019 and /archive/2021.