ADR 037 — Tauri Convergence
ADR 037 — Tauri Convergence
Section titled “ADR 037 — Tauri Convergence”Status: Accepted
Date: 2026-05-11
Context
Section titled “Context”Vox needs one maintainable path for generated GUI applications across desktop and mobile. The current implementation does not yet provide that. vox compile --target desktop|mobile-* runs the app bundle path and emits Tauri packaging hints, but the generated runtime is still an Axum server that binds 127.0.0.1 and serves embedded assets. Mobile application development and Android E2E still use Capacitor.
The codebase-wide Tauri audit found three important facts:
- Tauri is currently a manifest-hint layer, not a runtime/build dependency for generated applications.
- The generated user app uses Axum and
rust-embed; those are appropriate for explicit server/dashboard surfaces but not for the native application shell. - The only concrete blocker to full mobile convergence is the
vox-sherpa-transcribeCapacitor plugin inapps/vox-mental-tracker.
This ADR records the product and architecture decision so implementation can proceed as a mechanical migration instead of a recurring strategy debate.
Decision
Section titled “Decision”- Tauri 2 is the canonical generated application shell for
vox compile --target desktop,vox compile --target mobile-android, andvox compile --target mobile-ios. - Generated desktop/mobile applications must produce real Tauri projects and invoke Tauri build tooling, not only emit
tauri-packaging/hints. - Axum remains canonical for server/dashboard surfaces only:
vox dashboard, explicit server targets, daemon/API surfaces, and ADR-024 dashboard integration. The generated desktop/mobile user-app shell must not depend onaxumorrust-embed. - Capacitor is retired for new Vox application work. Existing Capacitor call sites are temporary, explicitly allowlisted, and removed by the Tauri convergence migration plan.
vox-sherpa-transcribeis ported to a Tauri 2 mobile plugin rather than preserving a long-term Tauri desktop / Capacitor mobile split.- Retirement is enforced by architecture checks:
docs/src/architecture/layers.tomlowns forbidden patterns for retired Capacitor and Axum-as-app code, with current call sites listed inexempt_filesuntil each phase removes them.
Rejected alternatives
Section titled “Rejected alternatives”- Tauri desktop + Capacitor mobile: keeps
vox-mental-trackermoving in the short term, but leaves Vox with two native shells, two plugin models, and two CI/toolchain paths for the same generated GUI product. - Keep Tauri hint-only: cheap and honest about current implementation, but fails the goal of shipping one native desktop/mobile application pipeline.
- Retire Tauri entirely: reduces build complexity, but gives up the strongest existing route to native installers and mobile webview packaging from the Vox language.
- Keep Axum-localhost as the desktop app shell: remains useful for
native-binaryand dashboard/server surfaces, but does not satisfy the user expectation thatdesktopmeans a native application bundle. - Defer Sherpa indefinitely: avoids native plugin work, but keeps the one real mobile application in the repo pinned to Capacitor.
Consequences
Section titled “Consequences”vox compile --target desktop|mobile-*becomes a heavier build path. CI must explicitly account for Tauri, Android, and iOS toolchain costs rather than hiding them behind hint generation.native-binaryremains available for the Axum + embedded SPA shape where a local server binary is the desired artifact.- The generated app codegen split becomes clearer: server targets emit Axum, application targets emit Tauri.
- Capability projection moves from “merge hints for a downstream shell” toward generated Tauri config/capability files.
apps/vox-mental-trackerbecomes the acceptance fixture for proving Tauri mobile can carry real Vox app features, including on-device ASR through the Sherpa plugin port.- Future contributors and coding agents get hard guardrails: adding new
@capacitor/*,npx cap sync, or Axum-as-app generation outside the active migration allowlist fails architecture checks.