The Promoter
2026 · Game Engine · Prototype / demo
A content-as-data game engine: encounters, cities and economy live in JSON so the product can change without a scene-graph rewrite.
Client-only Vite SPA with a PWA service worker. No accounts, no backend, no live industry data. Progress lives in localStorage. A debug panel ships because the game is still being balanced in the open.
Delivered
JSON catalogs, applyEffect-only mutations, a React client and a seeded headless Vitest sim sharing one engine. Client-only; progress in localStorage.

Problem
Every gameplay tweak meant a code refactor. Designers could not retune a beat without engineering in the loop.
Build a systems-heavy browser RPG where encounters, economy, and story share one effect list, so adding a beat in JSON changes the tour without a scene-graph rewrite.
Intervention
Scenes are JSON. TypeScript loads, validates, and picks eligible beats; state mutates only through applyEffect. Economy and story share the same effect list. Afterparties and ambient shocks stay in TypeScript but still exit through applyEffect.
Constraints
- Client-only Vite SPA on Vercel. No accounts, no backend, no live industry data
- All cities, encounters, and disasters are authored fiction; progress in localStorage
- The same engine must drive the React client and a seeded headless sim
Result
Catalog today: 52 encounters, 30 cities, 12 problems, 16 traits. Retune a beat in JSON and the tour changes without a UI rewrite.
Gameplay design stays continuous when content is data: JSON packs update narrative and economy without a scene-graph rewrite.
Screen breakdown



Start a conversation
Tell us who you are and what you need in a few lines. We reply with whether Iron Signal Works is the right fit and what a sensible first step looks like. Ranges and terms sit in pricing & terms.