Brand

Brand book · v0.1 · October 2026

Solid ground for the work

Cobalt is a hard metal and a blue that does not fade. Kobalt is the same for a business: a structure that holds, and a record that lasts. This page is both the rulebook and the library. Everything on it is built from the files in Files.

01 · Essence

Cobalt on porcelain

Kobalt is the durable, well-ordered system a small service company runs on, with AI agents that work inside it under rules everyone can see. One deep blue on calm surfaces, and an element tile that stands for “everything is an object”.

Promise

Your whole business in one model you can shape yourself, with agents you can trust because you can see and undo everything they do.

Purpose

Give small service companies the order and memory of a big company’s systems, without the cost, the consultants, or someone else’s way of working.

Belief

Software should bend to the business, and every action, by a person or an agent, should leave a clear trace.

Personality: the Craftsman, with a touch of the Guardian

TraitThisNot that
SolidReliable, steady, built to lastHeavy, slow, bureaucratic
ExactPrecise words, real numbers, clear structurePedantic, jargon-heavy
Open-handedShows its work: plans, history, reasonsSecretive, “trust us”
AdaptableShapes to the business; your copy is yoursShapeless, “anything goes”
CalmQuiet confidence, even when something failsFlat, robotic, indifferent

Voice: plain, exact, accountable

  1. Say what happens. Name the object, the action, the result. “Deal #42 moved to Won.”, not “Success!”
  2. Short and plain. One idea per sentence. Everyday words over technical ones.
  3. Show before doing. Anything that changes data, especially by an agent, is described first, then done.
  4. Own it. When we fail, say so, say what’s safe, say what to do next.
  5. No hype. Proof over adjectives. If we can’t show it, we don’t say it.
ContextSayNot
MarketingA deal is won. Kobalt opens the project, adds your standard tasks, and tells the account owner.Supercharge your pipeline with AI!
ErrorCouldn’t load deals. We’re retrying. Nothing you entered is lost.Oops! Something went wrong.
AdminAdded Renewal date to Deal.Schema updated successfully.
LimitsAgents paused: this month’s AI limit ($10) is used up. Raise the limit or wait until 1 Nov.You’ve hit your limit! Upgrade now!
DeleteDelete type Lead? 214 objects move to history. You can restore them for 30 days.Are you sure? This cannot be undone!

How agents talk

Agents are colleagues with a role, not personalities. They introduce themselves by role, plan before they act, report exactly with links, explain in one or two sentences, and say when they stop. They never pretend to be human, use exclamation marks, apologise at length, or act outside their role.

Onboarding agentAgent

I’ll create 6 tasks in Acme onboarding and assign 3 to Dana. Approve?

I stopped: I don’t have rights to edit invoices. Ask an admin to extend my role, or do this step yourself.

Words

We useWe avoid
object, type, attribute (app); record, field (marketing)entity, schema, metadata
agent, hire, role, limitsbot, AI magic, copilot, digital employee
approve, review, undo, history“trust us”, “fully autonomous”
change, set up, shapecustomize your journey, empower
simple, clear, in one placeseamless, revolutionary, unleash, supercharge
“you”, “your team”“users”, “end users”
fewer steps, nothing lost10x, effortless, frictionless

Messaging

Tagline

Run the whole business on solid ground.

Alternates: “One system. Every record. Nothing lost.” · “Shape it your way. Hire agents you can trust.”

In one sentence

Kobalt is one system for a service company’s clients, deals, projects and support that you shape yourself, with AI agents that do routine work under strict access control.

03 · Color

One blue, calm grounds

Kobalt Blue sits between historic cobalt pigment and a clear screen blue: deep and stable, not electric. Supporting colors come from the cobalt pigment family, so every hue has a reason.

Kobalt BluePrimary · actions, selection, the mark#1F47C9
Cobalt 900One deep band per page, logo on dark#0B1A4A
PorcelainMarketing and print ground#F7F5F0
Iron 950Dark theme ground#0E121B

How much of each (app screen)

Neutrals 85%10%

Neutrals first. Cobalt on actions, links, selection and focus. Semantic and agent colors only where a state exists, always with an icon or a word.

Two neutral families, never mixed on one surface

Iron

Cool, faint blue. Metal: the app’s working surfaces in both themes.

Porcelain

Warm off-white. Glaze: marketing, this book, print, empty-state drawings.

Scales

