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" —
bubblewrapis the CLI. Android only.
Older / less recommended
- 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 + Capacitor —
adapter-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.