How We Built Baja Pescador's AI Fishing Assistant to Work With No Signal

Baja Pescador's Offline AI Fishing Assistant

The Objective

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.

Service Tags

Vision Language Models Prompt Engineering Offline-First Architecture Mobile

Industry Tags

Outdoor Recreation Sport Fishing Consumer Mobile

Tech Stack

React Native Django GPT-4o mini Python

The Impact

Zero
queries lost
To connectivity gaps Images and prompts write to local storage before any network call is attempted, and persist across app close and device sleep.
Guidance
available offline
Trip planning, identification, and contextual advice Anglers previously relied on manual planning and accumulated field experience alone.
2
stores
Live in production iOS and Android, both published and available.
The Client

Baja Pescador Sells Fishing Gear, Apparel, and a Catch-ID App

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.

The Problem

The App Is Needed Offshore, Where There Is No Signal

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.

Our Approach

We Wrote Every Request to Local Storage Before Any Network Call

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.

Local Persistence Layer

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.

Queue and Sync

When connectivity returns, the queue clears and responses arrive. The angler does not need to remember what they submitted or resubmit anything.

Species Identification

Vision language model integration handles identification from a photograph. The underlying vision capability was strong without modification, so the engineering effort went elsewhere.

Prompt Engineering for Response Quality

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.

Trip Planning and Contextual Guidance

Beyond identification, the assistant handles trip planning and answers questions throughout the day, which makes it a companion across the whole outing.

Location Tracking

Catches carry positional context when it is available, so the log builds a picture of where species are being found.

What We Built

A Vision Assistant, an Offline Queue, and Trip Planning

Every component assumed the network would be unavailable when it mattered.

AI Trip Planning
Photograph-Based Species Identification
Contextual Fishing Guidance
Chat Interface for Follow-Up Questions
Tuned Prompt Layer
Local Draft Storage for Images
Local Draft Storage for Prompts
Queue and Sync on Reconnection
State Persistence Across App Close
State Persistence Across Device Sleep
Location Tracking on Capture
Catch Logging and History
React Native iOS Application
React Native Android Application
Django Backend and API Layer
How It Was Built

We Built and Tested the Offline Path Before the Connected One

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.

Outcome

Zero Queries Lost, and Answers Arrive When the Boat Returns

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.

Testimonials

"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."

Baja Pescador

Founder

Do your users need your product in places your infrastructure cannot reach?

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