We have shipped several client apps on Cordova over the past few years, but keeping up with the latest iOS and Android SDK requirements through Cordova's plugin ecosystem has gotten harder each year, as some plugins lag behind platform changes. Capacitor, Ionic's newer native runtime, is built with more direct alignment to current native tooling and has matured enough this year that we migrated a stable client app over.
The web layer itself needed almost no changes, since Capacitor is designed to be largely compatible with the Cordova plugin API for common use cases. The bigger change was on the native side — Capacitor expects you to work directly in Xcode and Android Studio projects it generates, rather than abstracting native configuration away entirely the way Cordova does, which took some adjustment for the team but gives us more direct control when something needs native-level troubleshooting.
Build reliability improved noticeably, particularly on iOS, where Cordova plugin updates had been a recurring source of build breakage after Apple SDK updates. We are treating Capacitor as our default for new hybrid app work going forward.
Plugins that needed direct replacement rather than a clean port
Not every Cordova plugin the app depended on had a drop-in Capacitor equivalent. A push-notification plugin in particular needed to be swapped for Capacitor's own first-party push notification plugin, which meant re-testing notification delivery and permission prompts on both platforms rather than assuming compatibility carried over automatically the way it did for most of the app's other plugin dependencies.
Build configuration also needed a second look — Capacitor's generated Xcode and Android Studio projects expect a few native-level settings, like app icons and splash screens, to be configured directly in the native project rather than through a cross-platform config file the way Cordova handles them, which meant re-doing a small amount of platform-specific configuration work that had previously lived in one shared place.
How long the migration actually took
The full migration, including the native-side adjustments and plugin swap described above, took a small team a little under two weeks for this particular app, most of which went into testing across a range of physical devices rather than the migration's actual code changes, which were comparatively quick once we understood Capacitor's native project structure.
What we would tell a team still running several Cordova apps
We would not recommend migrating every existing Cordova app immediately just because Capacitor exists — a stable app with no urgent build-reliability problems and no near-term feature work planned is a reasonable candidate to leave alone for now. We are prioritizing migrations for the apps where Cordova plugin lag against current platform SDKs has already caused real build breakage, treating this as an opportunistic migration driven by actual pain points rather than a blanket policy applied uniformly across every app in our portfolio regardless of its actual condition.