work / strata

Strata

A contractor in a crawl space with no signal gets accurate guidance by voice and camera — and it has to keep working when the connection does not.

Every interesting constraint in this project came from the physical environment, not the model.

Status
v1.0 shipped, April 2026
Role
Solo build
Stack
React Native (Expo) · FastAPI · GPT-4o Vision + Whisper · Pinecone · Supabase · SQLite FTS5 · Railway
Source
Private repo

01  The problem

Field service software is designed in offices by people with reliable wifi and clean hands. The actual user is under a house, holding a flashlight, wearing gloves, in the dark, with one bar of signal or none.

Strata is diagnosis for licensed plumbers: point the camera at a component and it identifies it and walks a hypothesis-elimination flow; hold to speak and it transcribes; say “Hey Strata” and it listens hands-free. It finds the nearest supply house that has the part.

The requirement that drove the architecture is that none of that can depend on the network.

02  How it works

Mobile appReact Native56px targets, 7:1 contrastFastAPIonline pathGPT-4o VisionPinecone RAGplumbing docsSQLite FTS5on-device cacheOutbox queueidempotentSupabasesyncs on reconnectGoogle Placesnearest supplieronlineoffline
Two paths to an answer and one path for writes. When the network is gone the app answers from a local full-text cache and queues everything it wanted to say, then replays the queue on reconnect without creating duplicates. Schematic — boxes illustrative, not to scale.

03  Cut the signal

Kill the network and watch where the query goes. Offline is not a degraded mode here — it is the mode the app was designed around, because the crawl space has no signal.

online · outbox 0 queued

Writes made offline queue in an idempotent outbox — each one keyed, so replaying the queue twice cannot create a duplicate record. Reconnect and watch it drain.

04  The parts that were actually hard

  • Offline is a product decision, not a fallback. Full diagnostic guidance runs from a local SQLite FTS5 index, so the app is useful with the radio off rather than showing a spinner.
  • An idempotent outbox. Feedback and job summaries queue locally and replay on reconnect. Because replay can happen more than once, every queued write is keyed so re-sending it cannot duplicate a record.
  • Designing for gloves and sunlight. 56px touch targets, 7:1 contrast, voice as the dominant input, one clear action per screen. This sounds like polish and is actually the difference between used and unused.
  • Chunking the manuals properly. Ingestion uses section-aware chunking with a parent/child schema in Pinecone, so a retrieved paragraph carries the context of the procedure it belongs to.

Honest limits. It is a diagnostic aid for licensed professionals, not a substitute for one, and GPT-4o Vision misidentifying a component in a dark crawl space is a real failure mode rather than a hypothetical one. The offline cache is a snapshot, so guidance can go stale between syncs.