Repo: brand
Rendered from spec at76d46f3 (2026-10-25) · its source · Edit this page
Status: Accepted
The design system — logo assets, colour/type/space tokens, and usage docs,
packaged as @lemonfiber/brand. Consumers take it as a commit-pinned git
dependency; nothing is published to a registry yet.
Implements: 60-brand, the design-token contract.
What this repo is
The single source of the brand: SVG marks, tokens as CSS + JSON, and the detailed
usage docs. Pull assets from here rather than re-drawing or re-exporting — that is
the repo’s whole purpose, and the reason it’s a repo rather than a folder in lemonfiber.
lemonfiber’s web UI consumes it as a dependency pinned to a commit
(contract); the marks are also
referenced where the web UI shows a logo.
Layout
brand/
├── assets/logo/ SVG marks — proprietary (see licence)
├── tokens/
│ ├── tokens.css CSS custom properties
│ └── tokens.json the same values as data
├── .docs/
│ ├── colour.md full palette + rules
│ ├── typography.md
│ ├── logo-usage.md clear space, minimums, pairings
│ └── asset-sheet.html contact sheet
├── package.json @lemonfiber/brand
├── CHANGELOG.md
├── LICENSE marks — proprietary
├── LICENSE-tokens tokens + docs — open
└── README.md
The split licence
This repo is where the project’s “open source, protected brand” position becomes concrete (licence rationale):
| Path | Licence | Why |
|---|---|---|
assets/logo/* |
Proprietary, all rights reserved | Trademark protection — anyone could otherwise ship a fork under the exact name and mark |
tokens/* |
Open (same as tokens are meant to be embedded) | The web UI embeds them; they must be freely usable |
.docs/* |
CC BY-SA 4.0 | Documentation, like the spec |
This is the standard pattern — Rust, Mozilla and Python all protect marks inside
open projects. The LICENSE file governs the marks; LICENSE-tokens governs the
rest, and the README states the split at the top so no one mistakes the marks for
freely reusable.
What the spec owns vs. this repo
Spec (60-brand/, contracts) |
This repo (.docs/) |
|---|---|
| The token schema and versioning | The token files |
| The accessibility contract + CI check | — |
| Surface mapping (web/TUI/CLI) | — |
Binding rules as DES-R |
Full usage guidance, clear-space maths, the contact sheet |
The rule of thumb matches every other repo: what and why, and cross-repo contracts, are the spec’s; the detailed how is the repo’s.
CI
| Check | Enforces |
|---|---|
spec-check |
Governance — every change cites a spec identifier (GOV) |
tokens (scripts/check_tokens.py) |
Every colour in tokens.json appears in tokens.css as --lf-color-<name> with the same value; ink, ink-soft, text-muted, leaf and fiber-deep each meet WCAG AA on paper; --self-test first holds the arithmetic to ratios WCAG states |
The check compares colours only: the font, size, space and radius groups, the
stylesheet’s --lf-color-text and the ink theme are not compared, so ARCH-R38’s
identical values are checked for colours alone. The contrast half computes the
ratio of each of those five colours on paper and fails on one below AA; no other
surface, and neither theme’s other pairings, are measured, so it covers part of
what ARCH-R40 asks. A recolour that looks fine and fails that meter is caught
here, not in the web UI.
Publishing
@lemonfiber/brand is not published to a registry and has no tags, so consumers
pin a commit. A consumer moves the pin
deliberately (cite GOV-R12) to pick up a brand change — the
token contract keeps
brand and binary decoupled, so a recolour never surprises a shipped lemonfiber.
Governing aesthetic change
Brand is judgment-heavy. The governance resolution:
changes within the rules (a new export, a recolour inside the palette) cite
GOV-R12; changes to what the rules permit are DES-R changes following the
normal lifecycle. This keeps the repo under governance without pretending
aesthetics are requirements.
Requirements
| ID | Requirement |
|---|---|
| REPO-R29 | The marks MUST be licensed proprietary; tokens and docs MUST be openly licensed, with the split stated in the README. |
| REPO-R30 | CI MUST verify tokens.css and tokens.json hold identical values. |
| REPO-R31 | CI MUST run the contrast check and fail on a body pairing below WCAG AA. |
| REPO-R32 | A release MUST publish @lemonfiber/brand, and lemonfiber MUST consume a pinned version. |
| REPO-R33 | Aesthetic changes within the rules MAY cite GOV-R12; changes to the rules MUST be DES-R changes. |
Related
- 60-brand/ — the brand section
- design-tokens contract
- licence rationale
- ADR-0004 Four-repo split — why brand is its own repo