This file provides guidance to WARP (warp.dev) when working with code in this repository.
MUNify DELEGATOR is a registration and organization management system for Model United Nations conferences. Built with SvelteKit 2, it handles delegation registration, assignment, and management workflows for MUN conferences.
Tech Stack: SvelteKit 2 (Svelte 5 runes mode), TypeScript, Prisma ORM (PostgreSQL), GraphQL (Pothos + Yoga), Tailwind CSS 4 + DaisyUI, Houdini (GraphQL client), Paraglide (i18n)
# Install dependencies
bun install
# Start full dev environment (Docker services + dev server)
bun run dev
# OR run separately:
bun run dev:docker # Start PostgreSQL and other services
bun run dev:server # Start SvelteKit dev server with Vite
# Install git hooks for automated linting
bunx lefthook install# Migrate database to latest schema
bunx prisma migrate dev
# Reset database (WARNING: deletes all data)
bunx prisma migrate reset
# Seed database with development data
bun prisma/seed/dev/seed.ts
# Open Prisma Studio (database GUI)
bun run studio# Format code
bun run format
# Lint (runs both prettier check and eslint)
bun run lint
# Type check
bun run typecheck
# Svelte type checking
bun run check
# Continuous type checking
bun run check:watch# Build for production
bun run build# Add new translation key
bun run add-translation
# Machine translate missing keys
bun run machine-translate-
src/routes/- SvelteKit file-based routing(authenticated)/- Protected routes requiring authenticationdashboard/[conferenceId]/- Participant-facing conference dashboardmanagement/[conferenceId]/- Admin conference management UIregistration/[conferenceId]/- Registration flows (delegation, individual, supervisor)assignment-assistant/- Committee assignment tooling
api/graphql/- GraphQL API endpointauth/- OIDC authentication flows
-
src/api/- GraphQL API implementationresolvers/- Pothos GraphQL resolvers organized by entityabilities/- CASL permission definitions per entitycontext/- Request context (OIDC, permissions)services/- Business logic services
-
src/lib/- Shared utilitiescomponents/- Reusable Svelte componentsqueries/- Houdini GraphQL queries/mutationsservices/- Frontend servicesschemata/- Zod validation schemasdb/- Database utilitiesparaglide/- Generated i18n code
-
src/tasks/- Background tasks (email sync, conference status updates) -
prisma/- Database schema, migrations, and seed scriptsschema.prisma- Main database schemamigrations/- Database migration historyseed/dev/- Development seed scripts
- Schema Generation: Pothos schema builder with Prisma plugin generates GraphQL schema from Prisma models
- Resolvers: Organized by entity in
src/api/resolvers/modules/(e.g.,conference.ts,delegation.ts) - Auto-generated CRUD:
prisma-generator-pothos-codegencreates base CRUD operations - Server: GraphQL Yoga serves the API at
/api/graphql
- Houdini Client: Type-safe GraphQL client with automatic cache management
- Code Generation:
houdini.config.jswatches schema and generates TypeScript types - Queries: Store queries in
src/lib/queries/for reuse across components - Load Functions: SvelteKit
+page.tsfiles use Houdini queries for SSR/CSR data loading
- OIDC Integration: Uses OpenID Connect (recommended: Logto, but supports any OIDC provider)
- Context Building:
src/api/context/context.tsconstructs request context with OIDC data - Permission System: CASL ability-based authorization
- Definitions in
src/api/abilities/entities/ - Admins get full access, team members get scoped access based on roles
- Roles:
admin,PROJECT_MANAGEMENT,PARTICIPANT_CARE, etc.
- Definitions in
- Prisma Models: Single source of truth in
prisma/schema.prisma - Generators: Three generators run on schema changes:
@prisma/client- TypeScript clientprisma-pothos-types- Pothos integration typesprisma-generator-pothos-codegen- Auto-generated resolvers
- Migrations: All schema changes must create migrations (
bunx prisma migrate dev)
- Paraglide.js: Compile-time i18n with URL-based locale switching
- Message Files: JSON files in
messages/directory per locale - Middleware:
hooks.server.tsusesparaglideMiddlewareto set locale from URL
- Tailwind CSS 4: Utility-first styling with DaisyUI component library
- Svelte 5 Runes: Uses modern runes mode (
$state,$derived,$effect) - Houdini Integration:
houdini-svelteplugin provides reactive stores
- Conference States:
PRE→PARTICIPANT_REGISTRATION→PREPARATION→ACTIVE→POST - Delegations: Groups of participants representing countries
- Single Participants: Individuals applying for custom roles
- Committee Assignment: Matching delegations to nations in committees
- Background Tasks:
src/tasks/contains scheduled jobs (mail sync, status updates)
After modifying prisma/schema.prisma:
- Run
bunx prisma migrate devto create migration - Run
bun prisma/seed/dev/seed.tsto seed test data - Use Prisma Studio (
bun run studio) to verify data structure
-
Environment Variables: Copy
.env.exampleto.envand configure:DATABASE_URL- PostgreSQL connection stringPUBLIC_OIDC_AUTHORITY- OIDC provider URLPUBLIC_OIDC_CLIENT_ID- OIDC client identifierSECRET- Session encryption keyCERTIFICATE_SECRET- Certificate signing key (generate withopenssl rand -base64 32)
-
Aliases: Configured in
svelte.config.js:$api→src/api$assets→src/assets$db→prisma$config→src/config$houdini→.houdini
- Schema Changes: Edit
prisma/schema.prisma→ run migrations → regenerate GraphQL schema - API Changes: Modify resolvers in
src/api/resolvers/modules/→ schema regenerates automatically - Frontend Changes: Edit Svelte components → Vite hot-reloads
- Adding GraphQL Operations: Create
.gqlfiles or usegraphql()function → Houdini generates types - Permission Changes: Edit ability files in
src/api/abilities/entities/
Follow Conventional Commits:
feat:- New featurefix:- Bug fixrefactor:- Code restructure without behavior changestyle:- UI/UX changesdocs:- Documentationtest:- Testschore:- Maintenanceci:- CI/CD changesbuild:- Build system changesperf:- Performance improvements
Example: feat(delegation): add nation preference selection
Use provided Docker images: deutschemodelunitednations/delegator
- Example compose file in
example/directory - Requires external OIDC provider (Logto recommended)
- Environment variables must be configured (see
.env.example)