The Patch blog

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.

Guide

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 →
Engineering

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 →
Guide

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 →
Engineering

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 →
Guide

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 →
Engineering

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 →
Guide

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 →
Engineering

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 →
Guide

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 →
Engineering

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 →
Engineering

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 →
Product

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 →