Skip to content

Commit a3c6ccb

Browse files
authored
Merge pull request #265 from OpenKnots/okcode/ok-code-brand-refresh
Centralize OK Code brand constants and unify identity
2 parents 5be6565 + 7a7c581 commit a3c6ccb

File tree

14 files changed

+59
-41
lines changed

14 files changed

+59
-41
lines changed

BRANDING.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
| **Stage Label** | Dev (development only) |
1414
| **Display Name** | OK Code |
1515
| **Version** | 0.0.1 |
16-
| **Tagline** | `[TBD]` |
17-
| **One-liner Description** | `[TBD]` |
16+
| **Tagline** | A Minimal Web GUI for Coding Agents |
17+
| **One-liner Description** | Chat with Codex and Claude in a modern web UI. Git worktree isolation, diff review, integrated terminal, and more. |
1818
| **Parent Organization** | OpenKnots |
19-
| **Website URL** | `[TBD]` |
19+
| **Website URL** | `[TBD]` |
2020
| **Repository** | `OpenKnots/okcode` |
2121

2222
### Brand Voice & Tone
@@ -27,8 +27,8 @@
2727
| **Tone** | Confident but not arrogant; technical but accessible |
2828
| **Copy Style** | Action-oriented imperatives ("New Thread", "Terminal", "Settings"); no unnecessary filler words |
2929
| **Audience** | Software engineers and technical users |
30-
| **Emoji Usage** | `[TBD — currently none in the UI]` |
31-
| **Error/Empty States Voice** | `[TBD]` |
30+
| **Emoji Usage** | None in UI copy; reserved for user-generated content only |
31+
| **Error/Empty States Voice** | Concise and helpful; state what happened and what to do next, no blame or humor |
3232

3333
---
3434

@@ -256,7 +256,7 @@ A subtle **fractal noise SVG overlay** is applied to `body::after` at **3.5% opa
256256
| Disabled opacity | `opacity-64` |
257257
| Disabled interaction | `pointer-events: none` |
258258
| Placeholder text | `muted-foreground/72` (72% opacity) |
259-
| Contrast standard | `[TBD — WCAG level target]` |
259+
| Contrast standard | WCAG 2.1 AA minimum |
260260

261261
---
262262

@@ -321,7 +321,7 @@ The app includes bespoke SVG icons for:
321321

322322
| Property | Value |
323323
| -------------------------------- | ------- |
324-
| `prefers-reduced-motion` support | `[TBD]` |
324+
| `prefers-reduced-motion` support | Respect; disable non-essential animations when set |
325325
| Global animation toggle | `[TBD]` |
326326

327327
---
@@ -385,19 +385,19 @@ Built with:
385385

386386
The following need to be provided/decided:
387387

388-
- [ ] **Tagline** — short memorable phrase
389-
- [ ] **One-liner description** — for app stores, meta tags, social cards
388+
- [x] **Tagline** — "A Minimal Web GUI for Coding Agents"
389+
- [x] **One-liner description** — see Brand Identity table above
390+
- [x] **WCAG contrast target** — AA minimum
391+
- [x] **Reduced motion support** — respect `prefers-reduced-motion`
392+
- [x] **Emoji policy** — none in UI copy
393+
- [x] **Error/empty state voice** — concise and helpful
390394
- [ ] **Logo mark description** — what does the mark depict?
391395
- [ ] **Logo usage guidelines** — minimum size, clear space, do's and don'ts
392396
- [ ] **Heading type scale** — H1–H6 sizes and weights
393-
- [ ] **WCAG contrast target** — AA or AAA?
394-
- [ ] **Reduced motion support** — respect `prefers-reduced-motion`?
395397
- [ ] **Website URL**
396398
- [ ] **Social media handles / links**
397399
- [ ] **App store descriptions**
398400
- [ ] **Open Graph / social card image**
399401
- [ ] **Brand color as hex** — the primary `oklch(0.488 0.217 264)` converts to approximately **#2b4acb** (a deep blue-violet); confirm this is the intended brand hex
400402
- [ ] **Secondary brand color** — is there a distinct secondary brand color beyond the neutral system?
401-
- [ ] **Emoji policy** — use in UI copy, notifications, etc.?
402-
- [ ] **Error/empty state voice** — tone for error messages, empty states, onboarding
403403
- [ ] **Icon stroke width** — confirm Lucide default (2) or custom

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2026 OpenKnot
3+
Copyright (c) 2026 OpenKnots
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

