A SvelteKit-based census data collection and admin review system.
- Collects family census submissions from a public form.
- Stores family + person records in PostgreSQL via Drizzle ORM.
- Provides an admin-only console for reviewing pending submissions, approving/rejecting records, editing records, and deleting approved family records.
- Protects admin routes with Better Auth + an email allowlist.
- SvelteKit 2 + Svelte 5
- Vite 7
- Tailwind CSS 4
- Better Auth (email/password)
- Drizzle ORM + Drizzle Kit
- Neon PostgreSQL driver (
@neondatabase/serverless) - Zod + SvelteKit Superforms
- Node.js (LTS)
- npm
- PostgreSQL database (Neon or any compatible Postgres instance)
Create a .env file in the project root.
DATABASE_URL: Postgres connection string used by the app and Drizzle.ADMIN_EMAILorADMIN_EMAILS: Admin allowlist (ADMIN_EMAILSis a comma-separated list).
BETTER_AUTH_SECRETBETTER_AUTH_URL(orBETTER_AUTH_BASE_URL, depending on your deployment setup)
npm installApply your current schema to the configured database:
npm run db:pushOther available database commands:
npm run db:generate
npm run db:migrate
npm run db:studionpm run devThen open:
- Public census form:
http://localhost:5173/ - Admin login:
http://localhost:5173/login
Admin sign-up is restricted to emails in ADMIN_EMAIL/ADMIN_EMAILS.
Create an admin user by sending a POST request to:
POST /api/signup
Payload:
{
"name": "Admin User",
"email": "admin@example.com",
"password": "your-strong-password"
}After signup, log in via /login with username/email + password.
/- Public census submission form/login- Admin login/admin/approval- Pending submissions queue/admin/approval/[id]- Review/edit a pending submission/admin/details- Approved submissions list/admin/details/[id]- View/edit/delete an approved submission/logout- Admin sign-out endpoint
npm run dev- Start dev servernpm run build- Production buildnpm run preview- Preview production buildnpm run check- Type + Svelte checksnpm run check:watch- Checks in watch modenpm run db:push- Push schema to DBnpm run db:generate- Generate SQL migrationsnpm run db:migrate- Apply migrationsnpm run db:studio- Open Drizzle Studio
- Admin pages are protected by server-side session checks in
src/routes/admin/+layout.server.ts. - If no admin allowlist is set, admin login/signup is disabled by design.