Cobalt

  • 50#f1f4feink text 15.9:1
  • 100#e8edfcink text 14.9:1
  • 200#c9d5faink text 11.9:1
  • 300#8fa8ffink text 7.6:1
  • 400#6486f0ink text 5.2:1
  • 500#3a63e0white text 5.2:1
  • 600#1f47c9white text 7.5:1
  • 700#1a3aa6white text 9.5:1
  • 800#122a76white text 13.0:1
  • 900#0b1a4awhite text 16.7:1
  • 950#051037white text 18.5:1

Iron

  • 50#f5f7faink text 16.2:1
  • 100#eceff4ink text 15.1:1
  • 200#dde2ebink text 13.4:1
  • 300#afb7c8ink text 8.7:1
  • 400#848da5ink text 5.3:1
  • 500#646e88white text 5.1:1
  • 600#566079white text 6.3:1
  • 700#3f485dwhite text 9.1:1
  • 800#2a3142white text 13.0:1
  • 850#1f2533white text 15.3:1
  • 900#161b26white text 17.2:1
  • 950#0e121bwhite text 18.7:1

Porcelain

  • 50#f7f5f0ink text 16.0:1
  • 100#efebe3ink text 14.7:1
  • 200#e2dcd0ink text 12.8:1
  • 300#b6b0a2ink text 8.1:1
  • 400#8c8576ink text 4.8:1
  • 500#6a6457white text 5.9:1
  • 600#575146white text 7.9:1
  • 700#423f3bwhite text 10.5:1
  • 800#2e2e30white text 13.6:1
  • 900#1b1e25white text 16.7:1
  • 950#12161fwhite text 18.1:1

Green

  • 50#f4f8f6ink text 16.3:1
  • 100#e3f4ecink text 15.3:1
  • 200#a0dec2ink text 11.4:1
  • 300#4fc79aink text 8.3:1
  • 400#41b38aink text 6.7:1
  • 500#339f7aink text 5.3:1
  • 600#248c6aink large 4.2:1
  • 700#13795bwhite text 5.4:1
  • 800#00573fwhite text 8.6:1
  • 900#003725white text 13.3:1
  • 950#002819white text 15.9:1

Aureolin

  • 50#f9f6f1ink text 16.2:1
  • 100#fbf0d9ink text 15.4:1
  • 200#f2d397ink text 12.1:1
  • 300#e8b54aink text 9.2:1
  • 400#d09d3aink text 7.1:1
  • 500#b88629ink text 5.4:1
  • 600#a17017white large 4.3:1
  • 700#8a5a00white text 5.9:1
  • 800#653f00white text 9.3:1
  • 900#422500white text 14.0:1
  • 950#311900white text 16.5:1

Kiln

  • 50#faf6f5ink text 16.2:1
  • 100#fbe7e5ink text 14.7:1
  • 200#ffbab1ink text 10.7:1
  • 300#ff8a7eink text 7.6:1
  • 400#ea6f63ink text 5.8:1
  • 500#d55448ink large 4.3:1
  • 600#c0362cwhite text 5.5:1
  • 700#a82e25white text 6.8:1
  • 800#7d1b15white text 10.3:1
  • 900#550806white text 14.8:1
  • 950#420101white text 17.0:1

Cerulean

  • 50#f4f7f9ink text 16.2:1
  • 100#e2f2f9ink text 15.2:1
  • 200#a3d9f3ink text 11.4:1
  • 300#5bc0ebink text 8.4:1
  • 400#49abd6ink text 6.7:1
  • 500#3796c1ink text 5.2:1
  • 600#2482adwhite large 4.3:1
  • 700#0b6e99white text 5.7:1
  • 800#004e71white text 9.0:1
  • 900#00314awhite text 13.7:1
  • 950#002339white text 16.2:1

Violet

  • 50#f7f6faink text 16.2:1
  • 100#f0e9faink text 14.7:1
  • 200#d4c0f7ink text 10.5:1
  • 300#b996f2ink text 7.2:1
  • 400#a37ae2ink text 5.3:1
  • 500#8e5dd1white text 4.5:1
  • 600#7a3fc0white text 6.4:1
  • 700#6a33adwhite text 7.8:1
  • 800#4f2284white text 11.1:1
  • 900#35115dwhite text 15.1:1
  • 950#29094awhite text 17.0:1

