Mobile & Desktop

Three runtime targets from one codebase

The same Vue source compiles to three runtimes via Quasar modes + Capacitor + Tauri:

TargetModeNative shellJS engine
Web SPAquasar dev -m spa(none, runs in browser)Browser JS
PWAquasar dev -m pwaService workerBrowser JS
Androidquasar build -m capacitor -T androidCapacitor 7System WebView
iOSquasar build -m capacitor -T iosCapacitor 7 + WKWebViewSystem WebView
Desktopcargo tauri build in src-tauri/Tauri 2System 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 (declared required=false; Capacitor Camera plugin)
  • READ_EXTERNAL_STORAGE up to API 32
  • READ_MEDIA_IMAGES / READ_MEDIA_VIDEO / READ_MEDIA_AUDIO (granular media perms API 33+)

Capacitor plugins used at runtime:

  • @capacitor/core 7.0
  • @capacitor/app 7.0 — lifecycle (back button, pause/resume)
  • @capacitor/camera 6.1 — take photo
  • @capacitor/clipboard 7.0
  • @capacitor/filesystem 7.0 — read/write files in app sandbox
  • @capacitor/ios 7.0
  • @capacitor/keyboard 7.0 — resizeOnFullScreen: true in capacitor.config.ts
  • @capacitor/status-bar 7.0
  • @capawesome/capacitor-android-edge-to-edge-support 7.1 — Android 15 edge-to-edge mode (backgroundColor: '#00ffffff')
  • @capawesome/capacitor-file-picker 7.2
  • @capawesome/capacitor-live-update 7.1 — OTA web bundle updates
  • @capgo/capacitor-printer 8.0 — native print dialog
  • capacitor-export-file 0.0.1 — save Blob/ArrayBuffer to Documents/AiaW/
  • capacitor-plugin-shell-exec 1.3 — native subprocess for the file-ops plugin
  • capacitor-stream-fetch 0.0.6 — streaming fetch (Android only; iOS falls back to native fetch)

Gradle config:

SettingValue
minSdkVersion23 (Android 6.0)
compileSdkVersion / targetSdkVersion35 (Android 15)
Java17 (source + target compatibility)
applicationIdapp.aiaw.glass
versionCode / versionName20018 / 2.0.8.9
release buildminifyEnabled 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-manager 2.2
  • @tauri-apps/plugin-opener 2.2 — open URLs in the system browser
  • @tauri-apps/plugin-os 2.2 — detect platform()
  • @tauri-apps/plugin-process 2.2
  • @tauri-apps/plugin-shell 2.2 — spawn subprocesses (used by MCP stdio)
  • @tauri-apps/plugin-updater 2.5 — signed update artifacts from https://github.com/NitroRCr/AIaW/releases/latest/download/latest.json
  • @tauri-apps/plugin-window-state 2.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 color
  • custom-service-worker.js — hand-written service worker for custom cache strategies
  • register-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

FilePurpose
android/app/src/main/AndroidManifest.xmlPermissions, activity, network security config
android/app/src/main/res/xml/network_security_config.xmlusesCleartextTraffic: true allows HTTP for local Ollama etc.
android/variables.gradlePinned SDK versions, support library versions
src-tauri/tauri.conf.jsonTauri window, bundle, updater config
src-tauri/capabilities/default.jsonTauri permission capabilities
src-tauri/Cargo.tomlRust deps; tauri 2.2, tauri-plugin-* 2.x
src-tauri/src/main.rsEntry point; calls app_lib::run()
src-pwa/manifest.jsonPWA install metadata