How We Built Baja Pescador's AI Fishing Assistant to Work With No Signal
Baja Pescador’s users need the app on the water and have no connectivity while they are there. A conventional AI app fails in exactly that situation: the photograph goes nowhere, the request times out, and the angler either loses the moment or has to remember to try again from shore. We built an assistant handling trip planning, species identification from a photograph, and contextual guidance throughout the day, architected so every image and query persists locally before any network call is attempted and syncs when the boat returns to range.
Baja Pescador is a sport fishing brand serving anglers in the waters around Baja California. Alongside the app they sell fishing gear and apparel, and they run community programs focused on the fishery itself.
Their users are on boats. Sometimes close to shore, frequently well offshore, and the moment they most want the product is the moment they are furthest from a tower. An angler lands a fish and wants to know what it is, right then, with the fish still in hand.
Baja Pescador came to us already knowing that connectivity was the design problem. Building an AI product for people on the open water means building for the absence of the network the AI depends on.
An angler lands a fish and wants to know what it is. That moment happens on the water, often with one bar of signal and often with none.
A conventional AI app fails there in a specific and damaging way. The photograph is taken, the request is submitted, the request times out, and the app returns an error. The angler now has a photograph and no answer, and the fish is going back in the water or into the cooler either way.
Losing one identification is the small cost. The larger one is behavioral. People stop reaching for an app that failed them in the exact situation the app exists for, and they stop reaching for it permanently. A single timeout twelve miles offshore does more damage to retention than a dozen imperfect answers would.
A retry loop does not solve it either, because retries still lose the request when the app closes or the phone sleeps. Both are normal on a boat, where the phone goes in a pocket between casts.
So we designed around the assumption that the network would be absent at the point of capture. That assumption drove the architecture from the first sprint.
Images and their associated prompts write to local storage as drafts the moment the angler submits them, before any network call is attempted. The request queues rather than fails. This had to be architectural, because local persistence survives app close and device sleep where a retry loop does not.
When connectivity returns, the queue clears and responses arrive. The angler does not need to remember what they submitted or resubmit anything.
Vision language model integration handles identification from a photograph. The underlying vision capability was strong without modification, so the engineering effort went elsewhere.
The value came from shaping the response. We tuned prompts to return what an angler actually wants: the species plus the descriptive context around it, delivered the way a knowledgeable person would say it.
Beyond identification, the assistant handles trip planning and answers questions throughout the day, which makes it a companion across the whole outing.
Catches carry positional context when it is available, so the log builds a picture of where species are being found.
Every component assumed the network would be unavailable when it mattered.
We treated no connectivity as the default state throughout development. The draft queue, local persistence, and sync behavior were built and tested first, and the connected path layered on top of them afterward.
That order matters more than it sounds. Build the connected path first and add offline handling later, and offline becomes a degraded mode with its own bugs, found by users long after the team has moved on. Build offline first and the connected path becomes the special case, which is the one that gets exercised constantly during development anyway.
The specific failure we designed against was state loss. A request that fails and says so is recoverable, because the user knows to try again. A request that disappears because the phone slept in a pocket gives the user no signal at all until they go looking for an answer that never arrived. Writing to local storage before any network attempt closes the window where a submission exists only in memory.
The model side needed far less work. GPT-4o mini identifies fish species from a photograph reliably out of the box, so engineering time there would have produced nothing. The work went into the prompt layer, calibrated against real catch photographs to control how much detail each response carried and what register it used. An angler wants the species and the story around it, and a taxonomic record satisfies neither.
Those photographs came from real conditions, which for this product means wet, moving, badly lit, and often taken one-handed. Response quality was validated on exactly that input.
React Native covered both platforms from one codebase, appropriate for a consumer application where iOS and Android parity matters and platform-specific hardware access does not.
An angler photographs a catch twelve miles out, submits the question, and carries on fishing. The draft sits on the device. When the boat returns to range, the queue clears and the answers arrive. Nothing needs remembering and nothing gets retyped.
Trip planning and contextual guidance work the same way, which turns the app into a companion across the whole outing instead of a lookup tool that only functions at the dock.
New query types inherit the same draft-and-sync behavior automatically, so the assistant can grow without anyone revisiting the connectivity architecture. That is the return on building the persistence layer first: every feature added afterward is offline-capable by default.
"AppVerticals built an application that plans the trip, identifies a catch from a photograph, and answers questions throughout the day. The team handled the vision model integration and the offline draft functionality well, which matters because connectivity offshore is unreliable. The app is live on both stores and we would recommend AppVerticals to others building AI products."
We have built offline-first AI architecture where persistence comes before the network call and nothing is lost to a dead zone. We know what this takes.
Start the conversation