| # Multiverse Campus β Architecture Map |
|
|
| **Source:** lizTheDeveloper/multiversecampus |
| **Mapped:** 2026-07-09 |
|
|
| --- |
|
|
| ## Stack |
|
|
| | Layer | Technology | |
| |---|---| |
| | Runtime | Node.js 20 | |
| | Language | TypeScript | |
| | Server | Express 4 | |
| | Client | React 18 + Vite 7 + Tailwind CSS 4 | |
| | State | Zustand (49 stores) | |
| | Database | PostgreSQL 16 (120 tables, 377 migrations) | |
| | Cache | Redis 7 (data + Socket.IO pub/sub) | |
| | Real-time | Socket.IO 4 (Redis adapter, PM2 cluster) | |
| | Process mgr | PM2 cluster mode (max instances) | |
| | Jobs | pg-boss 12 (durable, PostgreSQL-backed) | |
| | Queue | NATS JetStream (sprite generation) | |
| | Monorepo | npm workspaces: shared, design-system, server, client | |
|
|
| --- |
|
|
| ## Infrastructure |
|
|
| ``` |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| β cto-tycoon-hel1 (37.27.36.108, Helsinki) β |
| β βββββββββββββββ ββββββββββββ ββββββββββββ β |
| β β Coolify PaaSβ βPostgres16β β Redis 7 β β |
| β β (port 8000) β β (shared) β β β β |
| β βββββββββββββββ ββββββββββββ ββββββββββββ β |
| β βββββββββββββββ ββββββββββββ ββββββββββββ β |
| β β Campus Prod β β Campus β β Job β β |
| β β (port 4000) β β Staging β β Runner β β |
| β βββββββββββββββ ββββββββββββ ββββββββββββ β |
| β βββββββββββββββ ββββββββββββ ββββββββββββ β |
| β β School Web β β School β βVaultwardenβ β |
| β β (Flask) β β Worker β β(port 8443)β β |
| β βββββββββββββββ ββββββββββββ ββββββββββββ β |
| β βββββββββββββββ ββββββββββββ β |
| β β Marketing β β CotB β + precursors, β |
| β β Site β β Game β lore-db, etc. β |
| β βββββββββββββββ ββββββββββββ β |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| |
| ββββββββββββββββββββββββββββ βββββββββββββββββββββββββ |
| β livekit-prod β β Matrix (IPv6-only) β |
| β 204.168.199.122 β β matrix.themultiverse β |
| β Real-time audio/video β β .school β |
| ββββββββββββββββββββββββββββ βββββββββββββββββββββββββ |
| ``` |
|
|
| **Critical:** Staging and prod share the same PostgreSQL instance. Additive migrations only. |
|
|
| --- |
|
|
| ## Auth Flow |
|
|
| ``` |
| Client β Bearer JWT (15-min access / 7-day refresh) |
| β OR session cookie β Redis lookup (SSO from main school site) |
| β rejectIfIneligible() (bans/timeouts) |
| β requireAdmin / requireModerator (per-route) |
| |
| WebSocket: Socket.IO handshake.auth.token β verifyToken() |
| ``` |
|
|
| JWT signed with `JWT_SECRET` env var. Access token contains `{studentId, email}`. |
|
|
| --- |
|
|
| ## External Services |
|
|
| | Service | Purpose | Notes | |
| |---|---|---| |
| | Matrix (Synapse) | Chat | User provisioning, room mgmt, bot runtime | |
| | Stripe | Payments | Memberships, items, donations | |
| | LiveKit | Video/audio | Proximity calls, recordings | |
| | BigBlueButton | Lectures | Zeppelin lecture sessions | |
| | Groq | LLM (primary) | Default: `openai/gpt-oss-120b` | |
| | Anthropic | LLM (Claude) | Agent conversations | |
| | OpenRouter | LLM (fallback) | When direct calls fail | |
| | PixelLab | Sprite generation | AI pixel art for avatars/items | |
| | SendGrid | Email | Verification, notifications | |
| | AWS S3 | Storage | Recordings, uploads | |
| | GCP Secret Manager | Secrets (optional) | Alternative to Vaultwarden | |
|
|
| --- |
|
|
| ## AI Agent System |
|
|
| The deepest layer. Agents are first-class campus citizens. |
|
|
| **Model routing:** `modelRouter.ts` reads `llm_providers` table (5-min cache). Multi-provider: Groq β Anthropic β OpenRouter fallback. 27 services import `callLLM`. |
|
|
| **Agent services (20+):** |
| - Core: registry, cache, proxy, RAG, memory |
| - Behavior: movement, pathfinding, schedules, approach triggers, state machine |
| - Social: autonomous thinking (5-min tick), agent-to-agent conversations (10-min tick) |
| - Specialized: vision, speech, browser, code execution, companion, scripts |
| - Wellbeing: bell hooks-inspired check-ins (6-hour tick) |
|
|
| **Internal bot APIs:** `/api/internal/matrix-agents` (key-auth), `/api/internal/liz-assistant` |
|
|
| --- |
|
|
| ## Key Database Tables (120 total) |
|
|
| **Auth:** students, users, campus_profiles, refresh_tokens, auth_audit_log, user_matrix_accounts |
| **World:** maps, rooms, buildings, placed_objects, space_connections |
| **Agents:** agents, agent_capabilities, agent_conversations, agent_tool_executions, course_agent_templates |
| **Education:** classes, classtimes, exercises, exercise_submissions, lessons, modules, curriculum_pages |
| **Lectures:** lecture_sessions, lecture_transcripts, lecture_notes, lecture_slides |
| **Economy:** player_inventory, item_templates, products, purchases, membership_products |
| **LLM:** llm_providers (multi-provider config with rate limits) |
|
|
| --- |
|
|
| ## Deploy |
|
|
| Push to main β Coolify rebuild (webhook flaky β manually kick with `force=true`). |
| Docker multi-stage (node:20-slim). PM2 cluster. Non-root `campus` user. |
| Deploy scripts: `deploy.sh` (basic), `deploy-safe.sh` (snapshot + smoke test + rollback). |
|
|
| --- |
|
|
| ## Real-time Events (Socket.IO) |
|
|
| 16 handler modules: player movement, agent dialogue, quest progress, live lectures, inventory/trade, proximity chat, pets, tower defense, glitch contagion, moderation, faculty panel, call invites, experience rooms, broadcasting. |
|
|
| Redis adapter for horizontal scaling across PM2 workers. |
|
|