{"slug": "zed-ios-app-starter", "title": "zed-ios-app-starter", "summary": "Zed Industries developer Zander Martineau released zed-ios-app-starter, a SwiftUI and SwiftData template for native iOS 18+ apps with no third-party dependencies, as the fourth member of the Zed Stack. The template includes a tab layout, SwiftData model, preferences, onboarding, theme, and accessibility support, and uses an Xcode file-system synchronized group so adding files requires no project-file edits. A scaffold.sh script and the Zero project factory automate copying and renaming the template for new projects.", "body_md": "Put together [zed-ios-app-starter](https://github.com/mrmartineau/zed-ios-app-starter), a template for native iOS apps and the fourth member of [the Zed Stack](/zed-stack). It's SwiftUI and SwiftData targeting iOS 18+, and — unusually for me — it has no third-party dependencies at all.\n\nIt ships the shell I'd otherwise rebuild every single time: a tab layout with a `NavigationStack`\n\nper tab, one SwiftData `@Model`\n\nwired all the way through list, detail, edit and delete, an `@Observable`\n\npreferences object over `UserDefaults`\n\n(because `@AppStorage`\n\nonly works inside a `View`\n\n, which means anything a model needs ends up threaded through the view tree), a first-launch onboarding walkthrough you can replay from Settings, an animated splash over a matching launch-screen colour so there's no white flash, a theme with spacing and radius scales, and Reduce Motion and VoiceOver handling. StoreKit 2 in-app purchases and a streaming Claude API chat client are both in there but switched off by default — turn one on or delete its folder.\n\nThe bit I'm most pleased with is that adding files needs no project-file edits. The target uses an Xcode file-system synchronized group, so anything dropped into the source directory gets compiled automatically, new folders included. The only things needing a `project.pbxproj`\n\nchange are files that must be *excluded*.\n\nThere's a `scaffold.sh`\n\nthat copies the template to a new directory and renames everything — target, scheme, `@main`\n\nstruct, bundle id, StoreKit product ids — because `AppStarter`\n\nbecomes `struct AppStarterApp`\n\nand a hyphenated repo name simply won't compile. [Zero](/blog/zero-project-factory), my project factory, now does the same substitutions in CI, so `type: ios`\n\nis one more option on the form.", "url": "https://wpnews.pro/news/zed-ios-app-starter", "canonical_source": "https://zander.wtf/blog/2026-08-12-zed-ios-app-starter/", "published_at": "2026-08-12 00:00:00+00:00", "updated_at": "2026-08-13 20:12:42.080645+00:00", "lang": "en", "topics": ["developer-tools"], "entities": ["Zed Industries", "Zander Martineau", "zed-ios-app-starter", "SwiftUI", "SwiftData", "Xcode", "Zero"], "alternates": {"html": "https://wpnews.pro/news/zed-ios-app-starter", "markdown": "https://wpnews.pro/news/zed-ios-app-starter.md", "text": "https://wpnews.pro/news/zed-ios-app-starter.txt", "jsonld": "https://wpnews.pro/news/zed-ios-app-starter.jsonld"}}