Building Case Analyst · A Flutter dev series
Building Case Analyst — a Flutter dev series
TL;DR — Eight posts on how I built Case Analyst, a cyberpunk detective game, in pure Flutter — no game engine. The whole game is a fictional operating system: a terminal you type real commands into, a forensic image analyzer, an encrypted chat with a field agent, all driven by a JSON mission engine and a single Riverpod director over an event bus. The series walks the architecture from the spine outward, then ships it to five platforms and tells you what it actually cost.
Case Analyst is a narrative detective game where you investigate by typing commands into a fake forensic OS — no avatar, no sprites, no physics. That made it a strange fit for a game engine and a perfect fit for Flutter's widget tree. This series is the full engineering teardown: how each "tool" in the game works as plain widgets and immutable data, how the pieces talk through one event bus, how a solo, part-time dev shipped it to iOS, Android, macOS, Windows and Steam from a single ~20k-line codebase, and what I'd do differently. Read it in order for the architecture story, or jump to whichever part you came for.
The eight parts
- Part 1 Building a detective game in pure Flutter (no game engine) Why a narrative OS-sim doesn't need Flame — the analyst-desktop metaphor, Riverpod state, go_router, and a single game-director notifier reacting to an event bus.
-
Part 2
An in-game terminal with a real command parser
A pure-function parser returning a typed record, mission-gated verbs, command history on the arrow keys and a typewriter effect — all from a
TextFieldand a RiverpodNotifier. -
Part 3
A forensic image analyzer: enhance, thermal & deepfake detection
"Enhance" with no image processing:
ColorFilter.matrixfilters, aCustomPainterscan line, and a deepfake-hunt minigame that's entirely JSON hotspots. -
Part 4
Field Link: a data-driven branching dialogue engine
An encrypted chat built from immutable models and one Riverpod
Notifier, where a reply never mutates the game — it just fires an event and the director decides what it means. - Part 5 A data-driven mission & narrative engine Every case is JSON, not Dart: the mission model, a glob-the-manifest loader, flag-driven branching, coherent mid-campaign starts, and a persisted evidence archive.
-
Part 6
One codebase to iOS, Android, macOS, Windows & Steam
A
LayoutClassenum for responsive shape, a one-linemedia_kitshim for Windows video, IAP-vs-Steam monetization behind one provider — and the SteamPipe depot fight that actually hurt. -
Part 7
The AI asset pipeline of a solo indie game
Voices, portraits, video and a full trailer set from one part-time dev — ElevenLabs, MidJourney, AI video tools and Claude Code, plus a real
ffmpeg+ ASS/libass trailer pipeline. - Part 8 Shipping a Flutter game solo: what worked, what I'd change The honest ledger: the pure-Flutter bet, data over code, Riverpod at scale, the cost of "cross-platform free," AI's sharp edges, and marketing as the hardest unsolved problem.
Case Analyst is a cyberpunk detective game where you investigate by typing real commands in a terminal — out on mobile, coming to Steam on October 29. Wishlist it on Steam, and follow along for the whole series.
Where to find Case Analyst
- Official site: case-analyst.com
- Steam (launches October 29 — wishlist now): store.steampowered.com
- iOS: App Store · Android: Google Play
- Follow: YouTube · Instagram · TikTok · Discord