A real-time, multiplayer digital board game platform with asymmetric gameplay and modular game architecture.
Klura brings friends together for interactive, narrative-driven social experiences. Players join via QR code or link and receive role-specific interfaces based on their assigned persona (e.g., Detective vs Murderer in a Murder Mystery game).
- Real-time Multiplayer - Seamless state synchronization via WebSockets
- Asymmetric Gameplay - Different players see different information based on their role
- Game-as-Data - Scale to 100s of games via JSON configuration
- Modular Architecture - Add new games without code changes
- Theme System - Each game has its own visual identity
# Install dependencies
pnpm install
# Start development servers (frontend + backend)
pnpm dev
# Frontend: http://localhost:5173
# Backend: http://localhost:3000For detailed setup instructions, see GETTING_STARTED.md.
Phase: Greenfield - Foundation Complete ✅
- ✅ Monorepo structure configured
- ✅ Shared package with types & schemas
- ✅ Backend initialized (NestJS + Fastify)
- ✅ Frontend initialized (Vue 3 + Vite)
- ✅ Example game content (Murder Mystery)
- ✅ Development servers running
- Implement core game engine
- Create tRPC API layer
- Set up WebSocket gateway
- Build first plugin (Murder Mystery)
- Create UI components
See GETTING_STARTED.md for the full roadmap.
- Framework: Vue 3 (Composition API)
- Build Tool: Vite
- Styling: Tailwind CSS
- State: Pinia
- Real-time: socket.io-client
- Framework: NestJS (Fastify adapter)
- API: tRPC (type-safe)
- Real-time: Socket.IO
- Database: Redis (hot) + PostgreSQL (cold)
- Validation: Zod
- Language: TypeScript (strict mode)
- Monorepo: pnpm workspaces
Client Action → tRPC (validates) → Backend (processes) → Redis (saves)
↓
Client UI ← Socket.IO (broadcasts) ← GameGateway ← ──────────┘
Golden Rule: Mutations go through tRPC. Updates come through Socket.IO.
Games are defined through configuration, not code:
Game Template (Mechanics) → Game Variant (Instance) → Story (Narrative)
Example: Murder Mystery Engine → Blackwood Mansion → Blackwood Narrative
Klura/
├── apps/
│ ├── backend/ # NestJS backend
│ │ ├── src/
│ │ │ ├── core/ # Game-agnostic engine
│ │ │ ├── plugins/ # Game-specific mechanics
│ │ │ ├── admin/ # Content management
│ │ │ └── modules/ # tRPC, auth, websocket
│ │ └── package.json
│ │
│ └── klura-front-end/ # Vue 3 frontend
│ ├── src/
│ └── package.json
│
├── packages/
│ └── shared/ # Shared contracts
│ ├── schemas/ # Zod validation
│ ├── types/ # TypeScript types
│ └── themes/ # Visual styling
│
├── game-content/ # Game definitions (JSON)
│ ├── templates/ # Reusable mechanics
│ ├── variants/ # Themed instances
│ └── stories/ # Narrative content
│
└── conductor/ # Documentation
├── tech-stack.md
├── product.md
└── code_styleguides/
- GETTING_STARTED.md - Setup and development guide
- CLAUDE.md - AI assistant guidance
- PROJECT_STRUCTURE.md - Detailed architecture
- conductor/code_styleguides/architecture.md - Scalability architecture
- Node.js >= 18.0.0
- pnpm >= 8.0.0
# Development
pnpm dev # Start all services
pnpm dev:frontend # Frontend only
pnpm dev:backend # Backend only
# Building
pnpm build # Build all packages
pnpm build:shared # Build shared package
# Testing
pnpm test # Run all tests
pnpm type-check # Type check all packages
# Linting
pnpm lint # Lint all packagesFollowing Test-Driven Development (TDD):
- Write failing test (Red)
- Implement minimal code (Green)
- Refactor (Refactor)
- Commit atomically
Maintain 80% test coverage for all new code.
- TypeScript: Strict mode, explicit return types
- Naming: PascalCase (types), camelCase (variables), UPPER_SNAKE_CASE (constants)
- Functions: Early returns, async/await over promises
- Vue:
<script setup>, no business logic in components
See /conductor/code_styleguides/ for detailed guidelines.
- No game logic on client - Server is authoritative
- tRPC for mutations - Socket.IO only for updates
- No
anytype in shared package - Mobile-first UI - Players join via QR codes
[To be determined]
For questions or issues:
- Check documentation in
/conductor/ - Review architecture in
PROJECT_STRUCTURE.md - See troubleshooting in
GETTING_STARTED.md
Built with ❤️ for bringing friends together through play