rebrand: rename VoiceBox to TalkBox throughout codebase
CI / frontend-quality (push) Canceled after 0s

- All 'voicebox'/'Voicebox'/'VOICEBOX' strings replaced with 'talkbox'/'TalkBox'/'TALKBOX'
- Port changed from 17493 to 17494 (avoids conflict with upstream VoiceBox)
- MCP tool namespace: voicebox.* -> talkbox.*
- App bundle ID: sh.voicebox.app -> com.talkbox.app
- Binary names: voicebox-server -> talkbox-server, voicebox-mcp -> talkbox-mcp
- Docker user/group: voicebox -> talkbox
- Database: voicebox.db -> talkbox.db
- Env vars: VOICEBOX_* -> TALKBOX_*
- Asset files renamed: voicebox-logo.* -> talkbox-logo.*, etc.
- External binaries in tauri.conf.json updated to talkbox-server/talkbox-mcp
This commit is contained in:
2026-08-24 19:45:56 -07:00
parent eaef8dd838
commit b8815e94ea
205 changed files with 1593 additions and 1593 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
"""Route registration for the voicebox API."""
"""Route registration for the talkbox API."""
from fastapi import FastAPI
+4 -4
View File
@@ -1,4 +1,4 @@
"""Voicebox Cloud device login routes.
"""TalkBox Cloud device login routes.
The browser-based pairing flow:
1. POST /cloud/login/start — opens the browser to the cloud authorize page.
@@ -23,7 +23,7 @@ router = APIRouter(prefix="/cloud", tags=["cloud"])
def _callback_url(request: Request) -> str:
# Always loopback — the cloud only redirects codes to 127.0.0.1/localhost.
port = request.url.port or 17493
port = request.url.port or 17494
return f"http://127.0.0.1:{port}/cloud/callback"
@@ -45,14 +45,14 @@ async def cloud_callback(
heading = "You're connected" if ok else "Couldn't connect"
accent = "#16a34a" if ok else "#dc2626"
sub = (
"Voicebox is now linked to your account. You can close this tab and return to the app."
"TalkBox is now linked to your account. You can close this tab and return to the app."
if ok
else message
)
html = f"""<!doctype html>
<html lang="en"><head><meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Voicebox Cloud</title>
<title>TalkBox Cloud</title>
<style>
body {{ margin:0; min-height:100vh; display:flex; align-items:center; justify-content:center;
font-family: ui-sans-serif, system-ui, -apple-system, sans-serif; background:#0b0b0d; color:#e7e7ea; }}
+3 -3
View File
@@ -29,7 +29,7 @@ async def root():
index = _frontend_dir / "index.html"
if index.is_file():
return FileResponse(index, media_type="text/html")
return {"message": "voicebox API", "version": __version__}
return {"message": "talkbox API", "version": __version__}
@router.post("/shutdown")
@@ -185,7 +185,7 @@ async def health():
gpu_type=gpu_type,
vram_used_mb=vram_used,
backend_type=backend_type,
backend_variant=os.environ.get("VOICEBOX_BACKEND_VARIANT", default_variant),
backend_variant=os.environ.get("TALKBOX_BACKEND_VARIANT", default_variant),
supports_rocm=is_amd_gpu_windows(),
gpu_compatibility_warning=gpu_compat_warning,
)
@@ -211,7 +211,7 @@ async def filesystem_health():
writable = False
error = None
if exists:
probe = dir_path / ".voicebox_probe"
probe = dir_path / ".talkbox_probe"
try:
probe.write_text("ok")
probe.unlink()
+1 -1
View File
@@ -153,7 +153,7 @@ async def export_generation(
safe_text = "generation"
# Append a short id so exports of similarly-worded generations don't collide
# on the same filename (the first 30 chars are frequently identical).
filename = f"generation-{safe_text}-{generation_id[:8]}.voicebox.zip"
filename = f"generation-{safe_text}-{generation_id[:8]}.talkbox.zip"
return StreamingResponse(
io.BytesIO(zip_bytes),
+2 -2
View File
@@ -2,8 +2,8 @@
The Settings UI uses these to let users configure distinct voices per
agent (Claude Code in Morgan, Cursor in Scarlett, ...). The ``client_id``
column is the same value the MCP client sends in ``X-Voicebox-Client-Id``
(or the stdio shim pulls from ``VOICEBOX_CLIENT_ID``).
column is the same value the MCP client sends in ``X-TalkBox-Client-Id``
(or the stdio shim pulls from ``TALKBOX_CLIENT_ID``).
"""
from datetime import datetime, timezone
+1 -1
View File
@@ -294,7 +294,7 @@ async def export_profile(
safe_name = "".join(c for c in profile.name if c.isalnum() or c in (" ", "-", "_")).strip()
if not safe_name:
safe_name = "profile"
filename = f"profile-{safe_name}.voicebox.zip"
filename = f"profile-{safe_name}.talkbox.zip"
return StreamingResponse(
io.BytesIO(zip_bytes),
+5 -5
View File
@@ -1,9 +1,9 @@
"""POST /speak — REST wrapper around voicebox.speak for non-MCP callers.
"""POST /speak — REST wrapper around talkbox.speak for non-MCP callers.
Shell scripts, ACP, A2A, or any agent that doesn't speak MCP can hit this
endpoint to play text through a cloned voice. Uses the same profile
resolution and generation pipeline as the MCP tool, so per-client
bindings (via X-Voicebox-Client-Id) work identically.
bindings (via X-TalkBox-Client-Id) work identically.
"""
from __future__ import annotations
@@ -30,13 +30,13 @@ async def speak(
request: Request,
db: Session = Depends(get_db),
):
"""Speak text in a voice profile. Mirrors voicebox.speak (MCP).
"""Speak text in a voice profile. Mirrors talkbox.speak (MCP).
Response shape matches POST /generate — a ``GenerationResponse`` with
``status="generating"`` and an ``id`` the caller polls at
``GET /generate/{id}/status``.
"""
client_id = request.headers.get("X-Voicebox-Client-Id")
client_id = request.headers.get("X-TalkBox-Client-Id")
profile = resolve_profile(data.profile, client_id, db)
if profile is None:
if data.profile:
@@ -48,7 +48,7 @@ async def speak(
status_code=400,
detail=(
"No voice profile resolved. Pass `profile` (name or id), "
"or configure a default in Voicebox → Settings → MCP."
"or configure a default in TalkBox → Settings → MCP."
),
)