case studymobile

Offline-first angler log — structured environmental snapshots, on-device pattern engine, lazy sync.

fisherman's log — preview
figure · fishermans-log
01 · problem

Problem

Serious anglers want their log to answer one question: given today's conditions, what has worked here before? Existing apps capture the catch and drop the context — no stream gage, no moon phase, no wind. That is the wrong trade.

02 · shape

Shape

Flutter on top of Drift (SQLite) so the whole app works on the dock with no signal. Every catch links to an environmental snapshot — weather, water, moon phase, gear, spot, trip. Open-Meteo and USGS are the external sources; WorkManager queues fetches and retries them when the connection returns.

03 · build

Build

The pattern engine is on-device: a similarity score between the current environmental snapshot and every historical catch, ranked by lure success. No network round-trip, no cloud model, no PII leaving the device. The schema is normalized enough to run real queries — catches by species, by gage height band, by barometric trend — without scanning every row.

fisherman's log — clean architecture + on-device pattern engine Catches and environment snapshots are written to a local Drift SQLite database. The Pattern Engine queries that store on-device to score lures against current conditions. External weather and gage feeds enrich each catch. FLUTTER · DARK MODE presentation domain · usecases data · drift dao sqlite · on device pattern engine condition similarity · recency on device · no network ranked lures · best times EXTERNAL · LAZY SYNC usgs · gage open-meteo · wx LOCAL · ASTRO moon phase solunar
figure · service topology
04 · result

Result

The log answers the pattern question without a server. An angler at a boat ramp with no signal can log a catch, pull a similarity-ranked list of historical lures for the current gage and barometric trend, and walk back to the water without waiting on anything.

stack

FlutterRiverpodDriftWorkManagerOpen-MeteoUSGS