[ Case study ]
The rider app's map froze on mid-range Android phones, unlock codes failed at the dock in bright sun, and the nonprofit's own usage data showed riders giving up between finding a bike and unlocking it.
CLIENT a city bike-share nonprofit — FOCUS Profile on the median phone
Representative examplesEvery case study in this library is an illustrative composite of the kind of engagement we deliver — written to show our method and standards, not to name clients.
The nonprofit behind the city's bike-share operates a few hundred docks on grant funding and municipal goodwill, with a paid staff you could fit around one table. Its riders are not the premium-phone demographic: the median rider phone is four years old, and the equity mission that attracts the grants also defines the fleet. The rider app had been assembled by successive volunteers and short contracts, and the nonprofit's own usage data — assembled by hand for grant reports — showed riders quitting at the dock.
The rider app's map froze on mid-range Android phones, unlock codes failed at the dock in bright sun, and the nonprofit's own usage data showed riders giving up between finding a bike and unlocking it.
We proposed rebuilding the rider app around a performance contract: the four-year-old reference device is the release gate, and every map, animation, and unlock flow must clear it before it ships. The dock moment gets redesigned against its actual failure modes — high-contrast sun-readable unlock, haptic confirmation, and a code fallback that does not require reading anything. Rides carry coarse, consented zone tags from onboarding onward, so the funder's neighborhood report becomes a query instead of a hand-assembled project.
Just as important is what we ruled out, and why:
The map layer was rebuilt with clustering and offline tile caching until the four-year-old reference device scrolled smoothly — performance was a release gate, not a hope.
Unlock moved to a high-contrast, sun-readable screen with a fallback code entry and haptic confirmation, designed against the dock's actual failure modes.
Rides carry coarse, consented zone tags so the funder's neighborhood report is generated, not hand-assembled.
Delivered by the experience pod — mobile engineer + researcher over 8 weeks, with working increments reviewed with the client every week.
Obstacle
The first optimized build still dropped frames on the reference device: the tile cache was right, but station clustering recomputed on every pan and dragged the JavaScript thread to a standstill.
Handled: We moved clustering to a coarse grid that recomputes only on zoom changes and profiled until the reference device scrolled the full network without stutter — then froze that measurement as the gate.
Obstacle
Sunlight legibility never appeared in office testing: the unlock screen passed every review indoors, then failed on a sunny dock where riders could not distinguish active from inactive codes.
Handled: We made it an instrumented rebuild: a test device at the busiest noon dock, the unlock screen's contrast stepped through measured levels while the failure rates recorded in the nonprofit's own usage data served as the pass mark — the contrast level that survived the dock became the release gate, and haptic confirmation followed so success no longer depends on reading the screen.
The headline: rides per bike per day across the season after relaunch, read from the dock system's unlock records — 1.9 → 3.1, read from Dock-system unlock records. A second check: app-initiated unlocks abandoned before completion at −55%.
The app stopped being the part of bike-share the nonprofit apologizes for. Riders on old phones open the map and it opens — that alone returned a cohort the usage data showed had quietly left. The dock moment became something staff demonstrate proudly instead of explaining around. The operations lead now pulls the funder's neighborhood report in an afternoon instead of a fortnight, and the grant renewal conversation shifted from defending numbers to planning expansion, which is the conversation a nonprofit wants to be having.
The result was read from Dock-system unlock records against the pre-engagement baseline over the stated window, with a guardrail check on app-initiated unlocks abandoned before completion. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.
What we would do differently
We would test in actual daylight earlier — the screen-legibility failure was obvious on a sunny dock and invisible in the office, and it had been shipping for two seasons.
[ Related service ]
[ Related builds ]
Plastic cards Wallet passesAll active memberships issued as Wallet passes over the first renewal season, with gate scan time logged by the ticketing system
62% 89%Share of digital tickets validated offline-capable at first launch of the trial season, read from the operator's validation logs
[ Next step ]
Next case study