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
@@ -35,7 +35,7 @@ interface ChordPickerProps {
* before clicking Save (otherwise they'd be saving while still holding
* the shortcut, which is awkward).
*
* Browser limitation: we can only capture keys while Voicebox has key
* Browser limitation: we can only capture keys while TalkBox has key
* focus, so the picker pulls focus to a hidden capture surface inside
* the dialog. The actual chord runs through the Rust global hook —
* this picker only writes the configuration the hook reads.
@@ -122,7 +122,7 @@ export function ChordPicker({
});
}, []);
// Wire global listeners only while open. Capture phase so Voicebox's
// Wire global listeners only while open. Capture phase so TalkBox's
// own command palette / global shortcuts don't swallow the chord first.
useEffect(() => {
if (!open) return;
+3 -3
View File
@@ -39,7 +39,7 @@ export function MainEditor() {
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (file) {
if (!file.name.endsWith('.voicebox.zip')) {
if (!file.name.endsWith('.talkbox.zip')) {
toast({
title: t('main.import.invalidTitle'),
description: t('main.import.invalidDescription'),
@@ -84,7 +84,7 @@ export function MainEditor() {
<div className="absolute top-0 left-0 right-0 z-10">
<div className="flex items-center justify-between mb-4 px-1">
<h2 className="text-2xl font-bold">Voicebox</h2>
<h2 className="text-2xl font-bold">TalkBox</h2>
<div className="flex gap-2">
<Button variant="outline" onClick={handleImportClick}>
<Upload className="mr-2 h-4 w-4" />
@@ -93,7 +93,7 @@ export function MainEditor() {
<input
ref={fileInputRef}
type="file"
accept=".voicebox.zip"
accept=".talkbox.zip"
onChange={handleFileChange}
className="hidden"
/>
@@ -77,9 +77,9 @@ export function ConnectionForm() {
<FormItem>
<FormLabel>Server URL</FormLabel>
<FormControl>
<Input placeholder="http://127.0.0.1:17493" {...field} />
<Input placeholder="http://127.0.0.1:17494" {...field} />
</FormControl>
<FormDescription>Enter the URL of your voicebox backend server</FormDescription>
<FormDescription>Enter the URL of your talkbox backend server</FormDescription>
<FormMessage />
</FormItem>
)}
+5 -5
View File
@@ -2,7 +2,7 @@ import { ArrowUpRight } from 'lucide-react';
import type { CSSProperties, ReactNode } from 'react';
import { useEffect, useState } from 'react';
import { Trans, useTranslation } from 'react-i18next';
import voiceboxLogo from '@/assets/voicebox-logo.png';
import talkboxLogo from '@/assets/talkbox-logo.png';
import { usePlatform } from '@/platform/PlatformContext';
function FadeIn({ delay = 0, children }: { delay?: number; children: ReactNode }) {
@@ -45,12 +45,12 @@ export function AboutPage() {
<div className="max-w-md mx-auto h-full flex items-center">
<div className="flex flex-col items-center text-center space-y-5">
<FadeIn delay={0}>
<img src={voiceboxLogo} alt="Voicebox" className="w-20 h-20 object-contain" />
<img src={talkboxLogo} alt="TalkBox" className="w-20 h-20 object-contain" />
</FadeIn>
<FadeIn delay={80}>
<div className="space-y-1.5">
<h1 className="text-lg font-semibold">Voicebox</h1>
<h1 className="text-lg font-semibold">TalkBox</h1>
<p className="text-xs text-muted-foreground/60 h-4">
{version ? `v${version}` : '\u00A0'}
</p>
@@ -97,7 +97,7 @@ export function AboutPage() {
<ArrowUpRight className="h-3.5 w-3.5 text-muted-foreground/40 group-hover:text-muted-foreground transition-colors" />
</a>
<a
href="https://github.com/jamiepine/voicebox"
href="https://github.com/jamiepine/talkbox"
target="_blank"
rel="noopener noreferrer"
className="group inline-flex items-center gap-2 rounded-lg border border-border/60 px-4 py-2 text-sm transition-colors hover:bg-muted/50"
@@ -124,7 +124,7 @@ export function AboutPage() {
link: (
// biome-ignore lint/a11y/useAnchorContent: Trans fills content at runtime
<a
href="https://github.com/jamiepine/voicebox/blob/main/LICENSE"
href="https://github.com/jamiepine/talkbox/blob/main/LICENSE"
target="_blank"
rel="noopener noreferrer"
className="hover:text-muted-foreground/60 transition-colors"
@@ -27,7 +27,7 @@ export function CloudSection() {
if (connected && polling) {
setPolling(false);
toast({
title: 'Connected to Voicebox Cloud',
title: 'Connected to TalkBox Cloud',
description: `Linked as ${status?.device_name ?? 'this device'}.`,
});
}
@@ -84,7 +84,7 @@ export function CloudSection() {
return (
<SettingSection
title="Voicebox Cloud"
title="TalkBox Cloud"
description="End-to-end encrypted backup & sync across your devices."
>
<SettingRow
@@ -138,7 +138,7 @@ export function CloudSection() {
>
<a
className="text-sm text-accent hover:underline"
href={status?.dashboard_url ?? 'https://voicebox.sh/account'}
href={status?.dashboard_url ?? 'https://talkbox.sh/account'}
rel="noopener noreferrer"
target="_blank"
>
+3 -3
View File
@@ -74,7 +74,7 @@ export function GeneralPage() {
<div className="space-y-8 max-w-2xl">
<div className="grid grid-cols-2 gap-3">
<a
href="https://docs.voicebox.sh"
href="https://docs.talkbox.sh"
target="_blank"
rel="noopener noreferrer"
className="group flex items-center gap-3 rounded-lg border border-border/60 p-4 transition-colors hover:bg-muted/50"
@@ -82,7 +82,7 @@ export function GeneralPage() {
<Book className="h-5 w-5 shrink-0 text-accent" strokeWidth={2.5} />
<div className="min-w-0 flex-1">
<div className="text-sm font-medium">{t('settings.general.docs.title')}</div>
<div className="text-xs text-muted-foreground">docs.voicebox.sh</div>
<div className="text-xs text-muted-foreground">docs.talkbox.sh</div>
</div>
<ArrowUpRight className="h-4 w-4 text-muted-foreground/40 group-hover:text-muted-foreground transition-colors" />
</a>
@@ -126,7 +126,7 @@ export function GeneralPage() {
render={({ field }) => (
<FormItem className="flex-1">
<FormControl>
<Input placeholder="http://127.0.0.1:17493" {...field} />
<Input placeholder="http://127.0.0.1:17494" {...field} />
</FormControl>
<FormMessage />
</FormItem>
+14 -14
View File
@@ -18,23 +18,23 @@ import { SettingRow, SettingSection } from './SettingRow';
function getStdioShimCommand(): string {
if (typeof navigator === 'undefined') {
return '/Applications/Voicebox.app/Contents/MacOS/voicebox-mcp';
return '/Applications/TalkBox.app/Contents/MacOS/talkbox-mcp';
}
const platform = `${navigator.platform} ${navigator.userAgent}`.toLowerCase();
if (platform.includes('win')) {
return 'C:\\Program Files\\Voicebox\\voicebox-mcp.exe';
return 'C:\\Program Files\\TalkBox\\talkbox-mcp.exe';
}
if (platform.includes('linux')) {
return '/opt/voicebox/voicebox-mcp';
return '/opt/talkbox/talkbox-mcp';
}
return '/Applications/Voicebox.app/Contents/MacOS/voicebox-mcp';
return '/Applications/TalkBox.app/Contents/MacOS/talkbox-mcp';
}
/**
* Settings → MCP — configure per-agent voice binding and show copy-paste
* install snippets for major MCP clients. Backend runs at /mcp on the
* existing Voicebox server; this page is the agent-onboarding surface.
* existing TalkBox server; this page is the agent-onboarding surface.
*/
export function MCPPage() {
const { t } = useTranslation();
@@ -82,9 +82,9 @@ export function MCPPage() {
snippet={JSON.stringify(
{
mcpServers: {
voicebox: {
talkbox: {
url: mcpUrl,
headers: { 'X-Voicebox-Client-Id': 'claude-code' },
headers: { 'X-TalkBox-Client-Id': 'claude-code' },
},
},
},
@@ -95,7 +95,7 @@ export function MCPPage() {
<SnippetRow
title={t('settings.mcp.install.claudeCode.title')}
description={t('settings.mcp.install.claudeCode.description')}
snippet={`claude mcp add voicebox --transport http --url ${mcpUrl} --header "X-Voicebox-Client-Id: claude-code"`}
snippet={`claude mcp add talkbox --transport http --url ${mcpUrl} --header "X-TalkBox-Client-Id: claude-code"`}
/>
<SnippetRow
title={t('settings.mcp.install.stdio.title')}
@@ -103,9 +103,9 @@ export function MCPPage() {
snippet={JSON.stringify(
{
mcpServers: {
voicebox: {
talkbox: {
command: stdioShimCommand,
env: { VOICEBOX_CLIENT_ID: 'claude-code' },
env: { TALKBOX_CLIENT_ID: 'claude-code' },
},
},
},
@@ -276,19 +276,19 @@ export function MCPPage() {
<h3 className="text-sm font-semibold">{t('settings.mcp.sidebar.toolsTitle')}</h3>
<ul className="text-sm text-muted-foreground space-y-1.5 leading-relaxed">
<li>
<code className="text-accent">voicebox.speak</code>
<code className="text-accent">talkbox.speak</code>
<div>{t('settings.mcp.sidebar.tools.speak')}</div>
</li>
<li>
<code className="text-accent">voicebox.transcribe</code>
<code className="text-accent">talkbox.transcribe</code>
<div>{t('settings.mcp.sidebar.tools.transcribe')}</div>
</li>
<li>
<code className="text-accent">voicebox.list_captures</code>
<code className="text-accent">talkbox.list_captures</code>
<div>{t('settings.mcp.sidebar.tools.listCaptures')}</div>
</li>
<li>
<code className="text-accent">voicebox.list_profiles</code>
<code className="text-accent">talkbox.list_profiles</code>
<div>{t('settings.mcp.sidebar.tools.listProfiles')}</div>
</li>
</ul>
+2 -2
View File
@@ -2,7 +2,7 @@ import { Link, useMatchRoute } from '@tanstack/react-router';
import { AudioLines, Box, Captions, type LucideIcon, Mic, Settings, Volume2, Wand2 } from 'lucide-react';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import voiceboxLogo from '@/assets/voicebox-logo.png';
import talkboxLogo from '@/assets/talkbox-logo.png';
import { cn } from '@/lib/utils/cn';
import { usePlatform } from '@/platform/PlatformContext';
import type { UpdateStatus } from '@/platform/types';
@@ -47,7 +47,7 @@ export function Sidebar({ isMacOS }: SidebarProps) {
>
{/* Logo */}
<div className="mb-2">
<img src={voiceboxLogo} alt="Voicebox" className="sidebar-logo w-12 h-12 object-contain" />
<img src={talkboxLogo} alt="TalkBox" className="sidebar-logo w-12 h-12 object-contain" />
</div>
{/* Navigation Buttons */}