Clay

  • 50#fff3ebink text 16.0:1
  • 100#fae4dbink text 14.3:1
  • 200#e7c8b9ink text 11.1:1
  • 300#d4ac99ink text 8.4:1
  • 400#c1917aink text 6.3:1
  • 500#ae765bink text 4.6:1
  • 600#9a5b3cwhite text 5.3:1
  • 700#7b462bwhite text 7.6:1
  • 800#5e311bwhite text 10.9:1
  • 900#421e0cwhite text 14.8:1
  • 950#341505white text 16.7:1

Semantic tokens

Product code uses these names, never raw hex. The app uses Iron; marketing pages add the class ko-porcelain, which swaps the neutral tokens in the light theme.

TokenUse forLight (Iron)DarkPorcelain
--ko-bgApp background#f5f7fa#0e121b#f7f5f0
--ko-surfacePanels, cards, tables#ffffff#161b26#fdfcf9
--ko-surface-raisedMenus, popovers, dialogs (with shadow-1 in light)#ffffff#1f2533#fdfcf9
--ko-surface-sunkenTable headers, code, wells#eceff4#0e121b#efebe3
--ko-hoverRow and menu hover#f5f7fa#1f2533#efebe3
--ko-lineDividers, card borders (decorative)#dde2eb#2a3142#e2dcd0
--ko-line-strongInput and control borders, 3:1 or more#848da5#68728b#8c8576
--ko-textBody text#141a26#e6e9f0#12161f
--ko-text-mutedSecondary text, labels#566079#9aa3b8#575146
--ko-text-subtlePlaceholders, meta; the minimum for any text#646e88#8a93ab#6a6457
--ko-primaryButtons, links, selection, the brand#1f47c9#8fa8ff
--ko-primary-hoverHover and pressed primary#1a3aa6#c9d5fa
--ko-on-primaryText and icons on primary fills#ffffff#0e121b
--ko-primary-softSoft backgrounds, badges, focus fill#e8edfc#1b2648
--ko-primary-soft-textText on primary-soft#1a3aa6#c9d5fa
--ko-selectedSelected row tint#f1f4fe#202738
--ko-focusFocus ring: 2px with 2px offset#1f47c9#8fa8ff
--ko-successSaved, applied, won#13795b#4fc79a
--ko-success-softSuccess background#e3f4ec#203337
--ko-warningNeeds attention, near a limit#8a5a00#e8b54a
--ko-warning-softWarning background#fbf0d9#323130
--ko-warning-solidWarning fill, always with dark text#e8b54a#e8b54a
--ko-on-warning-solidText on warning-solid#0e121b#0e121b
--ko-dangerErrors, delete, rejected#c0362c#ff8a7e
--ko-danger-textDanger text on danger-soft#a82e25#ff8a7e
--ko-danger-softDanger background#fbe7e5#372c34
--ko-on-dangerText on danger fills#ffffff#0e121b
--ko-infoNeutral notices, tips#0b6e99#5bc0eb
--ko-info-softInfo background#e2f2f9#223241
--ko-agentAnything done or proposed by an agent#7a3fc0#b996f2
--ko-agent-textAgent text on agent-soft#6a33ad#b996f2
--ko-agent-softAgent background#f0e9fa#2d2c42
--ko-avatarPerson avatar with initials#eceff4#2a3142#efebe3

Contrast

  • All text is 4.5:1 or more, in light and dark; control borders and focus rings are 3:1 or more. scripts/build_brand.py checks every pair below and fails the build if one drops.
  • Dark theme: cobalt lifts to cobalt-300 and primary buttons switch to dark text on light blue.
  • Warning fills (aureolin) always take dark text. Warning as text uses the darker #8A5A00.
  • Data viz order: cobalt, cerulean, cobalt green, aureolin, cobalt violet, kiln red, iron.
