diff --git a/DIVERGENCES.md b/DIVERGENCES.md
index 3a9ce8c663..9e5238c7f6 100644
--- a/DIVERGENCES.md
+++ b/DIVERGENCES.md
@@ -109,7 +109,8 @@ from the squash message first, or use a plain merge.
| `packages/app/src/pages/layout.tsx`, `packages/app/src/pages/layout-new.tsx` | Dropped the ` ` mount and its import from both layouts (added upstream in v1.17.18); `HelpButton` stays. | `TabsInfoPopup` is a dev-channel-only "Introducing Tabs" promo whose `muted autoplay loop` `` mounts on every layout render. The fork's Windows e2e runs on GPU-less GitHub-hosted runners (software GPU — see the runner-swap row), where continuous video decode wedges the GPU command buffer (`kTransientFailure`), making the whole app-e2e suite flaky and ~3–5× slower. It never ships (release builds use a non-`dev` `CODEV_CHANNEL`), so unmounting it costs users nothing. | Keep ours: don't re-add the ` ` mount or restore it to the import. |
| `packages/app/src/components/help-button.tsx` | Removed the `TabsInfoPopup` component, its `introducing-tabs.mp4` import, and the imports only it used; `HelpButton` stays. (The file's `VITE_OPENCODE_CHANNEL` → `VITE_CODEV_CHANNEL` gates follow the env-var rename row.) | The popup is upstream's temporary, OpenCode-branded "Introducing Tabs" promo (upstream's own comment says it's removable after the rollout), already unmounted per the row above; removing the definition lets the 13 MB video be deleted (row below). | Keep our removal; take upstream's changes to `HelpButton`. If upstream mounts `TabsInfoPopup` somewhere new, drop that mount per the row above. When upstream deletes the popup itself, this row and the two rows around it retire. |
| `packages/app/src/assets/help/` (introducing-tabs.mp4, placeholder.png — whole directory) | Deleted | The 13 MB promo video's only consumer was the removed `TabsInfoPopup` (row above) and it bloats every clone; `placeholder.png` is referenced by nothing. | Keep deleted (`git rm` the upstream side of modify/delete conflicts). |
-| `packages/app/src/desktop-menu.ts`, `packages/app/src/components/windows-app-menu.tsx` | App-menu label "OpenCode" → "CoDev Code" | Visible menu branding. | Keep our labels. |
+| `packages/app/src/desktop-menu.ts`, `packages/app/src/components/windows-app-menu.tsx` | App-menu label "OpenCode" → "CoDev Code"; "OpenCode Documentation" item → "CoDev Code Documentation" (href `opencode.ai/docs` stays — real URL); trigger `aria-label` "OpenCode menu" → "CoDev Code menu" (×2) | Visible menu branding, incl. screen-reader labels. | Keep our labels; take upstream's surrounding menu changes. Rebrand any new "OpenCode" label/aria-label. |
+| Hardcoded product-string rebrand in TUI + web app: `packages/tui/src/app.tsx`, `packages/tui/src/routes/session/permission.tsx`, `packages/tui/src/attention.ts`, `packages/app/src/wsl/settings-model.ts` (+ `.test.ts`), `packages/app/src/components/help-button.tsx`, `packages/ui/src/components/favicon.tsx` | User-visible "OpenCode" strings outside the i18n dicts → fork brand: update-complete toast "Successfully updated to OpenCode v…" → "CoDev Code"; permission dialog "…until OpenCode is restarted" → "CoDev Code" (the sibling patterns line was already rebranded); OS-notification fallback title `opencode` → `codev` and built-in sound-pack display name "OpenCode Default" → "CoDev Code Default" (pack id `opencode.default` stays — internal identifier); WSL settings actions "Install/Update OpenCode" → "…CoDev Code" (+ test expectations/titles; fixture paths `/usr/local/bin/opencode` stay); help-button `aria-label` → "Open the CoDev Code website" (href `opencode.ai` stays); PWA `apple-mobile-web-app-title` "OpenCode" → "CoDev Code" (matches the rebranded `site.webmanifest`, favicon-assets row) | These render in surfaces the fork ships (TUI + embedded web UI); the i18n-dict strings remain a known gap (UI branding bullet below). | Keep our strings; take upstream's surrounding changes. Rebrand any new hardcoded user-visible "OpenCode" string in these surfaces; leave identifiers, URLs, and fixture paths. |
| `packages/desktop/src/main/index.ts`, `packages/desktop/src/main/windows.ts` | APP_NAMES + window title → "CoDev Code" (Dev/Beta variants too) | Desktop app display name. | Keep our names. |
| `packages/desktop/electron-builder.config.ts` | `productName` ×3 → "CoDev Code…"; artifactName → `codev-code-desktop-…`; protocol display name | Installer/product branding. appId (`ai.opencode.desktop`) and the `opencode://` deep-link scheme stay upstream — identity plumbing wired into main/index.ts and app deep-links; do not rename casually. | Keep our names; take upstream's other config. |
| `packages/ui/src/assets/favicon/` (favicon-v3.svg, site.webmanifest, favicon-96x96-v3.png, apple-touch-icon-v3.png, web-app-manifest-192/512.png) | New codev mark: blocky "C" in #00cdcd on dark; manifest name "CoDev Code"/"codev" | Web/desktop favicon + PWA branding (served via packages/app/public symlinks). | Keep our assets (binary: take ours wholesale). |
@@ -143,13 +144,18 @@ from the squash message first, or use a plain merge.
## Known rebrand gaps
-- **UI branding**: TUI banner, default-theme accent, desktop/web app names, and favicon/PWA
- assets are rebranded (see table). Still upstream-branded, deliberately: in-app i18n strings
- mentioning "OpenCode" (now only in the `en`/`es` locale files — see the locale-trim rows above;
- revisit with a runtime display-name shim if it matters), `favicon-v3.ico` + `social-share.png` (binary
- formats we can't author well — need design assets), desktop app ICONS (resources/icons —
- need design assets), and the `ai.opencode.desktop` appId / `opencode://` scheme (identity
- plumbing wired into deep-link handling).
+- **UI branding**: TUI banner, default-theme accent, desktop/web app names, favicon/PWA
+ assets, and the hardcoded TUI/web-app product strings are rebranded (see table). Still
+ upstream-branded, deliberately: in-app i18n strings mentioning "OpenCode" in the `en`/`es`
+ locale files (see the locale-trim rows above; revisit with a runtime display-name shim if
+ it matters), desktop-only hardcoded strings (`packages/desktop` renderer `` and the
+ crash dialogs in `main/windows.ts` — the fork doesn't ship the desktop app; revisit before
+ shipping it), `favicon-v3.ico` + `social-share.png` (binary formats we can't author well —
+ need design assets; note the docs site serves the upstream-branded `social-share.png` as its
+ `og:image`), desktop app icons (tracked sources in `packages/desktop/icons/{dev,beta,prod}/`,
+ copied to the gitignored `resources/icons` at build — need design assets), and the
+ `ai.opencode.desktop` appId / `opencode://` scheme (identity plumbing wired into
+ deep-link handling).
- **Internal names**: `@opencode-ai/*` package names and file names
inside `~/.local/share/codev` (e.g. `opencode-local.db`) keep upstream naming on purpose.
Renaming them would be a permanent merge-conflict machine for names users never see.
diff --git a/packages/app/src/components/help-button.tsx b/packages/app/src/components/help-button.tsx
index ce5b2c7d39..1edf1331e3 100644
--- a/packages/app/src/components/help-button.tsx
+++ b/packages/app/src/components/help-button.tsx
@@ -31,7 +31,7 @@ export function HelpButton() {
return (
}
- aria-label="OpenCode menu"
+ aria-label="CoDev Code menu"
onPointerDown={rememberFocus}
onKeyDown={rememberFocus}
/>
@@ -69,7 +69,7 @@ export function WindowsAppMenu(props: {
icon="menu"
variant="ghost"
class="titlebar-icon rounded-md shrink-0"
- aria-label="OpenCode menu"
+ aria-label="CoDev Code menu"
onPointerDown={rememberFocus}
onKeyDown={rememberFocus}
/>
diff --git a/packages/app/src/desktop-menu.ts b/packages/app/src/desktop-menu.ts
index b96fe57e0d..183285d46c 100644
--- a/packages/app/src/desktop-menu.ts
+++ b/packages/app/src/desktop-menu.ts
@@ -200,7 +200,7 @@ export const DESKTOP_MENU: DesktopMenu[] = [
id: "help",
label: "Help",
items: [
- { type: "item", label: "OpenCode Documentation", href: "https://opencode.ai/docs" },
+ { type: "item", label: "CoDev Code Documentation", href: "https://opencode.ai/docs" },
{ type: "item", label: "Support Forum", href: "https://discord.com/invite/opencode" },
{ type: "item", label: "Export Logs...", command: "logs.export" },
{ type: "separator" },
diff --git a/packages/app/src/wsl/settings-model.test.ts b/packages/app/src/wsl/settings-model.test.ts
index 812852ff10..99d3e522cc 100644
--- a/packages/app/src/wsl/settings-model.test.ts
+++ b/packages/app/src/wsl/settings-model.test.ts
@@ -37,7 +37,7 @@ describe("WSL server settings presentation", () => {
expect(wslRuntimeRetryable({ kind: "stopped" })).toBe(true)
})
- test("offers install and update only when OpenCode needs attention", () => {
+ test("offers install and update only when CoDev Code needs attention", () => {
expect(wslOpencodeAction(undefined)).toBeUndefined()
expect(
wslOpencodeAction({
@@ -48,7 +48,7 @@ describe("WSL server settings presentation", () => {
matchesDesktop: null,
error: null,
}),
- ).toBe("Install OpenCode")
+ ).toBe("Install CoDev Code")
expect(
wslOpencodeAction({
distro: "Debian",
@@ -58,7 +58,7 @@ describe("WSL server settings presentation", () => {
matchesDesktop: false,
error: null,
}),
- ).toBe("Update OpenCode")
+ ).toBe("Update CoDev Code")
expect(
wslOpencodeAction({
distro: "Debian",
@@ -179,7 +179,7 @@ describe("WSL server settings presentation", () => {
expect(model.busy).toBe(true)
})
- test("does not report ready when OpenCode is present but cannot run", () => {
+ test("does not report ready when CoDev Code is present but cannot run", () => {
const model = addServerViewModel({
state: {
...readyWslState,
diff --git a/packages/app/src/wsl/settings-model.ts b/packages/app/src/wsl/settings-model.ts
index 8a172e0574..f79ab2b8de 100644
--- a/packages/app/src/wsl/settings-model.ts
+++ b/packages/app/src/wsl/settings-model.ts
@@ -53,8 +53,8 @@ export const wslRuntimeRetryable = (runtime: WslServerRuntime) =>
export function wslOpencodeAction(check?: WslOpencodeCheck) {
if (!check) return
- if (!check.resolvedPath) return "Install OpenCode"
- if (check.matchesDesktop === false) return "Update OpenCode"
+ if (!check.resolvedPath) return "Install CoDev Code"
+ if (check.matchesDesktop === false) return "Update CoDev Code"
}
export function wslDistroReady(state: WslServersState | undefined, name: string) {
diff --git a/packages/tui/src/app.tsx b/packages/tui/src/app.tsx
index 78ea76e0f9..9c2a8ef2cc 100644
--- a/packages/tui/src/app.tsx
+++ b/packages/tui/src/app.tsx
@@ -1164,7 +1164,7 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi
await DialogAlert.show(
dialog,
"Update Complete",
- `Successfully updated to OpenCode v${result.data.version}. Please restart the application.`,
+ `Successfully updated to CoDev Code v${result.data.version}. Please restart the application.`,
)
void exit()
diff --git a/packages/tui/src/attention.ts b/packages/tui/src/attention.ts
index b309edcd9d..0d85b40af8 100644
--- a/packages/tui/src/attention.ts
+++ b/packages/tui/src/attention.ts
@@ -38,14 +38,14 @@ type TuiAttentionHost = TuiAttention & {
dispose(): void
}
-const DEFAULT_TITLE = "opencode"
+const DEFAULT_TITLE = "codev"
const DEFAULT_PACK_ID = "opencode.default"
const KV_SOUND_PACK = "attention_sound_pack"
const TITLE_LIMIT = 80
const MESSAGE_LIMIT = 240
const BUILTIN_PACK: RegisteredSoundPack = {
id: DEFAULT_PACK_ID,
- name: "OpenCode Default",
+ name: "CoDev Code Default",
builtin: true,
sounds: {
default: defaultSoundPath,
diff --git a/packages/tui/src/routes/session/permission.tsx b/packages/tui/src/routes/session/permission.tsx
index 926dcdb2d6..70b4defaa4 100644
--- a/packages/tui/src/routes/session/permission.tsx
+++ b/packages/tui/src/routes/session/permission.tsx
@@ -141,7 +141,7 @@ export function PermissionPrompt(props: { request: PermissionRequest; directory?
body={
-
+
diff --git a/packages/ui/src/components/favicon.tsx b/packages/ui/src/components/favicon.tsx
index 94cc82489f..46cfdf3c6c 100644
--- a/packages/ui/src/components/favicon.tsx
+++ b/packages/ui/src/components/favicon.tsx
@@ -7,7 +7,7 @@ export const Favicon = () => {
-
+
>
)
}