Skip to content

Comments

feat: migrate desktop app from Electron to Tauri v2#7269

Open
balcsida wants to merge 56 commits intoblock:mainfrom
balcsida:feat/electron-to-tauri
Open

feat: migrate desktop app from Electron to Tauri v2#7269
balcsida wants to merge 56 commits intoblock:mainfrom
balcsida:feat/electron-to-tauri

Conversation

@balcsida
Copy link

@balcsida balcsida commented Feb 17, 2026

Summary

Migrate the Goose desktop application from Electron v40 to Tauri v2, replacing the Node.js main process with a Rust backend while preserving the existing React 19 + Vite frontend through a compatibility bridge pattern.

Architecture

┌─────────────────────────────────────────┐
│  Existing React 19 + Vite Frontend      │
│  (40+ files unchanged)                  │
├─────────────────────────────────────────┤
│  tauri-bridge.ts                        │
│  (drop-in window.electron shim)         │
├─────────────────────────────────────────┤
│  Tauri Rust Backend (~1,600 LOC)        │
│  8 modules / 42 IPC commands            │
├─────────────────────────────────────────┤
│  17 Tauri Plugins                       │
│  (dialog, fs, shell, updater, etc.)     │
└─────────────────────────────────────────┘

Key changes

  • Rust backend (src-tauri/src/): 8 modules replacing the 2,394-line Electron main.ts
    • lib.rs - App setup, plugin init, lifecycle hooks
    • commands.rs - 42 IPC command handlers (settings, file ops, window mgmt, etc.)
    • goosed.rs - Backend process management with binary discovery and health polling
    • tray.rs / menu.rs - System tray and application menu
    • settings.rs - Persistent settings via JSON
    • wakelock.rs - Platform-specific sleep prevention (IOKit/macOS, SetThreadExecutionState/Windows)
    • dock.rs - macOS dock integration via Cocoa/objc
  • Compatibility bridge (tauri-bridge.ts): Drop-in window.electron shim so existing frontend files work without modification
  • 17 Tauri plugins: dialog, fs, shell, notification, global-shortcut, deep-link, updater, window-state, opener, store, process, log, clipboard, http, autostart, single-instance
  • Build config: Tauri-specific Vite config, npm scripts (tauri:dev, tauri:build), sidecar bundling
  • Side-by-side: Electron files restored for coexistence during transition period

Benefits over Electron

  • Smaller bundle: Uses system WebView instead of bundling Chromium (~150MB savings)
  • Lower memory: Rust backend vs Node.js main process
  • Native performance: Rust-powered IPC, file operations, and process management
  • Rust alignment: Keeps the entire stack in Rust, matching the existing goose codebase

Type of Change

  • Feature
  • Refactor / Code quality
  • Build / Release

AI Assistance

  • This PR was created or reviewed with AI assistance

Testing

Automated (46 unit tests):

  • Settings: serialization/deserialization roundtrip, defaults, camelCase field mapping, missing field handling
  • Commands: URL encoding (spaces, ampersands, equals, hashes, percent), recipe SHA-256 hashing (determinism, format, uniqueness), file operations (read/write/list with temp dirs), deep link classification
  • Goosed: fatal error detection, environment variable construction, state initialization

Manual:

  • Verified npm run tauri:dev compiles (582 Rust crates + Vite frontend)
  • Confirmed goosed backend starts and connects
  • Confirmed Tauri app window opens and renders the React frontend
  • Verified window dragging via data-tauri-drag-region
  • Tested system tray and application menu functionality
  • Tested macOS dock menu, traffic light positioning, transparent titlebar

Known Limitations

  • Tray update icon swap needs further testing
  • Linux wakelock is a stub (D-Bus integration planned)
  • No CI pipeline for Tauri builds yet

Related Issues

Closes #7332

Screenshots/Demos

Tauri Goose
Tauri build

Electron Goose
Electron Goose

@balcsida balcsida marked this pull request as draft February 17, 2026 12:52
@balcsida balcsida force-pushed the feat/electron-to-tauri branch from c4f2a5a to ca7d4be Compare February 17, 2026 12:52
@balcsida balcsida changed the title feat(ui): migrate desktop app from Electron to Tauri v2 feat: migrate desktop app from Electron to Tauri v2 Feb 17, 2026
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
…rtcuts

Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
…urce path

Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
The ipc:// protocol warning is a known WebKit limitation.
Tauri handles this with a postMessage fallback transparently.

Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
…styling

Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
…s, and deep links

Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
…setup

Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
Signed-off-by: Dávid Balatoni <balcsida@gmail.com>
@balcsida balcsida marked this pull request as ready for review February 20, 2026 00:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant