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/build.mjs; 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.

AssetFile
Logo (mark + wordmark), dark / light / monobrand/svg/logo-{dark,light,mono-black,mono-white}.svg, brand/png/logo-{dark,light}.png
Markbrand/svg/mark-{dark,light,mono-black,mono-white}.svg
Small mark (3 prompts, for 32px and below)brand/svg/mark-small-{dark,light}.svg
Wordmarkbrand/svg/wordmark-{dark,light,mono-black,mono-white}.svg
App iconbrand/svg/app-icon.svg, brand/favicon/icon-{192,512}.png, icon-maskable-512.png
Faviconsbrand/favicon/favicon.svg (adapts to light/dark tabs), favicon.ico (16/32/48), favicon-{16,32,48}.png, apple-touch-icon.png, site.webmanifest
Tray / menu bar (monochrome)brand/svg/tray-{white,black}.svg, brand/png/tray-{white,black}-{16,32}.png
Notification iconbrand/png/notification-256.png
Social / Open Graph (1200×630)brand/og/og.png, brand/og/og.svg

"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:

UseUnicodeASCII 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.40). NID_ASCII=1 forces ASCII; NO_COLOR removes colour but keeps the glyphs; NID_REDUCED_MOTION=1 (and CI) replaces spinners with a static ›. Terminal code takes these from packages/*/src/brand.ts.

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.

TokenHexUse
ink#0E1013Dark background, text on light
paper#F7F5F0Light background, text on dark
amber ("mound amber")#F2A93BKeystone, primary buttons, focus, accents on dark
amberOnPaper#B8740FKeystone on light backgrounds (graphics only)
amberDeep#9A5F00Amber 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.

TokenDarkLightUse
bg#0E1013#F7F5F0Page
surface#15181D#FFFFFFCards, panels
surface2#1C2026#EFECE5Hover, inset, code
border#2A2F37#DDD8CEHairlines
borderStrong#3A414B#C4BDB0Inputs, separators that must be seen
fg#F7F5F0#0E1013Text
muted#9CA2AB#5B6068Secondary text
accent#F2A93B#F2A93BPrimary button fill, selection
accentFg#0E1013#0E1013Text on accent
accentText#F2A93B#9A5F00Links, accent text
accentSoft#2A2112#FBEBD0Accent tint backgrounds
ok / okSoft#4CC38A / #10261C#1D7348 / #DCF0E3Success, merged, approved
warn / warnSoft#E8C547 / #2A2410#7D5A00 / #F7EBC4Needs attention, budget, stalls
danger / dangerSoft#FF7A6E / #2E1513#B8322A / #FADFDBFailures, destructive actions
focus#F2A93B#9A5F00Focus 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/build.mjs, which fails if a pair drops below its requirement. Text needs 4.5:1 (AA); focus rings and graphics need 3:1.

PairDarkLightNeeds
fg on bg17.4917.494.5
fg on surface16.3319.054.5
muted on bg7.415.814.5
muted on surface6.926.334.5
muted on surface26.365.364.5
accentText on bg9.544.814.5
accentText on surface8.915.244.5
accentFg on accent9.549.544.5
ok on bg / surface / okSoft8.60 / 8.03 / 7.205.36 / 5.84 / 4.904.5
warn on bg / surface / warnSoft11.35 / 10.60 / 9.215.78 / 6.30 / 5.294.5
danger on bg / surface / dangerSoft7.50 / 7.00 / 6.705.46 / 5.95 / 4.724.5
focus on bg / surface9.54 / 8.914.81 / 5.243
keystone on its backgroundamber on ink 9.54amberOnPaper on paper 3.483

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):

ToneTruecolor25616
accent#F2A93B214yellow
ok#4CC38A78green
warn#E8C547221yellow
danger#FF7A6E210red
muted#9CA2AB248bright black
info#8FB8DE110cyan

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#

SurfaceSansMono
nid.dev (web)Outfit (OFL, self-hosted woff2)JetBrains Mono (OFL, self-hosted)
Dashboardsystem stack: system-ui, -apple-system, "Segoe UI", Roboto, …ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas, monospace
Terminal app, CLIthe user's terminal fontthe 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#

  1. Lead with the fact. "3 agents finished. 1 is waiting for approval." Not "Great news!".
  2. Say the next step, as a command the user can copy: Next: nid land rebrand.
  3. Numbers over adjectives. "Merged 14 files (+420 −38)", not "a big change".
  4. Name things the way the CLI does: group, agent, lead, worker, board, task, worktree, land.
  5. Errors explain and recover: what failed, the likely cause, the fix. No blame, no "Oops".
  6. 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.
  7. No hype words: revolutionary, blazing, magic, supercharge, unleash, effortless, 10x, AI-powered. No exclamation marks except in literal output. No emoji in product UI.
  8. Lowercase product name always; agent names as their makers write them (Claude Code, Codex, opencode, Kimi Code).
  9. 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 ofWrite
"🎉 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 \"fix the flaky test\"."
"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.