Capacitor 9: what changes, and what to do first
Capacitor 9 is forecast for the end of November 2026: Cordova becomes optional, the iOS runtime is Swift, XCFramework distribution ends. Plus the CocoaPods deadline hiding inside it.
Capacitor 9 has been in alpha since May 2026, and Ionic's road map post of 28 August forecasts general availability for the end of November 2026. That is close enough to plan around, and the preparation worth doing is mostly work you should be doing anyway.
This is the short version of what changes, what breaks, and the order to do it in.
What changes
Cordova becomes optional
The Cordova compatibility layer is no longer pulled into every build; it is included only when you need it. For an app with no Cordova plugins left, that is dead weight removed from the binary and one less source of build noise. For an app still leaning on Cordova plugins, nothing is taken away — but this is a good moment to count how many you have. See migrating from Cordova to Capacitor.
The iOS runtime is now Swift
The remaining Objective-C in Capacitor's iOS implementation has been converted to Swift. Most apps will never notice. Plugin authors will: if you have a plugin that reaches into Capacitor's internals from Objective-C, that assumption is gone.
No more XCFramework distribution
Capacitor will no longer be distributed as an XCFramework, and plugin authors need to run Ionic's migration tooling so that Capacitor is pulled in correctly. If you maintain a public plugin, this is the item to schedule before GA — the apps depending on you cannot upgrade until you have.
Foldables and windowed apps
Multi-instance and windowed support is on the list, which matters more than it used to: Android 16 leaned hard into large-screen and desktop-style windowing, and an app that assumes exactly one resizable-by-accident window looks broken on the hardware shipping now.
The deadline hiding inside this: CocoaPods
The single most time-sensitive item is not in Capacitor 9 at all. CocoaPods Trunk goes permanently read-only on 2 December 2026, with a dry run from 1–7 November. After that date no new pod versions can be published and the specs repository is archived.
To be precise about the blast radius, because the internet has been overstating it: existing builds keep resolving. The specs repo and CDN stay up. Nothing you have already shipped stops working. What ends is publication — which means every dependency you rely on stops receiving updates through that channel, and the ecosystem drifts to Swift Package Manager whether or not you move with it.
Capacitor 8 already defaults new iOS projects to SPM, and Ionic's advice is blunt: if you have not migrated, now is the time. Our SPM migration guide walks the actual steps. Doing it before the Capacitor 9 upgrade means debugging one change at a time instead of two.
Trying the alpha
Alphas install from the next tag. Peer ranges will not be satisfied yet, hence the flag:
npm install @capacitor/core@next @capacitor/ios@next @capacitor/android@next --legacy-peer-deps npm install --save-dev @capacitor/cli@next --legacy-peer-deps
Do this on a branch, in a copy of a real app rather than a fresh template — the value of an alpha report is the plugin combination nobody on the core team has. Ionic is asking for three configurations in particular: Capacitor-only, mixed Capacitor and Cordova, and Cordova-only.
The order to do this in
| When | Do this | Why this order |
|---|---|---|
| Now | Upgrade to Capacitor 8.5+ and migrate to UIScene | Required to build with the iOS 27 SDK at all; unrelated to Capacitor 9, and urgent on its own |
| Now | Move iOS dependencies from CocoaPods to SPM | Trunk is read-only from 2 December 2026, and Capacitor 9 assumes SPM |
| October | Audit Cordova plugins and native plugin versions | Decides whether the Cordova layer can be dropped, and which plugins block the upgrade |
| Before GA | Run the alpha against a real app on a branch | Finding a plugin incompatibility in November is cheaper than in December |
| After GA | Upgrade, ship to a staging channel, then production | A major native upgrade deserves a staged rollout, not a straight release |
What over-the-air updates do and do not cover
A Capacitor major is a native upgrade: new binary, store review, staged release. No live-update tool changes that, and any that claims to should be read carefully.
Where OtaKit helps is the fallout. After a native upgrade, the bugs that surface in the first 48 hours are overwhelmingly web-layer — a plugin API that returns a slightly different shape, a race that only appears on a faster startup path. Those ship over the air in minutes. Pin the update to the new native version with runtime version and channels so devices on the old binary never receive a bundle that assumes the new one, and keep automatic rollback armed while the rollout is young.
Where to go next
Upgrading Capacitor 7 to 8 is the closest map to what a major upgrade actually costs, and the iOS 27 UIScene migration is the piece to clear first.