apps/desktop/scripts/electron-launcher.mjs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ import { dirname, join, resolve } from "node:path";
1717
import { fileURLToPath } from "node:url";
1818

1919
const isDevelopment = Boolean(process.env.VITE_DEV_SERVER_URL);
20-
const APP_DISPLAY_NAME = isDevelopment ? "OK Code (Dev)" : "OK Code";
21-
const APP_BUNDLE_ID = "com.okcode.okcode";
20+
// Keep in sync with APP_BASE_NAME from @okcode/shared/brand
21+
const APP_BASE_NAME = "OK Code";
22+
const APP_DISPLAY_NAME = isDevelopment ? `${APP_BASE_NAME} (Dev)` : APP_BASE_NAME;
23+
const APP_BUNDLE_ID = "com.openknots.okcode";
2224
const LAUNCHER_VERSION = 1;
2325

2426
const __dirname = dirname(fileURLToPath(import.meta.url));

apps/desktop/src/main.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import type {
2626
PreviewTabsState,
2727
} from "@okcode/contracts";
2828
import { autoUpdater } from "electron-updater";
29+
import { APP_BASE_NAME } from "@okcode/shared/brand";
2930

3031
import type { ContextMenuItem } from "@okcode/contracts";
3132
import { NetService } from "@okcode/shared/Net";
@@ -79,8 +80,8 @@ const STATE_DIR = Path.join(BASE_DIR, "userdata");
7980
const DESKTOP_SCHEME = "okcode";
8081
const ROOT_DIR = Path.resolve(__dirname, "../../..");
8182
const isDevelopment = Boolean(process.env.VITE_DEV_SERVER_URL);
82-
const APP_DISPLAY_NAME = isDevelopment ? "OK Code (Dev)" : "OK Code";
83-
const APP_USER_MODEL_ID = "com.okcode.okcode";
83+
const APP_DISPLAY_NAME = isDevelopment ? `${APP_BASE_NAME} (Dev)` : APP_BASE_NAME;
84+
const APP_USER_MODEL_ID = "com.openknots.okcode";
8485
const USER_DATA_DIR_NAME = isDevelopment ? "okcode-dev" : "okcode";
8586
const LEGACY_USER_DATA_DIR_NAME = isDevelopment ? "T3 Code (Dev)" : "T3 Code (Alpha)";
8687
const COMMIT_HASH_PATTERN = /^[0-9a-f]{7,40}$/i;

