Rewrite frontend to Tauri v2 + Svelte 5 for cross-platform support #4
Reference in New Issue
Block a user
Delete Branch "feature/tauri-rewrite"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Rewrites the desktop frontend from PySide6/Qt to Tauri v2 + Svelte 5, following the same architecture as https://repo.anhonesthost.net/MacroPad/voice-to-notes. This enables native
cross-platform support for Windows, macOS, and Linux with proper installers.
What changed
- Headless Python backend (backend/) — Extracts all orchestration logic from MainWindow into AppController, exposes a FastAPI REST API + WebSocket control channel. No PySide6 dependency.
- Tauri v2 shell (src-tauri/) — Minimal Rust scaffolding with shell, dialog, and process plugins. Configured for sidecar launch of the Python backend.
- Svelte 5 frontend (src/) — Complete UI with reactive stores, dark theme, and all settings from the original Qt GUI. Components: Header, StatusBar, Controls, TranscriptionDisplay,
Settings (full 10-section modal).
- Gitea CI/CD (.gitea/workflows/) — Two workflows: release.yml builds Tauri app installers (.msi, .dmg, .deb/.rpm) on all platforms; build-sidecar.yml builds Python sidecar with CUDA+CPU
variants.
- Headless PyInstaller spec (local-transcription-headless.spec) — Simplified build config that excludes PySide6, producing a leaner sidecar binary.
- Updated docs — README.md and CLAUDE.md fully rewritten for the new architecture.
Architecture
Tauri App (user launches this)
└─ Spawns Python backend as sidecar
├─ FastAPI REST API (/api/*)
├─ WebSocket /ws/control (real-time state + transcriptions)
├─ OBS web display at localhost:8080
└─ Transcription engine (Whisper or Deepgram)
What's preserved
- The legacy PySide6 GUI (main.py, gui/) still works unchanged
- All Python backend code (client/, server/) is untouched
- OBS browser source at localhost:8080 continues to work
- Configuration format and storage (~/.local-transcription/config.yaml) is unchanged
Build verification
- Svelte frontend: npx vite build passes (70KB JS + 11KB CSS)
- Tauri Rust: cargo check passes
- Python backend: syntax validated, all files clean
Test plan
- Run headless backend: uv run python -m backend.main_headless and test API with curl
- Run Tauri dev mode: npm run tauri dev (requires system deps)
- Verify legacy GUI still works: uv run python main.py
- Verify OBS display at http://localhost:8080
- Test CI workflows after merge (requires BUILD_TOKEN secret)
- Test on Windows, macOS, Linux