One source of truth for color, type, space, and component. Built lean — audit, consolidate, document. No color or font appears here that isn't already in use. Click any value to copy it; toggle the theme to test both polarities.
3 accent colors4 type families4pt spacing grid2 themestokens.json v1.4
01 — Foundations
Color
Two layers. Primitives are raw values named by what they are; page CSS never touches them. Semantics are intent aliases — switch the theme or rebrand and only these change.
Locked
The palette is decided — two accents, fixed roles
Hot pink #ff2e88 is the one brand accent: the chip, eyebrows, links, focus. Electric green #8dff1f is signal only — the lighthouse beacon and live/status dots, never decorative. The old lime is retired. Dark is the canonical theme. One accent per viewport.
--color-green-500#8dff1fSignal only · beacon + live dots. Never decorative.
--signalThe alias page CSS uses for live state
Semantic aliases — what page CSS uses
--canvasPage background
--canvas-deepDeepest section
--canvas-elevRaised card
--brand-accentSignature lime
--ink-strongMax-contrast text
--ink-muteMuted text
--ink-faintDivider overlay
--border-strongHairline on dark
Polarity pairs — text on canvas
Ink on canvas--ink-mute on --canvas — muted bodywhite · #1f1633
Ink on lime--ink-on-light on --brand-accent — the chip#1f1633 · #c2ef4e
02 — Foundations
Typography
Four families, each with exactly one role: Space Grotesk display, Rubik body & UI, Monaco code, Saira Stencil wordmark. Never reach for a fifth.
.display-heroSpace Grotesk · clamp 56–88 · 700
Hello, UpIsland
.display-largeSpace Grotesk · clamp 42–60 · 500
A new shape for the CISO office.
.h-xlRubik · 30 / 1.2 · 500
Heading XL — section opener
.h-lgRubik · 27 / 1.25 · 500
Heading LG — large card title
.h-mdRubik · 24 / 1.25 · 500
Heading MD — card title
.h-smRubik · 20 / 1.25 · 600
Heading SM — list-group title
.body-lgRubik · 16 / 2.0 · 400
Body LG — the airy marketing paragraph, two-line leading for generous breathing room.
.body-mdRubik · 16 / 1.5 · 500
Body MD — the default UI body, denser, closer to console output.
.captionRubik · 14 / 1.43 · 400
Caption — secondary info, meta, byline.
.micro-capRubik · 10 · 600 · tracked caps
Micro · all-caps metadata
.monoMonaco · 14 / 1.5
.mono — routing, code, machine values
03 — Foundations
Spacing
Every margin, gap, and pad lands on the 4-point grid. Section bands are always --space-96.
--space-44
--space-88
--space-1212
--space-1616
--space-24 · gutter24
--space-32 · card pad32
--space-4848
--space-6464
--space-96 · section96
04 — Foundations
Radius
Seven steps. xs–xl for components, xxl for raised cards, full for pills and avatars. Click a tile to copy its token.
xs · 4
sm · 6
md · 8
lg · 10
xl · 12
xxl · 18
full
05 — Foundations
Shadow
Functional only — three elevations for genuine lift, plus a violet soft-ring for the inverted button and a lime glow for the live dot. On dark canvas, depth comes from texture, not drop shadows.
Three roles. btn-primary for the page's main action; btn-inverted for the loud hero CTA (white pill, violet soft-ring); btn-ghost-dark for secondary actions on dark. Hover and focus them — keyboard focus shows the new lime ring.
.chip-lime is the load-bearing signature — it wraps a single word inside a display headline. .chip is the bordered neutral, .tag the soft taxonomy label, .status-pill the meta-strip badge.
A new shape for security.
Sentri4pt gridCISO officeAILive · v1.4
.chip-lime.chip.tag.status-pill
09 — Components
Forms new · v1.2
Generic fields added in the v1.2 audit — DESIGN.md specified text-input and select-violet, but only the scoped signup input existed. Focus shows the lime ring; the error state is where pink earns its keep.
Every page hero uses the same shape: lime eyebrow with a leading dot → display headline → muted lede.
Episode 3 · 2026-05-31
Outcomes, not theater. The CISO office, rebuilt.
An eight-agent virtual team running the work the role was never staffed to do. Built in public, anonymously.
.eyebrow.display-large.body-lg
11 — Components
Navigation
Sticky glass header, three columns: brand · links · CTA. The brand is the stencil wordmark with the lime dot between UP and ISLAND.
.nav.nav-inner.nav-brand.nav-links.nav-cta
12 — Components
Code & badges
The violet-framed mono block with a lime accent class, the rotated lime stamp, and the pulsing live dot.
$ bun run beam:assemble episode-3
[extract] 12 sources scanned · 8 promoted
[render] /episodes/episode-3/index.html (47 KB)
[deploy] upisland.org — done
next sundayepisode 3
publishing weekly · episode 3 live
.code.accent.stamp.pulse-dot
13 — Patterns
Surfaces
Three canvases per page. Alternate to create rhythm — never stack two of the same type back-to-back.
.section-dark default page canvas
.section-night deepest violet, contrast strips
.section-light cream surface, story sections
14 — Patterns
Cards & notes
The generic raised .card, and the three-intent .note callout: neutral, accent (lime, positive), warn (violet, attention).
Process
The eight-agent virtual team
Each agent owns one slice of the CISO mandate — strategy, architecture, compliance, awareness, IR — and ships felt outcomes.
.card.note.note.note-accent.note.note-warn
15 — Patterns
Prose & TOC
Wrap long-form content in .prose and write semantic HTML — every element gets the right type, color, and spacing in a 720px reading column. The standalone .toc drops anywhere.
A new shape for the CISO office: outcomes, not theater. The work the role was never staffed to do — done by a virtual team of purpose-built agents.
Why the old shape broke
The CISO role is structurally broken for SMEs. No single person has the time, depth, and breadth to do what the role demands — strategy, architecture, compliance, awareness, IR — all at once.
The deliverable of security is calm in the business, not a list of activities.
.prose.prose .lede.toc.toc-item
16 — Patterns
Footer & signup
The same footer shape on every page, and the newsletter band. The signup form's name="email" and action bind to the subscribe endpoint — preserve them in any migration.
Subscribe
Get the weekly issue.
One short letter every Sunday — the highest-signal CISO-office thinking, distilled.
No spam. Unsubscribe one click.
.signup-band.signup-form.footer.footer-inner
17 — System
Audit & changelog
What this pass found and what it changed. Fixes respect the doctrine — document what is, not what could be — so genuine gaps were filled and speculative components were left noted, not invented.
Fixed
Keyboard focus was invisible
No component had a :focus-visible style. Added a lime focus ring (--shadow-ring-focus) on buttons, nav, links, and fields. Mouse interaction is unchanged, so visual parity holds.
Added
Generic form fields
DESIGN.md specified text-input and select-violet, but the system only had the scoped signup input. Added .field, .input, .select, .textarea on-token — see §09.
Rebranded
Signature is now hot pink, green is signal
v1.3 made --brand-accent hot pink #ff2e88; v1.4 added --signal (electric green #8dff1f) with one job — the lighthouse beacon and live/status dots. Because every component reads these through tokens, the whole system reskinned from a few edits. Lime is retired.
Synced
tokens.json round-trip
The new ring-focus shadow was mirrored into tokens.json and the version bumped to 1.2.0, honoring the rule that every value appears in both files.
Noted
Card variants stay on the bench
DESIGN.md describes card-pricing, card-feature-dark, and card-spotlight-violet. No production page uses them yet, so per doctrine they're not in the system — promote when a real page needs one.
Noted
Episode HTML is out of scope
Episode bodies serve both web and the newsletter email, where <link> is stripped. They stay on inline-everything HTML, hand-synced to tokens.json — by design, not by omission.
Doctrine & migration recipe live in DESIGN_SYSTEM.md · primitives in tokens.css · this sheet is the proof.