What was broken
Getting across town meant bouncing between apps, comparing stale screenshots in my head, and hoping the fare I saw was still the fare I would pay. Ranges got flattened into fake precision. Wait times lived in a different mental tab than price.
Product decision
Build one decision surface. Map the route once. Pull published rate cards and a marketplace that moves with time of day, weather, and hotspots. Keep estimates as estimates, ranges as ranges, and upfront quotes as upfront. Rank by Price, Soonest, or Value, then hand off to the provider to book.
Flow
- 01FragmentedFour apps, one guess
Price in one place. ETA in another. Memory in between.
- 02One surfaceRoute once, compare once
Same trip. Side-by-side cards. Rank modes you can trust.
- 03DecidePick, then book there
RideLens ranks. The provider still owns the ride.
What it does
- Search From and To, or Quick fill a hub: JFK, LGA, EWR, Times Sq, Grand Central, or Brooklyn Bridge
- Use your current location or swap the ends, then map the route once on live roads
- Line up Uber, Lyft, Empower, and Curb side by side on one board
- Rank the same quotes by Price, Soonest, or Value; ⌘Enter runs the compare
- Open the provider to book. The final fare is always confirmed in the provider app
The comparison contract
- Estimates stay estimates
A modeled fare is shown as an estimate, never dressed up as a quote.
- Ranges stay ranges
When a fare is a range, both ends stay on the board. No invented midpoint.
- Upfront stays upfront
An upfront price is kept distinct from anything modeled.
- Expired quotes never win
A stale quote cannot take the top of the board.
I wanted a product that respects uncertainty. The board keeps these rules whichever way it is sorted.
Under the hood
- Photon for place search and OSRM for routing on live roads
- Fare math built on published rate cards
- A marketplace model that tracks time, zone heat, and weather, so estimates update with traffic, time of day, and hotspots
- Side-by-side provider cards that auto-refresh after the first compare
Why I built it
- I live in a city where the right ride changes with the clock, and where opening four apps is its own chore
- I wanted a product that respects uncertainty: never invent a midpoint just to look decisive
- The interesting work was the comparison contract, not another map widget
How it was built
- I directed product design, ranking rules, and quote honesty end-to-end
- Implemented and iterated the live app in Cursor; ownership of decisions and quality stays with me
- Marketplace behavior is modeled from published rate cards and conditions; booking still happens on the provider
- Shipped as a working product, not a pitch deck. Adoption claims are not the point of this case
Role & tags
Product, design, and build. Designed the comparison model, quote honesty rules, ranking modes, and the live marketplace surface.
- Multi-provider
- Live routing
- Quote honesty
- Price
- Soonest
- Value
Impact
A working product: Photon search, OSRM routing, side-by-side provider cards, and auto-refresh after the first compare. Built end-to-end in Cursor and shipped live. I made it because I kept paying the tax of not knowing which ride was actually better tonight.
Try the live product
The product itself, below. If it does not allow this page to frame it, or you are reading with JavaScript off, the picture stays and says so.
1-9 beats · j / k · ← → adjacent · y link · b brief