apps/marketing/components/workflows-section.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ function ApiMockup() {
203203
return (
204204
<div className="flex items-center justify-center h-full">
205205
<div className="bg-secondary/50 rounded-lg px-4 py-2 border border-border/50">
206-
<span className="text-xs font-mono text-muted-foreground">OK CODE API</span>
206+
<span className="text-xs font-mono text-muted-foreground">OK Code API</span>
207207
</div>
208208
</div>
209209
);

apps/server/src/checkpointing/Layers/CheckpointStore.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { GitCommandError } from "../../git/Errors.ts";
1818
import { GitCore } from "../../git/Services/GitCore.ts";
1919
import { CheckpointStore, type CheckpointStoreShape } from "../Services/CheckpointStore.ts";
2020
import { CheckpointRef } from "@okcode/contracts";
21+
import { GIT_IDENTITY_NAME } from "@okcode/shared/brand";
2122

2223
const makeCheckpointStore = Effect.gen(function* () {
2324
const fs = yield* FileSystem.FileSystem;
@@ -98,9 +99,9 @@ const makeCheckpointStore = Effect.gen(function* () {
9899
const commitEnv: NodeJS.ProcessEnv = {
99100
...process.env,
100101
GIT_INDEX_FILE: tempIndexPath,
101-
GIT_AUTHOR_NAME: "OK Code",
102+
GIT_AUTHOR_NAME: GIT_IDENTITY_NAME,
102103
GIT_AUTHOR_EMAIL: "okcode@users.noreply.github.com",
103-
GIT_COMMITTER_NAME: "OK Code",
104+
GIT_COMMITTER_NAME: GIT_IDENTITY_NAME,
104105
GIT_COMMITTER_EMAIL: "okcode@users.noreply.github.com",
105106
};
106107

apps/server/src/provider/codexCliVersion.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { APP_BASE_NAME } from "@okcode/shared/brand";
2+
13
const CODEX_VERSION_PATTERN = /\bv?(\d+\.\d+(?:\.\d+)?(?:-[0-9A-Za-z.-]+)?)\b/;
24

35
export const MINIMUM_CODEX_CLI_VERSION = "0.37.0";
@@ -137,5 +139,5 @@ export function isCodexCliVersionSupported(version: string): boolean {
137139

138140
export function formatCodexCliUpgradeMessage(version: string | null): string {
139141
const versionLabel = version ? `v${version}` : "the installed version";
140-
return `Codex CLI ${versionLabel} is too old for OK Code. Upgrade to v${MINIMUM_CODEX_CLI_VERSION} or newer and restart OK Code.`;
142+
return `Codex CLI ${versionLabel} is too old for ${APP_BASE_NAME}. Upgrade to v${MINIMUM_CODEX_CLI_VERSION} or newer and restart ${APP_BASE_NAME}.`;
141143
}

apps/web/src/branding.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
export const APP_BASE_NAME = "OK Code";
1+
export { APP_BASE_NAME } from "@okcode/shared/brand";
2+
23
export const APP_STAGE_LABEL = import.meta.env.DEV ? "Dev" : "";
34
export const APP_DISPLAY_NAME = APP_STAGE_LABEL
45
? `${APP_BASE_NAME} (${APP_STAGE_LABEL})`

apps/web/src/components/ChatHomeEmptyState.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
import { useCallback, useMemo, useState } from "react";
1616

1717
import { useAppSettings } from "../appSettings";
18-
import { APP_DISPLAY_NAME } from "../branding";
18+
import { APP_BASE_NAME, APP_DISPLAY_NAME } from "../branding";
1919
import { isElectron } from "../env";
2020
import { useHandleNewThread } from "../hooks/useHandleNewThread";
2121
import { serverConfigQueryOptions } from "../lib/serverReactQuery";
@@ -363,7 +363,7 @@ export function ChatHomeEmptyState() {
363363
Launch a premium coding workspace with reliable agent sessions built in.
364364
</h1>
365365
<p className="mt-5 max-w-2xl text-sm leading-7 text-muted-foreground sm:text-base">
366-
OK Code keeps threads tied to real repositories, preserves provider state,
366+
{APP_BASE_NAME} keeps threads tied to real repositories, preserves provider state,
367367
and gives your desktop a calmer control surface for deep, multi-session
368368
work.
369369
</p>

apps/web/src/components/Sidebar.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ import {
5050
useAppSettings,
5151
} from "../appSettings";
5252
import { isElectron } from "../env";
53-
import { APP_VERSION } from "../branding";
53+
import { APP_BASE_NAME, APP_VERSION } from "../branding";
5454
import { cn, isLinuxPlatform, isMacPlatform, newCommandId, newProjectId } from "../lib/utils";
5555
import { useStore } from "../store";
5656
import { shortcutLabelForCommand } from "../keybindings";
@@ -1805,8 +1805,8 @@ export default function Sidebar() {
18051805
render={
18061806
<div className="wordmark-stitch flex min-w-0 flex-1 items-center justify-center gap-1.5 cursor-pointer mx-auto px-3 py-1.5 rounded-lg">
18071807
<OkCodeMark className="size-6 text-foreground drop-shadow-[0_1px_0_rgba(255,255,255,0.15)]" />
1808-
<span className="truncate text-base font-semibold tracking-wide text-foreground uppercase drop-shadow-[0_1px_0_rgba(255,255,255,0.15)]">
1809-
OK Code
1808+
<span className="truncate text-base font-semibold tracking-wide text-foreground drop-shadow-[0_1px_0_rgba(255,255,255,0.15)]">
1809+
{APP_BASE_NAME}
18101810
</span>
18111811
</div>
18121812
}
@@ -1860,7 +1860,7 @@ export default function Sidebar() {
18601860
onClick={() => {
18611861
toastManager.add({
18621862
type: "info",
1863-
title: `OK Code ${serverUpdateInfo.latestVersion} available`,
1863+
title: `${APP_BASE_NAME} ${serverUpdateInfo.latestVersion} available`,
18641864
description: `Update with: npm install -g okcodes@latest`,
18651865
});
18661866
}}

0 commit comments

Comments
 (0)