Thumbtack's Journey to Swift 6
Article Summary
Scott Southerland from Thumbtack just shared what most iOS teams won't tell you: migrating to Swift 6 took 16+ months and broke their entire test suite. Here's the battle-tested playbook they wish they'd had.
Thumbtack's iOS team started adopting Swift concurrency in Fall 2023, moving through three enforcement levels before finally reaching Swift 6 in January 2025. Their journey reveals the hidden complexity behind Swift's promise of compile-time thread safety, including compiler bugs, framework incompatibilities, and runtime crashes that slip past compilation.
Key Takeaways
- Warnings-as-errors policy blocked incremental migration, requiring creative burndown lists and signup sheets
- Third-party dependencies (including Apple's) lacked concurrency support, forcing @unchecked Sendable workarounds
- Swift 6 runtime checks crashed production code even after passing compilation and tests
- XCUITest bugs with async contexts caused frequent timeouts and ignored failure flags
- Breaking code into modules enables scoped migrations for future Swift transitions
Thumbtack spent 16 months navigating three Swift concurrency levels, discovering that compile-time safety promises don't prevent runtime crashes from Objective-C interop.
About This Article
Thumbtack's warnings-as-errors policy meant they couldn't flip the Swift concurrency enforcement flag right away. The compiler had no way to suppress individual warnings, so the team had to fix all existing issues before they could enable targeted concurrency checks.
Scott Southerland's team built a local command to flip the compiler setting and created a burndown list with a signup sheet. This let engineers work through concurrency warnings at their own pace instead of blocking the whole codebase.
By December 2024, Thumbtack had enforced complete concurrency in CI. They fixed mutable data passing between contexts and replaced their @unchecked Sendable mocked networking stack with one that was actually thread-safe. The result was no more test timeouts and crashes.