VOID::NAV
VOID::NAV is now a pnpm workspace monorepo for the game website, living design docs, browser game shell, and SpacetimeDB backend module.
Layout
apps/docs Existing docs, interactive demos, and vertical slice
apps/site Public landing page / game website
apps/game Playable game shell connected to SpacetimeDB bindings
packages/ui Small shared UI primitives and CSS tokens
services/spacetimedb TypeScript SpacetimeDB module
archive/legacy-static Legacy static prototype files kept for reference
Prerequisites
- Node.js 24+
- pnpm 9+
- SpacetimeDB CLI for backend build, generation, and local DB runs
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.
Development
pnpm install
pnpm dev:docs
pnpm dev:site
pnpm dev:game
Default ports:
- docs:
http://localhost:5173/docs - site:
http://localhost:5174 - game:
http://localhost:5175
The public site links to docs and game via:
VITE_DOCS_URL=http://localhost:5173/docs
VITE_GAME_URL=http://localhost:5175
The game shell reads:
VITE_SPACETIME_URI=http://localhost:3000
VITE_SPACETIME_DATABASE=void-nav-dev
Builds
pnpm --filter @void-nav/docs build
pnpm --filter @void-nav/site build
pnpm --filter @void-nav/game build
pnpm build
pnpm check
SpacetimeDB
Root spacetime.json points at services/spacetimedb and generates TypeScript bindings into apps/game/src/module_bindings.
With the CLI installed:
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.