Ruby Native vs Capacitor

Capacitor wraps a web app in a native shell too. The difference is whose shell it is, and what it expects your frontend to be. Capacitor is built for a frontend that is compiled and shipped inside the app. Ruby Native is built for a Rails app that renders on the server, and it keeps the shell on our side.

#What Capacitor gives you

Capacitor is an open source runtime from Ionic, now part of OutSystems. It takes the output of your web build, the index.html and assets in webDir, bundles them into an iOS project and an Android project, and exposes native APIs to that JavaScript through plugins: camera, push notifications, the file system, and a large community library. It can load an external URL instead, but Capacitor's own config reference says server.url is intended for live reload servers and not for production.

Those two projects are yours. Capacitor 8 needs Node 22, Xcode 26 or newer for iOS, and Android Studio 2025.2.1 or newer for Android, and someone on the team to keep all three current as Apple and Google move. The hosted side, Appflow, stopped taking new customers in February 2025, and existing customers keep access through December 31, 2027. Capacitor itself stays free and maintained.

#Where Capacitor is the right call

  • Your frontend is already a single-page app in React, Vue, Angular, or Svelte that builds to static files, and Rails is its API.
  • You want native plugins beyond what a tab bar and push cover, and you are comfortable owning Swift and Kotlin glue code when a plugin falls behind.
  • You have, or want, a developer who keeps Xcode and Android Studio installed and current.
  • You want the native projects in your own repo, built in your own CI.

#Where Ruby Native is the right call

  • Your app renders on the server, in ERB, Hotwire, Inertia, or anything else Rails serves. Ruby Native loads your pages from your site, so every deploy updates the apps and nothing is bundled into the binary.
  • Nobody on the team wants to install Xcode. Builds run in the cloud on the current Xcode and Android SDK, and each new OS release is handled once in Ruby Native for every app.
  • The native layer is configuration. Tabs, icon, and permissions live in config/ruby_native.yml, and navigation bar buttons, menus, forms, and push are view helpers in your templates. Advanced Mode adds native push and pop transitions with one line.
  • The store work is part of it: the listing as a file in your repo, screenshots captured against your site, TestFlight testers, submission, and withdrawal, from the CLI, the dashboard, or your coding agent.

#Side by side

Capacitor Ruby Native
Your frontend Compiled and bundled into the app Served by your Rails app, as it is today
The native projects Yours to maintain, in your repo Ours to maintain, with a copy to download any time
Tooling your team installs Node, Xcode, Android Studio The gem
Native features Plugins, called from your JavaScript Signals in your HTML, read by the app
Builds and signing Your Mac or your CI Cloud builds, signed with your certificate
Store listing and submission App Store Connect and Play Console by hand A file in your repo, one command, or your agent
New iOS and Android releases Update Capacitor, the plugins, and both projects Handled once, picked up by your next build
Cost Free, plus the developer who maintains it $199 a month per app

#Moving between them

From Capacitor to Ruby Native, your Rails app needs nothing beyond the gem and the generator. If your frontend is a bundled single-page app and Rails is only its API, Ruby Native is not a fit, because there are no server-rendered pages to load. Inertia apps are the exception and work as-is. See Inertia.

From Ruby Native to Capacitor, or to anything else, the source you download is a normal Xcode and Android Studio project, and you keep it if you cancel.

The business comparison, against hiring a mobile team, an agency, or a React Native rebuild, is on Why Ruby Native. Try the demo app on your phone from /try, or email Joe at [email protected] with your app's URL.