Building Labi

Dark mode, the parts of the app that had quietly never worked on web, and the first Play Store prep

2026-06-11

A month passed with nothing landing publicly — the longest gap in the whole project so far. Whatever was happening in that stretch wasn't visible from the outside, and then this day arrived carrying two very different kinds of work.

Dark mode came first, and it wasn't just colors inverted. buildDarkTheme follows Apple's own Human Interface Guidelines rather than approximating them, a sun/moon toggle sits in the home screen app bar, and MainShell got fixed so every screen actually watches the theme provider and redraws when you flip the switch — before this, half the app would silently stay stuck in whatever mode it launched in, which is the kind of bug that's invisible until the exact moment someone notices it and then looks completely broken.

The less glamorous half of the same commit is the more honest one. Web guards went into Isar, because it has no real implementation on Flutter web and had just been silently failing there. A stub landed for CalendarService.createEvent on web, since there's no calendar to write to inside a browser. A run of kIsWeb checks got scattered through main.dart wherever they'd been missing. None of that is a feature anyone would notice. It's an admission that the app had been quietly assuming a mobile OS everywhere it ran, and the web build had been broken in ways nobody had gotten around to acknowledging — until dark mode forced an actual pass through the startup code and made it impossible not to notice.

The second half of the day was smaller and mattered in a completely different way: Firebase wired in, a logo, icons. None of it made the app more feature-complete. It made "eventually submit this to a store" stop being a someday conversation and start being an actual, trackable checklist — which turns out to matter more than it sounds like, because a checklist is the kind of thing that eventually gets finished, and a someday conversation usually isn't.


← Back to Blog