Show every checked pairing
ThemePairingColorsRatioNeeds
lighttext / bg#141a26 on #f5f7fa16.23:14.5:1
lighttext / surface#141a26 on #ffffff17.42:14.5:1
lightmuted / bg#566079 on #f5f7fa5.85:14.5:1
lightmuted / surface#566079 on #ffffff6.28:14.5:1
lightmuted / sunken#566079 on #eceff45.45:14.5:1
lightsubtle / bg#646e88 on #f5f7fa4.74:14.5:1
lightsubtle / surface#646e88 on #ffffff5.09:14.5:1
lightsubtle / raised#646e88 on #ffffff5.09:14.5:1
lightprimary / bg#1f47c9 on #f5f7fa6.98:14.5:1
lightprimary / surface#1f47c9 on #ffffff7.49:14.5:1
lighton-primary / primary#ffffff on #1f47c97.49:14.5:1
lighton-primary / primary-hover#ffffff on #1a3aa69.55:14.5:1
lightprimary-soft-text / primary-soft#1a3aa6 on #e8edfc8.16:14.5:1
lightprimary / selected#1f47c9 on #f1f4fe6.82:14.5:1
lighttext / selected#141a26 on #f1f4fe15.85:14.5:1
lightsuccess / surface#13795b on #ffffff5.37:14.5:1
lightsuccess / soft#13795b on #e3f4ec4.71:14.5:1
lightwarning / surface#8a5a00 on #ffffff5.93:14.5:1
lightwarning / soft#8a5a00 on #fbf0d95.24:14.5:1
lighton-warning / warning-solid#0e121b on #e8b54a9.94:14.5:1
lightdanger / surface#c0362c on #ffffff5.52:14.5:1
lightdanger-text / soft#a82e25 on #fbe7e55.73:14.5:1
lighton-danger / danger#ffffff on #c0362c5.52:14.5:1
lightinfo / surface#0b6e99 on #ffffff5.67:14.5:1
lightinfo / soft#0b6e99 on #e2f2f94.94:14.5:1
lightagent / surface#7a3fc0 on #ffffff6.36:14.5:1
lightagent-text / soft#6a33ad on #f0e9fa6.60:14.5:1
lighttext / avatar#141a26 on #eceff415.11:14.5:1
lightline-strong / surface (UI)#848da5 on #ffffff3.32:13:1
lightline-strong / bg (UI)#848da5 on #f5f7fa3.09:13:1
lightline-strong / raised (UI)#848da5 on #ffffff3.32:13:1
lightfocus / bg (UI)#1f47c9 on #f5f7fa6.98:13:1
lightfocus / surface (UI)#1f47c9 on #ffffff7.49:13:1
darktext / bg#e6e9f0 on #0e121b15.41:14.5:1
darktext / surface#e6e9f0 on #161b2614.18:14.5:1
darkmuted / bg#9aa3b8 on #0e121b7.41:14.5:1
darkmuted / surface#9aa3b8 on #161b266.81:14.5:1
darkmuted / sunken#9aa3b8 on #0e121b7.41:14.5:1
darksubtle / bg#8a93ab on #0e121b6.10:14.5:1
darksubtle / surface#8a93ab on #161b265.61:14.5:1
darksubtle / raised#8a93ab on #1f25334.99:14.5:1
darkprimary / bg#8fa8ff on #0e121b8.22:14.5:1
darkprimary / surface#8fa8ff on #161b267.56:14.5:1
darkon-primary / primary#0e121b on #8fa8ff8.22:14.5:1
darkon-primary / primary-hover#0e121b on #c9d5fa12.83:14.5:1
darkprimary-soft-text / primary-soft#c9d5fa on #1b264810.15:14.5:1
darkprimary / selected#8fa8ff on #2027386.54:14.5:1
darktext / selected#e6e9f0 on #20273812.27:14.5:1
darksuccess / surface#4fc79a on #161b268.18:14.5:1
darksuccess / soft#4fc79a on #2033376.27:14.5:1
darkwarning / surface#e8b54a on #161b269.14:14.5:1
darkwarning / soft#e8b54a on #3231306.89:14.5:1
darkon-warning / warning-solid#0e121b on #e8b54a9.94:14.5:1
darkdanger / surface#ff8a7e on #161b267.54:14.5:1
darkdanger-text / soft#ff8a7e on #372c345.84:14.5:1
darkon-danger / danger#0e121b on #ff8a7e8.20:14.5:1
darkinfo / surface#5bc0eb on #161b268.36:14.5:1
darkinfo / soft#5bc0eb on #2232416.36:14.5:1
darkagent / surface#b996f2 on #161b267.14:14.5:1
darkagent-text / soft#b996f2 on #2d2c425.62:14.5:1
darktext / avatar#e6e9f0 on #2a314210.69:14.5:1
darkline-strong / surface (UI)#68728b on #161b263.58:13:1
darkline-strong / bg (UI)#68728b on #0e121b3.90:13:1
darkline-strong / raised (UI)#68728b on #1f25333.19:13:1
darkfocus / bg (UI)#8fa8ff on #0e121b8.22:13:1
darkfocus / surface (UI)#8fa8ff on #161b267.56:13:1
porcelaintext / bg#12161f on #f7f5f016.61:14.5:1
porcelaintext / surface#12161f on #fdfcf917.64:14.5:1
porcelainmuted / bg#575146 on #f7f5f07.22:14.5:1
porcelainmuted / surface#575146 on #fdfcf97.66:14.5:1
porcelainmuted / sunken#575146 on #efebe36.61:14.5:1
porcelainsubtle / bg#6a6457 on #f7f5f05.39:14.5:1
porcelainsubtle / surface#6a6457 on #fdfcf95.73:14.5:1
porcelainsubtle / raised#6a6457 on #fdfcf95.73:14.5:1
porcelainprimary / bg#1f47c9 on #f7f5f06.88:14.5:1
porcelainprimary / surface#1f47c9 on #fdfcf97.30:14.5:1
porcelaintext / selected#12161f on #f1f4fe16.47:14.5:1
porcelainsuccess / surface#13795b on #fdfcf95.23:14.5:1
porcelainwarning / surface#8a5a00 on #fdfcf95.78:14.5:1
porcelaindanger / surface#c0362c on #fdfcf95.38:14.5:1
porcelaininfo / surface#0b6e99 on #fdfcf95.53:14.5:1
porcelainagent / surface#7a3fc0 on #fdfcf96.20:14.5:1
porcelaintext / avatar#12161f on #efebe315.22:14.5:1
porcelainline-strong / surface (UI)#8c8576 on #fdfcf93.57:13:1
porcelainline-strong / bg (UI)#8c8576 on #f7f5f03.36:13:1
porcelainline-strong / raised (UI)#8c8576 on #fdfcf93.57:13:1
porcelainfocus / bg (UI)#1f47c9 on #f7f5f06.88:13:1
porcelainfocus / surface (UI)#1f47c9 on #fdfcf97.30:13:1
lighttone cobalt#1a3aa6 on #e8edfc8.16:14.5:1
darktone cobalt#8fa8ff on #272f445.84:14.5:1
lighttone cerulean#0b6e99 on #e2f2f94.94:14.5:1
darktone cerulean#5bc0eb on #2232416.36:14.5:1
lighttone green#13795b on #e3f4ec4.71:14.5:1
darktone green#4fc79a on #2033376.27:14.5:1
lighttone aureolin#8a5a00 on #fbf0d95.24:14.5:1
darktone aureolin#e8b54a on #3231306.89:14.5:1
lighttone violet#6a33ad on #f0e9fa6.60:14.5:1
darktone violet#b996f2 on #2d2c425.62:14.5:1
lighttone kiln#a82e25 on #fbe7e55.73:14.5:1
darktone kiln#ff8a7e on #372c345.84:14.5:1
lighttone clay#7b462b on #fae4db6.24:14.5:1
darktone clay#d4ac99 on #302f376.40:14.5:1
lighttone iron#566079 on #eceff45.45:14.5:1
darktone iron#9aa3b8 on #282e3b5.38:14.5:1
porcelainwhite / cobalt-900 band#ffffff on #0b1a4a16.66:14.5:1
porcelaincobalt-300 / cobalt-900 band#8fa8ff on #0b1a4a7.31:14.5:1
porcelainprimary / alt band#1f47c9 on #efebe36.30:14.5:1
porcelainmuted / alt band#575146 on #efebe36.61:14.5:1

