Guzzolene
One car.
A world of moving parts.
Fuel economy and price trends, in context. Every fill-up tells a small part of a bigger story — about the road, the economy, and the world beyond the pump.
Explore the data- 01 / THE RECORD
- 211fill-ups tracked
- 02 / THE START
- 2018logging since
- 03 / THE PERSPECTIVE
- 1car. real-world data.
01 — THE OBSERVATIONS
The price of going places.
At the pump. Over time.
Monthly averages from a real driving life.
Real fill-ups. Monthly averages. World events for context.
02 — UNDER THE HOOD
How it's built
A personal tool, shipped — and a few decisions worth explaining.
From notebook to product
It started as a Python/Matplotlib notebook charting years of my own fill-ups. The web app reimplements those analyses as a live product: monthly aggregates computed in React Server Components and shipped as data to client-side Recharts, with Drizzle as the typed source of truth over Neon Postgres.
A PWA, not a native app
The job is logging a fill-up one-handed at the pump — sometimes with no signal. An installable PWA does that without app-store overhead: entries queue in an offline IndexedDB outbox and sync automatically when the phone reconnects.
Cutting the AI OCR
An earlier version read the pump display from a photo via Claude. I removed it: a mobile-shaped form with a numeric keypad turned out to be faster and more reliable than photo-then-extract, and dropping it shed two cloud dependencies. Not every problem needs a model.
Privacy by construction
Fill-ups can capture location for my own use, but coordinates are stripped at the database query for any public surface — they are never sent to an unauthenticated visitor, not merely hidden in the UI.
Built with
- Next.js 16
- React Server Components
- TypeScript
- Clerk
- Neon Postgres
- Drizzle ORM
- Recharts
- Tailwind CSS
- PWA · offline sync
- Vercel