Building a Full-Stack Swift App - From Navigation to Deployment
This series takes Apple's Landmarks tutorial app and turns it into a production-ready, full-stack Swift application. Each post builds on the last, introducing one architectural pattern at a time - from client-side navigation all the way through server deployment and automated testing.
Every post includes a companion GitHub repo with the complete working code.
The Series
1. SwiftUI Navigation the Easy Way
January 10, 2026
A type-safe, scalable approach to SwiftUI navigation using enums and centralized destinations.
2. Domain Models vs API Models in Swift
January 17, 2026
Why separating your network layer from your business logic makes everything easier.
3. Dependency Injection in SwiftUI Without the Ceremony
January 24, 2026
Closure-based services, observable stores, and why you don't need protocols or view models.
4. Tiered Caching in Swift
January 31, 2026
A two-layer cache with memory and disk storage, LRU eviction, and flexible fetch policies.
5. Setting Up a Backend Server for Our Landmarks App
February 7, 2026
Build a Vapor backend with Fluent models, response types, and RESTful routes.
6. Using Everything We've Learned to Build a Fully Featured App
February 14, 2026
Wire together Vapor, networking, API models, domain models, caching, and SwiftUI into a complete working app.
7. Let's Deploy It to AWS and Set Up a CI/CD Pipeline
February 21, 2026
Dockerize the Vapor backend, deploy to AWS with ECS Fargate, and automate with GitHub Actions.
8. Testing Against a Real Server in Vapor Tests
February 24, 2026
Write integration tests that boot a real server, make HTTP requests, and verify endpoints end-to-end.
9. Testing the Landmarks App with Dependency Injection
February 28, 2026
The closure-based DI pattern makes the iOS app trivially testable - without hitting any server.
10. Visual Regression Testing with Grantiva and Stateful Mocks
March 7, 2026
Use Grantiva's YAML-based visual regression testing to test real user flows and catch visual changes automatically — without a running server.