GalaGate is being rebuilt as a real-time event operations platform for student organizations and community events.
The v2 direction covers:
- Event setup
- Attendee import and management
- Staff check-in
- Live raffle display
- Sponsor asset management
- Post-event analytics
- AI-generated event recap reports
See the implementation plan in docs/galagate-v2-technical-plan.md.
apps/web/ GalaGate v2 Next.js application
Backend/ Legacy Flask prototype
CheckIn/ Legacy Next.js check-in prototype
Lottery/ Legacy Nuxt raffle display prototype
docs/ Planning and technical documentationThe legacy folders are kept as reference while v2 is rebuilt in apps/web.
Use Node.js 20+ and pnpm 10+.
pnpm install
pnpm devThe v2 app runs at http://localhost:3000.
Useful commands:
pnpm lint
pnpm typecheck
pnpm buildGalaGate v2 uses PostgreSQL and Prisma.
Start the local database after Docker Desktop is running:
docker compose up -d postgres
pnpm db:push
pnpm db:seedPrisma commands:
pnpm db:generate
pnpm db:migrate
pnpm db:studioThe local default database URL is:
postgresql://galagate:galagate@localhost:5433/galagateCopy .env.example to .env.local before running database or auth flows locally.
cp .env.example .env.localAI Event Recap Report uses the OpenAI Responses API. Set OPENAI_API_KEY before generating reports.
The organizer dashboard uses Auth.js credentials during local development.
Default credentials:
Email: junyu@example.com
Password: galagate-devThe protected dashboard is available at http://localhost:3000/dashboard.
Event management routes:
/dashboard/events
/dashboard/events/new
/dashboard/events/[eventId]
/dashboard/events/[eventId]/settingsAttendee management routes:
/dashboard/events/[eventId]/attendees
/dashboard/events/[eventId]/attendees/new
/dashboard/events/[eventId]/attendees/import
/dashboard/events/[eventId]/attendees/exportStaff check-in route:
/dashboard/events/[eventId]/check-in
/dashboard/events/[eventId]/check-in/walk-inWalk-in guests can be created during staff check-in. A walk-in record creates an attendee with source = WALK_IN and immediately writes a check-in record. Email is optional for walk-ins if a phone number is provided.
Realtime updates:
- The local dev server runs through
apps/web/server.ts. - Socket.IO clients join an event room by
eventId. - Staff check-in writes to PostgreSQL first, then broadcasts
check-in:created. - Event detail, attendees, and check-in pages refresh when a check-in event is received.
Raffle routes:
/dashboard/events/[eventId]/raffle
/dashboard/events/[eventId]/raffle/prizes/new
/stage/[eventId]Raffle drawing uses checked-in attendees where lotteryEligible = true and excludes anyone who has already won a prize for the event.
The stage display listens for raffle:winner-drawn events over Socket.IO and reveals the latest winner in fullscreen-friendly layout.
Stage display access requires the event stageToken; use the Stage display link from the raffle control page instead of opening the stage route manually.
Sponsor routes:
/dashboard/events/[eventId]/sponsors
/dashboard/events/[eventId]/sponsors/new
/dashboard/events/[eventId]/sponsors/[sponsorId]/editSponsors can be linked to raffle prizes. The stage display shows active sponsor names, tiers, optional logos, and display copy.
Analytics route:
/dashboard/events/[eventId]/analyticsAnalytics are computed from database aggregations and summarize attendance, check-in timeline, ticket type distribution, raffle activity, sponsors, and attendee sources. The same aggregation service is designed to feed the AI Event Recap Report input.
AI Event Recap Report routes:
/dashboard/events/[eventId]/reports
/dashboard/events/[eventId]/reports/new
/dashboard/events/[eventId]/reports/[reportId]Recap generation uses structured output validation. The model receives aggregated event analytics only, saves the generated report as DRAFT, and lets the organizer review and edit markdown before saving the report as SAVED. Failed generations are logged in AiGenerationLog without creating a broken report.
CSV import supports these headers:
fullName,email,phone,ticketType,ticketCode,lotteryNumber,lotteryEligible,notesA demo CSV fixture is available at:
apps/web/prisma/fixtures/demo-attendees.csvOverride credentials in .env.local:
NEXTAUTH_SECRET="replace-with-a-long-random-secret"
NEXTAUTH_URL="http://localhost:3000"
DEV_AUTH_EMAIL="junyu@example.com"
DEV_AUTH_PASSWORD="galagate-dev"Set OPENAI_API_KEY before using AI Event Recap Report generation.