From 5ad67d7ecbfb8f2e1d84e557e8c86deeb743ff9b Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 27 Feb 2026 06:32:02 +0100 Subject: [PATCH 1/3] fix: disable DMABUF renderer for NVIDIA GPUs on Linux WebKitGTK fails to create GBM buffers with NVIDIA proprietary drivers, resulting in an empty/blank Tauri window. Set WEBKIT_DISABLE_DMABUF_RENDERER=1 in the dev target to work around this. Co-Authored-By: Claude Opus 4.6 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 620f6c8c..94c841d3 100644 --- a/Makefile +++ b/Makefile @@ -79,7 +79,7 @@ dev: ## Start backend + desktop app (parallel) @echo -e "$(YELLOW)Note: If Tauri fails, run 'make build-server' first or use separate terminals$(NC)" @trap 'kill 0' EXIT; \ $(MAKE) dev-backend & \ - sleep 2 && $(MAKE) dev-frontend & \ + sleep 2 && WEBKIT_DISABLE_DMABUF_RENDERER=1 $(MAKE) dev-frontend & \ wait dev-backend: ## Start FastAPI backend server From d21c63b52c21cc6053f70e6df1df7d02d3915f82 Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 27 Feb 2026 06:49:08 +0100 Subject: [PATCH 2/3] fix: enable microphone access on Linux via WebKitGTK WebKitGTK denies getUserMedia by default. This adds webkit2gtk as a Linux dependency and configures the webview to enable media streams and auto-grant UserMediaPermissionRequest for microphone access. Co-Authored-By: Claude Opus 4.6 --- tauri/src-tauri/Cargo.lock | 3 ++- tauri/src-tauri/Cargo.toml | 3 +++ tauri/src-tauri/src/main.rs | 27 +++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/tauri/src-tauri/Cargo.lock b/tauri/src-tauri/Cargo.lock index 35b15188..1ee065f2 100644 --- a/tauri/src-tauri/Cargo.lock +++ b/tauri/src-tauri/Cargo.lock @@ -5041,7 +5041,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "voicebox" -version = "0.1.12" +version = "0.1.13" dependencies = [ "base64 0.22.1", "core-foundation-sys", @@ -5064,6 +5064,7 @@ dependencies = [ "tauri-plugin-updater", "tokio", "wasapi", + "webkit2gtk", "windows 0.62.2", ] diff --git a/tauri/src-tauri/Cargo.toml b/tauri/src-tauri/Cargo.toml index aa3b1a9c..1f3654d0 100644 --- a/tauri/src-tauri/Cargo.toml +++ b/tauri/src-tauri/Cargo.toml @@ -37,6 +37,9 @@ core-foundation-sys = "0.8" wasapi = "0.22" windows = { version = "0.62", features = ["Win32_Foundation", "Win32_UI_WindowsAndMessaging", "Win32_System_Com"] } +[target.'cfg(target_os = "linux")'.dependencies] +webkit2gtk = "2.0" + [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] tauri-plugin-updater = "2.0" tauri-plugin-process = "2.0" diff --git a/tauri/src-tauri/src/main.rs b/tauri/src-tauri/src/main.rs index 255655aa..19bf70aa 100644 --- a/tauri/src-tauri/src/main.rs +++ b/tauri/src-tauri/src/main.rs @@ -635,6 +635,33 @@ pub fn run() { } } + // Enable microphone access on Linux (WebKitGTK denies getUserMedia by default) + #[cfg(target_os = "linux")] + { + use tauri::Manager; + if let Some(window) = app.get_webview_window("main") { + let _ = window.with_webview(|webview| { + use webkit2gtk::{WebViewExt, SettingsExt, PermissionRequestExt}; + use webkit2gtk::glib::ObjectExt; + let wk_webview = webview.inner(); + + // Enable media stream support in WebKitGTK settings + if let Some(settings) = WebViewExt::settings(&wk_webview) { + settings.set_enable_media_stream(true); + } + + // Auto-grant UserMediaPermissionRequest (microphone access) + wk_webview.connect_permission_request(move |_, request: &webkit2gtk::PermissionRequest| { + if request.is::() { + request.allow(); + return true; + } + false + }); + }); + } + } + Ok(()) }) .invoke_handler(tauri::generate_handler![ From 30ee07c2e388d4328595639ce264a88bc5620cdd Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 27 Feb 2026 07:01:32 +0100 Subject: [PATCH 3/3] fix: scope DMABUF workaround to Linux+NVIDIA, add origin validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address CodeRabbit review feedback: - Makefile: only set WEBKIT_DISABLE_DMABUF_RENDERER=1 when running on Linux with an NVIDIA GPU detected via lspci - main.rs: validate webview origin before auto-granting microphone permission — only allow for trusted local origins (tauri://, localhost, 127.0.0.1) Co-Authored-By: Claude Opus 4.6 --- Makefile | 6 +++++- tauri/src-tauri/src/main.rs | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 94c841d3..3ff4080c 100644 --- a/Makefile +++ b/Makefile @@ -79,7 +79,11 @@ dev: ## Start backend + desktop app (parallel) @echo -e "$(YELLOW)Note: If Tauri fails, run 'make build-server' first or use separate terminals$(NC)" @trap 'kill 0' EXIT; \ $(MAKE) dev-backend & \ - sleep 2 && WEBKIT_DISABLE_DMABUF_RENDERER=1 $(MAKE) dev-frontend & \ + sleep 2 && if [ "$$(uname)" = "Linux" ] && lspci 2>/dev/null | grep -qi nvidia; then \ + WEBKIT_DISABLE_DMABUF_RENDERER=1 $(MAKE) dev-frontend; \ + else \ + $(MAKE) dev-frontend; \ + fi & \ wait dev-backend: ## Start FastAPI backend server diff --git a/tauri/src-tauri/src/main.rs b/tauri/src-tauri/src/main.rs index 19bf70aa..83629070 100644 --- a/tauri/src-tauri/src/main.rs +++ b/tauri/src-tauri/src/main.rs @@ -651,9 +651,19 @@ pub fn run() { } // Auto-grant UserMediaPermissionRequest (microphone access) - wk_webview.connect_permission_request(move |_, request: &webkit2gtk::PermissionRequest| { + // Only for trusted local origins (Tauri dev server or custom protocol) + wk_webview.connect_permission_request(move |webview, request: &webkit2gtk::PermissionRequest| { if request.is::() { - request.allow(); + let uri = WebViewExt::uri(webview).unwrap_or_default(); + let is_trusted = uri.starts_with("tauri://") + || uri.starts_with("https://tauri.localhost") + || uri.starts_with("http://localhost") + || uri.starts_with("http://127.0.0.1"); + if is_trusted { + request.allow(); + return true; + } + request.deny(); return true; } false