WebView2 Shell
On Windows, WebView2 (Edge Chromium) hosts the React UI and a separate embedded surface for Explorer cookie flows.
The main window webview loads the Vite bundle. Local playback uses Tauri asset protocol scopes so convertFileSrc URLs resolve under your download and library paths. CSP is null in config; sandboxing is mostly Tauri capability boundaries plus path allowlists.
Explorer is a child webview (explorer-view label on Windows) positioned over the content column. It paints above normal DOM, which is why back/forward/reload live in ExplorerTitlebarNav fixed at the sidebar seam, not inside the Explorer tab body. explorerBoundsSync.ts sends screen-space rects to ensure_embedded_explorer_bounds during sidebar resize.
WebView2 quirks shaped a few frontend choices: native confirm() is dead in practice, so deletes use React ConfirmDialog. Audio visualizers tap captureStream() because analyser nodes on <video> alone read silence in WebView2. applyMediaOutputState.ts syncs volume/mute on every load because autoplay can leave elements muted after mini handoff.
Rust patches Windows volume mixer labels via Core Audio so sessions show RuForge instead of a generic WebView2 name (windows_audio_brand.rs).
In the repo
Where it shows up
-
explorer_embed.rschild bounds, visibility, Linux surface variant -
ExplorerTitlebarNav+ Explorer host div inApp.tsx -
applyMediaOutputState.tson<video>/<audio>in player and mini -
tauri.conf.jsonassetProtocol.scopedrive and home paths