NORMAL
← cd ~/work
in progress Solo · Mobile Engineer · 2026 — Present

Client Mobile App — Security Hardening & Ground-Up Redesign

Took over an existing Flutter/Firebase mobile app as sole engineer — hardening data access rules, standing up a real testing and documentation process, and rebuilding the UI screen-by-screen to a new design spec.

  • Flutter
  • Dart
  • Firebase
  • Firestore

A client’s production Flutter/Firebase mobile app, handed to me mid-life as its sole engineer. Before touching a single screen, the first job was making the codebase safe to build on — tightening data access, writing down decisions, and establishing a process the project didn’t have yet.

Stabilizing before building

  • Hardened data access. Audited and locked down database security rules collection by collection, extending coverage as new features shipped so every write path is scoped rather than left open.
  • Stood up process from nothing. Wrote the project’s first architecture, security, and setup docs; opened a lightweight in-repo ticket tracker so decisions and known issues survive between sessions instead of living only in someone’s head.
  • Restructured the codebase into a proper monorepo ahead of a planned dashboard and website that will sit alongside the existing mobile app.

Rebuilding the UI against a real spec

  • Working screen-by-screen off a client-supplied design file, matching typography, spacing, and a specific accent color pixel-sampled directly from the source artifact rather than approximated from the app’s existing theme.
  • Rebuilt several core flows — listing browsing, detail views, and an in-app reservation request — including new backend schema and queries to back them.

Treating data quality as a first-class bug

  • While wiring a filter against live data, discovered two populations of existing records used the same two fields for opposite meanings — traced by querying the raw collection directly rather than guessing from the query layer.
  • Chose to revert the filter to its safe, unfiltered state and schedule a proper data migration instead of shipping a query clever enough to paper over the inconsistency.

The client and product name are confidential and intentionally omitted.