Engineering · 2026
Snap the fuel pump; Claude reads liters, price and total. No typing. Designed and directed end to end.
Context
Logging a fill-up by hand is exactly the kind of small friction that kills a habit. You are standing at the pump, the screen shows liters, price per liter and total, and the app asks you to retype all three into tiny fields. It is the kind of step that is easy to give up on.
I wanted the record to write itself. If the numbers are right there on the pump, the phone should read them. EcoDrive is my answer to that: a fuel and vehicle tracker where the primary input is a photo, not a keyboard.
My role
This is my own product. I designed and directed it end to end — the brand and the design system, the capture flow, the React Native app, and the Claude-powered backend behind it. I set the direction and built it alongside a small team of AI agents. There was no handoff between design and engineering, because the person who drew the result screen also directed the function that feeds it.
That unbroken thread from design to code is the point of the case. It let me make decisions where design and architecture meet — how confident the model has to be before the UI trusts it, what the app does when a reading does not add up, where a value is suggested versus where the person still chooses.
The core interaction is one tap. You photograph the pump display — or pick a shot from the gallery — and a few seconds later liters, price per unit, total and fuel type are already filled in, waiting only for you to confirm.
Under that tap is a deliberate pipeline. The image is downsized on the device before it ever leaves, then sent to a backend function that asks Claude to read the display and return strict JSON — quantity, unit, price per unit, total, fuel and a confidence level. The model is told to never guess: an illegible digit comes back as null with a note, not a fabricated number. Pump displays in Brazil use comma decimals and sometimes show dim or half-lit segments, so the prompt makes the model convert carefully and stay conservative on doubtful digits.
The app then checks the reading against itself — total should be roughly quantity times price per unit. If the math does not reconcile, confidence is downgraded and the screen shows it. And the UI never assumes a domain value on the user’s behalf: fuel type is a real dropdown with a placeholder, and the AI only pre-selects what it saw. The human is always the final word.
The brain is the product: getting from a photo to a trustworthy number. Everything else — the screens, the storage, the polish — is dressing built around that one capability.
In Brazil, a car often does not run on just one fuel. EcoDrive reads liquid pumps (ethanol, gasoline, diesel) in liters, CNG dispensers in cubic meters, and EV chargers in kWh — and it never mixes those units. You cannot add a liter to a cubic meter, so the app refuses to.
To still compare them, there is a small internal energy model: each fuel has an approximate energy content per sold unit, which lets the app reason about cost per kilometer across fuels and tell you, after a flex or dual-fuel fill, which one was actually cheaper to drive on. That physics stays backstage — the interface speaks in liters, reais and kilometers, never in joules.
The same vision pipeline reads the odometer from a dashboard photo. There the instruction is the opposite kind of careful: read the total odometer only, and ignore the trip meters, the tachometer, the speedometer and the fuel gauge.
The app is Expo and React Native in strict TypeScript, with React Navigation for the stack. It is local-first: every fill-up lives in on-device SQLite through Drizzle, with explicit migrations so the schema is something I can read and reason about, not a black box. Capture leans on the Expo camera, image picker and image manipulator modules; haptics and localization round out the feel.
The vision work runs in a Supabase Edge Function on Deno, hosted in the São Paulo region to keep latency low for the people I built it for. Two decisions there matter most to me. First, privacy: the photo is never stored — it passes through the function in memory and is gone. Second, the Anthropic key lives only as a server-side secret and never ships in the app bundle.
The backend routes models on purpose. A fast model does the reading; a stronger one is a fallback only when the response is malformed, never on transient overload — so a hiccup retries instead of escalating. Around all of that sits the unglamorous engineering that makes a tool feel solid: a typed error taxonomy (network, timeout, parse, empty and the rest) mapped to plain-language messages, request timeouts with cancellation, an image-size cap, and rate limiting to keep abuse and runaway cost in check.
EcoDrive has a defined visual language, not a default one. A deep brand green anchors it, with a brighter green for actions; the system is built on Material 3 foundations with Inter, and lives as tokens — color, corner radius, button height — so the same decisions hold across every screen. Most of the app is light and calm, with one focused dark screen for the moment of truth where the extracted numbers appear.
Hero-plus-panel screens use a collapsing header that shrinks as you scroll, so nothing ever scrolls awkwardly inside itself. Copy is bilingual from day one — every new string is born in Brazilian Portuguese and neutral English — and the voice is playful and unmistakably Brazilian, except where it must not be: errors, permissions and consent are always written straight.
Outcome
EcoDrive runs end to end on a real Android device today. You photograph a pump, and seconds later liters, price, total and fuel are filled in, ready to confirm — the keyboard-free flow I set out to build actually works, across liquid fuels, CNG and EV charging, plus odometer reads from the dashboard.
It is a personal product and not yet released, so there are no public numbers to quote and I will not invent any. What this case is really about is the craft: a coherent design system and a working photo-to-data engine, designed and directed by me and built with a small team of AI agents, holding together as a single product.