John Jayasankar

JJ-SYS-08Labs · Consumer5 min read

RideLens: every ride, one comparison

Live roads. Real rate cards. Uber, Lyft, Empower, and Curb ranked before you open four apps and guess.

  • Independent · Labs
  • 0→1 · live product
  • 2026
  • Product, design, and build

RideLens · compare board

Illustrative trip · four providers, three sort rules

4  to 1providers  to one board

Illustrative quote types, not live fares · the final fare is always confirmed in the provider app

Phases1-4 · select to hold

Reading the illustrative interfaceOne trip mapped once on live roads across Uber, Lyft, Empower and Curb, and the same quotes ranked by price, soonest pickup or value, with upfront prices, ranges and estimates kept distinct and expired quotes never on top.

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

  1. 01FragmentedFour apps, one guess

    Price in one place. ETA in another. Memory in between.

  2. 02One surfaceRoute once, compare once

    Same trip. Side-by-side cards. Rank modes you can trust.

  3. 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.

RideLens, as its case card shows it
A still of RideLens. The live product opens in its own tab, and appears here instead of this picture when it allows this page to frame it.

Open RideLens (opens in a new tab)

1-9 beats · j / k · ← → adjacent · y link · b brief