- iOS: Capacitor vs WKWebView vs React Native WebView analysis - Mac: Tauri v2 vs Electron comparison with menu bar app patterns - Plugins: Signature validation, sandboxed iframes, permission system Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.8 KiB
Mac Desktop App Research — AIUI
Overview
Two approaches for shipping AIUI as a Mac desktop app: Tauri v2 (Rust-based, system WebView) vs Electron (Chromium-based).
Tauri v2 (Recommended)
Released stable October 2024. Uses OS-native WebView (WKWebView on macOS). The Vue 3 + Vite frontend runs inside the WebView unchanged. JS calls into Rust via typed IPC bridge.
Binary Size: 2–8 MB installer (no bundled runtime) Memory Usage: ~30–40 MB idle Startup Time: < 500ms
Menu Bar App Pattern (Raycast-style)
Fully supported via tauri-plugin-positioner + tray + window APIs. Frameless popover window anchored to tray icon with decorations: false, skip_taskbar: true. Community examples exist (ahkohd/tauri-macos-menubar-app-example v2-popover branch).
Global Hotkey
Built-in via @tauri-apps/plugin-global-shortcut. Register accelerators (e.g., CmdOrCtrl+Space) that fire even when background/minimized. First-class plugin.
System Tray
First-class support. AppHandle::tray() with native menus and click event handling from Rust or frontend.
Auto-Update
@tauri-apps/plugin-updater — signed updates required (Ed25519 keypair). Host a static JSON endpoint with version metadata and signed artifact URLs.
macOS Code Signing / Notarization
Automated via Tauri CLI environment variables (APPLE_CERTIFICATE, APPLE_SIGNING_IDENTITY, APPLE_ID, APPLE_TEAM_ID). Notarization adds ~2–5 min per build.
Build Pipeline
- Prerequisites: Rust toolchain + Xcode CLI tools
- First build: 5–15 min (Cargo compiles Rust deps)
- Incremental builds: Fast with caching
- Config:
tauri.conf.json+Cargo.toml - Complexity: Medium-High (Rust requirement is the barrier)
Mobile Support
Tauri v2 has first-class iOS/Android support in the same codebase (WKWebView on iOS, Android System WebView on Android). HMR extends to physical devices. This is a genuine differentiator — Electron is desktop-only.
Electron
Mature since 2013. Bundles full Chromium + Node.js runtime. Used by VS Code, Slack, Discord, Obsidian.
Binary Size: 80–150 MB installer Memory Usage: 200–350 MB idle Startup Time: 1–2s
Menu Bar App
Well-established via menubar npm package. Creates BrowserWindow positioned below tray icon, manages show/hide on tray click. Very mature.
Global Hotkey
globalShortcut module in Electron core. System-wide even when hidden.
System Tray
Tray class in Electron core with context menus and click events.
Auto-Update
electron-updater (S3/GitHub Releases) or update.electronjs.org (free for open-source).
macOS Code Signing / Notarization
Via @electron/osx-sign + @electron/notarize, integrated into electron-builder / Electron Forge.
Build Pipeline
- Prerequisites: Node.js only — no additional runtimes
- Build tools:
electron-vitefor Vue 3 + Vite integration - Build times: 2–5 min (no Rust compilation) + 2–5 min notarization
- Complexity: Medium (main/renderer process split requires understanding)
Comparison
| Dimension | Tauri v2 | Electron |
|---|---|---|
| Installer size | 2–8 MB | 80–150 MB |
| Idle RAM | 30–40 MB | 200–350 MB |
| Startup time | < 500ms | 1–2s |
| Menu bar app | Supported | Supported |
| Global hotkey | Built-in plugin | Built-in API |
| System tray | Built-in | Built-in |
| Auto-update | Built-in (signed) | electron-updater |
| New language | Rust | None (JS/TS) |
| iOS/Android | Yes (same codebase) | No |
| WebView | WKWebView (varies by OS) | Chromium (pinned, consistent) |
| Ecosystem maturity | Growing fast | Very mature |
| Security model | Capability-based, opt-in | Opt-out, manual discipline |
| Debug tools | Safari Web Inspector | Chrome DevTools |
Recommendation
Tauri v2 is the stronger choice for AIUI:
- Memory advantage is decisive. Users running local LLMs or managing API streaming need resources for the AI workload, not the shell. 30 MB vs 300 MB matters.
- Menu bar pattern fits naturally for a chat/AI assistant (Raycast-style quick invoke).
- iOS/Android support from the same codebase aligns with AIUI's multi-surface vision.
- Capability-based security is appropriate for handling API keys and sensitive chat data.
- Binary size matters — 5 MB download vs 120 MB affects distribution trust.
Concrete Next Steps
- Scaffold Tauri v2 project:
npm create tauri-app@latestwith Vite template - Point dev server to existing
packages/appVite config - Implement tray icon + menu bar popover window
- Register global hotkey (e.g.,
Cmd+Shift+Space) to invoke chat - Write Rust commands for: file I/O, tray management, updater config
- Set up macOS code signing + notarization pipeline
- Distribute via Homebrew cask or direct download
- Evaluate Tauri mobile targets for iOS/Android convergence