04 · Typography

Inter, Inter Tight, JetBrains Mono

One skeleton for text and headlines, one mono for data. All OFL, self-hosted with Latin and Cyrillic. No font service sees our visitors.

Aa ЖжInter Tight

Display: headlines and the wordmark. 600 and 700.

Aa ЖжInter

UI and text. 400 body, 500 labels and buttons, 600 headings.

0O 1lIJetBrains Mono

Object IDs, values in diffs, API keys, code. 400 and 500.

App scale · base 14

heading-lg · 28/34 · Tight 600Acme onboarding
heading-md · 22/28 · Tight 600Deals in Proposal
heading-sm · 18/24 · 600Attributes
text-lg · 16/24 · 500Renewal date is 30 days away
text-base · 14/20 · 400Kobalt opens the project, adds your standard tasks, and tells the account owner.
text-sm · 13/18 · 400Changed by Dana Kovalenko · 2 hours ago
text-xs · 12/16 · 500Owner · Close date · Value
mono-sm · 12/16 · Mono 400DE-42 · €18,400.00 · 2026-10-21 14:07
eyebrow · 12 · 600 · +6%Type · Deal

Marketing scale · base 17

heading-lg · fluid 36–56Run the whole business on solid ground.
heading-md · fluid 28–36Hire agents for the routine work
text-base · 17/27A client, a deal, a task, a page: each one is an object with a type.
CyrillicУгода виграна. Kobalt відкриває проєкт і додає ваші стандартні завдання.
  • Sentence case everywhere. No all-caps body or headlines. Eyebrows and type chips are the only uppercase.
  • Numbers in tables and money use tabular figures (font-variant-numeric: tabular-nums). No other font features for now.
  • The name is always Latin “Kobalt”, also in Cyrillic text.

