Mobile & Desktop
Three runtime targets from one codebase
The same Vue source compiles to three runtimes via Quasar modes + Capacitor + Tauri:
| Target | Mode | Native shell | JS engine |
|---|---|---|---|
| Web SPA | quasar dev -m spa | (none, runs in browser) | Browser JS |
| PWA | quasar dev -m pwa | Service worker | Browser JS |
| Android | quasar build -m capacitor -T android | Capacitor 7 | System WebView |
| iOS | quasar build -m capacitor -T ios | Capacitor 7 + WKWebView | System WebView |
| Desktop | cargo tauri build in src-tauri/ | Tauri 2 | System WebView (Edge WebView2 on Windows, WKWebView on macOS, webkit2gtk on Linux) |
Android (Capacitor 7) specifics
App id: app.aiaw.glass. AndroidManifest.xml permissions:
INTERNET,ACCESS_NETWORK_STATE(for fetch)CAMERA(declaredrequired=false; Capacitor Camera plugin)READ_EXTERNAL_STORAGEup to API 32READ_MEDIA_IMAGES/READ_MEDIA_VIDEO/READ_MEDIA_AUDIO(granular media perms API 33+)
Capacitor plugins used at runtime:
@capacitor/core7.0@capacitor/app7.0 — lifecycle (back button, pause/resume)@capacitor/camera6.1 — take photo@capacitor/clipboard7.0@capacitor/filesystem7.0 — read/write files in app sandbox@capacitor/ios7.0@capacitor/keyboard7.0 —resizeOnFullScreen: trueincapacitor.config.ts@capacitor/status-bar7.0@capawesome/capacitor-android-edge-to-edge-support7.1 — Android 15 edge-to-edge mode (backgroundColor: '#00ffffff')@capawesome/capacitor-file-picker7.2@capawesome/capacitor-live-update7.1 — OTA web bundle updates@capgo/capacitor-printer8.0 — native print dialogcapacitor-export-file0.0.1 — save Blob/ArrayBuffer toDocuments/AiaW/capacitor-plugin-shell-exec1.3 — native subprocess for the file-ops plugincapacitor-stream-fetch0.0.6 — streaming fetch (Android only; iOS falls back to nativefetch)
Gradle config:
| Setting | Value |
|---|---|
minSdkVersion | 23 (Android 6.0) |
compileSdkVersion / targetSdkVersion | 35 (Android 15) |
| Java | 17 (source + target compatibility) |
applicationId | app.aiaw.glass |
versionCode / versionName | 20018 / 2.0.8.9 |
| release build | minifyEnabled true, proguard on, debug-key signing (replace before publishing) |
Desktop (Tauri 2) specifics
Window: 1150x750 default, resizable, drag-drop disabled. CSP null (Quasar dev server sets headers; production CSP should be reviewed before publish).
Tauri plugins used:
@tauri-apps/plugin-clipboard-manager2.2@tauri-apps/plugin-opener2.2 — open URLs in the system browser@tauri-apps/plugin-os2.2 — detectplatform()@tauri-apps/plugin-process2.2@tauri-apps/plugin-shell2.2 — spawn subprocesses (used by MCPstdio)@tauri-apps/plugin-updater2.5 — signed update artifacts fromhttps://github.com/NitroRCr/AIaW/releases/latest/download/latest.json@tauri-apps/plugin-window-state2.2
Bundle targets: deb, appimage, nsis, app, dmg. Update signing key is the upstream NitroRCr public key embedded in tauri.conf.json; replace it with your own before distributing.
PWA specifics
Workbox-based service worker in src-pwa/:
manifest.json— app metadata, icons, theme colorcustom-service-worker.js— hand-written service worker for custom cache strategiesregister-service-worker.js— registration entry
The navigateFallbackDenylist is [/^/budget//] — budget routes are excluded from SPA fallback. Generated by Quasar's workboxMode: 'GenerateSW'.
Platform-specific runtime files
| File | Purpose |
|---|---|
android/app/src/main/AndroidManifest.xml | Permissions, activity, network security config |
android/app/src/main/res/xml/network_security_config.xml | usesCleartextTraffic: true allows HTTP for local Ollama etc. |
android/variables.gradle | Pinned SDK versions, support library versions |
src-tauri/tauri.conf.json | Tauri window, bundle, updater config |
src-tauri/capabilities/default.json | Tauri permission capabilities |
src-tauri/Cargo.toml | Rust deps; tauri 2.2, tauri-plugin-* 2.x |
src-tauri/src/main.rs | Entry point; calls app_lib::run() |
src-pwa/manifest.json | PWA install metadata |