# Protocol Institute — Brand Kit (llms.txt) > Machine-readable entry point for agents applying the Protocol Institute brand. > Read this first, then load brand.json (tokens + components + build + quality), > brand.css (variables + `.pi-*` components), and brand.js (interactive behavior). > BUILD WITH THE COMPONENTS, not raw tokens alone — the `.pi-*` classes have the > spacing, contrast, and responsive behavior baked in, so you don't re-derive (and > re-bug) them. Then VERIFY (contrast + preflight + the Playwright qc.md) before shipping. ## Drop-in (head) ```html ``` brand.js auto-wires by markup: `.pi-hamburger[data-pi-menu="#m"]` toggles `.pi-mobile-menu#m`; `.pi-gutter` links get scroll-spy `.is-active`; anything with `data-pi-dark-aware` (and the gutter) flips to `.pi-on-dark` while it overlaps a `data-pi-surface="dark"` band. ## What this is The brand system for the Protocol Institute — "a research, education, media, and scene-making organization dedicated to advancing protocols and protocolization worldwide." It governs two veins that share ONE token system: 1. **Protocol Institute** — research / reports / SIGs / challenges. Formal, precise. 2. **Protocolized** — "The Magazine of New Nature". Editorial; Non-Fiction (Studies / Obliquities / Science) and Fiction. Voice guidance below covers NON-FICTION only; Fiction varies creatively and is not constrained. ## LLM-safe rules (do not violate) - **Decisions over values.** Use decision tokens (`--pi-action-primary`, `--pi-text-secondary`, …), never raw hex or arbitrary pixels. The token menus in brand.json / brand.css are CLOSED. - **No invented values.** If something is missing, extend brand.json/brand.css first, then use it. - **No dark MODE (no light/dark toggle) — but DARK SURFACES are first-class.** Heroes, CTA bands, footers, and dark slides use `surface-dark` + `on-dark` / `on-dark-muted` / `on-dark-line`. Any text/chrome that can overlap a dark band MUST flip to on-dark (mark the band `data-pi-surface="dark"` and the chrome `data-pi-dark-aware`; brand.js does the rest). Dark text on dark = 1.23:1 = invisible. - **Compose missing components** from existing decision tokens + the radius/hairline/type roles. - **Imagery:** never use real-person photos, headshots, event photos, screenshots, charts, or data-viz. Use only the curated artwork in assets/images/ (see metadata.json). ## Page header (every page) - Anchor the **"The Protocol Institute" wordmark** (P-mark + serif text) on the **top LEFT**, linking to https://protocol-institute.org/; put the page/local brand + nav on the RIGHT. - **Menu/nav links are UPPERCASE** (Outfit), matching protocol-institute.org. - Use `.pi-wordmark` and `.pi-topnav` from brand.css. ## Choose a vein, then apply | Need | Vein | Color emphasis | Type emphasis | Imagery | |------|------|----------------|---------------|---------| | Report / SIG / challenge / institutional | institute | action-primary (cobalt) | serif display + Lora | technical-schematic, abstract-geometric | | Magazine piece / editorial | protocolized | action-secondary (forest green, live) + accent rust for Featured | Instrument Serif 400 + Lora | painterly-illustration, retro-vintage, surreal-collage | Note: cobalt `#0064ff` is the aspirational brand primary; the live protocolized.io still serves forest green `#0f6e56`. Use cobalt for new artifacts, green to match the production site. ## Accessibility (contrast is tested, not assumed) Run `node scripts/contrast-check.mjs` (no deps) to verify every token pairing against WCAG 2.1. The required pairings are the contract in `brand.json → color.accessibility.pairings`; add new combinations there, then re-run. Known constraints the test enforces: white on **accent** (#d85a30) is large-text/non-text ONLY (3.87:1); accent-as-text on accent-tint uses **accent-deep** (#9e3d18), never bare accent. Exit code is non-zero on any failure. ## Verify before shipping (definition of done) 1. `node scripts/contrast-check.mjs` — every token pairing meets WCAG AA (incl. on-dark). Exit non-zero on fail. 2. `node scripts/preflight.mjs ` — static lint: favicon, viewport, fonts linked, no emoji, text-wrap present, no `img{max-width:100%}` vs full-bleed conflict, button/`a{color}` footgun, raw-hex nudge. 3. `scripts/qc.md` — the **Playwright pass**: render at 1280×720 and 390px; measure contrast (esp. chrome over dark bands), label→title / title→body gaps (≥8px), image-fills-card, no horizontal overflow, fonts loaded (`document.fonts.check`), mobile menu works. Every issue this kit has paid for is a check here. ## Gotchas (these bit real builds — the components above prevent them) - A global `img{ max-width:100% }` silently caps a full-bleed card image — use `.pi-card--media` (`max-width:none`). - A global `a{ color }` reset can override `.pi-btn` text (white-on-cobalt → invisible) — keep brand.css's `a.pi-btn` rules. - A muted nav grey (`#a3a3ab`) fails AA on paper (2.36:1) — `text-secondary` (#5f5e5a, 6.11:1) is the lightest text color. - Dark text over a dark hero/CTA fails (1.23:1) — flip to on-dark (see the dark-surface rule). - A kicker/eyebrow with ~0px below it collides with its title — `.pi-eyebrow` carries the gap. - `.lead` (grey/larger) used as a peer paragraph next to body (dark) reads as "a different font" — use lead only as the dek under a heading. ## Files - `brand.json` — tokens (primitives + decisions, incl. dark-surface), typography, components, `build`, `quality`, veins, imagery, voice. `color.accessibility.pairings` is the contrast contract. - `brand.css` — `--pi-*` variables + the component & behavior layer (`.pi-btn`, `.pi-card`/`.pi-card--media`, `.pi-section-head`, `.pi-gutter`, `.pi-hamburger`/`.pi-mobile-menu`, `.pi-figure-cta`, on-dark utilities, orphan control). - `brand.js` — interactive substrate (mobile menu, gutter scroll-spy, on-dark auto-flip). Drop in once. - `scripts/contrast-check.mjs` — WCAG contrast test (`cd scripts && npm test`). `scripts/preflight.mjs` — static linter (`npm run preflight -- `). `scripts/qc.md` — Playwright definition-of-done. - `BACKLOG.md` — traceable log of issues found while building + their resolutions (and what's deferred). - `apply-protocol-institute-brand.md` — step-by-step instructions for applying the brand. - `DESIGN-protocolized.md` — full sampled spec (source of truth, prose). - `assets/logos/` — wordmark + P-mark (black/white, static + animated), New Nature key art. - `assets/images/` + `metadata.json` — 111 curated artworks with per-image palette (W3C named colors). ## Typefaces — LOAD THEM, don't just name them Declaring the stacks without loading the webfonts gives you system fallbacks (a common mistake). **Link `brand.css`** — it `@import`s Instrument Serif, Lora, and Outfit. (Or add the Google Fonts `` yourself.) Then use the role tokens: - **Display + ALL headings** → serif (`--pi-font-serif` → Instrument Serif), **weight 400 — never bold.** - **Body / prose** → `--pi-font-body` → Lora. - **UI** (buttons, badges, nav, meta, labels) → `--pi-font-sans` → Outfit. Serif at ≥18px; sans only for UI ≤16px. ("Computer Modern Serif" is the brand-kit preference at the front of the serif/body stacks; self-host it to override — otherwise the loaded Instrument Serif / Lora apply.) Check: if a heading renders in a sans or a generic serif, the fonts did not load — link brand.css. ## Live references - https://protocol-institute.org/ - https://protocolized.summerofprotocols.com/