⬇ Download latest Android APK · Website · Quick start · Community · Contribute
Unofficial project. CourierPilot is not affiliated with, endorsed by, or sponsored by Wolt, Bolt, or their affiliates.
Work smarter, not longer. CourierPilot is a local-first Android companion for Wolt Partner and Bolt Food couriers. When an offer rings, it reads the offer from the screen, estimates a walking/cycling route when its protected routing service is configured, and shows an offer-time estimate of money per routed kilometre, coloured by how good the offer is.
A high payout alone does not make an offer profitable. The distance and route matter, and local market trends help put an offer in context. CourierPilot never taps Accept or Decline for you; it helps you make the decision. It also keeps a private history of every priced offer, the addresses you visit and your platform presence, so you can understand your own work from your own data.
The card appears while the offer is on screen and disappears when the offer ends (accepted, declined, expired or replaced).
- Rate first. A provisional €/km uses the courier app's stated distance; a route-verified €/km uses the Valhalla route estimate. Real-world distance may differ.
- Colour = verdict. The best offers glow in saturated gold; worse offers fade towards grey until a terrible one is barely visible. The emoji fades with it.
- Route on the right. 🚶 walking and 🚲 cycling distance from your GPS position via every pickup to every customer.
≈means estimate. When a full route cannot be trusted, the card says so (≈ €X/km ⏳or?/km) instead of pretending.- One offer, one verdict. The number and emoji are locked once shown; they never flip while you decide.
- Swipe sideways to hide the card for this offer (purely visual). Drag up or down to move it; the position is remembered.
- Never covers the app's buttons. The card is placed below the courier app's menu and Decline buttons on any screen size.
Home, History and Addresses are grouped lists that reuse the live card's colours: every offer's €/km is graded from gold (🔥) to clay (💩), venues of stacked orders are shown together (Burger Lab + Green Bowl), and saved door codes sit right next to the address. Light, dark or follow the phone — your choice in Settings → Appearance; the live card itself always stays dark so it reads over any map.
Rendered from the real app with invented venues, customers and codes.
- Offer appears. A Wolt or Bolt notification and/or the offer screen is detected.
- Capture. Accessibility text plus OCR of the offer card. An offer is saved only once a plausible, non-zero price is visible, and the clean proof screenshot is stored before any card is drawn.
- Stops. Wolt exposes text addresses, which are geocoded. Bolt shows only the restaurant address; customers are pins on a map (see below).
- Route. A fresh GPS fix plus the ordered stops go to a protected self-hosted Valhalla server for walking and cycling routes.
- Verdict. Money per real kilometre is scored against your local market thresholds and shown as colour and emoji.
Bolt does not show the customer address before you accept, only a map. CourierPilot measures the pins in a screenshot of the offer:
- The restaurant pin is matched to its geocoded text address; that fixes where the map is.
- The scale comes from Bolt's own minutes to the customer. Your blue location dot only refines it when it agrees, because shop and station icons share its colour.
- Every customer pin (doubles, triples, several restaurants) becomes a coordinate and is routed in order.
- A final sanity check compares the route with Bolt's minutes. If they don't fit, the card shows an honest
≈ €X/km ⏳estimate instead of a verdict.
In developer mode the card also shows tiny debug lines (the pickup address and the recovered customer address), and accepted Bolt orders are compared with the real address Bolt reveals, so recovery accuracy is measured rather than guessed.
No route server is needed to see personal provisional offer-rate trends. The Pay screen separately groups your last 90 days of captured Wolt/Bolt offers with a platform-reported distance. The estimate is labelled as platform-supplied, and it is not mixed with Valhalla-verified city statistics. Stacked incremental add-ons are excluded because their extra distance is not a full-route denominator.
For future optional worldwide routing, see the routing alternatives and public beta design.
| 💶 Offer history | Every priced offer with its proof screenshot, stored on the phone |
| 🎯 Live card | Real-route €/km, colour-graded verdict, walking and cycling distance |
| 🧭 Wolt routing | Timeline stop order (including stacked orders) → geocoder → Valhalla |
| 🗺 Bolt map recovery | Customer pins from the offer map, ETA-anchored scale and sanity gate |
| 📈 Market analysis | Personal offer €/km distributions, city comparison when enough privacy-safe observations exist, trend and confidence |
| 🔐 Access codes | Remembers door codes and arrival hints per address |
| 🛰 Ride traces | Explicit GPS recording of real rides for future personal route learning |
| 🔊 Voice | Optional spoken offer summary, off by default |
| 🌗 Light & dark | System, Light or Dark theme; the live card always stays dark |
| 🩺 Reliability screen | Privacy-safe capture diagnostics and an exportable report |
courier_offers.db— priced offer history;courier_meta.db— platform presence, address visits/context and access-code memory;route_research.db— route provenance, Bolt recovery accuracy, lifecycle research and GPS ride traces;Pictures/CourierOffers— priced proof screenshots.
Stops are resolved by the device geocoder; with routing enabled, ordered coordinates are sent to the configured protected Valhalla endpoint. There is no CourierPilot account or CourierPilot cloud sync. The APK currently declares optional ACCESS_BACKGROUND_LOCATION for arrival reminders; it is not requested by the normal setup flow, and the ETA fallback works without it. Android app-data backup is disabled to protect addresses and door codes. See Privacy & permissions.
Raw offer text, exact addresses, GPS points and Bolt samples stay out of the privacy-safe Reliability diagnostics. The on-card debug lines are on-screen only and are never logged.
Remote diagnostics are optional and off by default. When enabled in Reliability, only bounded technical metadata is uploaded (random install/session IDs, app/device version, platform, stage and a sanitized message) to the project's self-hosted endpoint. Notification text is redacted; screenshots, OCR frames, customer names, exact addresses and GPS coordinates are never included.
Don't judge an offer by its headline fee alone. A €5 offer across a long detour can be worse than a smaller payout nearby. CourierPilot estimates pay per routed kilometre, keeps the observed offer distribution, and compares your recent data with an eligible city baseline where available. It separates personal and city sources and shows confidence and insufficient-sample states instead of inventing a market average.
Market metrics describe seen offers, not proven net earnings per hour. Real take-home pay also depends on waiting time, riding time, expenses and whether an offer was accepted. See Market methodology and limits. There is no automatic acceptance — the courier remains in control.
Public routing research and hosting options · Market methodology
Download the latest signed APK · Quick start · Privacy & permissions · Compatibility
- Install the APK on Android 11+.
- Enable Notification access and Accessibility → CourierPilot screen capture after reading the permission explanations. On Android 13+, a sideloaded APK may show a Restricted settings warning.
- Use Wolt or Bolt Food. The live card is enabled by default. Offers with a visible payout are archived; a provisional €/km estimate is shown when the platform also provides a distance.
- Optional advanced routing: grant foreground location, configure a protected Valhalla endpoint and its bearer token, then enable routing. Do not paste your own token into public issues.
Important: route-verified €/km scoring requires a working protected Valhalla endpoint; CourierPilot does not currently provide a public shared routing token. The main offer-capture/history flow and provisional platform-distance €/km still work without it. The app never automatically taps Accept or Decline. Compatibility with every country, platform version or device is not guaranteed.
gradle testDebugUnitTest assembleDebugAndroid 11+ · Kotlin · Android SDK 35 · Java 17 · Jetpack Compose / Material 3 · NotificationListenerService · AccessibilityService · ML Kit Text Recognition · self-hosted Valhalla · SQLite · JUnit/Robolectric · GitHub Actions.
Release signing is documented in docs/RELEASE_SIGNING.md. Contributions: see CONTRIBUTING.md and never attach unredacted courier screenshots. Source code is available under the MIT License.
Download the latest release · The notes below highlight selected earlier milestones.
- 0.17.11 — direct Android permission shortcuts on Home and clearer basic/advanced routing setup. Notes.
- 0.17.10 — clearer market source/currency indicators, wrapped Wolt OCR earnings fix, and new field reports. See release notes.
- 0.17.9 — private Android backups disabled; new setup, privacy, compatibility and market-analysis guides. See release notes.
- 0.17.5 — every screen in the new design; wrapped Wolt venue names and OCR postcode duplicates fixed. See
docs/RELEASE_0.17.5.md. - 0.17.4 — clean screenshots: the card is hidden during capture instead of painted over. See
docs/RELEASE_0.17.4.md. - 0.17.3 — swiped card returns after reopening the courier app, smoother proof screenshots. See
docs/RELEASE_0.17.3.md. - 0.17.2 — Wolt stacked routes read straight from the card (no drop-off click), clean proof screenshots. See
docs/RELEASE_0.17.2.md. - 0.17.1 — instant History with incremental loading, redesigned Stats, Pay and Settings. See
docs/RELEASE_0.17.1.md. - 0.17.0 — new grouped-list design for Home/History/Addresses, System/Light/Dark theme, every venue of stacked Wolt orders. See
docs/RELEASE_0.17.0.md. - 0.16.2 — full Bolt venue names, new Wolt "Deliver to" screen, door-code reminders. See
docs/RELEASE_0.16.2.md. - 0.16.1 — live card redesign (gold → grey), Bolt map anchoring fix, ETA sanity gate, no card restarts while an offer rings. See
docs/RELEASE_0.16.1.md. - 0.16.0 — live advisor overhaul: stable sessions, compact card, flicker-free capture, Bolt north-up recovery. See
docs/RELEASE_0.16.0.md. - Next — map-label registration for Bolt (OCR of street and place names as extra anchors) and line-graph pairing for multi-stop orders, gated on measured accuracy. See
docs/LIVE_ADVISOR_OVERHAUL_PLAN.mdanddocs/ROUTE_INTELLIGENCE_ROADMAP.md.
Built for real courier use: inspectable numbers, explicit provenance, no invented certainty.
