Ship Swift over‑the‑air
Skip Waiting for Review

Move fast and fix things

MyApp — ProfileView.swift
MyApp › iPhone 15 Pro
13var body: some View {
14 VStack(alignment: .leading, spacing: 12) {
15 Avatar(url: user?.avatarURL)
16 .frame(width: 56, height: 56)
17 Text(user!?.displayName) ?? "there")
Fatal error: Unexpectedly found nil while unwrapping an Optional value
18 .font(.title2.weight(.semibold))
19 Spacer(minLength: 0)
20 }
21}
Hi, there
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
$ patchcli release -m "fix profile crash" ✓ Pushed module 1.4.2

Trusted by Swift developers from

Meta University of Oxford Y Combinator Imperial College London TikTok

One click rollout. Two clicks… rollback.

No more stuck on “Waiting for Review” for 49 hours.

v1.4.2Fix EU tax rounding2 min ago · youlive · 47%
v1.4.1Promo-code stackingyesterdaylive
v1.4.0Paywall copylast weekarchived

Rollback with 1 click

Something off? Roll the whole fleet back to any prior version in one click — instant rollback with no App Store review. Your users will be none the wiser.

47%rolled out
Devices2.12M / 4.5M
Errors0.00%
Median load4 ms

Monitor hotfixes in real time

Adoption, errors, and load — device by device, as each hotfix lands.

Canaryinternal · 1%100%
Betaearly access100%
Productionall users47%
A/B variant50 / 50 split50%

Progressive rollouts

Staged rollouts over the air: ship to canary, then beta, then everyone — or A/B a variant to a slice and promote the winner.

So simple you won’t need to ask Claude Astra

Copy our setup prompt

01

Install the CLI

brew install patch-release/tap/patchcli

02

Run patchcli init

It registers your app, adds the PatchSDK Swift package, and inserts the two-line startup code for you.

03

Write Swift like always

No JS bridge, no React Native, no rewrite. Code that touches raw OS APIs stays native automatically.

MyApp.swift
import SwiftUI +import PatchSDK @main struct MyApp: App { + init() { + Patch.configure(.init(appKey: "pak_live_a3f8…")) + Task { await Patch.shared.start() } + } var body: some Scene { WindowGroup { ContentView() } } }

Run it from your laptop, or from CI

A native-Swift alternative to Expo and CodePush — your React Native friends will be jealous.

~/MyApp — zsh
# ship it to 10% first, then ramp $ patchcli release -m "fix profile crash" --channel production --rollout 10 Patch push ========== Channel: production Rollout: 10% Fingerprint: ✓ compatible (a91f3c7d21b4…) ✓ Pushed module 1.4.2 Rollout: 10%
.github/workflows/patch.yml
# release an OTA patch on every merge to main name: Patch OTA on: push: branches: [main] jobs: release: runs-on: macos-14 steps: - uses: actions/checkout@v4 - run: | brew install patch-release/tap/patchcli patchcli release --channel production env: PATCH_API_KEY: ${{ secrets.PATCH_API_KEY }}

Start free. Pay as you grow.

Unlimited updates on every plan — hotfix as much as you want.

Hobby Free Up to 100 devices
  • Unlimited OTA updates
  • Instant rollback
  • CLI + CI/CD
  • Ship-safety checks
  • Individual workspace — one member
Start free
All features Startup $59/month Up to 10,000 devices
  • Everything in Hobby
  • Phased rollouts
  • Channels — canary, beta, production
  • A/B testing
  • Invite your team — unlimited members
Sign up
Enterprise Contact sales Custom pricing · unlimited devices
  • Everything in Startup
  • Priority support & SLA
  • Audit logs & activity feed
  • Dedicated onboarding
Contact sales

Questions, answered.

Can you update native Swift code over the air?

Yes. It's a common myth that native iOS code can't be updated over the air — that only a React Native (JavaScript) or Flutter (Dart) bundle can. It was true before Patch. Patch makes genuinely native Swift updatable: its CLI compiles the Swift you changed to WebAssembly and ships it as a small patch, and the on-device SDK runs it in the WasmKit runtime. Covered Swift — business logic, async/await, and SwiftUI views (74.6% of SwiftUI view bodies across a 24-app benchmark) — updates with no App Store review and instant rollback. Code that touches raw OS APIs stays in your signed native binary automatically, and if a patch can't run the SDK falls back to the bundled version. Your signed App Store binary is never modified — only the interpreted WebAssembly layer updates.

Is there a CodePush or Shorebird alternative for native Swift?

Yes — Patch. CodePush and Expo / EAS Update update the JavaScript bundle of a React Native app; Shorebird updates the Dart code of a Flutter app. None of them can touch a genuinely native Swift / SwiftUI app, because there's no JavaScript or Dart bundle to replace. Patch is the native-Swift equivalent: you write ordinary Swift, Patch compiles the changed code to WebAssembly and runs it on-device in WasmKit — ship in minutes, no App Store review, instant fleet-wide rollback — without adopting React Native or Flutter.

Is shipping code over the air allowed by Apple?

Yes — it's explicitly allowed by Apple's own rules. Apple's Developer Program License Agreement (§3.3.1(B)) expressly permits an app to download and run interpreted code, as long as it doesn't change the app's primary purpose, doesn't create a storefront for other code, and doesn't bypass the OS sandbox or code signing. Patch does none of those: your signed App Store binary never changes — only the interpreted WebAssembly layer updates. This is the exact same provision Expo / EAS Update and CodePush have relied on for nearly a decade, across tens of thousands of live App Store apps.

Will Patch slow my app down?

No — the overhead is negligible. Your patched code runs in the WasmKit runtime at near-native speed, and for the kind of code Patch ships — business logic, validation, pricing, networking glue, view construction — the cost is measured in microseconds. There's zero impact on launch: the SDK activates the cached module instantly (even offline) and only checks for updates in the background. Anything genuinely performance-critical stays native, so your hot paths are always compiled machine code. Modules are tiny (tens of KB) and updates ship as compressed binary diffs.

Do I have to rewrite my app?

Not at all. You keep writing native Swift exactly as you do today. Run patchcli init once — it registers your app, adds the Swift package, and inserts the two-line startup code for you — and that's the whole integration. No JS bridge, no React Native.

What can I actually update over the air?

Far more than logic. Swift concurrency (async/await) runs in WASM, and Patch has coverage for SwiftUI views — 74.6% of SwiftUI view bodies across a 24-app benchmark of real apps (16 open-source, 8 our own), with 82.5% measured per element. Pricing logic, validation, business rules, networking glue, feature flags, routing, and your view code can ship over the air. The few things that touch raw OS APIs (HealthKit, cameras) stay in your App Store binary; Patch detects the split automatically and only ships what's safe.

What happens if a patch breaks something?

Roll the whole fleet back to any previous version in under a minute — no resubmission. Patch also has a fallback chain: if a module is missing or corrupt, users automatically run the bundled version in the App Store binary.

Does it work offline and on older devices?

Updates apply on next launch and are cached on-device, so the app works completely offline. Patch runs on iOS 15+ and falls back gracefully to the original bundled version if a module is missing.

How is pricing counted?

By the number of distinct devices that receive patch updates across all of your apps. Every plan includes unlimited updates and rollbacks — you only move up a tier as your device fleet grows.

Push your first fix today.

Install now and ship a patch by this afternoon.