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
| Trait | This | Not that |
|---|---|---|
| Solid | Reliable, steady, built to last | Heavy, slow, bureaucratic |
| Exact | Precise words, real numbers, clear structure | Pedantic, jargon-heavy |
| Open-handed | Shows its work: plans, history, reasons | Secretive, “trust us” |
| Adaptable | Shapes to the business; your copy is yours | Shapeless, “anything goes” |
| Calm | Quiet confidence, even when something fails | Flat, robotic, indifferent |
Voice: plain, exact, accountable
- Say what happens. Name the object, the action, the result. “Deal #42 moved to Won.”, not “Success!”
- Short and plain. One idea per sentence. Everyday words over technical ones.
- Show before doing. Anything that changes data, especially by an agent, is described first, then done.
- Own it. When we fail, say so, say what’s safe, say what to do next.
- No hype. Proof over adjectives. If we can’t show it, we don’t say it.
| Context | Say | Not |
|---|---|---|
| Marketing | A deal is won. Kobalt opens the project, adds your standard tasks, and tells the account owner. | Supercharge your pipeline with AI! |
| Error | Couldn’t load deals. We’re retrying. Nothing you entered is lost. | Oops! Something went wrong. |
| Admin | Added Renewal date to Deal. | Schema updated successfully. |
| Limits | Agents 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! |
| Delete | Delete 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.
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 use | We avoid |
|---|---|
| object, type, attribute (app); record, field (marketing) | entity, schema, metadata |
| agent, hire, role, limits | bot, AI magic, copilot, digital employee |
| approve, review, undo, history | “trust us”, “fully autonomous” |
| change, set up, shape | customize your journey, empower |
| simple, clear, in one place | seamless, revolutionary, unleash, supercharge |
| “you”, “your team” | “users”, “end users” |
| fewer steps, nothing lost | 10x, 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.
02 · Logo
The element tile
A cobalt square tile holding a structured K: the element of a business system. The leg springs from the arm, not the stem, and leaves a small gap. The square dot top right marks the tile as an element.
Primary: cobalt tile with a white K. On cobalt-900 or photos: white tile with a cobalt K. The wordmark is Inter Tight 700, tracking −1%, drawn as outlines; it never needs the font installed.
Construction
- Tile: 32 × 32, corner radius 6 (about 19%).
- Strokes: 3.5 wide, cut flush at the cap line and the baseline.
- Stem x 10.5 · arm (10.5, 17) → (19.5, 8) · leg (14, 14) → (21.5, 24).
- Dot: 3 × 3 at (23, 8). Dropped below 24 px.
- Lockup: tile = 1.5 × cap height, gap = 0.35 × tile.
Clear space and size
Keep a quarter of the tile height free on every side. Nothing else goes inside that space.
Colour versions
Don’t
Stretch or rotate
Round it into a circle
Add glow, shadow, gradients
Type the name in a live font
The specimen tile (“27”, “Ko”) is an illustration of the idea for the brand book and marketing. It never replaces the mark.
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.
#1F47C9#0B1A4A#F7F5F0#0E121BHow much of each (app screen)
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
Cool, faint blue. Metal: the app’s working surfaces in both themes.
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.
| Token | Use for | Light (Iron) | Dark | Porcelain |
|---|---|---|---|---|
--ko-bg | App background | #f5f7fa | #0e121b | #f7f5f0 |
--ko-surface | Panels, cards, tables | #ffffff | #161b26 | #fdfcf9 |
--ko-surface-raised | Menus, popovers, dialogs (with shadow-1 in light) | #ffffff | #1f2533 | #fdfcf9 |
--ko-surface-sunken | Table headers, code, wells | #eceff4 | #0e121b | #efebe3 |
--ko-hover | Row and menu hover | #f5f7fa | #1f2533 | #efebe3 |
--ko-line | Dividers, card borders (decorative) | #dde2eb | #2a3142 | #e2dcd0 |
--ko-line-strong | Input and control borders, 3:1 or more | #848da5 | #68728b | #8c8576 |
--ko-text | Body text | #141a26 | #e6e9f0 | #12161f |
--ko-text-muted | Secondary text, labels | #566079 | #9aa3b8 | #575146 |
--ko-text-subtle | Placeholders, meta; the minimum for any text | #646e88 | #8a93ab | #6a6457 |
--ko-primary | Buttons, links, selection, the brand | #1f47c9 | #8fa8ff | |
--ko-primary-hover | Hover and pressed primary | #1a3aa6 | #c9d5fa | |
--ko-on-primary | Text and icons on primary fills | #ffffff | #0e121b | |
--ko-primary-soft | Soft backgrounds, badges, focus fill | #e8edfc | #1b2648 | |
--ko-primary-soft-text | Text on primary-soft | #1a3aa6 | #c9d5fa | |
--ko-selected | Selected row tint | #f1f4fe | #202738 | |
--ko-focus | Focus ring: 2px with 2px offset | #1f47c9 | #8fa8ff | |
--ko-success | Saved, applied, won | #13795b | #4fc79a | |
--ko-success-soft | Success background | #e3f4ec | #203337 | |
--ko-warning | Needs attention, near a limit | #8a5a00 | #e8b54a | |
--ko-warning-soft | Warning background | #fbf0d9 | #323130 | |
--ko-warning-solid | Warning fill, always with dark text | #e8b54a | #e8b54a | |
--ko-on-warning-solid | Text on warning-solid | #0e121b | #0e121b | |
--ko-danger | Errors, delete, rejected | #c0362c | #ff8a7e | |
--ko-danger-text | Danger text on danger-soft | #a82e25 | #ff8a7e | |
--ko-danger-soft | Danger background | #fbe7e5 | #372c34 | |
--ko-on-danger | Text on danger fills | #ffffff | #0e121b | |
--ko-info | Neutral notices, tips | #0b6e99 | #5bc0eb | |
--ko-info-soft | Info background | #e2f2f9 | #223241 | |
--ko-agent | Anything done or proposed by an agent | #7a3fc0 | #b996f2 | |
--ko-agent-text | Agent text on agent-soft | #6a33ad | #b996f2 | |
--ko-agent-soft | Agent background | #f0e9fa | #2d2c42 | |
--ko-avatar | Person 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.pychecks 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
| Theme | Pairing | Colors | Ratio | Needs |
|---|---|---|---|---|
| light | text / bg | #141a26 on #f5f7fa | 16.23:1 | 4.5:1 |
| light | text / surface | #141a26 on #ffffff | 17.42:1 | 4.5:1 |
| light | muted / bg | #566079 on #f5f7fa | 5.85:1 | 4.5:1 |
| light | muted / surface | #566079 on #ffffff | 6.28:1 | 4.5:1 |
| light | muted / sunken | #566079 on #eceff4 | 5.45:1 | 4.5:1 |
| light | subtle / bg | #646e88 on #f5f7fa | 4.74:1 | 4.5:1 |
| light | subtle / surface | #646e88 on #ffffff | 5.09:1 | 4.5:1 |
| light | subtle / raised | #646e88 on #ffffff | 5.09:1 | 4.5:1 |
| light | primary / bg | #1f47c9 on #f5f7fa | 6.98:1 | 4.5:1 |
| light | primary / surface | #1f47c9 on #ffffff | 7.49:1 | 4.5:1 |
| light | on-primary / primary | #ffffff on #1f47c9 | 7.49:1 | 4.5:1 |
| light | on-primary / primary-hover | #ffffff on #1a3aa6 | 9.55:1 | 4.5:1 |
| light | primary-soft-text / primary-soft | #1a3aa6 on #e8edfc | 8.16:1 | 4.5:1 |
| light | primary / selected | #1f47c9 on #f1f4fe | 6.82:1 | 4.5:1 |
| light | text / selected | #141a26 on #f1f4fe | 15.85:1 | 4.5:1 |
| light | success / surface | #13795b on #ffffff | 5.37:1 | 4.5:1 |
| light | success / soft | #13795b on #e3f4ec | 4.71:1 | 4.5:1 |
| light | warning / surface | #8a5a00 on #ffffff | 5.93:1 | 4.5:1 |
| light | warning / soft | #8a5a00 on #fbf0d9 | 5.24:1 | 4.5:1 |
| light | on-warning / warning-solid | #0e121b on #e8b54a | 9.94:1 | 4.5:1 |
| light | danger / surface | #c0362c on #ffffff | 5.52:1 | 4.5:1 |
| light | danger-text / soft | #a82e25 on #fbe7e5 | 5.73:1 | 4.5:1 |
| light | on-danger / danger | #ffffff on #c0362c | 5.52:1 | 4.5:1 |
| light | info / surface | #0b6e99 on #ffffff | 5.67:1 | 4.5:1 |
| light | info / soft | #0b6e99 on #e2f2f9 | 4.94:1 | 4.5:1 |
| light | agent / surface | #7a3fc0 on #ffffff | 6.36:1 | 4.5:1 |
| light | agent-text / soft | #6a33ad on #f0e9fa | 6.60:1 | 4.5:1 |
| light | text / avatar | #141a26 on #eceff4 | 15.11:1 | 4.5:1 |
| light | line-strong / surface (UI) | #848da5 on #ffffff | 3.32:1 | 3:1 |
| light | line-strong / bg (UI) | #848da5 on #f5f7fa | 3.09:1 | 3:1 |
| light | line-strong / raised (UI) | #848da5 on #ffffff | 3.32:1 | 3:1 |
| light | focus / bg (UI) | #1f47c9 on #f5f7fa | 6.98:1 | 3:1 |
| light | focus / surface (UI) | #1f47c9 on #ffffff | 7.49:1 | 3:1 |
| dark | text / bg | #e6e9f0 on #0e121b | 15.41:1 | 4.5:1 |
| dark | text / surface | #e6e9f0 on #161b26 | 14.18:1 | 4.5:1 |
| dark | muted / bg | #9aa3b8 on #0e121b | 7.41:1 | 4.5:1 |
| dark | muted / surface | #9aa3b8 on #161b26 | 6.81:1 | 4.5:1 |
| dark | muted / sunken | #9aa3b8 on #0e121b | 7.41:1 | 4.5:1 |
| dark | subtle / bg | #8a93ab on #0e121b | 6.10:1 | 4.5:1 |
| dark | subtle / surface | #8a93ab on #161b26 | 5.61:1 | 4.5:1 |
| dark | subtle / raised | #8a93ab on #1f2533 | 4.99:1 | 4.5:1 |
| dark | primary / bg | #8fa8ff on #0e121b | 8.22:1 | 4.5:1 |
| dark | primary / surface | #8fa8ff on #161b26 | 7.56:1 | 4.5:1 |
| dark | on-primary / primary | #0e121b on #8fa8ff | 8.22:1 | 4.5:1 |
| dark | on-primary / primary-hover | #0e121b on #c9d5fa | 12.83:1 | 4.5:1 |
| dark | primary-soft-text / primary-soft | #c9d5fa on #1b2648 | 10.15:1 | 4.5:1 |
| dark | primary / selected | #8fa8ff on #202738 | 6.54:1 | 4.5:1 |
| dark | text / selected | #e6e9f0 on #202738 | 12.27:1 | 4.5:1 |
| dark | success / surface | #4fc79a on #161b26 | 8.18:1 | 4.5:1 |
| dark | success / soft | #4fc79a on #203337 | 6.27:1 | 4.5:1 |
| dark | warning / surface | #e8b54a on #161b26 | 9.14:1 | 4.5:1 |
| dark | warning / soft | #e8b54a on #323130 | 6.89:1 | 4.5:1 |
| dark | on-warning / warning-solid | #0e121b on #e8b54a | 9.94:1 | 4.5:1 |
| dark | danger / surface | #ff8a7e on #161b26 | 7.54:1 | 4.5:1 |
| dark | danger-text / soft | #ff8a7e on #372c34 | 5.84:1 | 4.5:1 |
| dark | on-danger / danger | #0e121b on #ff8a7e | 8.20:1 | 4.5:1 |
| dark | info / surface | #5bc0eb on #161b26 | 8.36:1 | 4.5:1 |
| dark | info / soft | #5bc0eb on #223241 | 6.36:1 | 4.5:1 |
| dark | agent / surface | #b996f2 on #161b26 | 7.14:1 | 4.5:1 |
| dark | agent-text / soft | #b996f2 on #2d2c42 | 5.62:1 | 4.5:1 |
| dark | text / avatar | #e6e9f0 on #2a3142 | 10.69:1 | 4.5:1 |
| dark | line-strong / surface (UI) | #68728b on #161b26 | 3.58:1 | 3:1 |
| dark | line-strong / bg (UI) | #68728b on #0e121b | 3.90:1 | 3:1 |
| dark | line-strong / raised (UI) | #68728b on #1f2533 | 3.19:1 | 3:1 |
| dark | focus / bg (UI) | #8fa8ff on #0e121b | 8.22:1 | 3:1 |
| dark | focus / surface (UI) | #8fa8ff on #161b26 | 7.56:1 | 3:1 |
| porcelain | text / bg | #12161f on #f7f5f0 | 16.61:1 | 4.5:1 |
| porcelain | text / surface | #12161f on #fdfcf9 | 17.64:1 | 4.5:1 |
| porcelain | muted / bg | #575146 on #f7f5f0 | 7.22:1 | 4.5:1 |
| porcelain | muted / surface | #575146 on #fdfcf9 | 7.66:1 | 4.5:1 |
| porcelain | muted / sunken | #575146 on #efebe3 | 6.61:1 | 4.5:1 |
| porcelain | subtle / bg | #6a6457 on #f7f5f0 | 5.39:1 | 4.5:1 |
| porcelain | subtle / surface | #6a6457 on #fdfcf9 | 5.73:1 | 4.5:1 |
| porcelain | subtle / raised | #6a6457 on #fdfcf9 | 5.73:1 | 4.5:1 |
| porcelain | primary / bg | #1f47c9 on #f7f5f0 | 6.88:1 | 4.5:1 |
| porcelain | primary / surface | #1f47c9 on #fdfcf9 | 7.30:1 | 4.5:1 |
| porcelain | text / selected | #12161f on #f1f4fe | 16.47:1 | 4.5:1 |
| porcelain | success / surface | #13795b on #fdfcf9 | 5.23:1 | 4.5:1 |
| porcelain | warning / surface | #8a5a00 on #fdfcf9 | 5.78:1 | 4.5:1 |
| porcelain | danger / surface | #c0362c on #fdfcf9 | 5.38:1 | 4.5:1 |
| porcelain | info / surface | #0b6e99 on #fdfcf9 | 5.53:1 | 4.5:1 |
| porcelain | agent / surface | #7a3fc0 on #fdfcf9 | 6.20:1 | 4.5:1 |
| porcelain | text / avatar | #12161f on #efebe3 | 15.22:1 | 4.5:1 |
| porcelain | line-strong / surface (UI) | #8c8576 on #fdfcf9 | 3.57:1 | 3:1 |
| porcelain | line-strong / bg (UI) | #8c8576 on #f7f5f0 | 3.36:1 | 3:1 |
| porcelain | line-strong / raised (UI) | #8c8576 on #fdfcf9 | 3.57:1 | 3:1 |
| porcelain | focus / bg (UI) | #1f47c9 on #f7f5f0 | 6.88:1 | 3:1 |
| porcelain | focus / surface (UI) | #1f47c9 on #fdfcf9 | 7.30:1 | 3:1 |
| light | tone cobalt | #1a3aa6 on #e8edfc | 8.16:1 | 4.5:1 |
| dark | tone cobalt | #8fa8ff on #272f44 | 5.84:1 | 4.5:1 |
| light | tone cerulean | #0b6e99 on #e2f2f9 | 4.94:1 | 4.5:1 |
| dark | tone cerulean | #5bc0eb on #223241 | 6.36:1 | 4.5:1 |
| light | tone green | #13795b on #e3f4ec | 4.71:1 | 4.5:1 |
| dark | tone green | #4fc79a on #203337 | 6.27:1 | 4.5:1 |
| light | tone aureolin | #8a5a00 on #fbf0d9 | 5.24:1 | 4.5:1 |
| dark | tone aureolin | #e8b54a on #323130 | 6.89:1 | 4.5:1 |
| light | tone violet | #6a33ad on #f0e9fa | 6.60:1 | 4.5:1 |
| dark | tone violet | #b996f2 on #2d2c42 | 5.62:1 | 4.5:1 |
| light | tone kiln | #a82e25 on #fbe7e5 | 5.73:1 | 4.5:1 |
| dark | tone kiln | #ff8a7e on #372c34 | 5.84:1 | 4.5:1 |
| light | tone clay | #7b462b on #fae4db | 6.24:1 | 4.5:1 |
| dark | tone clay | #d4ac99 on #302f37 | 6.40:1 | 4.5:1 |
| light | tone iron | #566079 on #eceff4 | 5.45:1 | 4.5:1 |
| dark | tone iron | #9aa3b8 on #282e3b | 5.38:1 | 4.5:1 |
| porcelain | white / cobalt-900 band | #ffffff on #0b1a4a | 16.66:1 | 4.5:1 |
| porcelain | cobalt-300 / cobalt-900 band | #8fa8ff on #0b1a4a | 7.31:1 | 4.5:1 |
| porcelain | primary / alt band | #1f47c9 on #efebe3 | 6.30:1 | 4.5:1 |
| porcelain | muted / alt band | #575146 on #efebe3 | 6.61:1 | 4.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.
Display: headlines and the wordmark. 600 and 700.
UI and text. 400 body, 500 labels and buttons, 600 headings.
Object IDs, values in diffs, API keys, code. 400 and 500.
App scale · base 14
heading-lg · 28/34 · Tight 600Acme onboardingheading-md · 22/28 · Tight 600Deals in Proposalheading-sm · 18/24 · 600Attributestext-lg · 16/24 · 500Renewal date is 30 days awaytext-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 agotext-xs · 12/16 · 500Owner · Close date · Valuemono-sm · 12/16 · Mono 400DE-42 · €18,400.00 · 2026-10-21 14:07eyebrow · 12 · 600 · +6%Type · DealMarketing scale · base 17
heading-lg · fluid 36–56Run the whole business on solid ground.heading-md · fluid 28–36Hire agents for the routine worktext-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-14space-28space-312space-416space-520space-624space-832space-1248space-1664Density
- 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
chips
buttons
cards
dialogs
people only
Elevation
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
| Deal | Stage | Owner | Value |
|---|---|---|---|
| DeAcme onboarding DE-42 | Won | Dana K. | €18,400 |
| DeNorthwind retainer DE-43 | Proposal | Oleh M. | €6,250 |
| DeGlobex site rebuild DE-44 | Lead | Dana K. | €31,000 |
Onboarding agent wants to assign 3 tasks to Dana. Risk: changes her workload this week.
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.
Deals move here when their stage is set to Proposal.
Dark
| Deal | Stage | Owner | Value |
|---|---|---|---|
| DeAcme onboarding DE-42 | Won | Dana K. | €18,400 |
| DeNorthwind retainer DE-43 | Proposal | Oleh M. | €6,250 |
| DeGlobex site rebuild DE-44 | Lead | Dana K. | €31,000 |
Onboarding agent wants to assign 3 tasks to Dana. Risk: changes her workload this week.
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.
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.
Acme onboarding
- Stage
- Won
- Value
- €18,400
- Owner
- DKDana Kovalenko
- Company
- CoAcme Ltd
- Renewal date
- 2027-10-21
- Margin
- Finance role only
Acme Ltd
- Name from Party
- Acme Ltd
- Email from Party
- [email protected]
- Website
- acme.example
- TaKick-off callnew taskassignee: Dana
- TaCollect brand assetsnew taskassignee: Dana
- DeDeal #42StageWon→Onboarding
- DKDana Kovalenko moved Stage Proposal → Won
- Onboarding agentAgent created PrAcme onboarding
Why
The deal moved to Won, and your rule says to open a project with the standard onboarding tasks.
- 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.
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.
| Do | Don’t |
|---|---|
| Lead with a real scenario (“a deal is won…”) | Lead with adjectives or AI buzzwords |
| Use cobalt for action and selection | Use cobalt as a big background in the app |
| Show real product screens and tile diagrams | Use 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, counts | Use urgency (“Only today!”) or guilt |
| Keep the element idea quiet and structural | Pile on chemistry puns or periodic-table kitsch |
| Write in sentence case, plain English | Use ALL CAPS headlines or exclamation marks |
| Describe what Kobalt does | Name 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); }