Make school easier, organized, and genuinely engaging. See claude.md for the full product spec
and roadmap.md for the phased build order and progress.
Live: https://schoolify-blond.vercel.app
Next.js 15 (App Router) + TypeScript, Tailwind + shadcn/ui, PostgreSQL via Prisma, Clerk for auth, deployed on Vercel.
Prerequisites: Node 22+, Docker Desktop (for local Postgres).
docker compose up -d # starts local Postgres on localhost:5432
npm install
npx prisma migrate dev # applies the schema
npm run dev # http://localhost:3000The app will build and the database will work locally without any external accounts. Auth (Clerk) requires the account setup below before sign-in/sign-up actually function.
Three external services need accounts before the app is fully functional. None of this can be done by an agent — each requires signing in as you.
-
Create a free app at dashboard.clerk.com.
-
Copy the Publishable key and Secret key into
.env:NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="pk_..." CLERK_SECRET_KEY="sk_..." -
In the Clerk dashboard, add a webhook endpoint pointing at
https://<your-deployed-domain>/api/webhooks/clerk(once deployed — see below), subscribed touser.created,user.updated,user.deleted. Copy the Signing secret into.envasCLERK_WEBHOOK_SIGNING_SECRET. This is what keeps ourUsertable in sync with Clerk; without it, the dashboard will show "waiting on the Clerk webhook to sync."To test this locally before deploying, use the Clerk CLI's tunnel instead of a real domain:
clerk webhooks listen --forward-to http://localhost:3000/api/webhooks/clerkIt prints a
https://webhooks.clerk.com/in/c_.../relay URL — add that as the dashboard endpoint (steps above) to get a local signing secret.
- Create a free database at neon.com or supabase.com.
- Copy the connection string into
DATABASE_URL(in Vercel's environment variables when you deploy — see below). - Run
npx prisma migrate deployagainst it once, to create the schema.
- Push this repo to GitHub (already done if you're reading this from the repo).
- Import the repo at vercel.com/new.
- Add the environment variables from
.env(Clerk keys + webhook secret, and the managedDATABASE_URLfrom step 2) in the Vercel project settings. - Deploy. Update the Clerk webhook URL (step 1.3) to point at the real deployed domain.
.github/workflows/ci.yml runs lint, typecheck, a Prisma migration check, and a production
build against a throwaway Postgres service on every push — no account setup needed for CI itself.