Skip to content

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.

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.

74.6%view-level — 1,024 / 1,372
82.5%element-level — 21,034 / 25,503
98%best app — first-party-app-b
45%worst app — kiwix-apple

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:

AppViews loweredCoverage
tinode-ios1 / 1100%
first-party-app-b41 / 4298%
first-party-app-f34 / 3694%
first-party-app-g22 / 2492%
first-party-app-d57 / 6390%
first-party-app-h24 / 2789%
first-party-app-c35 / 4185%
firefox-ios64 / 7684%
GoCycling31 / 3882%
first-party-app-a23 / 2882%
wire-ios137 / 17280%
clean-architecture-swiftui7 / 978%
isowords49 / 6378%
wikipedia-ios114 / 14977%
WWDC22 / 2976%
exyte-Chat42 / 5675%
first-party-app-e18 / 2475%
MovieSwiftUI35 / 4873%
Pulse52 / 7173%
ACHNBrowserUI75 / 11068%
IceCubesApp91 / 16057%
NetNewsWire8 / 1457%
Gifski13 / 2748%
kiwix-apple29 / 6445%

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.

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.

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.