Mobility · 2024
Otto Mobility
Native iOS app powering 200K riders daily
A native rewrite of a cross-platform app that was failing its riders — cut crashes by 92% and doubled how long people stayed in the app.
Year
2024
Sector
Mobility
Duration
8 months
Team
2 iOS engineers, 1 Android engineer, 1 backend, 1 designer
(01) The story
Otto's React Native app had been in production for two years and was slowly falling apart. Crash rates were climbing, the map rendering stuttered on older devices, and the engineering team had stopped trusting the bridge layer after three consecutive releases shipped regressions they couldn't reproduce locally.
The decision to go native wasn't obvious. Cross-platform had served Otto well at the start — it got them to market fast with a small team. But at 200K daily riders, the performance ceiling was real. We spent the first two weeks benchmarking the specific bottlenecks: map rendering, location tracking in the background, and the real-time dispatch connection. All three were areas where the React Native bridge was the limiting factor.
We rewrote the iOS app in Swift with SwiftUI for the interface layer and UIKit fallbacks where SwiftUI's ceiling still bit (custom map overlays, complex gesture handling). The Android app was rebuilt in Kotlin with Jetpack Compose. Both apps shared a Go backend that we also rewrote — the original Node.js server couldn't sustain the WebSocket load at peak hours.
The rollout was staged: 5% of riders on the new app for two weeks, then 25%, then 50%, then full. Each stage had automated crash-rate and session-length monitoring with automatic rollback triggers. By the time we hit 100%, the crash rate had dropped 92% and average session length had doubled — riders were actually using features they'd been abandoning because the old app was too slow to reach them.
(02) Challenges
What they were facing
- React Native bridge was the performance bottleneck at 200K daily users
- Real-time dispatch over WebSockets failing at peak load
- Staged rollout required without disrupting active riders
- Two platforms (iOS + Android) needed simultaneously
(03) What we built
The work
- Native iOS app in Swift/SwiftUI with custom map overlays
- Native Android app in Kotlin/Jetpack Compose
- Go backend replacing Node.js for WebSocket scalability
- Staged rollout system with automated crash-rate monitoring
- Real-time dispatch connection handling 50K concurrent riders
(04) Outcomes
The numbers
92%
Crash rate reduction
2×
Session length increase
4.7 (from 3.2)
App Store rating
0
Rollout incidents
“Our riders noticed before we announced it. The reviews changed overnight.”
(05) Related work
Similar engagements
Want results like Otto Mobility's?