05 · Layout and shape

Squarish, dense, calm

A 4 px grid. Small radii like tiles. Borders before shadows. Built for all-day use: lots of information, little noise.

Spacing

space-14
space-28
space-312
space-416
space-520
space-624
space-832
space-1248
space-1664

Density

  • Controls 32 px high; 36 px on touch and marketing.
  • Table rows 36 px, or 32 px in compact mode.
  • Sidebar 240 px. App panels pad 16; marketing sections 64–96.

Radius

xs · 3
chips
sm · 6
buttons
md · 8
cards
lg · 12
dialogs
full
people only

Elevation

Line · most surfaces
shadow-1 · menus
shadow-2 · dialogs

In the dark theme, floating things use surface-raised and a line instead of a heavy shadow.

06 · Components

The library

Plain HTML and CSS from kobalt.css, on the app’s Iron surfaces. The same markup in both panels: the theme comes from data-theme or the system setting.

Light

Buttons
Fields
Choices
Badges and type chips
Selected Applied Needs review Rejected Tip Sales
DeDeal CoCompany PePerson TaTask
People and agents
DKDana Kovalenko Onboarding agentAgent
Assistant (acting as Dana)Agent
Tabs
Table
DealStageOwnerValue
DeAcme onboarding DE-42WonDana K.€18,400
DeNorthwind retainer DE-43ProposalOleh M.€6,250
DeGlobex site rebuild DE-44LeadDana K.€31,000
Alerts and toast
Approval needed

Onboarding agent wants to assign 3 tasks to Dana. Risk: changes her workload this week.

Couldn’t save Acme Ltd

The email is already used by Acme Group. Your other changes are kept.

This workspace used $8.40 of its $10 AI limit this month. Agents pause at $10.

Deal #42 moved to Won.
Empty state
No deals in this stage yet

Deals move here when their stage is set to Proposal.

Dark

Buttons
Fields
Choices
Badges and type chips
Selected Applied Needs review Rejected Tip Sales
DeDeal CoCompany PePerson TaTask
People and agents
DKDana Kovalenko Onboarding agentAgent
Assistant (acting as Dana)Agent
Tabs
Table
DealStageOwnerValue
DeAcme onboarding DE-42WonDana K.€18,400
DeNorthwind retainer DE-43ProposalOleh M.€6,250
DeGlobex site rebuild DE-44LeadDana K.€31,000
Alerts and toast
Approval needed

Onboarding agent wants to assign 3 tasks to Dana. Risk: changes her workload this week.

Couldn’t save Acme Ltd

The email is already used by Acme Group. Your other changes are kept.

This workspace used $8.40 of its $10 AI limit this month. Agents pause at $10.

Deal #42 moved to Won.
Empty state
No deals in this stage yet

Deals move here when their stage is set to Proposal.

07 · Object visuals

Types, objects, actors, history

The product is objects, types and actors. These visuals are the brand inside the app: every type looks and behaves the same, and every change shows who made it.

Type chips and tones

A type chip is a small tile with a two-letter symbol, like an element: made from the type’s name, editable. Each type picks one of eight tones. Tones identify types; they never mean status.

DeDeal CoCompany PePerson TaTask MeMeeting TiTicket PrProject PaParty
DeDealDE-42

Acme onboarding

Stage
Won
Value
€18,400
Owner
DKDana Kovalenko
Company
CoAcme Ltd
Renewal date
2027-10-21
Margin
Finance role only
CoCompanyCO-7

Acme Ltd

