Documentation menu
nid brand
How nid looks, sounds and behaves on every surface: the CLI, the terminal app, the dashboard, notifications, installers, docs and nid.dev. If a surface disagrees with this page, the surface is wrong.
Everything here is generated from undefined by
node brand/; the assets live in undefined.
Story#
A termite mound is built by thousands of small workers. None of them holds the plan; the structure comes out of each one doing its piece and leaving signals for the others. nid does the same with coding agents: Claude Code, Codex, opencode, Kimi and your own agents each work in their own worktree, coordinate through one board, and build one codebase.
nid is the nest. Nid is French for nest, and the nest is what the colony builds: the
one structure that comes out of all that small, separate work. It is also a short form of
terminid (terminal + termite, from termitid, the termite family), the name it had
before, cut down to three letters you can type between two commands. It is always written in
lowercase: nid, even at the start of a sentence.
The names so far: pawmux (up to 0.1.0-alpha.9), terminid (alpha.10 to alpha.12), nid since. The old names stay only where an upgrade needs them: shims, fallbacks and the upgrade notes.
Made by Cats with Keyboards.
The mark: the pile#
Six terminal prompts (›) piled 1-2-3 into a mound. The top one, the keystone, is amber:
it is the lead, and the point the swarm converges on. The rest are ink on light backgrounds and
paper on dark ones.
| Asset | File |
|---|---|
| Logo (mark + wordmark), dark / light / mono | brand/, brand/ |
| Mark | brand/ |
| Small mark (3 prompts, for 32px and below) | brand/ |
| Wordmark | brand/ |
| App icon | brand/, brand/, icon-maskable-512 |
| Favicons | brand/ (adapts to light/dark tabs), favicon.ico (16/32/48), favicon-{16,32,48}.png, apple-touch-icon, site |
| Tray / menu bar (monochrome) | brand/, brand/ |
| Notification icon | brand/ |
| Social / Open Graph (1200×630) | brand/, brand/ |
"dark" means for dark backgrounds (paper prompts), "light" means for light backgrounds (ink
prompts with the deeper amberOnPaper keystone, so it keeps 3:1 contrast on paper).
Sizes#
- Full mark (6 prompts): 24px and up.
- Small mark (keystone + 2): 32px and below, favicons, tray icons. Between 24 and 32px either works; prefer the small mark when the background is busy.
- Logo lockup: 96px wide minimum. Below that, use the mark alone.
- Wordmark alone: 64px wide minimum; it is for places where the mark already appears nearby.
Clear space#
Keep clear space around the mark and the logo equal to the height of one prompt row (a quarter of the mark's height) on every side. Nothing else (text, edges, other logos) enters it.
Text form (terminals)#
Where pixels are not available, the mark is text:
| Use | Unicode | ASCII fallback |
|---|---|---|
| Header mark | ››› (keystone › in amber, the rest in the default foreground) | >>> |
| Working / lead glyph | › amber | > |
| Working spinner (3 cells) | › ›› ››› ›› › | same with > |
The header reads ››› nid followed by dim context (· group · 4 agents · $12).
NID_ASCII=1 forces ASCII; NO_COLOR removes colour but keeps the glyphs;
NID (and CI) replaces spinners with a static ›.
Terminal code takes these from packages/.
Do / don't#
Do:
- Use the supplied files; scale them proportionally.
- Use the dark logo on ink or other dark surfaces, the light logo on paper or white.
- Use the mono logo when you only have one colour (print, embossing, tray icons).
- Put the app icon on its own ink tile when the background is unknown.
Don't:
- Recolour the prompts, swap which prompt is amber, or make all six amber.
- Add gradients, outlines, drop shadows, glows or 3D.
- Rotate the mark, flip it, or rearrange the pile into another shape.
- Retype the wordmark in a font. It is drawn; the files are the only source.
- Capitalise it (
Nid,NID) or add a trademark-style suffix in running text. - Place the amber keystone on amber, terracotta or blue backgrounds.
- Use the old pawmux paw or the terminid wordmark anywhere except the upgrade notes.
Colour#
Dark-first. Ink and paper do most of the work; amber is the only brand colour and is used sparingly: the keystone, the primary action, focus rings, the current selection. It is not a status colour.
| Token | Hex | Use |
|---|---|---|
ink | #0E1013 | Dark background, text on light |
paper | #F7F5F0 | Light background, text on dark |
amber ("mound amber") | #F2A93B | Keystone, primary buttons, focus, accents on dark |
amberOnPaper | #B8740F | Keystone on light backgrounds (graphics only) |
amberDeep | #9A5F00 | Amber text and links on light backgrounds |
Amber sits clear of the neighbours we don't want to be mistaken for: it is yellower and lighter
than Claude's terracotta (#D97757) and nowhere near GitHub's blue.
Semantic tokens#
The dashboard, site and any web surface use these through undefined
(CSS custom properties with the names below in kebab-case: --surface-2, --accent-fg...).
Dark is the default; light applies with prefers-color-scheme: light or data-theme="light" on
<html>, and data-theme="dark" forces dark.
| Token | Dark | Light | Use |
|---|---|---|---|
bg | #0E1013 | #F7F5F0 | Page |
surface | #15181D | #FFFFFF | Cards, panels |
surface2 | #1C2026 | #EFECE5 | Hover, inset, code |
border | #2A2F37 | #DDD8CE | Hairlines |
borderStrong | #3A414B | #C4BDB0 | Inputs, separators that must be seen |
fg | #F7F5F0 | #0E1013 | Text |
muted | #9CA2AB | #5B6068 | Secondary text |
accent | #F2A93B | #F2A93B | Primary button fill, selection |
accentFg | #0E1013 | #0E1013 | Text on accent |
accentText | #F2A93B | #9A5F00 | Links, accent text |
accentSoft | #2A2112 | #FBEBD0 | Accent tint backgrounds |
ok / okSoft | #4CC38A / #10261C | #1D7348 / #DCF0E3 | Success, merged, approved |
warn / warnSoft | #E8C547 / #2A2410 | #7D5A00 / #F7EBC4 | Needs attention, budget, stalls |
danger / dangerSoft | #FF7A6E / #2E1513 | #B8322A / #FADFDB | Failures, destructive actions |
focus | #F2A93B | #9A5F00 | Focus rings (2px, offset 2px) |
Status always pairs colour with a glyph or word (✓ merged, ! stalled, ✗ failed); colour is
never the only signal.
Contrast (WCAG 2.x)#
Generated by brand/, which fails if a pair drops below its requirement. Text needs
4.5:1 (AA); focus rings and graphics need 3:1.
| Pair | Dark | Light | Needs |
|---|---|---|---|
fg on bg | 17.49 | 17.49 | 4.5 |
fg on surface | 16.33 | 19.05 | 4.5 |
muted on bg | 7.41 | 5.81 | 4.5 |
muted on surface | 6.92 | 6.33 | 4.5 |
muted on surface2 | 6.36 | 5.36 | 4.5 |
accentText on bg | 9.54 | 4.81 | 4.5 |
accentText on surface | 8.91 | 5.24 | 4.5 |
accentFg on accent | 9.54 | 9.54 | 4.5 |
ok on bg / surface / okSoft | 8.60 / 8.03 / 7.20 | 5.36 / 5.84 / 4.90 | 4.5 |
warn on bg / surface / warnSoft | 11.35 / 10.60 / 9.21 | 5.78 / 6.30 / 5.29 | 4.5 |
danger on bg / surface / dangerSoft | 7.50 / 7.00 / 6.70 | 5.46 / 5.95 / 4.72 | 4.5 |
focus on bg / surface | 9.54 / 8.91 | 4.81 / 5.24 | 3 |
| keystone on its background | amber on ink 9.54 | amberOnPaper on paper 3.48 | 3 |
In terminals#
Terminals pick their own background, so the CLI and terminal app use the semantic tones only,
tuned for dark terminals and downsampled by depth (brand.ts):
| Tone | Truecolor | 256 | 16 |
|---|---|---|---|
| accent | #F2A93B | 214 | yellow |
| ok | #4CC38A | 78 | green |
| warn | #E8C547 | 221 | yellow |
| danger | #FF7A6E | 210 | red |
| muted | #9CA2AB | 248 | bright black |
| info | #8FB8DE | 110 | cyan |
Rules: default foreground for content; amber for the mark, the lead, the current selection and
the key the user should press next; dim/muted for metadata. Never set a background colour on
whole lines. Respect NO_COLOR, FORCE_COLOR, NID_ASCII.
Type#
| Surface | Sans | Mono |
|---|---|---|
| nid.dev (web) | Outfit (OFL, self-hosted woff2) | JetBrains Mono (OFL, self-hosted) |
| Dashboard | system stack: system-ui, -apple-system, "Segoe UI", Roboto, … | ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas, monospace |
| Terminal app, CLI | the user's terminal font | the user's terminal font |
The dashboard and terminal app work offline and never download fonts. The website self-hosts its fonts (no font CDNs). The wordmark is drawn, not typeset, so it does not depend on either.
Weights: 400 for text, 500 for UI labels and headings, 600 only for the single most important number on a screen. Sentence case for headings, buttons and menu items.
Voice#
nid sounds like a good senior engineer at the next desk: precise, calm, a little wry. It says what happened, what it means, and what to do next. It never hypes.
Rules#
- Lead with the fact. "3 agents finished. 1 is waiting for approval." Not "Great news!".
- Say the next step, as a command the user can copy:
Next: nid land rebrand. - Numbers over adjectives. "Merged 14 files (+420 −38)", not "a big change".
- Name things the way the CLI does: group, agent, lead, worker, board, task, worktree, land.
- Errors explain and recover: what failed, the likely cause, the fix. No blame, no "Oops".
- One joke per screen at most, and only where nothing is going wrong. Empty states and first-run screens may be wry; errors, approvals and anything about money may not.
- No hype words: revolutionary, blazing, magic, supercharge, unleash, effortless, 10x, AI-powered. No exclamation marks except in literal output. No emoji in product UI.
- Lowercase product name always; agent names as their makers write them (Claude Code, Codex, opencode, Kimi Code).
- Short. Help lines fit in 80 columns. Notifications fit in two lines.
Taglines#
- Primary: One terminal. A swarm of agents.
- Short slots (badges, social bios): Command the swarm.
Examples#
| Instead of | Write |
|---|---|
| "🎉 Your team crushed it!" | "Done. 4 tasks, 23 files changed. Next: nid land or nid pr." |
| "Oops! Something went wrong." | "Couldn't start codex: codex is not on PATH. Install it or run nid doctor." |
| "Unleash the power of AI agents" | "Run Claude Code, Codex and opencode on one goal, each in its own worktree." |
| "No data available" | "No groups yet. The swarm is waiting for a goal: nid \." |
| "Are you sure?" | "Remove group rebrand? Its 3 worktrees are deleted; branches stay." |
| "Approval required!!!" | "codex wants to run pnpm install. Allow once / always / no." |
Surfaces checklist#
- Terminal app: header
››› nid · group · n agents · $cost; amber keystone as the working glyph; pile spinner; welcome screen with the mark and one sentence; approval prompts with amber key hints; DONE card with outcome numbers and land / PR / diff keys. - CLI: help grouped by task, examples in the voice above, status glyphs
✓ ! ✗ ·in ok/warn/danger/muted,Next:hints on stderr. - Dashboard: logo top-left, favicon set,
tokens.css, dark default with a light theme, amber focus rings, empty states that say what to do. - Notifications: title
nid · <group>, the app icon, one line of outcome. - Installers: one amber
›››line, then plain steps and the next command. No banners. - nid.dev: the logo, Outfit + JetBrains Mono, the same tokens, the OG image.
Rebuilding#
node brand/build.mjs # SVG, PNG, ICO, tokens.css, contrast report
node brand/build.mjs --no-png # without a browser
node brand/review/concepts.mjs # the concept sheets the mark was chosen from (brand/review/)
The concepts that were considered and why the pile won are in undefined and on the rebrand board.