XcodeGen and the Quest to Modularize the Wealthfront iOS App
Article Summary
Wealthfront's iOS team eliminated merge conflicts entirely and cut build times by breaking their 10-year-old monolith into modules. Here's how XcodeGen made it possible.
Wealthfront's engineering team tackled the classic iOS scaling problem: 2,000+ files, 15 engineers across 7 squads, and constant project file conflicts. They adopted XcodeGen to generate Xcode projects from YAML, enabling a path to true modularization with compiler-enforced boundaries.
Key Takeaways
- Fresh builds take 2-3 minutes across all targets due to monolithic architecture
- XcodeGen eliminated merge conflicts by removing .xcodeproj from source control
- Local Swift Packages enforce one-way dependencies the compiler can verify
- Module emitting consumes 14.5 seconds of incremental build time
- Eight infrastructure modules extracted, feature modularization coming next
XcodeGen transformed project management from a merge conflict nightmare into declarative YAML, unlocking modularization that will scale build times with changed code instead of the entire codebase.
About This Article
Wealthfront's iOS app had a monolithic build configuration stored in XML. Reviewing changes meant parsing XML files or navigating Xcode's UI, which made code reviews nearly impossible. Auditing build settings across the 15-person team was manual and error-prone.
XcodeGen generates Xcode projects from YAML files instead. This makes build configuration changes human-readable in diffs. You can review pull requests that add targets, modify settings, or add build scripts.
The team set up local Swift Packages with one-way dependencies to enforce module boundaries. The compiler automatically rejects any cross-module imports that violate these boundaries. This creates structural separation that code discipline and testing alone cannot achieve.