Hybrid Apps with Cordova — Then and Now



For years, Apache Cordova was how a web developer became a "mobile app developer" overnight. It wraps your HTML, CSS, and JavaScript inside a native WebView and exposes a bridge to device features — camera, accelerometer, contacts, GPS — through JavaScript APIs. One codebase, packaged into an .apk or .ipa, shipped to every store. No Java, no Objective-C required.


The way we used to build them

Back then the classic stack was Cordova + jQuery Mobile (or Sencha Touch). jQuery Mobile gave you touch-friendly, "responsive" UI widgets out of the box, and Cordova turned that web page into an installable app. It was a genuine breakthrough — small teams could ship to iOS and Android without learning two native toolchains.

But it came with real pain: the old WebViews were slow and inconsistent across OS versions, animations felt janky, scrolling lagged, and apps often looked distinctly "not native." Adobe's hosted flavour, PhoneGap, was hugely popular in this era.


What changed in modern times

The landscape shifted dramatically, for a few reasons:

1. WebViews grew up. Modern Chromium (Android) and WKWebView (iOS) are fast and standards-compliant, so web-based apps finally feel smooth.

2. The ecosystem moved on. jQuery Mobile is deprecated and Adobe discontinued PhoneGap in 2020. Apache Cordova itself is now largely in maintenance/legacy mode.

3. Better successors arrived. If you love the web-tech approach, Capacitor (from the Ionic team) is the modern spiritual successor to Cordova — same idea, cleaner native tooling, and it can still run most Cordova plugins. For fully native performance, React Native and Flutter now dominate cross-platform development. And for many use cases a Progressive Web App (PWA) removes the need for a store wrapper entirely.

Bottom line: Cordova is still useful for maintaining existing apps and quick prototypes, but for anything new in 2025 you'd almost always reach for Capacitor, React Native, or Flutter instead.


A small example: a Cordova app in 5 minutes

Even today you can spin one up quickly. First install the CLI (needs Node.js):

$ npm install -g cordova

Create a project — directory, app id, and display name:

$ cordova create hello com.example.hello HelloWorld

Add the platform you want to build for:

$ cd hello
$ cordova platform add android

Your app's UI lives in www/. Edit www/index.html and wait for Cordova's deviceready event before touching any device API:

<!-- www/index.html -->
<button id="tapBtn">Tap me</button>
<p id="out"></p>

<script>
  document.addEventListener('deviceready', function () {
    document.getElementById('tapBtn').addEventListener('click', function () {
      document.getElementById('out').textContent = 'Running on ' + device.platform;
    });
  });
</script>

Add a plugin to reach a native feature (here, device info):

$ cordova plugin add cordova-plugin-device

Run it on an emulator or a plugged-in device:

$ cordova run android
$ cordova build --release android  # a signed build for the store

That's the whole loop: create → add platform → build UI in www/ → add plugins → run. The concepts map almost one-to-one onto Capacitor, so the mental model still pays off even if you migrate later.


Where to go next: the modern successor — Capacitor, the still-maintained Cordova docs, or the native-performance route with React Native and Flutter.