Trip, station and “worth the drive?” on iPhone2026
Every fuel app lists prices. Revala answers the question you actually have in the car — which stop on this road is worth it.
It began in March 2026 as Servo Map, an Australian price map, and grew into three parts: an iPhone app, a core that reads every official price feed on Cloudflare, and a console only I can open. Britain joined in October, chargers in November, and the name became Revala.
Stack
SwiftUI
·Cloudflare Workers
·Hono
·D1
·R2
·Next.js
Category
iOS
Why I Built It
3 problems
Price lists that decide nothing
The apps that already do this were designed years ago and read like it: a table of numbers with no brands and no answer, dense rows and small targets for a phone held in a car. One of the first decisions was to put every station’s logo on the map and mark the cheapest one, so the answer is visible before anything is read.
The real need is on the way
I almost never drive out just for fuel; I fill up on the way home. So the question is not which station is nearest but which one on this road is worth the stop: stations along the route, a Live Activity for the next stop, only stations that will be open when you get there, and quick answers you choose with one tap — Cheapest, Balanced or Quickest.
Nobody did the sums
Whether a detour pays for your own tank, which day of the week a region is cheapest, what each fill-up actually cost over a year: none of it was in the apps I had. Revala works these out from the price history it keeps, and logs a fill-up right after the stop.
On the Phone
iPhone · Australia
Three of the questions it answers, each on one sheet over the map.
Can I make it? One fill, and where
A price against the local average
Worth the drive? Not for 17 km
From One State’s Feed to Two Countries
Mar – Nov 2026
Each step widened what the base could hold rather than adding a special case on top of it.
1
An Australian price mapMarch. Eight states and territories each publish their own feed in their own shape; the core’s first job was to read them all into one.
2
A native iPhone appSeptember. SwiftUI on iOS 26, with CarPlay, widgets, a Watch app and a Live Activity for the next stop.
3
A country is dataOctober. Instead of making Britain a second Australia, the base became one rule for every country — regions, currency, units and time zones as data — and the UK’s Fuel Finder came first.AUUK
4
Chargers, and the car decidesNovember. Charging sites became a layer a country adds with data, and the first question became what you drive: an electric car opens on chargers, a petrol car on fuel.
5
Servo Map becomes Revala“Servo” is Australian for a petrol station; an app that is no longer only Australian needed a name that travels.
Same Code, Another Country
Australia · United Kingdom
The trends page for Australia and for Britain, and Britain’s brands page — one codebase, a different country’s data.
Australia, by state
The same page for the UK
Which brands the stations belong to
Fuel and Charging Are Two Problems
4 decisions
Fuel is read in batches
A timer wakes every five minutes and reads only the feeds that are due, a whole state at a time; each state publishes on its own cadence, from ten minutes in Queensland to four hours in Tasmania.
A charger is its own thing
A charging site is never a station: it is modelled on OCPI 2.2.1, with connectors, tariffs and live status, and read by protocol rather than by country — a new OCPI operator anywhere is one more row.
Opening hours had to be found
Most official feeds carry no hours, and “open when you arrive” needs them, so they are gathered from brands’ own site finders, the FuelCheck websites and OpenStreetMap, with public holidays counted.
A licence sets the cache
Queensland’s licence asks that a price change is shown within thirty minutes and never republished, so every cache in front of its prices is sized backwards from that limit.
Is Every Request Necessary?
Built for a million drivers
Priced for a million drivers
Before launch I measured a week of real traffic on every Worker, KV and D1 database and costed the same system at a million users; the target set from it is Cloudflare under US$100 a month at a million daily drivers.
Computed once, served from the edge
A region’s prices are the same for everyone, so after each read they are written once as files to R2 and served through the CDN with signed reads. The apps read there first; the API is the fallback.
The phone holds the state
The device keeps a state’s stations and refreshes only their prices, by time, while you drive; moving the map no longer asks the server anything.
Only what changed, next
One forecourt changing one price still resends a whole state today. Sending only the prices that moved is being built: for New South Wales that is 0.7 KB in place of 66 KB on a quiet evening.
Where a Price Comes From
8 official feeds
The path one price takes: read from its source, judged before it is stored, stored once, and served from the edge to every client. A read that returns less than half of last time is refused rather than written over good data.
Official price feedsRead on each source’s own cadence
NSW FuelCheckNSW + ACT · 20 min
Fuel Prices QLD10 min
WA FuelWatch60 min
SA · NT · TAS · VIC15 min – 4 h
UK Fuel Finder15 min
→read
Cloudflare WorkersA timer every 5 minutes
Collect
Readonly the sources that are due
Judgenames fuels, flags outliers
Guardrefuses a read under half of last time
→write
Store
D1price history
KVthe current state
R2public files
→
Serve
Data hostCDN, signed reads
Public APIrate-limited
Pushhourly, via APNs
→only what changed
Clients
iPhonepulls changes every 5 min
CarPlay · Widgets · Watch
revala.apppages rebuilt every 10 min
Recorded from the console’s data-flow view, redrawn as the path a single price takes.
Running It From One Console
Operations
A console with no address of its own
The console is a separate Next.js app behind Cloudflare Access. It holds no database: the core owns every query and every write, and exposes them on an entrypoint that has no public address — only the console’s service binding can reach it.
Down, stale or slow — I hear first
A monitor outside the app probes the service and publishes its state; the console shows each check, the incidents of the last ninety days and the daily pass rate, and a mail arrives when prices go stale or answers slow down, before a driver notices.
Fix it where I see it
A failed background job can be run again from its row, from an allow-list, with the risky options asking for confirmation. A wrong station is corrected with an override that beats every source and survives the next ingest, and each fix leaves an activity record of who changed what.
What it costs, by month
Cost and quotas are one page, built from the same computation as the weekly report that lands in my inbox: any month, by product, each allowance against its use, and the invoices themselves.
Releases are switched, not shipped
Every country and feature has a stage — off, internal, testing or live — switched from the console, so a country opens to TestFlight before everyone without a new build. The same tab reads TestFlight and the App Store from App Store Connect.
Agents, Inside Boundaries
200+ decision records
A decision record before code
Most of Revala is written with coding agents, so each feature starts as a numbered decision record — the problem, the options, what I chose — and only then is built. There are more than two hundred of them.
The core owns every fact
Brands, countries, units and the words a country changes live once, in the core, and are generated into the app. The core also publishes a manifest of every operation and shared function, and the iPhone app’s CI fails the moment one is missing or renamed.
Taking the AI out was a decision too
The in-app assistant grew into a server agent held to about four hundred evaluation cases. In November I switched it off: the quick answers are now worked out on the phone from the app’s own sums, and Apple Intelligence reads a question where the device has it.
Built With
3 rows
iPhone
SwiftUI
·MapKit
·WidgetKit
·ActivityKit
·CarPlay
·watchOS
iOS 26; field performance from MetricKit, with no third-party SDK.
Core
Cloudflare Workers
·Hono
·D1
·KV
·R2
·Cron Triggers
·Analytics Engine
Nothing runs on a server of its own.
Web & console
Next.js
·React
·OpenNext
revala.app, one site per country, and the owner’s console behind Cloudflare Access.
Where It Stands
Revala covers fuel across Australia and the United Kingdom, and chargers in the UK. The iPhone app is in App Store review, with builds going out through TestFlight in the meantime; which country or feature is live is switched from the console, not from a release.
Live site
Want the full walkthrough?
Happy to talk through the architecture, the decisions, and the trade-offs behind this build.
A modern web application for calculating points for Australian Expression of Interest (EOI) for skilled migration visas. Features real-time calculation, bilingual support, responsive design, and dark/light mode.