Rideshare Driver App (worked example) GitHub issue

vibecode
{"vibecode": {
    "doc": "rideshare-driver-app",
    "role": "worked-example spec for a driver-side PWA built on puck.uno/geo; doubles as the end-to-end validation case for whether geo covers a real rideshare driver use case",
    "key_concepts": ["driver_pwa", "puck_uno_geo_validation", "address_resolution",
        "turn_by_turn_navigation", "fare_zone_logic"],
    "status": "brainstorm"
}}

Status: spec for a real app Miko may build — a driver-side Progressive Web App for a new rideshare service. Doubles as a worked example of how puck.uno/geo is intended to be used.

This doc covers the driver-side app only. The companion rider-side app is a separate concern (different UI, mostly the same geo usage).


Goals GitHub issue


What puck.uno/geo Provides GitHub issue

Everything map-related routes through puck.uno/geo:

The geo service is the only third-party-style dependency for maps. No Google Maps, no Mapbox, no separate provider keys.


What puck.uno/geo Does NOT Provide GitHub issue

Everything ride-business-specific lives in the rideshare's own backend (which is a separate system from puck.uno/geo):

The rideshare backend is its own beast; this doc concerns itself only with the driver-PWA side and its use of puck.uno/geo.


Tech Stack GitHub issue


Major Screens GitHub issue

Status / Main (idle) GitHub issue

The driver's home screen when not on a ride.

The map embed updates as the driver moves. The driver can pan/zoom inside the iframe if they want to look around.

Incoming Ride Request GitHub issue

A modal that appears (with push notification if backgrounded) when the rideshare backend matches this driver with a pickup.

If the driver accepts, the rideshare backend confirms and transitions the ride to "en route." The app moves to the "To Pickup" screen.

To Pickup (en route to rider) GitHub issue

Active navigation screen — the driver is driving to the pickup location.

ETA recalculates periodically (every minute, or on significant location change). Each recalc is a $geo.eta_to(pickup_coords) call from the driver's current location.

Arrived at Pickup GitHub issue

Driver pulls up; app detects arrival (proximity to pickup coords).

In Trip (en route to drop-off) GitHub issue

Same shape as "To Pickup" but routed to the drop-off coords.

End Trip GitHub issue

Driver pulls up at drop-off; presses End Trip.

Earnings GitHub issue

A separate screen showing recent rides, totals, payout status. Pure rideshare-backend data; no puck.uno/geo involvement.

Settings / Profile GitHub issue

Vehicle info, documents, driver preferences. Rideshare-backend data.


puck.uno/geo Usage Summary GitHub issue

Cross-referenced from the screens above:

Screen puck.uno/geo methods used
Status / Main $map.html (current location, with live tracking via postMessage), $geo.restrooms, $geo.coffee, $geo.food(drive_thru:), $geo.gas
Incoming Request $geo.address (resolve pickup), $geo.distance_to, $geo.eta_to
To Pickup $map.html with $map.navigation = true; destination set programmatically (mechanism TBD)
Arrived at Pickup $geo.distance_to (for proximity detection)
In Trip $map.html with $map.navigation = true; destination set to drop-off coords
End Trip none (rideshare backend handles fare/payment)
Earnings none
Settings none

This is the complete geo surface the driver app uses. Any geo method not on this list isn't needed for v1; any geo method on this list needs to actually work well for v1 to ship.


Validation: Does puck.uno/geo Have What's Needed? GitHub issue

Cross-checking the table above against the geo spec:

Method Status in geo spec
$geo.address ✅ Spec'd
$geo.distance_to ✅ Spec'd (linear distance)
$geo.eta_to ✅ Spec'd in navigation brainstorm
$geo.route_to ✅ Spec'd in navigation brainstorm
$geo.restrooms / .coffee / .food / .gas ✅ Spec'd in $geo.businesses shortcuts
$map.html ✅ Spec'd — DOM embed; the rendered map handles dynamic behavior internally
$map.navigation = true ✅ Spec'd — toggles navigation features in the rendered map
$map.voice = true ✅ Spec'd — toggles voice prompts during navigation

Gap surfaced GitHub issue

The earlier "live-tracking map embed" and "route-as-map" gaps are now resolved by the simpler navigation paradigm — the rendered map handles all dynamic behavior internally; Caspian just toggles features.


PWA Limitations to Design Around GitHub issue

PWAs are not native apps; some things that "just work" on iOS/Android require workarounds in a PWA. The driver app is particularly sensitive to a few of these:

Background location GitHub issue

Native apps can track location in the background. PWAs cannot (deliberately — browser privacy protection). For a driver app this means:

Push notifications GitHub issue

Web Push API works on Android (Chrome, Firefox, Edge) and recently on iOS (Safari 16.4+, requires PWA installed to home screen). For a driver:

Wake lock GitHub issue

Screen Wake Lock API keeps the screen from sleeping. Supported on Android Chrome and recent iOS Safari. Critical for the driver — a dimmed/locked screen mid-ride is a usability disaster.

Offline behavior GitHub issue

Spotty cell coverage is real (rural roads, parking garages, etc.). The app needs:

Battery GitHub issue

Drivers run their phones 8–12+ hours a day. The app needs to be battery-conscious:


What's Out of Scope for v1 GitHub issue

To keep the v1 scope honest:


Open Questions GitHub issue


Why This Validates the Geo Service GitHub issue

If this app ships and works well, that's strong evidence the puck.uno/geo service is sufficient for real driver use. The doc above pins down exactly which geo methods the app needs; gaps surface as missing methods or weak performance. The validation feedback loop goes:

  1. Build the driver app per this spec.
  2. Use it. Note where geo falls short.
  3. Refine geo. Repeat.
Eating our own dog food is the point.

© 2026 Puck.uno