Challenges & solutions
Cross-platform packaging
The challenge — Produce a native installer for Windows (.msi), Linux (.deb) and macOS (.dmg) from a single codebase, in an automated way.
The solution — Tauri natively handles all three platforms. The GitHub Actions workflow uses a runner matrix:
strategy:
matrix:
os: [ubuntu-22.04, windows-latest, macos-latest]Each runner produces its platform's installer via tauri-apps/tauri-action, and everything is published automatically in a GitHub Release as soon as a tag is pushed.
OBS overlay without an external server
The challenge — Make a desktop app communicate with a browser source in OBS, without depending on a cloud service or hosted server.
The solution — A WebSocket server embedded in the Tauri app, implemented in Rust with tokio-tungstenite. OBS connects to localhost:9876 like any WebSocket. When the app closes, the connection drops. Everything stays local.
Stream Deck synchronisation
The challenge — The Stream Deck plugin needs to know the decks configured in the app, without direct coupling between the two.
The solution — Simple handshake protocol: on startup, the plugin sends GET_DECKS_CONFIG. The app responds with the full list of decks (name, type, icon in base64). If the configuration changes, the user can trigger a re-sync from the plugin.
Local album artwork in the overlay
The challenge — Artwork can come from an external URL or a local file. The OBS overlay (a browser) cannot access the user's local file system.
The solution — When the user selects a local file, the Tauri app reads it on the Rust side and converts it to base64. The image is then included directly in WebSocket messages as a data URI. The overlay never accesses the disk — everything goes through the WebSocket.
Version synchronisation
The challenge — Three files must contain the same version: package.json, tauri.conf.json and Cargo.toml. Forgetting one leads to inconsistent builds.
The solution — A scripts/sync-version.js script reads the version from package.json and automatically updates the other two files. It is triggered automatically via npm prebuild and pretauri hooks, making manual updates impossible to forget.

