Solo Narrative RPG - Thinking
Core Idea
A complete, playable solo narrative RPG experience — branded StoryLab — delivered as a browser-based, local-first PWA, built on Ironsworn as the licensed mechanical backbone. The player never leaves the product to consult a rulebook, roll dice elsewhere, or track state in a separate tool. The RPG system is infrastructure. The product is the experience.
State of Thinking
The product — now named StoryLab — is a digital solo narrative RPG built on Ironsworn as licensed mechanical infrastructure, with AI in the assistance layer (oracle inspiration, contextual prompts) rather than as GM or narrator. That boundary, set in v2, has held through design and into build.
StoryLab has a defined visual identity: “Mythic Minimal” — dark-mode-first, type-heavy, minimal chrome, no fantasy-game clichés — built on a three-layer token architecture with six neutrally-named themes (chosen to avoid trademark issues). The app’s real shape turned out to be two routes (Launch, Active Scene) with six overlay surfaces on Active Scene, not the eight separate pages originally imagined.
The rules engine no longer depends on @datasworn/ironsworn-classic — moves, assets, and oracles have been extracted directly from the source Ironsworn PDF into owned markdown, under the project’s own key registry (asset_key / category_key / move_key).
Phase 0 (Direction & Exploration) is complete. Phase 1 (build) began 2026-06-11, sequenced via OpenSpec with a “just-in-time engine” principle — engine modules get built alongside the screen that needs them, not upfront. A parameterized route structure (/campaign/[id]) was adopted now, in Phase 1, even though co-op/cloud is Phase 3 — retrofitting later would touch every component reading “active campaign from state,” so doing it now costs almost nothing.
What started as mobile-first has expanded: desktop now has its own three-column “campaign war room” layout, not just a stretched mobile view. Mobile-first remains the floor, not the ceiling.
Thinking Trace
- Original framing (v1): AI as GM — the AI runs the whole narrative, adjudicates rules, manages world state. Felt right conceptually as a “flip” on writing tools.
- After research and reflection: AI as GM is too technically complex, and the development risk is that it pulls toward AI game design rather than product thinking. Not the right problem to start with.
- Pivot: AI-assisted solo narrative RPG. But “assisted” was still pointing at a companion/tracker framing — something that sits alongside the game.
- Clarification: the product is the game itself. Ironsworn is the engine, not the product. The player experience lives entirely inside what gets built.
- Research (second round) converged on useful signal: solo campaigns die from friction and re-entry cost, not rules complexity. The right design optimises for momentum and resumability, not for maximum features or generated text.
- Key research finding worth holding: “AI must serve the game mechanics, not replace them.” That is the correct boundary.
Since v2 — design phase into build (2026-05 to 2026-06):
- The product got a real name — StoryLab — and a visual identity (“Mythic Minimal”) locked in alongside it. Naming wasn’t deeply deliberated; it was practical, driven by needing a name to do renaming work — but it stuck and became the project’s real identity.
- A tangent into PWA storage limits (Safari’s 7-day eviction for non-installed PWAs) surfaced a monetization shape almost by accident — local-only free, cloud sync as the paid tier, à la Obsidian Sync. Captured separately — see Local-First as a Monetization Lever.
- Re-understood the app’s actual shape: not eight pages, but two routes (Launch, Active Scene) with six overlays. The app didn’t change — the mental model of it did, and that reshaped how design work got sequenced.
- Removed the @datasworn/ironsworn-classic dependency entirely — rules data now extracted and owned from the source PDF, after repeatedly finding the PDF more authoritative than the package. Worth holding as a general principle: own your ground truth data once a dependency proves less authoritative than the source.
- Formalised a five-pass verification framework (PDF source tracing, cross-file consistency, developer simulation, routing audit) and adopted it immediately as the standard for all doc work — it then carried roughly three weeks of work.
- Adopted OpenSpec for Claude Code sessions and packaged the review workflow into a reusable storylab-reviewer skill. The same day the skill was packaged, a session deviated from it — checkpoints skipped, fixes applied inline. Agreed to re-read reference docs at the start of the next session; no confirmation yet that this happened.
- A People-tab feature (BONDED grouping) originally deferred to Phase 2 got pulled into Phase 1 because the data model already supported it at “near-zero implementation cost.” Live tension worth tracking: the original research said deferred features must not be introduced unless requested, but in practice the bias has been toward pulling things forward when they’re cheap — worth watching how much “free” scope accumulates this way over Phase 1.
- Reconsidered mobile-first as the only shape — designed a genuine three-column desktop layout (“campaign war room”). Mobile-first remains the floor, but desktop now gets its own architecture.
- Phase 0 (Direction & Exploration) declared complete after a 41-slide, 7-screen-group design review; Phase 1 (build) begins. Build order split further than originally planned (Step 2 → 2a/2b, Step 3 → 3a/3b), with a “just-in-time engine” principle. A genuine OpenSpec gap surfaced — no concept of “not yet started” work, distinct from “spec’d” or “in progress” — CLAUDE-CODE.md now holds that sequencing.
What changed?
v3
The project crystallised from an unnamed exploration into a named product (StoryLab, “Mythic Minimal” visual identity) with a settled design system, a clarified screen architecture (2 routes + 6 overlays), owned rules data (datasworn dependency removed), and a completed Phase 0 → Phase 1 (build) transition. Desktop expanded from an afterthought to its own three-column layout. AI’s role as assistance-layer (not GM/narrator) held through this entire phase.
v2
Pivoted away from AI as GM. Product concept clarified from “AI writing tool” to a complete playable solo narrative RPG experience, with Ironsworn/Starforged as licensed mechanical infrastructure. AI role narrowed to assistance layer (oracles, inspiration), not GM or narrator.
v1
— skip —
Why it changed?
v3
This wasn’t one decision — it’s the accumulation of roughly three weeks of design-and-build work converging on a stable design phase. Naming and the design system emerged from practical necessity (renaming work) but became the project’s real identity. The screen-architecture reframe, the datasworn removal, and the desktop expansion were each discovered through doing the work rather than planned upfront — consistent with the OpenSpec-style “real-time decisions, not pre-specified” approach. Phase 0 closed because the specs had become stable enough to build against, not because of a fixed deadline.
v2
AI as GM research revealed two problems: technical complexity is high, and the development path easily strays into AI game design rather than product thinking. Separately, the companion/tracker framing undersells the actual ambition — the product is not a tool that sits alongside the game, it is the game. These two shifts happened in the same thinking session.
v1
— skip —
Open Questions
- Rules engine breakdown not yet started — the OpenSpec explore session to cut the rules engine into ordered sub-changes hasn’t run; src/lib/engine/ is empty.
- Step 5 (Move Selector + Roll Result) sizing is unresolved — flagged as possibly the largest step and may need splitting like Steps 2 and 3.
- Step 3b (campaign setup wizard) is blocked on an incomplete carousel draft (slides-setup.jsx).
- architecture.md still describes a flat folder structure that contradicts the parameterized-routes decision — known doc-debt.
- Auth/account model for cloud sync is entirely undesigned — the local-first monetization idea (see Local-First as a Monetization Lever) has no implementation path; the app currently has zero account concept.
- Process drift from the storylab-reviewer skill, acknowledged the same session it was packaged — agreed to re-ground at the start of the next session, not confirmed as having happened.
- Docs housekeeping debt from the Phase 0 → Phase 1 transition — reorg/archive handoff was requested, not confirmed closed out.
Connections
- Evolved from AI Writing Tool
- GenAI Development - From APM to OpenSpec — process/mental-model evidence drawn from this project
- Local-First as a Monetization Lever — monetization thought surfaced from this project
Changelog
- v3 — Model shift: see What/Why changed
- v2 — Model shift: see What/Why changed
- v1 — Initial node