YourGM is a mobile-first, SRD-faithful tabletop RPG where an LLM is the game master. It runs as a three-repo stack: a game app on top, a rules platform in the middle, and the Mirora AI platform underneath.
Each layer has one job and a strict contract with the layer below. Game-specific code never leaks downward; platform code never knows it's powering a game.
Mobile-first Web PWA with a 3D tactical view, plus a Fastify backend that orchestrates every turn. The only layer that knows about characters, story arcs, and players.
Game-agnostic TypeScript workspace implementing the SRD ruleset faithfully: engine, character model, turn loop, contracts, runtime, and mobile UI primitives. A YAML golden-scenario suite keeps the engine honest.
The generic Mirora platform: one FastAPI deployable mounting six router-packages — Core AI (LLM gateway), Vector Store, RAG, Knowledge Graph, Image Generation, and Synthetic Data. It powers the narrative voice and the world's memory.
The core design split of YourGM: the LLM tells the story, the engine enforces the rules — and neither crosses into the other's lane.
Vite + React + react-three-fiber web client. Installable PWA; native packaging deferred, not abandoned.
VercelFastify orchestrator. Runs the turn loop, calls the SRD engine in-process, and is the only thing that talks to Mirora.
RenderTypes and contracts shared between mobile and backend. No runtime logic — a pure boundary definition.
contractsCommitted, read-only snapshot of the SRD platform, refreshed by script. Tooling-enforced: direct edits are denied.
read-onlyPlayer free text → Fastify backend → SRD engine validates state → Mirora Core AI narrates → Knowledge graph updated → Story beat to PWA
The LLM writes the scene; the engine guarantees nothing impossible happened in it.
Action panel tap → Fastify backend → @srd/engine resolves (dice, rules, state) → Result rendered in 3D tactical UI
No LLM in the loop — combat outcomes are pure rules engine, every time.
Story events → Backend → Mirora Knowledge Graph + Vector Store → Retrieved as context on future turns
Long-term campaign memory, so the GM never forgets what your character did.
The mobile PWA never carries an API key. Only the backend authenticates to Mirora, over HTTPS.
Mobile never imports the SRD engine, runtime, or contracts. Rules resolution cannot be tampered with client-side.
No house rules in the platform layer. Customization is an overlay pattern owned by the game, not the rules library.
Tactical UI is action-panel-only, so prompt injection can never reach mechanical resolution.
All three repos ship from main. Every merge rolls forward automatically — no release trains, no staging queues.
| Component | Platform | Stack | Trigger |
|---|---|---|---|
| Mobile PWA | Vercel | Vite + React + R3F | Auto-deploy on merge to main |
| Game Backend | Render | Fastify (Node) | Auto-deploy on merge to main |
| Mirora Platform | Render | FastAPI (Python) | Auto-deploy on merge to main |
| SRD Platform | — | TypeScript libraries | Vendored into the game by refresh script |
Want an AI platform that can power experiences like this?
START A CONVERSATION