Turn a Vue or Nuxt App Into an iOS and Android App
Short answer
A Vue or Nuxt app reaches the App Store and Google Play fastest through a native wrapper that loads the deployed app, keeping SSR and Nitro server routes intact. Capacitor, optionally with Ionic Vue, bundles the app locally but requires Nuxt in SPA or static mode. In both cases, plan router history, the Android back button and offline behavior deliberately.
Start with your Nuxt rendering mode
Plain Vue apps built with Vite are static after the build and can go any route. Nuxt is different: by default it renders on the server and ships Nitro server routes under /server/api. Which mobile approach fits depends on what you use:
- Universal rendering with server routes: a wrapper that loads the live deployment keeps everything working.
- SPA or static output: with
ssr: falseandnuxi generate, the output in.output/publiccan be bundled with Capacitor. - Mixed: if you bundle with Capacitor, your server routes must run on a separate deployed backend, and the app calls them with an absolute base URL from
runtimeConfig.public.
Wrapper or Capacitor with Ionic Vue
| Native wrapper | Capacitor (+ Ionic Vue) | |
|---|---|---|
| Nuxt SSR and server routes | Keep working | Moved to a separate backend |
| UI changes | Live with each web deploy | Usually via store release |
| Native look and transitions | Native shell, web UI | Ionic components and page transitions |
| First launch without network | Offline screen or cache | Assets are local |
Ionic Vue adds platform-styled components and ion-router-outlet, which gives stack navigation with native-feeling transitions and iOS swipe-back. It shines for new apps. Retrofitting an existing Vuetify or Tailwind interface into Ionic page structures is real work, so many teams use plain Capacitor first and adopt Ionic only for new screens.
Routing and history: the details that cause reviews to fail
In a browser, users rarely notice history bugs. In an app, the Android back button and the iOS swipe gesture expose them immediately.
- History mode.
createWebHistoryworks in a wrapper as long as your server already falls back toindex.html. With Capacitor's local server it generally works too; hash mode is a safe fallback if reloads or deep links land on a blank page. - Login redirects. Use
router.replaceafter sign-in, otherwise back navigation returns users to the login form. - Android back button. In a wrapper, back should step through webview history and only close the app at the start route. In Capacitor, handle the back button event from the App plugin yourself.
- Modals and drawers. If back should close an open dialog, reflect its state in the route or a query parameter.
- Deep links. Universal links and App Links must map to real routes; test them with a cold app start, not only while the app is open.
Offline handling that matches reality
Decide first what "offline" must mean for your users. For most portals it means a clear message and a retry, not full offline editing.
- Minimum: a native offline screen that appears instead of a browser error page and reloads when the connection returns.
- Read-only cache: keep recent data in IndexedDB or a persisted Pinia store and show it with a "last updated" note. On Android, service workers work in the webview; on iOS, service workers inside an app's webview require App-Bound Domains, so test this early.
- Offline writes: queue changes locally and sync with conflict handling. This is where Capacitor with local storage or SQLite, or a native rewrite, starts to pay off.
How jocapps can help
WebViewGold turns your deployed Vue or Nuxt app into native iOS and Android apps with push notifications, offline support and 40+ native APIs, without changing your rendering mode. It is a one-time purchase. For Capacitor and Ionic Vue builds, offline sync or production hardening with long-term SLAs, OnlineAppCreator is our delivery team for custom app development. Background reading: converting a PWA into iOS and Android apps.
If you want a second opinion on your Nuxt setup, book a free 30-minute intro call.
Frequently asked questions
Do I have to disable SSR in Nuxt to build an app?
Only if you bundle the app with Capacitor. A native wrapper loads your deployed Nuxt app, so universal rendering and server routes stay as they are.
Should I switch Vue Router to hash mode?
Usually not. History mode works in a wrapper and generally with Capacitor; switch to hash mode only if reloads or deep links end on a blank page in your setup.
Is Ionic Vue required for Capacitor?
No. Capacitor works with any Vue UI. Ionic Vue adds native-styled components and page transitions, which is most useful for new apps or new screens.
How do I handle the Android back button?
Map it to router or webview history and close the app only on the start route. Open modals should close on back if their state is reflected in the route.
Guides on this topic
Related solutions
- Website and web app to mobile appPublish a Bubble App to the App Store and Google Play
- Website and web app to mobile appTurn a Django Web App Into iOS and Android Apps
- Website and web app to mobile appTurning a Drupal Site Into an App for Universities and Public Bodies
- Website and web app to mobile appPush Notifications for Online Shops: Permission, Segments and Consent
Talk to us about your project
Honest advice on your idea, prototype or app.
- 30 minutes
- Free
- No obligation
