From 5af8fe696771a08ca7caf8c121c5cae55e2756eb Mon Sep 17 00:00:00 2001
From: Palash Debnath <4178343+debpalash@users.noreply.github.com>
Date: Wed, 16 Sep 2026 22:11:59 +0530
Subject: [PATCH] Make Electron the default desktop and refresh setup
documentation
---
.github/CONTRIBUTING.md | 26 +++++++++++++-------
README.md | 36 +++++++++++++++++-----------
docs/install/linux.md | 31 ++++++++++++++++++------
docs/install/macos.md | 21 ++++++++++++++--
docs/install/windows.md | 29 +++++++++++++++++-----
docs/media/sponsor-slot.svg | 10 ++++++++
electron/README.md | 24 +++++++------------
package.json | 48 ++++++++++++++++++++++++-------------
turbo.json | 6 ++++-
9 files changed, 161 insertions(+), 70 deletions(-)
create mode 100644 docs/media/sponsor-slot.svg
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index ca85f6ca..a3d4e2c3 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -56,7 +56,17 @@ bun install
bun run dev
```
-This starts both services:
+This launches Electron with hot reload. Its runtime supervisor manages backend setup
+and startup; do not launch a second backend. See [Electron setup](../electron/README.md).
+
+```bash
+bun run build # build Electron
+bun run start # launch the built Electron app
+bun run dist # package locally without publishing
+bun run dev:web # legacy browser UI + backend
+```
+
+The legacy browser command starts both services:
| Service | URL | What it does |
|---------|-----|---|
@@ -71,23 +81,23 @@ cause doesn't scroll away with the terminal. The same death is also reported
as a crash notice in the UI the next time the backend starts (see
[docs/install/troubleshooting.md §14c](docs/install/troubleshooting.md)).
-### Desktop App (Tauri)
+### Legacy Desktop App (Tauri)
```bash
-bun run desktop # dev: hot-reload Tauri shell + backend
-bun run desktop-prod # production: builds, bundles the backend, then launches
+bun run tauri # legacy dev: hot-reload Tauri shell + backend
+bun run tauri:desktop-prod # legacy production: builds, bundles the backend, then launches
```
Both run `uv sync` first (so the Python backend env is set up) and start the
backend automatically — you do **not** start it separately. Use the exact script
-names: there is no `desktop=prod` (note the **hyphen** in `desktop-prod`).
-`desktop-prod` is Windows-aware (auto-detects bash/git; see `scripts/desktop-prod.mjs`).
+names: there is no `desktop=prod` (note the **hyphen** in `tauri:desktop-prod`).
+`tauri:desktop-prod` is Windows-aware (auto-detects bash/git; see `scripts/desktop-prod.mjs`).
Requires [Rust](https://rustup.rs/) and platform-specific Tauri dependencies — see the [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/).
After installing Rust with rustup (or `uv` with its installer), a terminal that
-was already open still has the old `PATH`. The desktop launchers (`bun desktop`,
-`bun desktop-prod`, `bun desktop-fresh`) detect this and add `~/.cargo/bin` /
+was already open still has the old `PATH`. The desktop launchers (`bun tauri`,
+`bun tauri:desktop-prod`, `bun tauri:desktop-fresh`) detect this and add `~/.cargo/bin` /
`~/.local/bin` for that run, printing a one-line note; to make it permanent,
open a new terminal, or on macOS/Linux load Cargo into the current one:
diff --git a/README.md b/README.md
index 7db3c260..c7143a78 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,6 @@
Open source voice cloning and workflow engine. Build local.
-
Clone voices, dub videos, dictate, and create audiobooks with local AI.
-

-## Create with VoiceStudio
+## Your voice. Your workflow.
-- **Clone & design voices** — use a reference recording or describe the voice you imagine.
-- **Dub video** — transcribe, translate, assign speakers, and edit timed speech.
-- **Dictate anywhere** — record, transcribe, and copy text with a floating recording widget.
-- **Tell longer stories** — create multi-voice scripts, audiobooks, and batch jobs.
-- **Choose your models** — manage speech and transcription engines, languages, and compute devices.
+| Create | Produce | Connect |
+| :--- | :--- | :--- |
+| Clone a voice or design your own | Dub videos with timed speech | Local API & MCP for agents |
+| Dictate with a floating widget | Stories, audiobooks & batch jobs | Optional remote workers |
Start with **VoiceStudio** (default, powered by k2-fsa/OmniVoice), or choose another engine.
Local workflows run on your hardware. Remote services are optional; usage analytics requires consent.
+
+Explore the workspaces · Clone, dub, design & models
+
@@ -49,6 +49,10 @@ Local workflows run on your hardware. Remote services are optional; usage analyt
Voice design
Local models
+
+
+
+
## Get started
Download from [Releases](https://github.com/debpalash/VoiceStudio/releases/latest), then follow your platform guide:
@@ -57,17 +61,19 @@ Download from [Releases](https://github.com/debpalash/VoiceStudio/releases/lates
Open **Voice cloning**, choose a voice or add a clean reference recording, enter your text, and generate. Install the required model when prompted. Hardware needs vary by engine; see [performance](docs/performance.md).
-**Run the Electron preview from source:**
+
+Run the Electron preview from source
```bash
git clone https://github.com/debpalash/VoiceStudio.git
cd VoiceStudio
bun install
-cd electron
bun run dev
```
-See [Electron setup](electron/README.md) for prerequisites and backend configuration. VoiceStudio is in active development; report bugs through [GitHub Issues](https://github.com/debpalash/VoiceStudio/issues).
+See [Electron setup](electron/README.md) for prerequisites and backend configuration.
+
+
## Documentation
@@ -80,11 +86,13 @@ See [Electron setup](electron/README.md) for prerequisites and backend configura
Agent skills: `npx skills add debpalash/VoiceStudio` — choose **voicestudio** for audio workflows or **oss-maintainer** for repository maintenance.
-## Support VoiceStudio
+## Sponsors
-[Ko-fi](https://ko-fi.com/debpalash) · [PayPal](https://paypal.me/palashCoder) · [Sponsor the project](SPONSORS.md) · [Partnerships](mailto:partner@voicestudio.sh)
+
-**Put your brand where people build with voice.** Explore paid placements in the app footer, integrations directory, documentation, and README. [Apply to partner](https://forms.gle/2PYCvd39hbwijzX37) or [email us](mailto:partner@voicestudio.sh).
+**Become a featured partner.** [Apply for a paid placement](https://forms.gle/2PYCvd39hbwijzX37) · [Email us](mailto:partner@voicestudio.sh)
+
+Support development: [Ko-fi](https://ko-fi.com/debpalash) · [PayPal](https://paypal.me/palashCoder) · [Sponsorship details](SPONSORS.md)
## License & responsible use
diff --git a/docs/install/linux.md b/docs/install/linux.md
index f73f9327..f54dbecf 100644
--- a/docs/install/linux.md
+++ b/docs/install/linux.md
@@ -1,5 +1,22 @@
# VoiceStudio — Install on Linux
+## Electron desktop (current)
+
+From the repository root, install Bun and uv, then run:
+
+```sh
+bun install
+bun run dev
+```
+
+Use `bun run desktop-prod` to build and launch Electron, or `bun run dist`
+to create local installers without publishing. The app manages its backend.
+See [Electron setup](../../electron/README.md) and [migration notes](../electron-migration.md).
+
+## Legacy Tauri installation and troubleshooting
+
+The instructions below apply to the sunset Tauri app and existing Tauri installers.
+
This page is self-contained: follow it top to bottom and you'll end up with a
working VoiceStudio install on a Debian / Ubuntu / Fedora / Arch host.
@@ -28,7 +45,7 @@ Everything above, plus the toolchain:
`sudo dnf install python3.11` on Fedora, or already installed on Arch.
- **Bun** — `curl -fsSL https://bun.sh/install | bash`.
- **Rust / Cargo** — `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh` or via your package manager (e.g., `sudo apt install rustc cargo`).
- If you use rustup, reopen the shell or source `"$HOME/.cargo/env"` before running `bun run desktop-prod`.
+ If you use rustup, reopen the shell or source `"$HOME/.cargo/env"` before running `bun run tauri:desktop-prod`.
- **GTK/WebKit deps** for the Tauri shell:
```bash
@@ -66,10 +83,10 @@ git clone https://github.com/debpalash/VoiceStudio.git
cd VoiceStudio
bun install
source "$HOME/.cargo/env" # only needed in a shell opened before rustup finished
-bun desktop # development build with hot reload
+bun tauri # development build with hot reload
```
-Use `bun run desktop-prod` instead when you need to build and launch the
+Use `bun run tauri:desktop-prod` instead when you need to build and launch the
production bundle. Both commands create the Python environment via `uv`, sync
dependencies, and start the backend automatically; do not start the backend in
a second terminal.
@@ -87,7 +104,7 @@ pkg-config --exists \
&& echo "Tauri system libraries are ready"
```
-`bun desktop` also checks the native `libxdo` linker input and GStreamer's
+`bun tauri` also checks the native `libxdo` linker input and GStreamer's
`autoaudiosink` before starting. The latter is required even if you do not plan
to record: WebKitGTK 2.52 aborts its renderer when a page creates an audio
element without that plugin, which otherwise turns a running app blank. The
@@ -256,7 +273,7 @@ If you are on v0.4.0 or older, either update or build from source:
git clone https://github.com/debpalash/VoiceStudio.git
cd VoiceStudio
bun install
-bun run desktop-prod
+bun run tauri:desktop-prod
```
Tracking issues: [#62](https://github.com/debpalash/VoiceStudio/issues/62),
@@ -389,9 +406,9 @@ reinstall and left the CPU-only CUDA build in place).
**2. Environment variable (existing installs / headless / source).** Set
`OMNIVOICE_TORCH_VARIANT=rocm` before launching — the next bootstrap performs
the same ROCm reinstall. Source installs honour it too:
-`OMNIVOICE_TORCH_VARIANT=rocm bun run desktop` swaps torch right after
+`OMNIVOICE_TORCH_VARIANT=rocm bun run tauri` swaps torch right after
`uv sync` and launches the backend without re-syncing, so the wheel is not
-reverted on the next start (#1665). Without the variable, `bun run desktop`
+reverted on the next start (#1665). Without the variable, `bun run tauri`
restores the lockfile's CUDA build — a hand-swapped ROCm wheel does not
survive it. `OMNIVOICE_TORCH_INDEX=` overrides the wheel
index when you need a different ROCm version — e.g. AMD publishes newer
diff --git a/docs/install/macos.md b/docs/install/macos.md
index a1d7ac2c..5b7a772f 100644
--- a/docs/install/macos.md
+++ b/docs/install/macos.md
@@ -1,5 +1,22 @@
# VoiceStudio — Install on macOS
+## Electron desktop (current)
+
+From the repository root, install Bun and uv, then run:
+
+```sh
+bun install
+bun run dev
+```
+
+Use `bun run desktop-prod` to build and launch Electron, or `bun run dist`
+to create local installers without publishing. The app manages its backend.
+See [Electron setup](../../electron/README.md) and [migration notes](../electron-migration.md).
+
+## Legacy Tauri installation and troubleshooting
+
+The instructions below apply to the sunset Tauri app and existing Tauri installers.
+
This page is self-contained: follow it top to bottom and you'll end up with a
working VoiceStudio install on macOS (Apple Silicon).
@@ -36,7 +53,7 @@ Everything above, plus the toolchain:
- **Python 3.11+** — `brew install python@3.11` (or use `pyenv` / the system Python if you already have ≥3.11).
- **Bun** — `curl -fsSL https://bun.sh/install | bash`.
- **Rust / Cargo** — `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh` or `brew install rust`.
- If you use rustup, reopen the terminal or source `"$HOME/.cargo/env"` before running `bun run desktop-prod`.
+ If you use rustup, reopen the terminal or source `"$HOME/.cargo/env"` before running `bun run tauri:desktop-prod`.
FFmpeg/FFprobe and yt-dlp are **not** prerequisites on any install path: the
app resolves them itself (a static build ships with the Python environment;
@@ -63,7 +80,7 @@ Or manually:
git clone https://github.com/debpalash/VoiceStudio.git
cd VoiceStudio
bun install
-bun run desktop-prod
+bun run tauri:desktop-prod
```
The first launch builds the Tauri shell, creates the Python venv via `uv`,
diff --git a/docs/install/windows.md b/docs/install/windows.md
index 202a4039..27705bb0 100644
--- a/docs/install/windows.md
+++ b/docs/install/windows.md
@@ -1,5 +1,22 @@
# VoiceStudio — Install on Windows
+## Electron desktop (current)
+
+From the repository root, install Bun and uv, then run:
+
+```sh
+bun install
+bun run dev
+```
+
+Use `bun run desktop-prod` to build and launch Electron, or `bun run dist`
+to create local installers without publishing. The app manages its backend.
+See [Electron setup](../../electron/README.md) and [migration notes](../electron-migration.md).
+
+## Legacy Tauri installation and troubleshooting
+
+The instructions below apply to the sunset Tauri app and existing Tauri installers.
+
This page is self-contained: follow it top to bottom and you'll end up with a
working VoiceStudio install on Windows 10 / 11 (x64).
@@ -20,7 +37,7 @@ by the app itself on first launch. No toolchain needed.
Everything above, plus the toolchain:
- **Git for Windows** — `winget install --id Git.Git -e`. Needed for
- `git clone`, and it includes **Git Bash**, which `bun run desktop-prod`
+ `git clone`, and it includes **Git Bash**, which `bun run tauri:desktop-prod`
uses to run its build-and-launch script. Without it, `desktop-prod` stops
with an error telling you to install it.
- **Python 3.11+** — `winget install Python.Python.3.11` (or download from
@@ -32,7 +49,7 @@ Everything above, plus the toolchain:
- **Bun** — `powershell -c "irm bun.sh/install.ps1 | iex"`.
- **FFmpeg** — `winget install Gyan.FFmpeg`.
- **Rust / Cargo** — `winget install Rust.Rustup` or download `rustup-init.exe` from [rustup.rs](https://rustup.rs/).
- After installing Rustup, close and reopen PowerShell before running `bun run desktop-prod`.
+ After installing Rustup, close and reopen PowerShell before running `bun run tauri:desktop-prod`.
## GPU support on Windows
@@ -64,17 +81,17 @@ Or manually:
git clone https://github.com/debpalash/VoiceStudio.git
cd VoiceStudio
bun install
-bun run desktop-prod
+bun run tauri:desktop-prod
```
The first launch creates the Python venv via `uv`, syncs deps, and downloads
model weights. The splash screen shows progress.
-> **Note:** `bun run desktop-prod` runs a bash script under the hood. You can
+> **Note:** `bun run tauri:desktop-prod` runs a bash script under the hood. You can
> launch it from PowerShell or cmd as shown — it finds Git Bash automatically
> (installed with Git for Windows, see Prerequisites). If no Git Bash is
> found, it prints instructions instead of failing silently. Alternatives
-> that don't need bash: `bun run desktop` (dev mode) or the pre-built MSI
+> that don't need bash: `bun run tauri` (dev mode) or the pre-built MSI
> below.
## Install (pre-built MSI)
@@ -283,7 +300,7 @@ peak throughput in exchange for the engine actually loading.
```powershell
$env:TORCH_COMPILE_DISABLE = "1"
-bun run desktop-prod
+bun run tauri:desktop-prod
```
This setting is a no-op on macOS and Linux (the OOM is Windows-specific —
diff --git a/docs/media/sponsor-slot.svg b/docs/media/sponsor-slot.svg
new file mode 100644
index 00000000..0886cb6c
--- /dev/null
+++ b/docs/media/sponsor-slot.svg
@@ -0,0 +1,10 @@
+
diff --git a/electron/README.md b/electron/README.md
index 3fcc1498..b3d4d29e 100644
--- a/electron/README.md
+++ b/electron/README.md
@@ -1,19 +1,11 @@
-# VoiceStudio — Electron shell (preview)
+# VoiceStudio — Electron desktop app
-An Electron rewrite of the desktop shell, built page by page. Today it ships
-**Voice cloning** only; the Tauri app in `frontend/` remains the product.
+Electron is the primary desktop app for voice cloning, stories, dubbing,
+transcription, voice design, and workflows. Tauri is retained only for its final
+sunset update; see [migration notes](../docs/electron-migration.md).
-Both shells talk to the same local FastAPI backend (`backend/`, port 3900), so
-voices, history and installed engines are shared. Nothing leaves the machine.
-
-The Electron UI follows T3 Code's styling foundation: shadcn Base UI Mira,
-Zinc light surfaces, near-black dark surfaces, blue actions, system fonts,
-compact controls, and translucent popovers/dialogs. Shared palette roles live in
-`src/renderer/src/styles/t3-theme.css`; app geometry and surface utilities live in
-`styles/globals.css`. The palette is adapted from
-[T3 Code](https://github.com/pingdotgg/t3code/blob/main/apps/web/src/index.css)
-under the MIT license (see `T3CODE-LICENSE.txt`).
-Light/dark switching is local; T3's theme editor and theme library are not included.
+The runtime supervisor manages the local FastAPI backend. Network integrations
+and remote workers require configuration; local generation stays on your machine.
## Stack
@@ -28,7 +20,7 @@ Light/dark switching is local; T3's theme editor and theme library are not inclu
## Run it
```sh
-cd electron
+# From the repository root
bun install
bun run dev # electron-vite: main + preload + renderer with HMR
```
@@ -57,7 +49,7 @@ app-relative `/api/...`:
```sh
bun run typecheck # tsgo, both projects
-bun run check # vp: format + lint + types
+bun run check:electron # types, tests, build, packaging contract
bun run test # vitest (jsdom)
bun run build # electron-vite build → out/
bun run dist # + electron-builder → release/
diff --git a/package.json b/package.json
index 118af88d..43ec84dc 100644
--- a/package.json
+++ b/package.json
@@ -8,29 +8,45 @@
"setup:api": "uv sync && uv run python scripts/setup.py",
"dev:api": "bun scripts/dev-backend.mjs",
"dev:frontend": "bun run --cwd frontend dev",
- "dev:desktop": "TAURI_SKIP_BACKEND=1 bun run --cwd frontend desktop",
+ "dev:desktop": "bun run --cwd electron dev",
"wait:api": "wait-on -t 300000 http-get://localhost:3900/system/info",
"wait:frontend": "wait-on -t 120000 http://localhost:5173",
- "predev": "bun install && bun scripts/clear-dev-ports.mjs 3900 3901",
- "dev": "bun run setup:api && concurrently -n api,fe -c green,cyan --kill-others-on-fail \"bun run dev:api\" \"bun run dev:frontend\"",
- "predesktop": "bun install && bun scripts/desktop-runtime-preflight.mjs && bun scripts/clear-dev-ports.mjs 3900 3901",
- "desktop": "bun run setup:api && concurrently -n api,app -c green,magenta --kill-others-on-fail \"bun run dev:api\" \"bun run dev:desktop\"",
- "desktop-prod": "bun scripts/desktop-prod.mjs",
- "desktop-prod:run": "bun scripts/desktop-prod.mjs --skip-build --keep-data",
- "desktop-prod:upgrade": "bun scripts/desktop-prod.mjs --keep-data",
- "desktop-prod:keep-models": "bun scripts/desktop-prod.mjs --keep-models",
- "desktop-prod:pill": "bun scripts/desktop-prod.mjs --pill",
- "desktop-prod:run:pill": "bun scripts/desktop-prod.mjs --skip-build --keep-data --pill",
- "desktop-fresh": "bun scripts/desktop-fresh.mjs",
- "desktop-fresh:run": "bun scripts/desktop-fresh.mjs --skip-build",
- "build": "turbo run build",
+ "predev": "bun install",
+ "dev": "bun run --cwd electron dev",
+ "predesktop": "bun install",
+ "desktop": "bun run dev:desktop",
+ "build": "bun run --cwd electron build",
"check:electron": "bun run --cwd electron typecheck && bun run --cwd electron test && bun run --cwd electron build && node electron/tests/packaging-contract.mjs",
- "start": "turbo run start",
+ "start": "bun run --cwd electron start",
"test:frontend": "node --test tests/frontend/*.test.mjs",
"smoke-test": "bash scripts/smoke-test.sh",
"smoke-test:quick": "bash scripts/smoke-test.sh --skip-build --skip-model",
"smoke-test:upgrade": "bash scripts/smoke-test.sh --keep-data --skip-build",
- "deps:check": "taze -r --maturity-period 7"
+ "deps:check": "taze -r --maturity-period 7",
+ "dev:web": "bun run setup:api && concurrently -n api,fe -c green,cyan --kill-others-on-fail \"bun run dev:api\" \"bun run dev:frontend\"",
+ "predev:web": "bun install && bun scripts/clear-dev-ports.mjs 3900 3901",
+ "dev:tauri": "TAURI_SKIP_BACKEND=1 bun run --cwd frontend desktop",
+ "pretauri": "bun install && bun scripts/desktop-runtime-preflight.mjs && bun scripts/clear-dev-ports.mjs 3900 3901",
+ "tauri": "bun run setup:api && concurrently -n api,app -c green,magenta --kill-others-on-fail \"bun run dev:api\" \"bun run dev:tauri\"",
+ "build:all": "turbo run build",
+ "build:web": "bun run --cwd frontend build",
+ "dist": "bun run --cwd electron dist --publish never",
+ "tauri:desktop-prod": "bun scripts/desktop-prod.mjs",
+ "tauri:desktop-prod:run": "bun scripts/desktop-prod.mjs --skip-build --keep-data",
+ "tauri:desktop-prod:upgrade": "bun scripts/desktop-prod.mjs --keep-data",
+ "tauri:desktop-prod:keep-models": "bun scripts/desktop-prod.mjs --keep-models",
+ "tauri:desktop-prod:pill": "bun scripts/desktop-prod.mjs --pill",
+ "tauri:desktop-prod:run:pill": "bun scripts/desktop-prod.mjs --skip-build --keep-data --pill",
+ "tauri:desktop-fresh": "bun scripts/desktop-fresh.mjs",
+ "tauri:desktop-fresh:run": "bun scripts/desktop-fresh.mjs --skip-build",
+ "desktop-prod": "bun run build && bun run start",
+ "desktop-prod:run": "bun run start",
+ "desktop-prod:upgrade": "bun run desktop-prod",
+ "test": "bun run --cwd electron test",
+ "typecheck": "bun run --cwd electron typecheck",
+ "lint": "bun run --cwd electron lint",
+ "format": "bun run --cwd electron format",
+ "dist:dir": "bun run --cwd electron dist:dir --publish never"
},
"workspaces": [
"frontend",
diff --git a/turbo.json b/turbo.json
index 4175b5da..4dc42a1f 100644
--- a/turbo.json
+++ b/turbo.json
@@ -2,7 +2,11 @@
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": {
- "outputs": ["dist/**", "build/**"]
+ "outputs": [
+ "dist/**",
+ "build/**",
+ "out/**"
+ ]
},
"dev": {
"cache": false,