Payload 3 admin CMS, deployed on Vercel, backed by Turso (libSQL) and Vercel Blob.
- Payload 3.83 + Next.js 16 (App Router)
- Turso (libSQL) via
@payloadcms/db-sqlite - Vercel Blob for media uploads
- Resend for outbound email (wrapped with Sentry error capture)
- Sentry for error + performance monitoring
- Plugins: MCP, Redirects, Search, SEO, Sentry
Users— admins with local-strategy auth + optional API keysServiceAccounts— API-key-only accounts for bots/integrationsMedia— Vercel Blob-backed uploadsEvents,Rsvps,Emails— events + email blastsHackNightSessions— hack night contentShelterProjects,Ugrants— public-facing project showcases
bun install
cp .env.example .env # fill in secrets
bun run devFor local dev against a file-backed SQLite, set TURSO_DATABASE_URL=file:./dev.db and leave TURSO_AUTH_TOKEN empty.
See .env.example. Required for production:
| Variable | Purpose |
|---|---|
PAYLOAD_SECRET |
Payload JWT/session signing |
TURSO_DATABASE_URL |
libsql://…turso.io connection URL |
TURSO_AUTH_TOKEN |
Turso DB auth token |
BLOB_READ_WRITE_TOKEN |
Vercel Blob token (auto-set on Vercel) |
RESEND_API_KEY |
Resend API key for transactional email |
SENTRY_DSN |
Server-side Sentry DSN |
NEXT_PUBLIC_SENTRY_DSN |
Client-side Sentry DSN |
SENTRY_AUTH_TOKEN |
Source-map upload token (Vercel CI only) |
turso db create purdue-hackers-cms
turso db show purdue-hackers-cms --url
turso db tokens create purdue-hackers-cmsAdd TURSO_DATABASE_URL and TURSO_AUTH_TOKEN to Vercel env (vercel env add).
- Generate a new migration:
bun run migrate:create <name> - Apply migrations:
bun run migrate - The initial baseline lives at
src/migrations/20260421_050103_initial.ts.
The build runs migrations via the ci script: payload migrate && bun run build. Set Vercel's build command to bun run ci.
vercel link
vercel env pull .env
vercel deploy --prodstrictNullChecksis off to keep the ported hook code compiling. Treat nullable fields defensively in new code.- The MCP plugin registers a
payload-mcp-api-keysauth collection automatically — role-based access helpers insrc/collections/auth-utils.tsignore non-role-bearing user types.