Migration11 min read

Migrating from Cordova to Capacitor in 2026

Cordova is in maintenance mode. A step-by-step guide to migrating a Cordova app to Capacitor without a rewrite — plugins, config, native projects — and adding OTA live updates Cordova never had.

Cordova has been in maintenance mode for years, and the plugin ecosystem it depended on is thinning out. Capacitor is the modern successor: same idea — your web app in a native shell — but with maintained tooling, first-class native project access, and a healthy plugin ecosystem. The migration is more “adopt a new native layer” than “rewrite,” and it unlocks something Cordova never had cleanly: over-the-air updates.

Good news up front: your web app — HTML, CSS, JS, and your framework — comes across essentially unchanged. What changes is the native wrapper and how plugins are wired.

The mental-model shift

Cordova hides the native projects and generates them from config and plugins. Capacitor treats the ios/ and android/ folders as source you own and commit. This feels heavier at first and pays off constantly: you can open Xcode or Android Studio and change native config directly, instead of fighting a hook system.

Migration steps

  1. Add Capacitor to your existing project:
    npm install @capacitor/core @capacitor/cli
    npx cap init
  2. Point webDir at your existing web build output, then add platforms:
    npx cap add ios
    npx cap add android
  3. Replace Cordova plugins with Capacitor equivalents. Many common ones (camera, geolocation, filesystem, push) have official Capacitor plugins. Capacitor can also run many Cordova plugins directly, which is a useful bridge while you migrate the rest.
  4. Move config.xml settings into capacitor.config.ts and the native projects (permissions, app id, name, splash/icon).
  5. Build your web app and sync:
    npx cap sync

The payoff: live updates

Cordova's update story was awkward — the community options were limited and the hosted ones have since shut down. On Capacitor, add @otakit/capacitor-plugin and you can ship web-layer changes over the air:

otakit upload --release production

After the migration, most of what you iterate on ships without a store review. That's often the single biggest reason teams finally make the move. See how OTA works for the delivery model.

Watch out for plugins that inject into the WebView or rely on Cordova-specific globals. Test those paths on device early — they're the most likely to need a Capacitor-native replacement rather than a drop-in.

Where to go next

Follow Setup for the Capacitor + OtaKit install, then the CLI reference. If you're on Ionic specifically, see Ionic live updates.

Related docs