iOS Engineer
Own the Cityflo iOS app end-to-end — live tracking, booking, payments — on Swift 6 and SwiftUI, with pragmatic judgment about when to go native and when to ship through the WebView.
You'll own the Cityflo iOS app — the thing 60,000+ commuters open at 8am to find their bus on a map. Features, releases, crash triage, production health: yours. You co-own a growing KMM shared module with our Android engineer and push more logic into an embedded WebView layer so we can ship faster than App Store review allows. The work is rider-facing and unforgiving: live bus tracking, trip booking, payments over Indian rails, notifications, the home and trip screens. We want someone fluent in modern Swift Concurrency who treats AI dev tools as a way to contain complexity and tech debt — not just to type faster.
What we look for
- 3–5 years shipping production iOS — you've owned features, releases, and the crash reports that follow
- Fluent in Swift 6, SwiftUI, and Swift Concurrency (async/await, actors, structured cancellation); comfortable around legacy UIKit/GCD without reaching for it
- Sound native-vs-web judgment — you know when an embedded WebView is the right call and when it isn't
- You've run the full App Store release lifecycle and live in Crashlytics/Sentry as a habit, not a fire drill
- You've touched (or are keen to co-own) a Kotlin Multiplatform shared module across iOS and Android
- You use AI coding tools daily and can tell us, concretely, where the model was wrong
The assignment
Build a small SwiftUI app on Swift 6 with strict concurrency checking ON: the user searches a term, browses results from a network API, taps into a detail view, and the app remembers recent searches across launches. Modern Swift Concurrency only — no Combine, no GCD, no third-party packages for networking/images/caching (Apple frameworks only). It's deliberately under-specified; the calls you make and the questions you'd have asked are the test. Full brief + optional mock data: https://careers.cityflo.com/takehomes/ios-engineer/ — read BRIEF.md before you start. Use your coding agent fully; that's the point.
A 24-hour window from the moment you read the brief. We expect roughly half a day of real focus — call it 4–6 hours. Going much past that is itself a signal we'd rather not see: scope down and tell us what you cut.
Connect your coding agent to our MCP and it handles the whole application — profile, resume, and this assignment. Solve it the way you actually work.