Loading...
Loading...
Complete guide for migrating from Apache Cordova to Capacitor. Use this skill when users need to modernize a Cordova/PhoneGap app to Capacitor, migrate plugins, or understand platform differences.
npx skill4agent add cap-go/capacitor-skills cordova-to-capacitor| Aspect | Cordova | Capacitor |
|---|---|---|
| Native IDE | Builds via CLI | First-class Xcode/Android Studio |
| Plugin Management | Separate ecosystem | npm packages |
| Updates | Full app store review | Live updates with Capgo |
| Web App Platform | Any | Any (React, Vue, Angular, etc.) |
| Maintenance | Slowing down | Active development |
| TypeScript | Limited | Full support |
| Modern APIs | Older patterns | Modern Promise-based APIs |
cordova --version
cordova platform versioncordova plugin listcat config.xml# Install Capacitor
bun add @capacitor/core @capacitor/cli
# Initialize Capacitor
bunx cap initcom.company.appwww# Add iOS platform
bun add @capacitor/ios
bunx cap add ios
# Add Android platform
bun add @capacitor/android
bunx cap add androidios/android/| Cordova Plugin | Capacitor Equivalent | Install Command |
|---|---|---|
| cordova-plugin-camera | @capacitor/camera | |
| cordova-plugin-geolocation | @capacitor/geolocation | |
| cordova-plugin-device | @capacitor/device | |
| cordova-plugin-network-information | @capacitor/network | |
| cordova-plugin-statusbar | @capacitor/status-bar | |
| cordova-plugin-splashscreen | @capacitor/splash-screen | |
| cordova-plugin-keyboard | @capacitor/keyboard | |
| cordova-plugin-dialogs | @capacitor/dialog | |
| cordova-plugin-file | @capacitor/filesystem | |
| cordova-plugin-inappbrowser | @capacitor/browser | |
| cordova-plugin-media | @capacitor/media | Custom or use @capgo plugins |
| cordova-plugin-vibration | @capacitor/haptics | |
| cordova-plugin-local-notifications | @capacitor/local-notifications | |
| cordova-plugin-push | @capacitor/push-notifications | |
# Cordova
cordova plugin add cordova-plugin-fingerprint-aio
# Capacitor
bun add @capgo/capacitor-native-biometric# Cordova
cordova plugin add cordova-plugin-purchase
# Capacitor
bun add @capgo/capacitor-purchases# Facebook
bun add @capgo/capacitor-social-login
# Google
bun add @codetrix-studio/capacitor-google-authdocument.addEventListener('deviceready', () => {
navigator.camera.getPicture(success, error, options);
});import { Camera } from '@capacitor/camera';
// No deviceready event needed
const image = await Camera.getPhoto({
quality: 90,
allowEditing: true,
resultType: CameraResultType.Uri
});// Cordova
const uuid = device.uuid;
const platform = device.platform;
// Capacitor
import { Device } from '@capacitor/device';
const info = await Device.getId();
const platform = await Device.getInfo();// Cordova
const networkState = navigator.connection.type;
// Capacitor
import { Network } from '@capacitor/network';
const status = await Network.getStatus();
console.log('Connected:', status.connected);// Cordova
navigator.geolocation.getCurrentPosition(success, error);
// Capacitor
import { Geolocation } from '@capacitor/geolocation';
const position = await Geolocation.getCurrentPosition();// Cordova (remove this)
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
// Your code
}
// Capacitor (just use directly)
import { Camera } from '@capacitor/camera';
async function takePicture() {
const photo = await Camera.getPhoto();
}import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.company.app', // From config.xml widget id
appName: 'My App', // From config.xml name
webDir: 'www', // From Cordova build output
server: {
androidScheme: 'https'
},
plugins: {
SplashScreen: {
launchShowDuration: 3000,
backgroundColor: '#ffffff',
androidScaleType: 'CENTER_CROP',
showSpinner: false
}
}
};
export default config;<!-- Cordova config.xml -->
<preference name="Orientation" value="portrait" />
<preference name="StatusBarOverlaysWebView" value="false" />
<preference name="StatusBarBackgroundColor" value="#000000" />@capacitor/status-bar<!-- Cordova config.xml -->
<platform name="ios">
<allow-intent href="itms:*" />
</platform>// capacitor.config.ts
const config: CapacitorConfig = {
ios: {
contentInset: 'always',
},
android: {
allowMixedContent: true,
}
};<key>NSCameraUsageDescription</key>
<string>We need camera access to take photos</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We need photo library access to select images</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We need location to show nearby places</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need microphone access for audio recording</string><uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />bunx cap syncwww/bunx cap open ios
# Then build in Xcode (Cmd+R)bunx cap open android
# Then build in Android Studio (Run)# Remove Cordova platforms
cordova platform remove ios
cordova platform remove android
# Remove Cordova
bun remove cordova
bun remove cordova-ios
bun remove cordova-android
# Remove Cordova plugins
cordova plugin list | xargs -I {} cordova plugin remove {}
# Remove config.xml (after backing up)
mv config.xml config.xml.backupError: Plugin not foundbun listbunx cap syncdeviceready// Remove this
document.addEventListener('deviceready', onDeviceReady);
// Use this
import { App } from '@capacitor/app';
App.addListener('appStateChange', (state) => {
console.log('App state changed:', state.isActive);
});webDirbun run buildbunx cap syncimport { Camera } from '@capacitor/camera';
// Capacitor handles permission prompts automatically
const photo = await Camera.getPhoto();bun add cordova-plugin-example
bunx cap synccordova plugin listbun add @capacitor/plugin-namedevicereadybunx cap sync# Install Capgo plugin
bun add @capgo/capacitor-updater
# Create account at capgo.app
bun add -g @capgo/cli
capgo login
# Initialize and deploy
capgo init
bun run build
capgo uploadcapgo-live-updates| App Size | Estimated Time |
|---|---|
| Small (1-3 plugins) | 2-4 hours |
| Medium (4-8 plugins) | 1-2 days |
| Large (9+ plugins) | 3-5 days |
| Enterprise (custom plugins) | 1-2 weeks |
capacitor-ci-cdcapgo-live-updatescapacitor-app-store