OTA updates, Swift to WebAssembly, and iOS release engineering
Field notes on shipping code to native Swift apps without an App Store release, the WebAssembly runtime underneath it, and what Apple actually allows.
How OTA updates work on iOS: one architecture, four payloads
How CodePush, EAS Update, Shorebird, and Patch ship code updates to iOS apps without App Store review — the interpreter architecture they all share.
Read post →We named our CLI `patch`. Unix has had a `patch` since 1985.
Shipping a CLI that collides with a 40-year-old Unix tool: what PATH-order roulette does to onboarding, what the rename cost, and a checklist for naming yours.
Read post →What Apple actually allows: the real rules for updating an iOS app outside the App Store
Does Apple allow OTA updates? Guideline 2.5.2, the §3.3.1(B) interpreted-code clause, and the 2017 JSPatch ban — what's allowed and what gets rejected.
Read post →Compiling Swift to WebAssembly: the toolchain, the binary sizes, and the sharp edges
Swift compiles to WebAssembly now — but hello-world is 5 MB, Foundation makes it 57 MB, and string interpolation can fail to link. A field guide.
Read post →You shipped a bad iOS build. Now what? The hotfix playbook
A bad iOS build is live. Every option, fastest first: pause the phased release, kill switches, expedited App Store review, forced updates, OTA patches.
Read post →Running Swift async/await inside WebAssembly (where there is no event loop)
Swift async/await silently hangs in WASM: WASI has no event loop. How we run real Swift concurrency from the host via swift_task_enqueueGlobal_hook.
Read post →Feature flags vs OTA code updates: two different insurance policies
Feature flags toggle code you already shipped; OTA updates change the code itself. What each can fix, what each costs, and why teams end up running both.
Read post →Anatomy of a host bridge: how WebAssembly host functions let sandboxed WASM call native iOS code
How sandboxed WASM calls native iOS code: WebAssembly host functions in Swift, the (ptr, len) string ABI, WasmKit imports, and the bugs they cost us.
Read post →WasmKit: the WebAssembly runtime written in Swift
WasmKit is a pure-Swift WebAssembly interpreter: embeddable via SwiftPM, WASI support, no JIT — which means it runs where JITs can't, including iOS.
Read post →Two WASM modules walk into one memory: why we ship a container, not a merged module
wasm-merge gives you a module with multiple memories — and runtimes refuse to instantiate it. Why merging isn't linking, and the container we ship instead.
Read post →Sending SwiftUI over the wire: a view body is just data
A SwiftUI body is data, not drawing. How we serialize a SwiftUI view tree to an IR, run the logic in WASM, and render it with real native SwiftUI.
Read post →CodePush is retired. Here's the 2026 map of OTA updates for mobile
CodePush shut down with App Center's retirement on March 31, 2025. The 2026 OTA map: EAS Update for React Native, Shorebird for Flutter, Patch for native Swift.
Read post →