diff --git a/.gitignore b/.gitignore
index 1e5ffcb..d6dd2f3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@ spacetime.local.json
vite.config.js
vite.config.d.ts
.playwright-mcp/
+.spacetime-dev/
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..8eb421a
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,42 @@
+# VOID::NAV — Monorepo Root
+
+Open-world space exploration RPG. Windward Horizon in space with FTL-style combat.
+
+## Directory Map
+
+| Path | Purpose |
+|------|---------|
+| `apps/docs` | Living design docs, interactive demos, and vertical-slice prototype |
+| `apps/game` | Playable game shell connected to SpacetimeDB |
+| `apps/site` | Public landing page |
+| `packages/ui` | Shared UI primitives and design tokens |
+| `services/spacetimedb` | SpacetimeDB TypeScript backend module |
+| `scripts/` | Dev tooling (dev.sh startup script) |
+| `archive/` | Legacy pre-monorepo files kept for reference |
+| `src/module_bindings/` | Empty; generated bindings go to `apps/game/src/module_bindings` |
+
+## Key Files
+
+- `package.json` — pnpm workspace scripts (`dev`, `build`, `check`, `generate:bindings`)
+- `pnpm-workspace.yaml` — workspace glob patterns
+- `spacetime.json` — SpacetimeDB module path and binding generation config
+- `tsconfig.base.json` — Shared TypeScript config (ES2020, React JSX)
+
+## Commands
+
+```bash
+pnpm dev # Full stack: SpacetimeDB + game (port 5175)
+pnpm dev:docs # Docs only (port 5173)
+pnpm dev:site # Site only (port 5174)
+pnpm dev:game # Game frontend only (requires running SpacetimeDB)
+pnpm build # Build all apps
+pnpm check # Typecheck all packages
+pnpm generate:bindings # Regenerate SpacetimeDB TypeScript bindings
+```
+
+## Conventions
+
+- SpacetimeDB is the persistence layer from day 1 — no localStorage for game state
+- All UI uses Tailwind CSS v4 with custom design tokens from `packages/ui`
+- 3D rendering uses React Three Fiber + Drei + Three.js
+- Module bindings are auto-generated — never edit `module_bindings/` by hand
diff --git a/README.md b/README.md
index 3d68adb..d6bfb80 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,23 @@
# VOID::NAV
-VOID::NAV is now a pnpm workspace monorepo for the game website, living design docs, browser game shell, and SpacetimeDB backend module.
+**An open-world space exploration RPG** — trade, quest, fight, or simply drift and enjoy the ambiance. Inspired by the charm and freedom of Windward Horizon, set in a procedurally generated galaxy with FTL-style tactical combat.
+
+You are a young, unaffiliated captain with an entire galaxy open for exploration. Every campaign features a unique, procedurally generated sector map. Trade goods between stations, take on quests for various factions, mine asteroid belts, or simply cruise and enjoy the void. Prefer a quieter life? You can simply sail the stars.
+
+Combat is **FTL-style tactical resource management** — no dogfighting or direct piloting. Click a hostile, your ship auto-engages, and you manage reactor power between Weapons / Shields / Engines / Auxiliary. The skill is in *what* you power and *when*, not how fast you click.
+
+VOID::NAV is a pnpm workspace monorepo for the game website, living design docs, browser game shell, and SpacetimeDB backend module.
+
+## Core Pillars
+
+| Pillar | Description |
+|--------|-------------|
+| **Open-World Exploration** | Procedurally generated galaxy with unique sectors, anomalies, and hidden treasures every campaign |
+| **Trade & Commerce** | Regional price differences, supply/demand, and trade routes between stations and factions |
+| **FTL-Style Combat** | Tactical power management (not action). Auto-engage with reactor allocation decisions |
+| **Ship Customization** | Build the ship that suits your style — tough juggernaut, nimble scout, or cargo hauler |
+| **Dynamic World Impact** | Faction leaders, world events, and player actions shape the galaxy without firing a shot |
+| **Solo or Co-op** | Brave the void alone or crew with friends. Built with co-op in mind. |
## Layout
@@ -17,17 +34,30 @@ archive/legacy-static Legacy static prototype files kept for reference
- Node.js 24+
- pnpm 9+
-- SpacetimeDB CLI for backend build, generation, and local DB runs
+- SpacetimeDB CLI (`spacetime`) v2.3.0+
The SpacetimeDB CLI is not vendored. Frontend builds use the committed placeholder bindings in `apps/game/src/module_bindings`; run `pnpm generate:bindings` after installing the CLI to replace them with generated bindings.
+## Quick Start
+
+```bash
+pnpm install
+pnpm dev
+```
+
+This single command starts a fresh SpacetimeDB instance (ephemeral, in-memory), publishes the module, generates bindings, and launches the game dev server.
+
+Open `http://localhost:5175` to play.
+
+Press `Ctrl+C` to stop everything.
+
## Development
```bash
-pnpm install
-pnpm dev:docs
-pnpm dev:site
-pnpm dev:game
+pnpm dev # Full stack: SpacetimeDB + game (port 5175)
+pnpm dev:docs # Docs only (port 5173)
+pnpm dev:site # Site only (port 5174)
+pnpm dev:game # Game frontend only (requires running SpacetimeDB)
```
Default ports:
@@ -35,50 +65,20 @@ Default ports:
- docs: `http://localhost:5173/docs`
- site: `http://localhost:5174`
- game: `http://localhost:5175`
-
-The public site links to docs and game via:
-
-```text
-VITE_DOCS_URL=http://localhost:5173/docs
-VITE_GAME_URL=http://localhost:5175
-```
-
-The game shell reads:
-
-```text
-VITE_SPACETIME_URI=http://localhost:3000
-VITE_SPACETIME_DATABASE=void-nav-dev
-```
+- SpacetimeDB: `http://127.0.0.1:3000`
## Builds
```bash
-pnpm --filter @void-nav/docs build
-pnpm --filter @void-nav/site build
-pnpm --filter @void-nav/game build
-pnpm build
-pnpm check
+pnpm build # Build all apps
+pnpm check # Typecheck all packages
+pnpm generate:bindings # Regenerate SpacetimeDB TypeScript bindings
```
## SpacetimeDB
Root `spacetime.json` points at `services/spacetimedb` and generates TypeScript bindings into `apps/game/src/module_bindings`.
-With the CLI installed:
+The `pnpm dev` script uses an isolated ephemeral data directory (`.spacetime-dev/`) so it starts clean every time. No stale database or auth issues.
-```bash
-spacetime build --module-path services/spacetimedb
-pnpm generate:bindings
-pnpm dev:db
-```
-
-`pnpm dev:db` targets the SpacetimeDB CLI server nickname `local` so development publishes to `http://127.0.0.1:3000` instead of any configured cloud default.
-
-Initial reducers:
-
-- `connectPlayer(displayName: string)`
-- `renamePlayer(displayName: string)`
-- `seedWorld()`
-- `ping()`
-
-The game shell calls `connectPlayer` after connection, subscribes to starter shell rows, and displays connection, player, ship, system, station, and reducer status. When SpacetimeDB is unavailable or bindings are still placeholders, it shows a clear disconnected/error state.
+Reducers: `connectPlayer`, `renamePlayer`, `seedWorld`, `ping`, `undock`, `selectTarget`, `startApproach`, `completeApproach`, `dock`, `startMining`, `completeMiningCycle`, `sellOreToNpcMarket`
diff --git a/apps/AGENTS.md b/apps/AGENTS.md
new file mode 100644
index 0000000..bec7e1d
--- /dev/null
+++ b/apps/AGENTS.md
@@ -0,0 +1,16 @@
+# apps/ — Application Packages
+
+Three Vite + React apps, each independently buildable and dev-serveable.
+
+| App | Port | Package | Description |
+|-----|------|---------|-------------|
+| `docs` | 5173 | `@void-nav/docs` | Living design docs, 16 doc pages, 14 interactive demos, game-slice prototype |
+| `game` | 5175 | `@void-nav/game` | Playable game client connected to SpacetimeDB backend |
+| `site` | 5174 | `@void-nav/site` | Public landing page / marketing site |
+
+## Shared
+
+- All use Tailwind CSS v4 and `@void-nav/ui` for shared primitives
+- All use Vite 7 as build tool
+- All use React 18 with TypeScript 5.8
+- `docs` and `game` also use Three.js + React Three Fiber for 3D scenes
diff --git a/apps/docs/AGENTS.md b/apps/docs/AGENTS.md
new file mode 100644
index 0000000..463753a
--- /dev/null
+++ b/apps/docs/AGENTS.md
@@ -0,0 +1,56 @@
+# apps/docs — Living Design Documentation
+
+Package: `@void-nav/docs`
+Port: `http://localhost:5173/docs`
+
+This is the **design documentation hub** and interactive prototype playground. It contains the full GDD as 16 browsable pages, 14 interactive demos validating individual game subsystems, and a complete game-slice prototype implementing the full MVP loop in-browser with localStorage.
+
+## Structure
+
+```
+src/
+ App.tsx Route definitions (16 doc pages + 14 demo routes + 1 prototype)
+ main.tsx Entry point
+ components/ Shared UI: NotFound, Sidebar, TopBar
+ data/
+ nav.ts Sidebar navigation structure and page titles
+ fakeBackend.ts Mock data for demos
+ layouts/
+ DocsLayout.tsx Sidebar + content layout wrapper
+ lib/
+ threeHelpers.ts Shared Three.js utility functions
+ pages/docs/ 16 design doc page components:
+ OverviewPage.tsx Vision, pillars, core loop, HUD architecture, onboarding
+ ArchitecturePage.tsx System architecture, error handling, persistence, audio
+ TechStackPage.tsx Technology decisions
+ BackendPage.tsx 56+ database tables, movement model, ER diagram
+ AgentsPage.tsx Scheduled agent system (3 scheduling strategies)
+ GameplayPage.tsx Core loop, security, NPC pirates, combat, missions, travel, events, balancer
+ ShipsPage.tsx Ship classes, fitting, acquisition, AI crew
+ EconomyPage.tsx Trade routes, info diffusion, refining, manufacturing, NPC pricing, faucets/sinks
+ SocialPage.tsx XP & skills, chat, bounty, kill feed, corporations
+ ShipAIPage.tsx Zora companion AI with soul depth and module gating
+ RoadmapPage.tsx 16 phases (0-15), 2 eras, 6 integration gates
+ RisksPage.tsx Open risks and questions
+ TodoPage.tsx Living implementation status tracker (68 items across 8 phases)
+ DemoGalleryPage.tsx Links to all demos
+ GapAnalysisPage.tsx Cross-reference: specs vs demos vs readiness
+ VerticalSliceEvaluationPage.tsx Alignment matrix, phase readiness
+ DesignDocPage.tsx Original GDD reference
+ prototypes/
+ game-slice/ Full MVP loop prototype (localStorage, not SpacetimeDB)
+ existing-demos/ 14 standalone interactive demo components
+ r3f/ Reusable R3F 3D scenes (combat, galaxy, HUD, movement, navigation, starmap, warp)
+ standalone-huds/ GameHudPrototype, PrototypeFrame
+ styles/
+ tailwind.css Tailwind v4 entry point
+public/
+ docs/ Markdown files: vertical-slice-evaluation.md, gap-analysis.md
+ assets/ Design doc (.docx), 3 concept drawings (.png)
+```
+
+## Key Design Decisions
+
+- Docs are **React components**, not markdown files — this allows interactive demos inline with documentation
+- The `game-slice/` prototype is a self-contained playable game that validates the full loop before backend migration
+- All 14 demos in `existing-demos/` use the R3F scenes in `r3f/`
diff --git a/apps/docs/src/App.tsx b/apps/docs/src/App.tsx
index 05b20ab..22bf00a 100644
--- a/apps/docs/src/App.tsx
+++ b/apps/docs/src/App.tsx
@@ -17,6 +17,7 @@ import { DemoGalleryPage } from "./pages/docs/DemoGalleryPage";
import { GapAnalysisPage } from "./pages/docs/GapAnalysisPage";
import { VerticalSliceEvaluationPage } from "./pages/docs/VerticalSliceEvaluationPage";
import { DesignDocPage } from "./pages/docs/DesignDocPage";
+import { TodoPage } from "./pages/docs/TodoPage";
import { StarMapDemo } from "./prototypes/existing-demos/StarMapDemo";
import { ShipMovementDemo } from "./prototypes/existing-demos/ShipMovementDemo";
import { WarpTravelDemo } from "./prototypes/existing-demos/WarpTravelDemo";
@@ -56,6 +57,7 @@ export function App() {
} />
} />
} />
+ } />
} />
} />
diff --git a/apps/docs/src/data/nav.ts b/apps/docs/src/data/nav.ts
index 59cf5bc..b523c70 100644
--- a/apps/docs/src/data/nav.ts
+++ b/apps/docs/src/data/nav.ts
@@ -24,6 +24,7 @@ export const navSections: NavSection[] = [
{ path: "/docs/social", icon: "✧", label: "Progression & Social" },
{ path: "/docs/ship-ai", icon: "◈", label: "Ship AI - Zora" },
{ path: "/docs/roadmap", icon: "⊞", label: "Roadmap" },
+ { path: "/docs/todo", icon: "⊡", label: "Implementation Status" },
{ path: "/docs/risks", icon: "◬", label: "Risks & Questions" },
{ path: "/docs/gap-analysis", icon: "□", label: "Gap Analysis" },
{ path: "/docs/vertical-slice-evaluation", icon: "▤", label: "Slice Evaluation" },
diff --git a/apps/docs/src/pages/docs/EconomyPage.tsx b/apps/docs/src/pages/docs/EconomyPage.tsx
index 905a560..17b8ecb 100644
--- a/apps/docs/src/pages/docs/EconomyPage.tsx
+++ b/apps/docs/src/pages/docs/EconomyPage.tsx
@@ -40,29 +40,29 @@ export function EconomyPage() {
return (
-
Economy & Industry
+
Trade & Industry
- Player-led economy with NPC support as an underlying demand/supply buffer. Players mine, refine,
- manufacture, and trade. NPCs provide a price floor and basic market liquidity so new players
- always have a way to earn and spend.
+ Trade between stations with regional price differences. Supply what stations need and watch them grow.
+ Mine ore, refine into minerals, manufacture modules and ships. The economy rewards exploration —
+ discovering a profitable trade route is as valuable as finding a rich asteroid belt.
-
Player-led
-
Economy Model
+
Trade Routes
+
Core Mechanic
8 → 8
Ore Types → Minerals
-
8+
-
Manufacturable Items
+
Regional
+
Price Differences
-
2%
-
Market Tax
+
Dynamic
+
Station Prosperity
@@ -91,10 +91,10 @@ export function EconomyPage() {
- Exploration and commerce are the core pillars. This walkthrough shows what a new player sees, decides,
- and experiences in their first 30 minutes — from undocking with an empty cargo hold to discovering their first price
- difference and making a profitable trade. The goal: by minute 30, the player understands that information asymmetry
- is the game, and they've profited from it at least once.
+ Trade and exploration are the entry point. This walkthrough shows what a new captain sees, decides,
+ and experiences in their first 30 minutes — from undocking with an empty cargo hold to discovering their first
+ trade route and making a profitable run. The goal: by minute 30, the player understands that
+ different stations need different things, and supplying them is how you grow — whether through mining, trading, or quests.
@@ -132,9 +132,9 @@ export function EconomyPage() {
Design intent: By minute 8, the player has discovered that prices differ between stations.
- By minute 12, they\'ve acted on that discovery and profited. By minute 30, they have a mental model of the
- economy as a landscape of opportunities, not a single "sell" button. This is the hook. If the price discovery
- moment doesn\'t feel exciting, the entire game falls flat.
+ By minute 12, they've acted on that discovery and profited. By minute 30, they have a mental model of the
+ galaxy as a landscape of trade routes, faction needs, and opportunities — not a single "sell" button.
+ This is the hook. If the moment of discovering a trade route doesn't feel exciting, the trading game needs work.
- The core loop: connect → spawn → navigate → mine → inventory → station → sell on the market → chat.
- Steps 1–7 work in Era 1 (single-player). Step 8 (Chat) requires multiplayer and ships in Era 2 (Phase 11).
- Each step is UI-driven. The player's main interface is tables, charts, and panels — not a cockpit.
+ The core loop: explore → trade → quest → fight (FTL-style) → upgrade → sail deeper.
+ Every system feeds into the others. Trade earns ISK for upgrades. Quests unlock faction influence. Combat protects trade routes.
+ Exploration reveals new opportunities. Steps 1–7 work in Era 1 (single-player). Multiplayer features arrive in Era 2.
{[
- { step: 1, title: 'Connect', desc: 'Player opens the app and connects to SpacetimeDB. Identity is established, player row loaded.', color: 'var(--cyan)' },
- { step: 2, title: 'Spawn', desc: 'A player row and ship row exist; the ship appears in the shared star system for all subscribers.', color: 'var(--cyan)' },
- { step: 3, title: 'Navigate (click & autopilot)', desc: 'Player clicks a point of interest — asteroid, station, hostile — and the ship automatically pilots there. No manual flight control at all. The player sets intent, the ship executes.', color: 'var(--green)' },
- { step: 4, title: 'Mine (activate & wait)', desc: 'Player clicks an asteroid to approach, then activates mining modules. The ship navigates on its own. Mining runs on a timer. The decision is what to mine and when, not how.', color: 'var(--accent)' },
- { step: 5, title: 'Inventory', desc: 'Ore appears in inventory panel. Quantity, type, and value visible. Player manages cargo space.', color: 'var(--purple)' },
- { step: 6, title: 'Dock at Station', desc: 'Player docks at a station. Station UI becomes available: sell, market, refit.', color: 'var(--cyan)' },
- { step: 7, title: 'Sell Ore', desc: 'Player sells ore through station UI for ISK (in-game currency). Simple fixed pricing for MVP; market orders later.', color: 'var(--accent)' },
- { step: 8, title: 'Chat', desc: 'Players send and receive messages in current system. Basic rate limiting and length validation. Requires multiplayer — ships in Phase 11 (Era 2).', color: 'var(--green)' },
+ { step: 1, title: 'Spawn & Explore', desc: 'Player connects and spawns at a station in a procedurally generated sector. The map is hidden — fog of war covers unexplored regions. Nearby POIs are visible: stations, belts, signal sources. The urge to explore is immediate.', color: 'var(--cyan)' },
+ { step: 2, title: 'Navigate (click & autopilot)', desc: 'Player clicks a point of interest — asteroid, station, anomaly, signal — and the ship automatically pilots there. No manual flight. The journey IS the experience: watch the stars scroll, spot distant objects, feel the void.', color: 'var(--green)' },
+ { step: 3, title: 'Gather Resources', desc: 'Mine asteroids for ore. Salvage derelicts for components. Discover anomalies for rare materials. The decision is what to gather and where — different regions have different resources.', color: 'var(--accent)' },
+ { step: 4, title: 'Trade Between Stations', desc: 'Buy low at one station, sell high at another. Prices vary by region and faction needs. Stations that need resources pay more. Trade routes emerge naturally from exploration.', color: 'var(--purple)' },
+ { step: 5, title: 'Accept Quests', desc: 'Faction agents offer missions: deliver cargo, eliminate threats, explore sectors, escort convoys. Completing quests earns ISK, standing, and unlocks new opportunities. Helping one faction may hinder another.', color: 'var(--cyan)' },
+ { step: 6, title: 'Combat (FTL-style)', desc: 'Click a hostile → ship auto-engages → manage reactor power between Weapons/Shields/Engines/Aux. No dogfighting. The skill is tactical resource allocation. PvE pirates, bounty targets, and hostile NPCs. PvP in Era 2.', color: 'var(--red)' },
+ { step: 7, title: 'Upgrade & Customize Ship', desc: 'Use ISK to buy bigger ships, fit modules, upgrade weapons and defenses. Build the ship that suits your style: nimble trader, tough warship, or versatile explorer.', color: 'var(--accent)' },
+ { step: 8, title: 'Sail Deeper', desc: 'Venture into unexplored sectors with better resources but greater danger. Higher risk, higher reward. Faction territory, world events, and player actions shape the galaxy. Co-op multiplayer in Era 2.', color: 'var(--green)' },
].map((s, i) => (
- A browser-based spreadsheet simulator in the EVE Online tradition,
- set inside a single persistent galaxy that the server simulates as a living world.
- The game is played through UI panels, market tables, inventory grids, and chat channels — not by flying a ship.
- Movement and combat are deliberately rudimentary; the depth lives in the economy, information diffusion,
- strategic decisions, and a galaxy that evolves around you through dynamic PvE events and emergent world story.
+ Trade, quest, fight, or simply drift and enjoy the ambiance. A charming open-world space RPG inspired
+ by the freedom and charm of Windward Horizon — set in a procedurally generated galaxy where
+ every campaign is unique. Explore sectors, trade between stations, take on faction quests, mine asteroids,
+ or simply cruise the void. Combat is FTL-style tactical resource management —
+ no dogfighting. You are the captain who decides what to power and when, not the pilot who dodges.
-
UI-first
-
Design Pillar
+
Explore
+
Core Pillar
SpacetimeDB
Backend
-
~3 hrs
-
Session Target
+
FTL Combat
+
Combat Model
-
Player-led
-
Economy Model
-
-
-
Living Galaxy
+
Dynamic
World Model
+
+
Co-op
+
Multiplayer
+
@@ -42,10 +42,10 @@ export function OverviewPage() {
- Primary recommendation: Build the MVP as a UI-heavy browser game — a spreadsheet simulator.
- The 3D scene is a strategic map layer for context, not the game itself. Players spend 90% of their time
- in tables, charts, and panels: market depth, order books, cargo manifests, fitting spreadsheets,
- route planners, and chat. The 3D viewport exists to give spatial awareness, not twitch gameplay.
+ Primary inspiration: Windward Horizon's charm and freedom in a space setting. The game is an
+ open-world exploration RPG where the player charts their own path — trader, mercenary, explorer, or drifter.
+ The 3D scene is the primary viewport for spatial immersion. Panels and UI overlays handle station services, fitting, and market.
+ Combat uses FTL-style power management — no dogfighting. The galaxy is procedurally generated each campaign.
Core Pillars
@@ -59,29 +59,34 @@ export function OverviewPage() {
-
Economy & markets
-
Player-led economy with NPC support. Mining → refining → manufacturing → trade. Geographic price differences, contract markets, order books, and information asymmetry between systems create emergent trade routes and speculative opportunities. This IS the game.
-
Era 1NPC economy, single-player mining/refining/manufacturing Era 2Player-to-player market, info diffusion
+
Open-world exploration
+
Procedurally generated galaxy with unique sectors every campaign. Points of interest: stations, asteroid belts, anomalies, derelicts, signal sources. Explore to discover resources, quests, and hidden stories. The map reveals as you travel — fog of war drives the urge to see what's out there.
+
Era 1Single system with POIs, procedural generation seed
-
Social & multiplayer
-
Local chat, delayed PMs, bounty system, emergent player-driven justice. Communication is range-based. Priority pillar.
-
Era 2All social features require multiplayer
+
Trade & commerce
+
Buy low at one station, sell high at another. Regional price differences driven by supply/demand and faction needs. Trade routes are the economic backbone. Towns need resources to grow — supplying them leads to prosperity.
+
Era 1NPC economy, regional prices, trade routes Era 2Player-to-player market, info diffusion
-
Command-based (not action)
-
Players issue high-level intentions — click a point of interest and the ship autopilots there. Click a hostile and the ship auto-engages. During combat the player manages reactor power allocation (FTL-style) between systems. No manual flight, no aiming, no skill shots. The skill is in what you power, not how fast you click.
-
Era 1Core combat & movement loop
+
FTL-style combat
+
No dogfighting. Click hostile → ship auto-engages → manage reactor power allocation (FTL-style) between Weapons/Shields/Engines/Aux. The skill is in what you power, not how fast you click. Combat creates consequences — ship damage, loot, insurance — but it's not the focus.
+
Era 1Core combat & power management
-
Ship fitting
-
CPU/Power Grid slot system. High/Med/Low slots with meaningful fitting tradeoffs. Multiple ships, AI crew (post-MVP).
-
Era 1Basic fitting, single ship class
+
Ship customization
+
Build the ship that suits your style — tough juggernaut that can take a beating, nimble scout that rains fire from afar, or cargo hauler keeping trade routes supplied. Swap modules to change role. Multiple ship classes from nimble interceptors to powerful cruisers.
+
Era 1Basic fitting, multiple ship classes
-
Emergent lore
-
No server has the same lore as another. The galaxy is a single persistent world with systems, planets, anomalies, and orbiting objects. A world simulation layer spawns PvE events dynamically — faction wars, space anomalies, migrations, raids — that create a living story unique to every server. Lore evolves through both player actions and server-driven world events.
-
Era 2Living galaxy requires world agents
+
Dynamic world & factions
+
Stations and provinces need resources to grow. Supplying them leads to prosperity. Faction leaders involve you in their agendas — helping one may hinder another. Enough support can let a faction leader take control of a province without a single shot fired. A living galaxy that evolves through player actions and world events.
+
Era 1Basic factions, NPC agents, quests Era 2Living galaxy, world agents, territory
+
+
+
Solo or co-op
+
Brave the void alone or crew with friends. The game is built with co-op in mind — bring your crew, set sail, and experience the chaotic endgame together. Solo play is fully viable; co-op makes the late game richer.
+
Era 1Solo proof of concept Era 2Multiplayer, fleets, PvP
@@ -93,11 +98,11 @@ export function OverviewPage() {
-
Spreadsheet simulator, not flight sim
+
Exploration-first, not spreadsheet-first
- 90% of gameplay happens in tables, charts, and panels: market order books, cargo manifests, fitting spreadsheets,
- route planners, ship AI logs, and chat channels. The 3D viewport gives spatial awareness, not twitch gameplay.
- Movement is click-to-autopilot. Combat is click-to-engage with FTL-style power management. The depth is in the economy and information.
+ The 3D viewport IS the game. Players spend their time flying between points of interest, discovering new sectors,
+ and engaging with the world. Station panels handle trading, fitting, and services — but the joy is in
+ the journey, not the ledger. Trade, quest, fight, or simply set sail and enjoy the ambiance.
@@ -108,20 +113,19 @@ export function OverviewPage() {
-
Information is the real currency
+
Every campaign is unique
- Market data propagates at the speed of player travel, not the speed of light. Knowing a price discrepancy exists
- before other traders — that's the skill. The ship AI (Zora) is a living market intelligence tool. See the
- Economy → 📡 Info Diffusion tab for the full model.
+ Procedurally generated galaxy maps ensure no two games are alike. Fog of war hides unexplored sectors.
+ Factions, resource distributions, and quest chains vary per seed. Replayability through discovery, not grind.
-
Movement & combat are not action
+
FTL combat — captain, not pilot
- The player never pilots the ship directly. Click a destination → ship autopilots. Click a hostile → ship auto-engages.
+ The player never directly flies or aims. Click a destination → ship autopilots. Click a hostile → ship auto-engages.
During combat, the player manages reactor power allocation (FTL-style: weapons/shields/engines/aux)
- and subsystem targeting. That's it. Ship destruction
- is an economic event (ISK sink, insurance payout, loot drop), not a competitive action moment. ISK (symbol ₢) is the canonical in-game currency.
+ and subsystem targeting. You are the chief engineer deciding where
+ the reactor output goes — not the pilot or gunner.
@@ -133,20 +137,19 @@ export function OverviewPage() {
- The real loop is economic. Connect → gather information → identify opportunity → act on it → profit.
- The "mine → sell" cycle is the entry point. The endgame is inter-regional arbitrage, supply chain management,
- manufacturing empires, and market manipulation — all driven by information diffusion between systems.
+ The real loop is adventure. Spawn → explore the unknown → discover opportunities → act on them → grow your ship and reputation → sail into deeper, riskier space.
+ The "mine → sell" cycle is the entry point. The endgame is about faction influence, rare discoveries, commanding powerful ships,
+ and shaping the galaxy through your choices — whether by trade, combat, or diplomacy.
Minimum Viable Screens
@@ -193,9 +196,9 @@ export function OverviewPage() {
- Decision: Hybrid diegetic + panel approach.
- The game uses two distinct view modes depending on the player's state. This resolves the ambiguity
- between the gamehud demo (which renders diegetic overlays on a 3D viewport) and the spec's description of traditional panels.
+ Decision: Hybrid immersive + panel approach.
+ The game uses two distinct view modes depending on the player's state. When in space, the 3D viewport
+ is the primary experience with diegetic HUD overlays. When docked at a station, traditional panel UI handles services.
Both are correct — they apply to different contexts.
@@ -267,13 +270,13 @@ export function OverviewPage() {
- Why not all-diegetic or all-panel?
- A fully diegetic HUD (Dead Space style) works for immersion but is terrible for spreadsheet gameplay — you can't read
- an order book through a holographic visor. A fully panel UI (traditional MMO) loses the spatial awareness that makes
- space feel like space. The hybrid approach keeps the best of both: diegetic immersion during the action, panel efficiency
- during the economy game. The key insight is that the game alternates between two distinct cognitive modes —
- reactive (in-space, monitoring health/modules/overview) and analytical (docked, reading tables/planning routes).
- Each view mode is optimized for its cognitive mode.
+ Why this hybrid approach?
+ A fully diegetic HUD (Dead Space style) works for immersion but makes station services clunky — buying cargo through
+ holographic menus is painful. A fully panel UI (traditional MMO) loses the spatial immersion that makes space feel
+ like space. The hybrid keeps the best of both: immersive 3D exploration and combat, efficient panel-based station services.
+ The game alternates between two modes —
+ reactive (in-space, monitoring health/modules/threats) and analytical (docked, trading/fitting/planning).
+ Each view mode is optimized for its mode.
@@ -282,20 +285,20 @@ export function OverviewPage() {
- The first 30 minutes teach the game through doing, not reading. New players learn by playing a guided
- mission sequence that introduces each system naturally. There is no separate "tutorial mode" \u2014 the tutorial IS the game.
- See Economy \u2192 First 30 Minutes tab for the full moment-by-moment walkthrough.
+ The first 30 minutes teach the game through adventure, not reading. New players learn by playing a guided
+ mission sequence that introduces each system naturally — undocking, navigating, mining, trading, and their first combat encounter.
+ There is no separate "tutorial mode" — the tutorial IS the game.
Mission 2: "Armed and Ready" \u2014 accept kill mission, engage NPC frigate, manage power allocation, collect bounty. Teaches: combat, insurance.
-
Mission 3: "Supply Chain" \u2014 refine ore, manufacture a module, fit it to ship. Teaches: industry, fitting.
-
Mission 4: "Price Watcher" \u2014 fly to second station, compare prices, sell at the better one. Teaches: price discovery, trade routes.
-
Mission 5: "Your AI Companion" \u2014 Zora introduces herself, explains her modules, offers first market tip. Teaches: Zora, AI modules.
+
Mission 1: "Welcome, Captain" — undock, navigate to asteroid belt, mine 100 ore, dock, sell. Teaches: navigation, mining, market.
+
Mission 2: "First Contact" — encounter an NPC hostile, manage FTL-style power allocation, survive the fight. Teaches: combat, damage, repair.
+
Mission 3: "Supply Run" — accept a trade quest from a faction agent, deliver goods to another station, earn ISK and standing. Teaches: trade routes, factions.
+
Mission 4: "The Bigger Ship" — earn enough ISK to buy a new ship class, fit it with modules. Teaches: ship acquisition, fitting.
+
Mission 5: "Into the Unknown" — explore an uncharted sector, discover a hidden anomaly, encounter a world event. Teaches: exploration, discovery, the wider galaxy.
diff --git a/apps/docs/src/pages/docs/RoadmapPage.tsx b/apps/docs/src/pages/docs/RoadmapPage.tsx
index 98f0dee..ebc148e 100644
--- a/apps/docs/src/pages/docs/RoadmapPage.tsx
+++ b/apps/docs/src/pages/docs/RoadmapPage.tsx
@@ -5,72 +5,72 @@ export function RoadmapPage() {
const eras = [
{
id: 'solo',
- title: 'Era 1 — Single-Player Proof of Concept',
- subtitle: 'Validate core loops locally. SpacetimeDB runs on the local machine from Phase 0 — there is no localStorage. One browser window, one player, one simulated galaxy.',
+ title: 'Era 1 — Single-Player Open-World RPG',
+ subtitle: 'Validate the core adventure loop locally. SpacetimeDB runs on the local machine from Phase 0 — there is no localStorage. One browser window, one captain, one procedurally generated galaxy to explore.',
accent: 'var(--accent)',
phases: [
{
num: '0',
- title: 'Local Skeleton',
- goal: 'Vite app with local SpacetimeDB instance, game state manager, tick loop, and a single rendered star system.',
- doneWhen: 'App boots, connects to local SpacetimeDB instance. Shows a star system with a station and 3 asteroids. Game state updates on a local tick (60fps render, 1Hz sim tick). All persistence through SpacetimeDB — no localStorage.',
+ title: 'Local Skeleton & Star System',
+ goal: 'Vite app with local SpacetimeDB instance, rendered star system with station and asteroids. Player can connect and see the void.',
+ doneWhen: 'App boots, connects to local SpacetimeDB instance. Shows a star system with a station and 3 asteroids. Ship visible in 3D viewport. Game state persists in SpacetimeDB — no localStorage.',
status: 'current',
},
{
num: '1',
- title: 'Movement & Commands',
- goal: 'Click-to-move autopilot with local path resolution. Ship accelerates, cruises, decelerates.',
- doneWhen: 'Click an asteroid or station. Ship plots a course and moves there with smooth interpolation. ETA display updates. Warp-to for distant objects works.',
+ title: 'Navigation & Exploration',
+ goal: 'Click-to-navigate autopilot with smooth ship movement. Warp-to for distant objects. Explore POIs within a system.',
+ doneWhen: 'Click an asteroid, station, or anomaly. Ship plots a course and moves there with smooth interpolation. ETA display updates. Warp-to for distant objects works. Player can freely navigate the star system.',
status: 'upcoming',
},
{
num: '2',
- title: 'Mining & Inventory',
- goal: 'Asteroid mining cycle, ore extraction, cargo hold, and jettison.',
- doneWhen: 'Approach asteroid, start mining. Mining cycle shows progress. Ore appears in cargo. Cargo full warning. Can jettison into a can.',
+ title: 'Mining, Inventory & Trade',
+ goal: 'Asteroid mining cycle, ore extraction, cargo hold. NPC market for buying/selling goods. Regional price differences between stations.',
+ doneWhen: 'Approach asteroid, start mining. Mining cycle shows progress. Ore appears in cargo. Dock at station, sell ore for ISK. Fly to another station — prices are different. Buy low / sell high works.',
status: 'upcoming',
},
{
num: '3',
title: 'Combat — FTL Power Allocation',
- goal: 'Auto-engage combat with reactor power management between weapons / shields / engines.',
- doneWhen: 'Target a hostile NPC. Ship auto-engages. Player shifts reactor power between 3 subsystems (FTL-style). Power allocation visibly changes combat outcome. Ship can be destroyed.',
+ goal: 'Auto-engage combat with reactor power management between weapons / shields / engines. Encounter NPC pirates at belts and anomalies.',
+ doneWhen: 'Target a hostile NPC at a belt or anomaly. Ship auto-engages. Player shifts reactor power between subsystems (FTL-style). Power allocation visibly changes combat outcome. Ship can be destroyed. NPC pirates drop loot and bounty.',
status: 'upcoming',
},
{
num: '4',
- title: 'Ship Fitting',
- goal: 'CPU / Power Grid slot system. High / Med / Low racks with modules that change ship behavior.',
- doneWhen: 'Dock at station. Open fitting screen. Equip weapons in high slots, shield booster in mid, cargo expander in low. Fitting affects combat and mining stats. Invalid fits rejected (insufficient CPU/PG). AI module slot type added to fitting schema.',
+ title: 'Ship Customization & Upgrades',
+ goal: 'Multiple ship classes (scout, hauler, warship). Module fitting with High/Med/Low slots. CPU/PG constraints. Buy new ships at stations.',
+ doneWhen: 'Dock at station. Open fitting screen. Equip weapons in high slots, shield booster in mid, cargo expander in low. Fitting affects combat and trade stats. Can buy a new ship class. Invalid fits rejected (insufficient CPU/PG).',
status: 'upcoming',
},
{
num: '5',
- title: 'Refining & Manufacturing',
- goal: 'Refine ore into minerals at a station. Use minerals to manufacture modules and ammo.',
- doneWhen: 'Dock with ore. Refine at station facility (with yield efficiency). Minerals stored locally. Open manufacturing tab, select a blueprint, queue a job. Job completes after sim time. Product appears in hangar.',
+ title: 'Faction Quests & Dynamic World',
+ goal: 'NPC agents offer quests (kill, courier, mining, exploration). Faction standing system. Station prosperity responds to player supply. Dynamic world events spawn.',
+ doneWhen: 'Talk to NPC agent at station. Accept a quest (deliver cargo, kill pirates, explore anomaly). Complete quest for ISK + standing. Standing unlocks better quests and prices. Supplying a station increases its prosperity. World events spawn in explored systems.',
status: 'upcoming',
},
{
num: '6',
- title: 'NPC Economy Sim',
- goal: 'Simulated NPC market with supply/demand. Prices react to player trades. Regional price differences.',
- doneWhen: 'Sell ore at a station. Price adjusts (supply increases, price drops). Fly to another system, price is different. Buy low / sell high works. Market history table shows price movement.',
+ title: 'Industry & Economy Depth',
+ goal: 'Refining ore into minerals. Manufacturing modules and items. Full NPC market with supply/demand. Price history and regional differences.',
+ doneWhen: 'Dock with ore. Refine at station. Minerals appear in hangar. Open manufacturing tab, select a blueprint, queue a job. Job completes. Product appears. Sell on NPC market. Prices react to trades. Different stations have different prices.',
status: 'upcoming',
},
{
num: '7',
- title: 'Single-Player Polish',
- goal: 'Complete HUD, notifications, empty states, tutorial hints, and save/load.',
- doneWhen: 'Full game loop is playable solo: mine → refine → manufacture → fit → fight → trade. HUD shows all relevant info. SpacetimeDB persists all state (ships, inventory, market, skills) — no localStorage. No dead-end states. Tier 0 Zora: status readouts, basic shield warnings, bare-bones soul state vector in SpacetimeDB. Lightweight exploration events spawn in visited systems.',
+ title: 'Single-Player Polish & Procedural Galaxy',
+ goal: 'Procedurally generated multi-system galaxy. Fog of war. Full HUD. Notifications. Tutorial sequence. Ship AI companion (Zora Tier 0). Save/load.',
+ doneWhen: 'Full game loop is playable solo: explore → mine → trade → quest → fight → upgrade → explore deeper. Procedural galaxy generates unique systems each campaign. Fog of war reveals as you travel. HUD shows all relevant info. Tutorial guides new players through first 30 minutes. SpacetimeDB persists all state.',
status: 'future',
},
],
},
{
id: 'multi',
- title: 'Era 2 — Multiplayer Environment',
- subtitle: 'Promote local SpacetimeDB to a shared server. Add multiplayer networking, social systems, and the full living galaxy simulation. Multiple players, one persistent world.',
+ title: 'Era 2 — Multiplayer & Living Galaxy',
+ subtitle: 'Promote local SpacetimeDB to a shared server. Add multiplayer co-op, social systems, PvP, and the full living galaxy simulation. Multiple captains, one persistent universe.',
accent: 'var(--cyan)',
phases: [
{
@@ -181,15 +181,15 @@ export function RoadmapPage() {
Development Roadmap
- Two eras, sixteen phases. Era 1 proves the game is fun as a single-player simulation with a local
- SpacetimeDB instance — the same persistence architecture as multiplayer, just one player. Era 2 promotes
- that local SpacetimeDB to a shared server and adds social systems, the living galaxy, and multiplayer combat.
+ Two eras, sixteen phases. Era 1 proves the game is fun as a single-player open-world space RPG
+ with a local SpacetimeDB instance — exploration, trading, FTL-style combat, ship customization, and faction quests.
+ Era 2 promotes that local SpacetimeDB to a shared server and adds multiplayer, social systems, the living galaxy, and co-op play.
Each phase has a verifiable done-when condition. Integration gates between phase groups ensure every system works together before advancing.
Why single-player first with local SpacetimeDB? Networking is the biggest source of bugs and complexity.
- By validating that mining, combat, fitting, and the economy are fun locally — using the same SpacetimeDB
+ By validating that exploration, trading, combat, fitting, and faction quests are fun locally — using the same SpacetimeDB
persistence that will serve multiplayer — we de-risk the entire project. There is no localStorage; SpacetimeDB is the
persistence layer from day 1. When Era 2 begins, the question is only "how do we share this server?" — not
"is this game fun?" or "will the persistence migration work?"
@@ -205,35 +205,37 @@ export function RoadmapPage() {
-
Gate 1 — Core Loop (after Phase 2)
+
Gate 1 — Exploration & Trade Loop (after Phase 2)
- Navigate to asteroid → mine → fill cargo → dock → sell ore. The complete economic loop runs in a single session
- without errors. SpacetimeDB persists the session — closing the browser and reopening restores state.
+ Navigate to asteroid → mine → fill cargo → dock → sell ore → navigate to another station → discover price difference → trade.
+ The complete exploration and trade loop runs in a single session without errors. The galaxy feels alive and explorable.
+ SpacetimeDB persists the session — closing the browser and reopening restores state.
Phases covered: 0, 1, 2
-
Gate 2 — Combat + Fitting (after Phase 4)
+
Gate 2 — Combat + Customization (after Phase 4)
- Fit a ship at station → undock → encounter NPC pirate → manage power allocation → destroy or be destroyed →
- insurance payout (if destroyed) → refit at station. Combat and fitting form a closed loop with economic consequences.
+ Customize a ship at station → undock → encounter NPC pirate → manage FTL power allocation → destroy or be destroyed →
+ collect loot → buy upgrades → try a different ship class. Combat and ship customization form a satisfying adventure loop.
Phases covered: 0–4
-
Gate 3 — Full Economy (after Phase 6)
+
Gate 3 — Full Adventure Loop (after Phase 6)
- Mine ore → refine → manufacture a module → fit it → use it in combat → sell excess minerals across systems at different prices.
- The complete production chain and NPC market work as an integrated system. Price differences between stations are discoverable.
+ Explore → mine ore → refine → manufacture a module → fit it → fight pirates → accept faction quest → deliver goods →
+ earn standing → unlock better missions → sell excess across stations at different prices.
+ The complete adventure: exploration, economy, industry, and faction systems work as an integrated whole.
Phases covered: 0–6
Gate 4 — Era 1 Complete (after Phase 7)
- Full solo game loop with all systems integrated: mine → refine → manufacture → fit → fight → trade → repeat.
- HUD, notifications, Zora Tier 0, exploration events, and missions all work without dead ends. A new player
- can learn the game in one session. SpacetimeDB state survives restart.
+ Full solo game with all systems integrated: explore → mine → trade → quest → fight → customize → sail deeper.
+ Procedurally generated galaxy. Fog of war. HUD, notifications, Zora Tier 0, world events, tutorial sequence.
+ A new player can learn the game in one session and want to keep going. SpacetimeDB state survives restart.
Phases covered: 0–7 (all Era 1)
@@ -248,8 +250,9 @@ export function RoadmapPage() {
Gate 6 — Launch Ready (after Phase 15)
- Fresh player can: create account, complete tutorial, mine ore, fit ship, survive PvE, make a trade, join a corp,
- participate in a world event — all without crashes or dead ends. Server handles 50 concurrent. Full game loop validated.
+ Fresh player can: create account, complete tutorial, explore their first system, mine and trade, survive a PvE encounter,
+ customize their ship, accept and complete a faction quest, join a crew with friends — all without crashes or dead ends.
+ Server handles 50 concurrent players. Full game loop validated.
- Ships are the player's primary asset. Each ship has a slot layout with CPU and Power Grid limits
- that constrain what modules can be fitted. Players own multiple ships and can assign AI crew to
- pilot them on autonomous tasks.
+ Build the ship that suits your style — a tough juggernaut that can take a beating, a nimble scout that rains fire from afar,
+ or a cargo hauler keeping trade routes supplied. Swap out weapons for extra armor, or add mining lasers to become an industrial powerhouse.
+ Each ship has a slot layout with CPU and Power Grid limits that constrain what modules can be fitted.
+ Living TODO document tracking what's built vs. what's designed. Auto-generated from codebase review on {LAST_UPDATED}.
+ Each item maps to a specific phase, layer, and file reference.
+
+
+
+
+
{counts.byStatus.done}
+
Done
+
+
+
{counts.byStatus.partial}
+
Partial
+
+
+
{counts.byStatus.missing}
+
Missing
+
+
+
{counts.byStatus.blocked}
+
Blocked
+
+
+
+
+ Backend coverage: {BACKEND_TABLES_IMPLEMENTED} / {BACKEND_TABLES_DESIGNED} tables ({Math.round(BACKEND_TABLES_IMPLEMENTED / BACKEND_TABLES_DESIGNED * 100)}%).
+ {BACKEND_REDUCERS_IMPLEMENTED} / {BACKEND_REDUCERS_DESIGNED} reducers ({Math.round(BACKEND_REDUCERS_IMPLEMENTED / BACKEND_REDUCERS_DESIGNED * 100)}%).
+ All 14 interactive demos and the full game-slice prototype live in apps/docs/src/prototypes/ using localStorage — these serve as reference implementations for migration into the SpacetimeDB backend.
+