Nearly half of Moober’s rides drove empty while riders who wanted those seats searched, saw nothing, and left. I redesigned how the platform matches riders to drivers.
Moober is UC Davis’s student-only rideshare. Students carpool home for breaks or split the drive to the airport.
I owned one problem: the search matching riders to drivers. It was quietly failing both sides of a live product I couldn’t rebuild from scratch.
Match on the whole route, not just the city.
Search reads the driver’s actual route and sorts every result into three honest tiers, from perfect match to near miss.
The driver’s destination is the rider’s destination. These sort to the top.
The rider’s city sits minutes off the driver’s highway path, never more than the driver allows. A prompt nudges riders to message their exact drop-off.
The ride ends within the rider’s search radius. The badge shows the mileage gap, so the last mile is a decision, not a surprise.
Every search ends somewhere now. ✈
The rides existed. The riders existed. The search kept them apart.
Search matched on exact city name. Nothing else. A student living between Davis and a driver’s destination was invisible, even when that driver was about to drive right past them. Search your city, get nothing, close the app.
44% wasn’t a supply problem. ✈ It was a search problem.
Two sides had to change: what riders see, and what drivers allow.
Riders widen the net themselves, up to 30 miles.
The same Fresno search now surfaces seven rides.
Every result says what kind of match it is. No pretending.
Cards draw the driver’s full path, with the rider’s stop on it.
5, 15, or 30 minutes off route. They carry the cost, so they hold the dial.
Wrong person doing the asking, and booking turns into a negotiation.
On-route matching needs a routing API call per search, which costs money. Nearby only needs distance between two points, which is free.
The feature is in build, so this is the bar I set for it.
The bar is simple: ✈ rides that actually happen.
A live product, a real codebase, real constraints. The interesting work was fitting a smarter system into an interface students already knew.
The tiers could have hidden their weaker matches. Labeling them plainly, mileage gap included, trades a little polish for trust. That matters when someone is planning a real trip.
The designs are done and handed to engineering. Next is launch, then watching whether the empty-seat number moves.
A startup is mostly its people. Ours: the team, a trip to SF, and a thoroughly unserious promo reel.

