Web Dev Tools

Mobile Packaging (Wrap Web → iOS/Android)

Ship your existing web app to the App Store and Play Store.

Different from Mobile Native — here the goal is to take an existing web app (your Next.js, Remix, SvelteKit, Astro, or vanilla SPA) and ship it as an iOS / Android binary without rewriting it in React Native.

The current options

  • Capacitor (Ionic) — the dominant choice. Wraps your web app in a native shell, exposes 100+ native plugins (Camera, Geolocation, Filesystem, Push, BLE, Biometrics, etc.). Works with any framework. Free, open source.
  • Tauri Mobile — Tauri 2 added iOS / Android targets. Rust-backed; smaller binaries than Capacitor; native plugins via Rust or JS. Great if you also want desktop. Most-watched newcomer in 2026.
  • Hotwire Native (formerly Turbo Native) — Basecamp's approach. Embeds a WKWebView / Android WebView; you author screens as web pages and write thin native code for navigation/transitions. Best fit for Rails / Hotwire apps.
  • PWA Builder (Microsoft) — turns a PWA into store-publishable packages: TWA for Play Store, packaged PWA for App Store via WKWebView wrapper. Free, hosted.
  • TWA (Trusted Web Activity) — Google's official "ship a PWA in the Play Store" — bubblewrap is the CLI. Android only.
  • Cordova / PhoneGap — Capacitor's predecessor; effectively superseded.
  • Median.co, WebView App — paid services that wrap a URL in a native shell. Convenient but lock-you-in and store-review risk.

What you give up vs. native

  • Performance — modern WebViews are fast, but heavy animations and gestures still feel different from native. Not a deal-breaker for most apps.
  • App Store review — Apple sometimes rejects "this is just a website" submissions. You typically have to make the app do something the website can't (push, biometrics, offline) to clear the review bar.
  • Native UI patterns — date pickers, navigation feel, sheet animations. Your users will notice.

What you keep

  • One codebase. One bug-fix path. Your existing routing, auth, components, design system — unchanged.
  • Hot reloads / OTA updates via your normal web deploy.
  • Push notifications, camera, biometrics, secure storage — via Capacitor or Tauri plugins.

Common combinations

  • Next.js / SPA + Capacitor — most common. Use output: 'export' (Next.js) or any static build; Capacitor copies the static files into the iOS/Android shell.
  • Remix / RR7 + Capacitor — works if SPA-mode; SSR routes won't run inside the shell.
  • SvelteKit + Capacitoradapter-static + Capacitor.
  • Astro + Capacitor — Astro's static output drops cleanly into Capacitor.
  • Tauri Mobile + any framework — same idea, Rust shell.
  • Hotwire Native — only if your backend is Rails/Phoenix/Hotwire-style.

Push notifications specifically

  • Capacitor Push Notifications plugin + APNs / FCM directly.
  • OneSignal — Capacitor plugin; cross-platform; free tier covers most.
  • Firebase Cloud Messaging — bundled if you're already on Firebase.
  • Expo Push Service — only relevant if you're on RN/Expo.

Pick this if…

  • You have a Next.js / SPA and want stores fast: Capacitor.
  • You want desktop and mobile from one Rust shell: Tauri 2.
  • You have a Rails app: Hotwire Native.
  • Android-only, just need Play Store presence: TWA via PWA Builder or bubblewrap.
  • You don't actually need the stores: stop here, ship a PWA instead.

On this page