Name from Party
Acme Ltd
Email from Party
[email protected]
Website
acme.example
Proposed by Onboarding agentAgent 3 changes · waiting
  • TaKick-off callnew taskassignee: Dana
  • TaCollect brand assetsnew taskassignee: Dana
  • DeDeal #42StageWon→Onboarding
Added Renewal date to Deal Dana Kovalenko · 14:07
Delete 12 stale leads Rejected by Oleh M. · yesterday
  1. DK
    Dana Kovalenko moved Stage Proposal → Won
  2. Onboarding agentAgent created PrAcme onboarding
    Why

    The deal moved to Won, and your rule says to open a project with the standard onboarding tasks.

  3. Assistant (acting as Dana)Agent added Renewal date
  • Person: round avatar, photo or initials on --ko-avatar.
  • Agent: square tile in violet with the bot icon, and the word “Agent”. Square = system actor, round = person. Never shape or color alone.
  • Assistant: agent style, labelled “Assistant (acting as Dana)” to show it carries her rights.
  • Change set: proposed = dashed violet border with Approve and Reject; applied = solid line, check, time, Undo; rejected = muted, struck title, who and when.
  • History: agent entries carry a violet left rule and a “Why” with the reasoning summary.
  • Permissions: a lock on fields the viewer can’t edit, naming the role needed. Never hide why.

08 · Icons

Lucide, one style

Line icons at a 1.5 px stroke, 16 px in dense UI and 20 px in navigation and buttons, in currentColor. No filled or duotone mixes.

bot · agents
user
history
undo
lock · no rights
inherited
text
number
date
list · enum
reference
types
deals
companies
tickets
pages

Icons from Lucide 1.61.0, ISC licence (licence text). Inlined as an SVG sprite on this page; the product bundles its own copy.

09 · Motion

Explains, never decorates

Calm, quick, and gone. Small slides of 4–8 px and opacity; no bounces, springs or parallax. With reduced motion turned on, changes are instant.

Hover or focus a tile to see its timing. Enter cubic-bezier(0.2, 0, 0, 1); exit cubic-bezier(0.3, 0, 1, 1), about 20% shorter.

Agent working

Onboarding agentAgent

A small violet dot breathes (opacity 0.4 → 1, 1.6 s). No spinning orbs.

Changes land visibly

Renewal date 2027-10-21

A field changed by someone else gets a 600 ms tint fade: cobalt-50 for people, violet for agents. Hover to replay.

10 · Brand in use

Do and don’t

Order without bureaucracy, help without losing control.

DoDon’t
Lead with a real scenario (“a deal is won…”)Lead with adjectives or AI buzzwords
Use cobalt for action and selectionUse cobalt as a big background in the app
Show real product screens and tile diagramsUse stock photos, 3D blobs, robot mascots
Mark agent work with the violet badge and the word “Agent”Make agents look like people or hide that an agent acted
Give numbers for limits, prices, countsUse urgency (“Only today!”) or guilt
Keep the element idea quiet and structuralPile on chemistry puns or periodic-table kitsch
Write in sentence case, plain EnglishUse ALL CAPS headlines or exclamation marks
Describe what Kobalt doesName or compare with other products

Checklist for a new page or screen

  • One clear purpose; the headline says what it is or does in plain words.
  • Neutrals dominate; cobalt only on actions, links, selection; semantic colors only on state.
  • All text 4.5:1 or more (3:1 for large text and control borders), in light and dark.
  • Inter, Inter Tight and JetBrains Mono only; type tokens, not ad-hoc sizes.
  • Radii, spacing and shadows from tokens; borders before shadows.
  • Icons from Lucide, one size and stroke.
  • Every change shows its actor; agents use the agent badge.
  • Destructive or agent actions show a plan or consequence first.
  • Copy passes the words-we-avoid list; no claims about other products.
  • Works at 360 px wide with a 16 px gutter; keyboard focus visible; reduced motion respected.

11 · Files

Take the files

Copy these into your project; don’t hotlink them. All of them are generated by scripts/build_brand.py (run make brand), except kobalt.css and the fonts.

Use it

<!-- In <head>: tokens first, then components -->
<link rel="stylesheet" href="/brand/tokens.css">
<link rel="stylesheet" href="/brand/kobalt.css">

<!-- App: Iron surfaces. Marketing: add ko-porcelain. -->
<body class="ko">
<button class="ko-btn ko-btn--primary">Add deal</button>

/* In your own CSS, use the semantic tokens */
.panel { background: var(--ko-surface); border: 1px solid var(--ko-line); }