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.

Montage of real Case Analyst gameplay: the analyst terminal, a rain-soaked cyberpunk alley, a burnt-out car behind police tape, a suspect's face, and the forensic analyzer's scan-line UI — all from the actual game.
Real scenes from the game: the terminal, the streets, the forensic analyzer. Every screen in this series is built from plain Flutter widgets — no game engine.

The eight parts

  1. 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.
  2. 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 TextField and a Riverpod Notifier.
  3. Part 3 A forensic image analyzer: enhance, thermal & deepfake detection "Enhance" with no image processing: ColorFilter.matrix filters, a CustomPainter scan line, and a deepfake-hunt minigame that's entirely JSON hotspots.
  4. 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.
  5. 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.
  6. Part 6 One codebase to iOS, Android, macOS, Windows & Steam A LayoutClass enum for responsive shape, a one-line media_kit shim for Windows video, IAP-vs-Steam monetization behind one provider — and the SteamPipe depot fight that actually hurt.
  7. 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.
  8. 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.