A stand-alone feature demo for Studio-Whip, exploring Combined full featured Svelte 5 GUI + native Bevy 0.18 3D viewport with native GPU rendering.
A number of different methods are tested to determine the best way to get the best of both worlds for desktop applications.
just setup # Install dependencies
just dev # Development mode (UI hot reload)
just build # Release build
just run # Run release
| Mode | Architecture | UI Engine | Status |
|---|---|---|---|
--cef |
Native Bevy + offscreen Chromium | CEF | Recommended |
--electron |
WASM Bevy in Electron | Chromium | Recommended for WASM |
--dioxus |
Native Bevy + native Rust UI | Dioxus/Blitz | Experimental |
--overlay |
Native Bevy + GTK overlay | WebKitGTK | Implementation inconsistent across platforms |
--capture |
Native Bevy + offscreen WebKitGTK | WebKitGTK | Unmaintained |
--tauri |
WASM Bevy in Tauri | WebKitGTK | Unmaintained |
./launcher.sh --cef # Recommended: native Bevy + Chromium
./launcher.sh --electron # WASM mode with Chromium
./launcher.sh --dioxus # Native Rust UI (no browser dependency)
./launcher.sh --release --cef # Release build
./launcher.sh --dev # Dev mode (run `cd ui && npm run dev` first)
# Ubuntu/Debian
sudo apt-get install -y \
libasound2-dev libudev-dev libxkbcommon-dev libwayland-dev \
libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev \
librsvg2-dev pkg-config
rustup target add wasm32-unknown-unknown
cargo install wasm-bindgen-cli
Node.js 22+ required for Svelte UI.
crates/
├── app/ # Native Bevy application
├── app-wasm/ # WASM Bevy build
├── scene/ # Shared 3D scene
├── webview/ # Offscreen webview (WebKitGTK, CEF, Dioxus)
├── dioxus-ui/ # Native Rust UI components (Dioxus)
├── ipc/ # Message protocol
└── diffusion/ # Texture streaming
src-electron/ # Electron shell
ui/ # Svelte frontend
Native modes (cef, overlay, capture): Bevy owns the window. UI runs in webview, composited as texture or overlay.
Dioxus mode: Bevy owns the window. UI is pure Rust using Dioxus with Blitz WGPU renderer, composited as texture. No browser dependency.
WASM modes (electron, tauri): Desktop framework owns the window. Bevy compiles to WASM, renders via WebGL2 alongside Svelte.
Fundamentally flawed approach:
WebKitGTK 2.40+ has WebGL2 instability causing context loss. Not a Pentimento bug. Works in Chrome/Firefox.
MIT