What Patch can & can't update
The honest, developer-facing map of what an OTA patch can reach in a SwiftUI app — and the small set of things it genuinely can’t. The short version: SwiftUI structure is never the wall. An OTA patch can author, restyle, reorder, rebind, and re-flow essentially your entire view hierarchy. The only true ceiling is the App Store’s own boundary — a native capability, framework symbol, or privacy entitlement that isn’t already compiled and signed into your shipped binary.
Measured coverage
Section titled “Measured coverage”Across 24 real apps — ours and well-known open-source ones — 74.6% of SwiftUI view bodies lower to WebAssembly and ship over the air.
Per-app results vary widely, so the average matters less than the spread. The
16 named
apps are public repositories measured at pinned commits, so you can verify those
yourself; the 8
first-party-app-* rows are our own apps, included because dogfooding is the
point but not named:
| App | Views lowered | Coverage |
|---|---|---|
| tinode-ios | 1 / 1 | 100% |
| first-party-app-b | 41 / 42 | 98% |
| first-party-app-f | 34 / 36 | 94% |
| first-party-app-g | 22 / 24 | 92% |
| first-party-app-d | 57 / 63 | 90% |
| first-party-app-h | 24 / 27 | 89% |
| first-party-app-c | 35 / 41 | 85% |
| firefox-ios | 64 / 76 | 84% |
| GoCycling | 31 / 38 | 82% |
| first-party-app-a | 23 / 28 | 82% |
| wire-ios | 137 / 172 | 80% |
| clean-architecture-swiftui | 7 / 9 | 78% |
| isowords | 49 / 63 | 78% |
| wikipedia-ios | 114 / 149 | 77% |
| WWDC | 22 / 29 | 76% |
| exyte-Chat | 42 / 56 | 75% |
| first-party-app-e | 18 / 24 | 75% |
| MovieSwiftUI | 35 / 48 | 73% |
| Pulse | 52 / 71 | 73% |
| ACHNBrowserUI | 75 / 110 | 68% |
| IceCubesApp | 91 / 160 | 57% |
| NetNewsWire | 8 / 14 | 57% |
| Gifski | 13 / 27 | 48% |
| kiwix-apple | 29 / 64 | 45% |
The remainder is mostly custom child views the engine cannot reconstruct, and unsupported modifiers. A view that cannot lower is never silently broken — it renders natively from your signed binary.
What you can update over the air
Section titled “What you can update over the air”Within your app’s already-linked frameworks and declared entitlements, OTA patches reach virtually the entire SwiftUI surface:
| Area | What an OTA patch can do |
|---|---|
| View structure | Add, remove, reorder, and restyle views; change the whole hierarchy. Structure is fully authorable over the air. |
| Text & images | Text (literals, interpolation, computed strings), Label, Image(systemName:) and bundle assets, AsyncImage. |
| Layout | Stacks, grids, List, Form, Section, ScrollView, Spacer/Divider, ViewThatFits, and the layout modifiers — frame, padding, offset, position, safe-area insets. |
| Styling, colors & fonts | Foreground/background/tint, borders, shadows, corner radius, fonts and weights, plus design-system tokens — a custom Theme.Colors.ink / Theme.Font.body(…) / Theme.Radius.lg in a modifier value position lowers and rides the patch (resolved natively, fed to the view). |
| Controls & state | Button, Toggle, Slider, Stepper, Picker, TextField/SecureField, Link/ShareLink, Gauge/ProgressView, bound to @State / @Binding / @AppStorage / @FocusState. |
| Navigation & presentation | NavigationStack / navigationDestination, sheets, full-screen covers, popovers, alerts, confirmation dialogs, toolbars, context menus, and searchable. |
| Modifiers & control flow | The vast majority of standard modifiers, plus if / if let / switch control flow inside a view body, gestures (onTapGesture & the gesture algebra), onAppear/onChange/task, and full async/await logic. |
For the exhaustive symbol-by-symbol breakdown, see What’s updatable and the per-function coverage you get from patchcli build --verbose.
What you can’t update — the binary-symbol wall
Section titled “What you can’t update — the binary-symbol wall”There is essentially one true wall, with two faces. Both reduce to the same thing: an OTA patch can never introduce a native symbol, framework, or entitlement that isn’t already in your shipped, code-signed app, and can never rewrite the compiled machine code of native functions that aren’t a patchable View.body. This is not “hard, just not yet” — it’s a physical boundary, and it’s exactly the line the App Store draws.
The one-line rule
Section titled “The one-line rule”If a change lives entirely inside your app’s existing linked frameworks, declared entitlements, and SwiftUI view bodies, an OTA patch can ship it. If it requires a new native symbol, framework, or privacy entitlement that isn’t in the signed binary — or it rewrites compiled native code that isn’t a View.body — it needs an App Store release. That second set is tiny, and it’s the same boundary Apple’s review process draws. When Patch isn’t sure a change is safe, it keeps the code native and renders the bundled fallback, so an update can never break your app.
New here? Start with the Quick Start or have an AI assistant set Patch up for you.