Roadmap
Each phase ends with something you can demo. A phase isn't done until its exit criteria pass in CI. Task IDs refer to tasks.md.
gantt
dateFormat YYYY-MM-DD
axisFormat %b %d
section Foundation
P0 Repo & tooling :p0, 2026-10-05, 5d
section Single-player
P1 Walkable greybox :p1, after p0, 10d
P2 Real world & avatars :p2, after p1, 15d
P3 Shops & UI :p3, after p1, 15d
section Multiplayer
P4 Server & sync :p4, after p3, 12d
section Polish
P5 Perf, a11y, mobile :p5, after p4, 10d
P6 Launch v1.0 :p6, after p5, 5dThe dates assume one full-time developer plus one part-time 3D artist. Phases 2 and 3 run in parallel (art and code).
Phase 0: Foundation (week 1)
Goal: an empty repo where contributors can't break the build or the budgets.
- pnpm workspace with
client,serverandshared, plus TypeScript strict and Biome. (T-001) - Vite client that renders a spinning cube with Three.js, plus the
?debugstats overlay. (T-002, T-003) shared/config.tszod schema and an examplemall.config.ts. (T-004)- CI: typecheck, lint, unit tests, build, size budget. (T-005, T-006)
- README, CONTRIBUTING, CODE_OF_CONDUCT, issue templates, MIT license. (T-007)
Exit: pnpm i && pnpm dev works on a clean machine. CI is green. The size check fails when a 300 KB dependency is added.
Phase 1: Walkable greybox (weeks 2–3)
Goal: feel. Movement and camera have to be good before any art exists.
- Greybox mall in Blender (boxes only) exported with the meta empties. (T-101)
- Fixed-step loop, input manager (keyboard, pointer, touch). (T-102, T-103)
- Capsule controller with the BVH: walls, slopes, steps, two floors, escalators. (T-104, T-105)
- Third-person camera with collision, zoom and smoothing. (T-106)
- Mobile joystick and drag-look. (T-107)
- Navgrid bake + A* + tap-to-walk. (T-108, T-109)
- Zones and the "You are in" signal. (T-110)
Exit: you can walk the whole greybox on desktop and phone at 60 fps, ride an escalator, tap-to-walk to any point, and the camera never clips through walls. A playtest with 3 people says the movement "feels good".
Phase 2: Real world & avatars (weeks 4–6, parallel with P3)
Goal: looks. Swap the greybox for the real mall and real people.
- Modular kit + mall.blend + lightmap bake. (T-201, T-202)
optimize-assetspipeline and the asset budget check in CI. (T-203, T-204)- Zone chunk streaming and zone visibility. (T-205, T-206)
- Shared skeleton, animation pack, 2 bodies × 3 outfits via Higgsfield. (T-207, T-208)
- Avatar factory, animation state machine, accessories. (T-209, T-210)
- Quality tiers + auto-detect. Floor reflections per tier. (T-211, T-212)
- Ambient details: fountain, skylight, NPC shoppers. (T-213)
Exit: first playable frame within the ≤ 2.5 MB budget. Medium tier runs 60 fps on a Pixel 7a. Screenshots at every tier are approved in design review.
Phase 3: Shops & UI (weeks 4–6, parallel with P2)
Goal: purpose. The mall is actually useful.
- Preact overlay shell: HUD, dock, toasts, signals bridge. (T-301)
- Landing screen with live avatar preview, saved look, preloading during the form. (T-302)
- Signage generator (worker + OffscreenCanvas + IndexedDB cache). (T-303)
- Shop registry: slots → storefronts, door triggers, the E prompt. (T-304)
- Shop panel + product adapters (
static,json-url). (T-305, T-306) - Directory with fuzzy search. Travel-to (walk or fade-teleport). (T-307)
- Minimap and overview camera. (T-308, T-309)
- Deep links
/s/:idand/@x,z,yaw. The static HTML directory page. (T-310, T-311) - i18n: English plus one complex-script locale. (T-312)
Exit: a new operator can add a shop with products by editing mall.config.ts alone, in under 10 minutes (timed with a volunteer). All shop content is reachable without WebGL.
Phase 4: Multiplayer (weeks 7–8)
Goal: together.
shared/protocol.tsbinary codec with round-trip property tests. (T-401)- Server: ws upgrade, sessions, resume, rooms, auto-sharding. (T-402, T-403)
- Client socket with backoff and resume. Snapshot buffer and interpolation. (T-404, T-405)
- Remote avatars with LOD, instanced name tags. (T-406)
- Chat, emotes, batched join/leave, speech bubbles. (T-407, T-408)
- Moderation: filters, rate limits, mute, report, host token. (T-409, T-410)
- Docker image and a load-test bot (
tools/bots.ts). (T-411, T-412)
Exit: 100 bots in one room. Clients stay within the network budget. Server CPU is ≤ 10 % of a core. Killing and restarting a client's network for 10 s resumes the session without a join/leave message.
Phase 5: Performance, accessibility, mobile polish (weeks 9–10)
pnpm perfPlaywright budget gate in CI. (T-501)- Dynamic resolution, idle throttling, zero allocations per frame. (T-502, T-503)
- Keyboard/screen-reader audit, reduced motion. (T-504)
- Phone layout pass: safe areas, nothing blocking the centre, bottom sheets. (T-505)
- Audio. (T-506)
- Social verbs: wave, dance, hug, apple. (T-507)
Exit: all budgets pass in CI on throttled profiles. axe-core reports zero serious issues. The reference device matrix has been tested by hand.
Phase 6: Launch v1.0 (week 11)
- Docs site (the
docs/folder rendered with VitePress) and an operator guide. (T-601) - Demo deployment (static + server) and a one-click deploy template. (T-602)
- Analytics sink example. Privacy note. (T-603)
- Release checklist, tag, changelog, launch post with a video. (T-604)
Exit: the public demo is up, the repo is tagged v1.0.0, and a stranger can self-host by following the guide.
Phase 3b: Live content (decided 2026-09-29, before Phase 5)
Goal: the mall owner edits shops, products and art from a browser, and changes appear live. See ADR 0005 and ADR 0006.
- Rename the project to Shopping Mall (packages, image, docs). (T-700)
- Postgres schema and migrations; seed from
mall.config.ts. (T-701) - Content API: public read, host-only write; live
contentbroadcast. (T-702, T-705) - S3-compatible uploads with presigned URLs; asset records by content hash. (T-703)
/adminpage: shops, products, slots, assets. (T-704)- Swappable art: the client loads the mall package, avatars and props through asset records. (T-706)
- Railway deploy with Postgres, bucket and backups; compose gains Postgres + MinIO. (T-707)
Exit: the host adds a shop with a logo and products from /admin, and every connected visitor sees the new sign within 2 seconds, with no deploy. Replacing the mall model file swaps the building on the next visit.
Phase 2 note
3D art for v1 uses free CC0 kits (Kenney, Quaternius, Poly Pizza). Higgsfield-generated assets come later and drop in as file swaps (ADR 0006). The licence has been checked: generated models may be committed.
After v1.0 (P2 backlog)
- Private rooms and invite links
- 3D product pedestals and product
.glbviewer - Shopify / WooCommerce adapters
- Scheduled events and host stage
- Proximity voice chat (WebRTC)
- WebGPU renderer by default once it matches WebGL on the device matrix
- Interior theme packs for tenants