Architecture · LikeC4
Wheel Practice App
Seeded, offline Wheel of Fortune trainer: ingest puzzle packs, then play them on iOS or web
The whole picture
System landscape
The system in context, then opened up into its containers.
Inside each box
Containers & components
Each part decomposed into the components that implement it. Every box links to its source in the interactive explorer.
Puzzle pipeline (pipeline/) — components
pipelineContainerpipeline/ — ingest raw sources → normalize → dedupe → score → validated pack JSON
Game engine (duplicated) — components
engineContainerPure-functional seeded logic. RISK: lives twice (ios/src/engine + app/src/engine), kept byte-identical only by an interim sha256 drift guard; extraction to /shared/engine/ is still planned
Web app (app/) — components
webContainerapp/ — React + Vite + Tailwind. The migration target: iOS Standard-mode improvements ported here, kid-mode extras preserved
iOS app (ios/) — components
iosContainerios/ — React Native + Expo. The improvement source-of-truth being ported to web; still the originally-shipped target
How it runs
Walkthrough flows
Dynamic views — the narrative spine of the system, step by step.
Walkthrough — building a puzzle pack
buildPackDeterministic by design: the same inputs + --seed always produce byte-identical pack JSON, so dedupe ids and pack stats are reproducible. Hand-editing data/packs breaks the content-hash ids.
Walkthrough — a Standard-mode round (web)
standardRoundThe whole round runs through the seeded reducer: spin, guess consonants, buy vowels (gated by mustSpin), then solve. Determinism means the same seed replays the same wheel and reveal order.
Walkthrough — a Kid-mode session
kidSessionKid mode never penalizes: every wheel outcome is positive (stars, hints, money, free letters). Phonics and letter-suggestion helpers plus TTS scaffold early readers; progress and treasure persist across sessions.
Explore it live
The figures above are static exports. The interactive explorer lets you pan, zoom, follow relationships, and jump from any box to the source.