ntwrk/Brand book v1.0 · 13 Oct 2026

Identity / Colour

Colour

Cream ground, ink type, one Forest. The palette is small on purpose. Every value below comes from tokens.json; never sample a colour from a screenshot.

Approved: codifies liveAA pairings passOwner: Wes FischerUpdated 13 Oct 2026

01Core palette, light

#F2EFE3
bg--bg

Page ground (cream)

#ECE9DD
surface--surface

Bands, figures, form panels

#FFFFFF
card--card

Cards only

#0F1A14
ink--ink

Headings, wordmark

#2E3A33
ink-2--ink-2

Body text

#62695F
mute--mute

Mono labels, secondary borders

#D8D4C5
line--line

Hairlines; decorative only

#2A7048
primary--primary

Forest: action, owned, slash

#E2F0E8
primary-tint--primary-tint

Owned-panel tint

#BFDBC9
primary-edge--primary-edge

Tint edge

#B8DDC4
accent--accent

Chart secondary

#0F1A14
inverse-bg--inverse-bg

Close band

02Core palette, dark

#0E1411
bg--bg

Page ground (cream)

#161D19
surface--surface

Bands, figures, form panels

#1F2823
card--card

Cards only

#E8E4D6
ink--ink

Headings, wordmark

#BDB9AB
ink-2--ink-2

Body text

#868F87
mute--mute

Mono labels, secondary borders

#2A3430
line--line

Hairlines; decorative only

#6CC48A
primary--primary

Forest: action, owned, slash

#1A2B22
primary-tint--primary-tint

Owned-panel tint

#234734
primary-edge--primary-edge

Tint edge

#1F3F2A
accent--accent

Chart secondary

#F2EFE3
inverse-bg--inverse-bg

Close band

03Functional colours

#2A7048
success--success

States only

#7A5C12
warning--warning

States only

#8B2A24
danger--danger

Errors only

#2E5E80
info--info

Notes, info states

Each has -bg and -edge partners for panels. Functional colours never decorate.

04Rules

  1. Forest means owned, or do this. The primary action, the owned element in a figure, the slash. Never a frame, a heading colour or a background block.
  2. At most three Forest uses per viewport (for example: the slash, one primary button, one owned marker). Markers in a single owned list count as one Forest use. The primary action counts as one use per viewport however many times it appears: a header button and a hero button are one use.
  3. Labels and headings are never Forest text. Use ink or mute. Link arrows inherit the link colour and are never Forest.
  4. Line colours are decorative. At 1.3:1 they never carry meaning or mark an interactive boundary; inputs and secondary buttons use --mute.
  5. White is for cards only. The page is cream. Never more than about six cards visible at once.
  6. Dark theme swaps every token; components never hard-code a hex value.
Creative ruling, 8 Oct 2026The primary action counts as one Forest use per viewport however many times it appears. Link arrows inherit the link colour. Labels and headings are never Forest text: use ink or mute.

05Contrast pairings

WCAG 2.2 ratios, generated from tokens by build_tokens.py. Text needs 4.5:1, large text and UI boundaries 3:1.

Light

PairingRatioAllowed use
Aa ink on bg15.47:1any text size
Aa ink on card17.82:1any text size
Aa ink-2 on bg10.3:1any text size
Aa ink-2 on surface9.76:1any text size
Aa ink-2 on card11.87:1any text size
Aa mute on bg4.92:1any text size
Aa mute on surface4.66:1any text size
Aa mute on card5.67:1any text size
Aa primary on bg5.19:1any text size
Aa primary on card5.98:1any text size
Aa primary-fg on primary5.19:1any text size
Aa primary-fg on primary-hover7.07:1any text size
Aa inverse-fg on inverse-bg15.47:1any text size
Aa ink on primary-tint15.16:1any text size
Aa danger on bg7.43:1any text size
Aa warning on warning-bg4.97:1any text size
Aa info on info-bg5.49:1any text size
Aa ink-2 on primary-tint10.1:1any text size
Aa danger on danger-bg6.33:1any text size
Aa warning on bg5.41:1any text size
Aa info on bg6.02:1any text size
Aa mute on bg4.92:1UI boundary OK (>=3:1)
Aa mute on card5.67:1UI boundary OK (>=3:1)
Aa line on bg1.29:1decorative only, never for meaning
Aa line on card1.48:1decorative only, never for meaning
Aa primary on bg5.19:1UI boundary OK (>=3:1)

Dark

PairingRatioAllowed use
Aa ink on bg14.64:1any text size
Aa ink on card11.9:1any text size
Aa ink-2 on bg9.49:1any text size
Aa ink-2 on surface8.74:1any text size
Aa ink-2 on card7.71:1any text size
Aa mute on bg5.58:1any text size
Aa mute on surface5.14:1any text size
Aa mute on card4.54:1any text size
Aa primary on bg8.79:1any text size
Aa primary on card7.14:1any text size
Aa primary-fg on primary8.79:1any text size
Aa primary-fg on primary-hover10.82:1any text size
Aa inverse-fg on inverse-bg16.18:1any text size
Aa ink on primary-tint11.68:1any text size
Aa danger on bg5.74:1any text size
Aa warning on warning-bg7.96:1any text size
Aa info on info-bg7.55:1any text size
Aa ink-2 on primary-tint7.57:1any text size
Aa danger on danger-bg5.21:1any text size
Aa warning on bg9.47:1any text size
Aa info on bg8.49:1any text size
Aa mute on bg5.58:1UI boundary OK (>=3:1)
Aa mute on card4.54:1UI boundary OK (>=3:1)
Aa line on bg1.45:1decorative only, never for meaning
Aa line on card1.18:1decorative only, never for meaning
Aa primary on bg8.79:1UI boundary OK (>=3:1)
Decided 5 Oct 2026Light --warning is #7A5C12 (was #8B6915): 5.41:1 on cream and 4.97:1 on its own tint, so warning text passes AA at any size.
Dark --mute is #868F87 (was #828B83), the smallest lift that passes on dark cards: 4.54:1 on --card, up from 4.31:1.

06Chart colours

#0F1A14
c1--chart-c1

Series 1: the comparison

#2A7048
c2--chart-c2

Series 2: the owned or decision value

#2E3A33
c3--chart-c3

Series 3

#D8D4C5
c4--chart-c4

Series 4: sand, the remainder

Data-viz rules