Part I
Live coding
Small starter projects in the shape companies hand out for the live round: make it build, find what's wrong, fix what matters, then add a feature on top of your fixes and test it. Each round has a runnable project in LiveCodingLab.
Start here
Rounds
- 01The transactions that don't add up60 minA modern SwiftUI transactions list — @Observable, NavigationStack, .task, .refreshable — with its service in a local package. It doesn't build, rows don't open, one record blanks the screen and refresh doubles the list. Fix it, then add merchant search and a spend total, and test both.
- 02The driver who drives backwards60 minA SwiftUI ride-tracking screen fed by an AsyncStream of driver positions, with an ETA request per position. It doesn't build under Swift 6, freezes when it opens, shows an ETA that jumps back up, never says the driver arrived, and keeps tracking after you leave. Fix it, then add an "almost here" banner and a Cancel ride button, and test both with a fake stream.
- 03The reviews that won't stop loading60 minA paged SwiftUI reviews list for one tour, with its service in a local package. It doesn't build, it opens on a CancellationError, the rating is always a whole number, and scrolling to the end wipes the list. Fix it, then switch to the cursor endpoint, add a minimum-stars filter, and test the paging.
- 04The photo from another row60 minA modern UIKit product list — diffable data source, cell registrations, list content configurations — with photos loaded async from a local package. It doesn't build, it crashes on launch, rows show other products' photos after a fast scroll, every photo is downloaded three times and memory triples. Fix it, then build a real image loader step by step, the way the interviewer escalates: share in-flight downloads, then cap the memory. Test it by counting downloads.
- 05The flag that was never off60 minA wallet home screen whose features hang on a synchronous, UserDefaults-backed flag singleton. It doesn't build under Swift 6, an unfinished feature is live, hiding the balance doesn't stick, and the existing tests only pass in one order. Fix it, then migrate the screen to an async flag client that can fail, keeping its tests.
- 06The basket that charges twice60 minA SwiftUI basket with a Pay button, reviewed the way a payments team reviews a pull request. It doesn't build, it says €50.00 and still charges shipping, totals go stale, quantities go negative, an empty basket can be paid for, and two taps charge the card twice. Fix it, then add promotion codes, where every rule needs a question first, and test the money.