Performance scheduling and signup tool for choral groups.
Frontend: Next.js (App Router) with Tailwind and FullCalendar.
Backend: Express + Prisma + Passport (session-based auth) with officer-only event creation and voice-part quotas.
- frontend/ — Next.js 14 application
- Calendar (
/calendar) - Event detail + signup (
/events/[id]) - Login (
/login) - Dashboard redirect
- “My Signups” (
/my-signups) - Axios client configured to point to the backend API
- Calendar (
- backend/ — Express API using Passport Local Strategy, session authentication, and Prisma ORM for PostgreSQL
- backend/prisma/schema.prisma — Models for:
UserEventQuotaSignup
- Node.js 18+ and npm
- PostgreSQL database
- Two terminals (or a process manager) to run frontend and backend in parallel
- Backend
.envfile (see below)
DATABASE_URL=postgresql://USER:PASSWORD@HOST:PORT/DBNAME
SESSION_SECRET=your-session-secret
OFFICER_SECRET=shared-secret-for-officer-registration
Frontend API base URL is configured in:
frontend/lib/api.ts
Default:
http://localhost:4000
Change if your backend host or port differs.
cd backend
npm install
npx prisma migrate deploy # or `npx prisma db push` for development
npm run dev # serves http://localhost:4000cd frontend
npm install
npm run dev # serves http://localhost:3000The root route redirects:
- to
/loginwhen unauthenticated - to
/dashboardwhen logged in
- Email/password authentication with sessions
/auth/login,/auth/me,/auth/logout
- Officer registration via secret (
/auth/register-officer) - Member self-registration (
/auth/register) - Event creation (officers only)
- Voice-part quotas per event
- Signup tracking with automatic quota increments
- Calendar view (FullCalendar)
- Event detail page with signup form
- Personal signup list (“My Signups”)
Start the backend first, then the frontend:
- API:
http://localhost:4000 - Web:
http://localhost:3000
npm run devnpm run buildnpm start
npm run devnpm run buildnpm startnpm run lint