Those Who Swift - Issue 281
Weekly note ✏️Ship day gets the screenshots, the release notes, and the celebratory post. Day two gets the bug reports. This week’s reads are about that much longer stretch of software life: a 14-year-old app replacing its database, an open-source maintainer asking others to take ownership, a developer measuring what iOS background scheduling actually does in the wild, and an engineering lead making decisions before certainty arrives. Hit reply and tell us: what’s the oldest piece of software you’re still responsible for keeping alive? Shipping Is the Easy Part. Sustaining It Is the Job.with Divya Ravi — Technical Editor, iOS engineer Ship day gets all the ceremony. The build goes green, App Review says yes, and for a few hours the project feels finished. Then somebody finds the edge case. Maybe it is an old device you no longer own. Maybe it is data created six versions ago. Maybe it is not even your bug, but it is happening inside your app, so the distinction is not especially useful to the person staring at a broken screen. That is the part of shipping we rarely celebrate: the years after the release, when the job becomes less about adding something new and more about keeping a promise you already made. Daniel Saidi’s Wally is a good example. The app is 14 years old, and version 7 replaces Realm with SwiftData. Saidi describes a much cleaner architecture, less storage code, better integration with modern Apple frameworks, and private iCloud sync. It is tempting to summarize that as a straightforward modernization. It probably did not feel straightforward while changing the foundation of an app that has been accumulating users and data since 2012. There is a point in every long-lived codebase when leaving the old system alone stops being the conservative choice. The workaround has a workaround. A dependency no longer fits the direction of the platform. The code still runs, but every new feature pays rent to an architectural decision made years ago. Replacing it is risky. Keeping it is risky too. Matt Massicotte’s post sits nearby, although the debt is human rather than technical. He lists the open-source projects he can no longer maintain properly and asks people to take them over. I appreciated how direct the post is. Open source has plenty of launch energy and very little succession planning. We talk about adoption, stars, and contributors; we talk much less about what happens when the person whose name is on the repository no longer has the time to be its unpaid support team. Asking for maintainers is not abandoning a project. Done early enough, it may be the most responsible maintenance decision available. Irving Popovetsky’s post on iOS background tasks is the kind of article that only gets written after the happy path has stopped being useful. He instrumented The useful part is not a magic configuration that makes iOS behave like And sometimes the maintenance problem is outside your repository. Jeff Johnson’s latest App Store post looks at suspicious gaps between ratings and written reviews, along with developers submitting apps at remarkable volume. You can improve your architecture, tests, and release process and still depend on a distribution system whose failures you cannot patch. So I kept coming back to Mohammad Faani’s decision framework, especially his 70% rule: when one option looks roughly 70% right, choose it and adjust as you learn. That is useful advice for leads, but it is also a fair description of maintenance work. Most choices arrive with incomplete information. Wait for certainty and the backlog continues making decisions for you. Working on SDKs has changed what I count as a successful release. A launch can be exciting, but the work that builds trust happens afterward: integrations continue working, old assumptions are tested against new platform behavior, and users do not need to know how much changed underneath them. “Nothing broke” is not much of a headline. It is still an outcome worth being proud of. There is no tidy lesson here. Sometimes the right call is a migration. Sometimes it is one more compatibility fix. Sometimes it is admitting that a project needs a new maintainer. The hard part is noticing when the decision has changed—and making it before neglect makes it for you. Hit reply and tell me: what are you still sustaining years after you shipped it, and would you make the same choices again? Related reading on this week's theme 📚Wally 7Daniel Saidi releases version 7 of Wally, the wallet app he first built in 2012. The biggest change is underneath: Realm is gone, SwiftData is in, and the new storage layer removes a lot of code while adding private iCloud sync. 📍Level: Intermediate Looking for Maintainers!Matt Massicotte has more open-source projects than he can properly support, so he names them and asks for new maintainers. A candid post about ownership, handoffs, and the part of open source that begins after people depend on your work. 📍Level: Beginner Running iOS Background Tasks Reliably, Part 1Irving Popovetsky instrumented 📍Level: Advanced A Framework to Make Decisions Faster as a Lead Software EngineerMohammad Faani offers a practical framework for decisions that cannot wait for perfect information: separate reversible choices from irreversible ones, timebox the research, write down the uncertainty, and use the 70% rule when it is time to commit. 📍Level: Intermediate More Incredible Tales of App Store CurationJeff Johnson continues documenting App Store curation problems, including suspicious rating patterns and developers shipping apps at astonishing volume. A reminder that keeping an app healthy also means living with systems you do not control. 📍Level: Intermediate This Week in Those Who Swift 🗞️The latest across Swift, Apple, AI, and the community. Swift Around the Web 🌐What Is a Swift Package Registry?Dave Verwer explains the difference between SwiftPM, a package index, and a package registry—and why verified, immutable source archives can be faster and safer than fetching every dependency through Git. 📍Level: Intermediate Coding 👨💻Protecting SwiftUI Views With AuthenticationA reusable 📍Level: Intermediate Empty States in SwiftUI with ContentUnavailableViewKyle Browning walks through the 📍Level: Intermediate The Curious Case of the Missing SwiftUI ClicksButtons inside a bidirectional 📍Level: Intermediate Preventing Transitive Swift Imports with BazelSwift permits a module to import dependencies it never declared directly. Adin Ćebić shows how the 📍Level: Advanced iOS 27: StateReporterAnton Gubarenko explores StateReporting, a new iOS 27 framework that attaches app-state context to MetricKit and Instruments. Instead of seeing only that a hang occurred, you can see what the app was doing when it happened. 📍Level: Intermediate NSTextTable in SwiftiOS 27 brings 📍Level: Intermediate Apple 🍏Changes for Apps in the European UnionApple announced new EU business terms taking effect October 1. The update replaces the per-install Core Technology Fee with a 5% commission on digital transactions in apps distributed outside the App Store, revises other commission rates, expands alternative-distribution eligibility, and adds child-safety rules for alternative payments. Embedded Swift Improvements Coming in Swift 6.4Swift.org previews broader language support for Embedded Swift, including generalized existential types, untyped throws, and metatypes, plus floating-point parsing and error handling for concurrent operations on constrained targets. AI & Tooling 🤖Apple Foundation Models: Hybrid AI with Dynamic ProfilesPeter Friese builds a router that keeps smaller prompts on Apple’s on-device model and sends larger ones to Gemini. Dynamic Profiles hold the model choice, token-budget check, and model-specific instructions so the call site stays clean. 📍Level: Advanced Translation Sub-Agents Go BrrrrrrrrAmy Delves shares a localization workflow built around 📍Level: Intermediate AI Wanted to Give Up. The Human Didn’t.Fatbobman reflects on Linus Torvalds’s “debug session from hell”: 24 debugging patches and 18 kernel boots to find a one-line fix. AI helped with the repetitive work, but human judgment supplied the persistence. A timely reminder that faster tools do not remove the hardest part of debugging—knowing when the evidence still does not add up.. 📍Level: Intermediate Tutorials 📒Presenting Alerts and Confirmation Dialogs from Identifiable Data in SwiftUINatascha Fadeeva demonstrates the new iOS 27 item-based APIs for presenting alerts and confirmation dialogs. Binding presentation directly to an optional 📍Level: Intermediate Video🎥AI-Assisted TDD in Practice (Swift + AI)Quality Coding demonstrates how test-driven development can put useful boundaries around AI-generated Swift code. The tests define the expected behavior, while the coding assistant works toward small, verifiable changes instead of producing an entire implementation at once. 📍Level: Intermediate Thanks for reading Those Who Swift! Subscribe for free to receive new posts. 👇
|

