Brand system for OpenPlan Labs — the single source of truth for colour, mark, type, figures, and voice across pymapf, PythonPDDL, cuda-planning, planviz, openplan-bench, awesome-pddl and pddl-examples.
If a repo's colours drift from this one, this repo wins.
Frontier — cool paper, three semantic values, one warm.
Every search has the same three sets: the nodes you have expanded, the nodes on the frontier, and the path you returned. So the palette is that legend rather than a scheme figures have to be matched to. A correctly drawn figure is on-brand by construction.
The only warm colour in the system is the solution.
Generated by tokens/frontier.mplstyle — the
palette applied by a stylesheet, not by hand.
| Role | Token | Light | Dark |
|---|---|---|---|
| Ground | --color-bg |
#f2f4f6 |
#12171a |
| Raised | --color-bg-raised |
#ffffff |
#1a2126 |
| Hairline | --color-line |
#d9dfe4 |
#2a343a |
| Heading | --color-heading |
#14181c |
#e8edf0 |
| Body | --color-body |
#3c464e |
#aab6bd |
| Muted | --color-muted |
#5e6a73 |
#7d8b93 |
| Faint | --color-faint |
#7b8790 |
#59666e |
| Path (accent) | --color-path |
#c2472c |
#e87a5c |
| Frontier | --color-frontier |
#127a78 |
#3fb3ad |
| Expanded | --color-expanded |
#6d8298 |
#8ba2b7 |
frontier and expanded are semantic, not decorative — they mean "open
list" and "closed list". Charts needing more series use the separate agent ramp
in brand/figures.md.
Light-first, because papers, README images and notebook output are where this
work is actually seen. Full rationale and measured contrast in
brand/palette.md.
| Role | Family |
|---|---|
| Display / label | Libre Franklin 600 |
| Prose | Charter 400 |
| Code | IBM Plex Mono 400 |
Charter because it is the serif of computer-science writing — drawn by Matthew
Carter in 1987 to survive bad rendering, and carrying technical papers ever
since. Reasoning in brand/typography.md.
brand/
├── palette.md the legend-as-palette, accent budget, accessibility
├── typography.md three roles, the scale, why Charter
├── figures.md THE important one — how to draw grids, plots, animations
├── logo.md the mark, and the currentColor/<img> trap
└── voice.md how the writing sounds
research/
├── palette-study.md four directions, and the legend-as-palette decision
└── mark-study.md four concepts, and what rendering caught
tokens/
├── tokens.css CSS custom properties, light + dark
├── tokens.json design-token JSON
├── tailwind.css Tailwind v4 @theme block
└── frontier.mplstyle matplotlib style — use this in every notebook
assets/
├── logo/ SVG marks, light and dark, plus favicons
└── figures/ the reference figure above
In a notebook or a plotting script:
plt.style.use("tokens/frontier.mplstyle")On the web, include tokens/tokens.css and style through
the custom properties — never hard-code a hex in a repo. The dark theme is
handled for all three viewer states (prefers-color-scheme, an explicit
data-theme="dark", and an explicit data-theme="light" overriding a dark OS).
Two traps worth knowing before you use the mark, both found by rendering rather
than reasoning, both written up in brand/logo.md:
currentColor does not survive an <img> boundary, and --color-path on
light paper sits at exactly 4.50:1 with no headroom.
Split, because the tokens and the mark are not the same kind of thing. Full
terms in LICENSE.
| Scope | Licence |
|---|---|
tokens/, brand/, research/, assets/figures/, README.md |
MIT |
assets/logo/ — the mark and wordmark |
All rights reserved |
MIT rather than CC-BY-4.0 because planviz already ships
tokens/frontier.mplstyle inside an MIT wheel on
PyPI, and one licence across the org is worth more than the closer fit CC-BY
would give a file of colour values.
So: copy the palette, the stylesheets and the prose freely, with attribution as MIT requires. The mark is reserved — you may reproduce it to refer to OpenPlan Labs or to link here, but not as the identity of your own project. Everyone may use the colours; nobody should ship the mark as their own.

