← BackMobile & Infra
Bolt14,20 €Best price
Heetch15,80 €
Uber16,40 €
Citygo15,10 €

Digster

The problem

Comparing the price of the same ride from one ride-hailing app to the next means opening the apps one by one and typing the same trip each time — even though the price gap between two of them often exceeds 30%.

The solution

One trip entry, every price shown side by side in seconds, and a direct hand-off to the chosen app. Built solo end to end: mobile, API and mapping infrastructure.

ResultA solo end-to-end app, published on the App Store and Google Play (EAS build).

React NativeFastAPIMapLibreCloudflare Workers
Comparator

Every ride-hailing app compared in one entry

One trip entered, and Digster returns the prices side by side — then opens the chosen app directly.

  • Bolt
  • Uber
  • Heetch
  • FreeNow
  • Allocab
  • Blacklane
  • Citygo
  • G7
Under the hood

How it works

The app queries the ride-hailing APIs in parallel through a FastAPI backend I built and host (Render), while it shows the map live — MapLibre natively, with its own tiles served by a Cloudflare Worker rather than by Google Maps. Expo / React Native front end, the whole thing built with Cursor.

Mobile appReact Native · Expo
APIFastAPI
APIs VTCUber · Bolt · Heetch · Citygo · G7
MappingApple Maps (iOS) · MapLibre + Cloudflare (Android)
The delicate parts
01Comparison

One trip, every price in parallel

The pickup and drop-off address is geocoded once (Photon, Nominatim as backup), the route computed by OSRM, then the backend queries the providers in parallel: an exact Uber estimate via OAuth when the account is linked, estimates and deep links for Bolt, Heetch, Citygo, G7. The prices come back grouped and show side by side on the map.

02Mapping

Its own map stack, no Google

The map runs on MapLibre natively, fed by tiles served through a Cloudflare Worker (tiles.digster-app.com) that relays OpenFreeMap — no Google billing on load, no proprietary SDK embedded. RN Maps stays as a fallback if MapLibre fails on a device.

03The heaviest piece

Reading ride receipts through an OCR cascade

Two inputs: the Gmail API (read-only OAuth, token exchange on the backend) which pulls receipt emails on its own, or a PDF / photo dropped in by hand. pypdf and Pillow prepare the document, then an OCR cascade steps up only as needed — Tesseract locally, OCR.space, Google Vision, Gemini Flash — until a reliable amount comes out. receipt_parser isolates the price, the provider and the date, and the ride joins the history.

04Accounts

Digster and ride-hailing auth, kept apart

Firebase Auth handles the Digster account (Apple, Google, email, phone); tokens live in the device's SecureStore. Linking a ride-hailing account is a separate step: Uber OAuth goes through auth.uber.com and passes via the backend — the app never holds the Uber secrets. OAuth loops close on digster:// deep links.