Five palettes, a theme from one hue, your own colours or your design system's tokens. Problems sit opposite the data and passes differ from them in lightness, so the colours mean something together. The builder's Colours menu has them all.
Editing
Edited by hand
1 of 3 done [ █░░ ]
░ ▒ done█ done The lint passes░ ▒ done█ done Sources namedto do About 80 columns
glyph-kit read notes.md
Read back
2 of 3 done [ ██░ ]
░ ▒ done█ done The lint passes░ ▒ done█ done Sources namedto do About 80 columns
check
Every problem at once.
redraw
Draws figures again in place.
read
Turns an edited drawing back into its spec.
--with-spec
Keeps the spec beside the figure.
Change the drawing and read it back, or change the spec and redraw. Only the figure changes; the rest of the file stays as it was.
Open source
Using it in your own work: what the MIT licence allows and how to credit the kit if you want to, in the README.
CONTRIBUTING.md: what's welcome, the rules every change keeps and the checks to run. docs/adding-a-type.md walks through adding a type end to end, using palette.
Issue templates for a new type and for something that's wrong, and a pull request checklist. CI now also checks that the guides match the code.
Editing
Plain words to a screen.scripts/say.mjs reads lines such as "An email field. A Send button." into a screen spec (glyph-kit say "…"), from one closed list of names for each part, and says which words it couldn't place.
check lists every problem at once: a missing source, a colour on one row, the type's own data checks, labels that will be cut and frames that don't close. Problems exit 1; notes don't. Works on a spec, a list of specs or a Markdown file.
A figure keeps its spec beside it.--with-spec on render --to markdown and export --to md writes the spec after the figure in a folded <details> block; a figure can also name a spec file on the line above it.
redraw draws figures again in place. Only each figure's text and description change; the rest of the file stays as it was. redraw --check lists stale figures and exits 1, for CI or a pre-commit hook.
read turns an edited drawing back into its spec for tables, token tables, decision logs, QA checklists, now/next/later boards and colour roles. Columns don't have to line up; nothing is written when an edit can't be read exactly. Guide: reference/editing.md.
Focus
Call something out on any type."focus": { "on": ["M2"], "tone": "problem", "say": "Every cohort halves between M1 and M2." } names what to look at as it is drawn: a row label, a column heading, both, or any words in the figure. Instead of a colour on one row, which is still refused.
The same in every form. The text gets a ► line with the point, so it reads without colour. HTML, decks, SVG, PNG, PDF and the terminal paint the focus in its tone (problem, good or plain) and let the rest of its block recede. In a heatmap, cohort or calendar strip the receded cells keep their ramp colour, dimmed, and a plain focus keeps its own. In HTML and decks the focus arrives last and lands with the inverted flash, and the figure still settles within 600ms.
A name that isn't drawn is refused, in plain words, and check lists it with everything else.
Colour types
palette: a tonal scale. One column per hue, one row per step, each step's contrast on the page; ▲ marks the first step that reads as words. Steps out of order are named. Four hues fit in 80 cells.
colourRoles: what each colour is for. Role, token, light and dark values, each on its own page, and a verdict by use: words need 4.5 to 1 (7 for AAA), marks 3, lines 1.5, the same rule as the theme check.
Swatches in their own colour. In both types a swatch is ██ followed by its value. HTML, SVG, PNG, PDF and 24-bit terminals draw it in that colour; the text keeps the value, so it still reads.
Colour by role
Your colours. A theme is a palette name or a base plus the roles you change: { "base": "paper", "data": "#1f4fd6", "flag": "#b8421f" }. Put it on a spec, report or deck as theme, or pass --theme theme.json to render, export, deck and live. Guide: reference/colour.md.
From your design system. A roles block in design-system.map.json points roles at your tokens. HTML and decks write the token's var(--…) so your CSS wins; SVG, PNG and PDF use its fallback colour. A token with no fallback is refused.
Contrast is checked. Every colour you supply is checked against the page and the panel: 4.5 to 1 for words, 3 for marks, 1.5 for lines. A refusal names the pair and a nearby colour that passes.
A Halloween palette.--theme halloween: pumpkin data, bruise-purple lines and bone text on near-black, with its own ramp from bruise purple to pumpkin. In every form and in the site's Colours menu.
Problems and passes differ in lightness. In every palette, problems are now the darker colour, about 2 to 1 from passes, as drawn and when red or green is seen weakly, so colour-blind readers can tell them apart. paper becomes oxblood and green, ink coral and mint, phosphor amber and pale green, gilt terracotta and bright gold; phosphor and gilt passes no longer share the data colour. paper's pair also fell under 4.5 to 1 for those readers and now passes. Before and after: docs/palette-lightness.md.
How a theme's colours relate. Four rules, measured in OKLCH: the ramp follows the data hue, problems sit opposite data and are loudest, passes differ from problems in lightness as well as hue, and the neutrals carry the data hue. A theme that breaks one still draws, with a note that names the pair and a nearby colour that fits; check theme.json and check spec.json --theme theme.json list them. docs/theme-rules.md has each palette against the rules.
A theme from one hue.{ "base": "ink", "mixed": "#7a5cff" } or --theme mixed:#7a5cff:dark derives every role from one hue so that the four rules and every contrast check hold, light or dark. The builder's Colours menu has it as Mixed.
A ramp for density grids. Four colours for ░ ▒ ▓ █ in heatmap, cohort and calendarStrip, drawn solid in SVG. Elsewhere shades keep the data colour, so the density ladder means the same thing.
Colour in the terminal. Text drawn to a terminal is coloured by role in the 16 standard colours: problems red, passes green, lines dim. NO_COLOR and --no-color turn it off; --color turns it on for a pipe. Markdown and files stay plain.
Every figure on the site moves. Moving diagrams loop side by side; every other figure arrives again on a 6-second cycle while it is in view. A figure holds still while hovered or focused, off screen or in a hidden tab, and reduced motion shows stills. Layouts now arrive in reading order too, in decks and on the site. autoplay(…, { solo: false }) lets a page play every moving diagram in view instead of one.
Pick the colours on the site. The builder has a Colours menu with the four palettes; exports use the one you pick.
Colour follows meaning.color on a node, bar or row is refused.
Paper passes its own rule. Its problem colour is darker (#c4401c to #b8391a) and its secondary text a touch darker (#6d6c66 to #6b6a64), so both reach 4.5 to 1 on the panel.
Existing specs need no changes. The text form is unchanged.
Long flow labels wrap instead of being cut. A flow box no longer cuts a label over 24 cells; it wraps it onto more lines. Agents were spending turns shortening labels and drawing again: with this fix, a flow costs a third less to make in Claude Code.
A meter below its cap never draws as full. 64 of 65 used to fill every cell.
Layout pages and reports embed Departure Mono again, so they line up offline.
A comparison arrives as one move. The before column steps in, and the after column starts as soon as it has settled, instead of 600ms later. A journey map's stages follow each other within 240ms.
"over" in a label stays plain. "over" and "fails" are painted as problems only as the verdict at the end of a line, so a label such as "Processes over time" is no longer red.
Contrast thresholds on a narrow scale. The 3, 4.5 and 7 labels keep a space between them; one that would touch its neighbour is dropped and its ┊ still marks the place.
Site
A Changelog page at /changelog/, every release newest first.
Problems and passes on the site follow the same rule: paper's pair in light mode, ink's in dark.
The kit against HTML/JS, measured again on the current kit: cheaper, faster and fewer tokens written on every run, for all five deliverables tested in Claude Code.
Every type moves. In HTML pages and decks, each type arrives once in the order that carries its point, then stays still: bars at one speed so the longest lands last, diagrams growing from their start along their lines, tables in reading order, journeys stage by stage, a before and after changing into its after. A small ↺ plays a figure again. Steps are 40ms and a figure settles within about 600ms. Reduced motion, print, Markdown and text show the figure as it is.
Six processes keep moving: loop, funnel, states, queue, rollout and loading, in a Processes area with their own guide. They move exactly as in 0.1.0 and start from their still. A funnel accepts a list of steps or {steps: [...]}.
A test result can move. Give abResult readings over time ({ days, readings: [{ day, people, variants }] }) and it steps through them: the intervals narrow, numbers change in place, and the verdict switches when the intervals part. Without readings it is drawn as before.
Motion timing and easing play at real speed. Each row gets its own box, all starting together, so 150ms against 200ms, or one curve against another, can be felt.
Steadier playback. Moving diagrams redraw once per 120ms step, and only the one most in view plays. Deck titles appear whole; prototype buttons answer a press; hover only fires where hover exists.
Standalone moving pages embed Departure Mono (with its SIL OFL notice) so they line up offline, have a Still button to pause them, and carry only the code their types need: the loop page drops from 206 KB to 110 KB.
Layouts
Document layouts. Five new types put a whole deliverable on one page: readout, dashboard, prSummary, designReview and statusUpdate. Each has fixed slots: a sentence, short lists and ordinary specs. Code places everything within 80 cells; figures share a row only when they fit with a 4-cell gap. HTML and PDF give one page in Departure Mono and the kit's palette, and a list of layouts exports as one document, a layout to a page. Guide: reference/areas/layouts.md.
Screen layouts.appShell (header, sidebar, content), cardGrid, listDetail and modal place the screen primitives in regions inside one frame.
Bounded layouts. Every figure fits in 80 cells. Long labels are cut at 24 cells with …; more than 16 rows end with "… and N more rows"; a layout that can't fit says so in plain words.
Stacked marks get room. Rows of bars, tracks and curves have a blank row between them; the state machine draws its transitions in lanes.
A cheaper skill
Less to read. SKILL.md has the types picker inline and one render-and-fix loop (7.9 KB to 6.6 KB); area guides use tighter JSON (75 KB to 65 KB). glyph-kit.mjs guide <type> prints one type's spec and notes without reading a whole guide.
Right first time. Labels cut with … are listed on stderr with their limit, so the agent can shorten them. The agent works in the user's folder, not the skill's.
Faster. The command line loads only what a command needs; text that is only ASCII, box drawing and blocks skips Unicode segmentation, so figures draw about 4× faster.
Reports show the figure as text in Departure Mono, coloured by role, so the page copies as text. The example report goes from 73 KB to 46 KB.
Smaller install. The skill holds only what an agent needs; the zip is 205 KB with 60 types, down from 495 KB, and the plugin installs only skills/glyph-kit.
Handoff
Component anatomy. A new type, anatomy, draws a component's container with its parts inside, numbered on their edges, and a legend of each part's name and rule; optional parts have dashed edges. Parts sit in a row (a text field) or a column (a card). It arrives part by part in number order, each part with its legend line.
Language
Labels in any script. Widths count display cells, so Chinese, Japanese and Korean take two and graphemes stay whole. The lint flags mixed right-to-left text.
lang. An optional language tag, like "de" or "tr": numbers get local separators, uppercase follows the language, and HTML, decks, reports and MDX declare it.
60 types in ten areas. Existing specs need no changes; regenerate standalone pages to get the new player and the font.
45 kinds of figure in 8 areas: research data, experiments and metrics, UX flows, planning, wireframes, design system, handoff and QA, motion. Drawn by code from a small JSON spec, not by the model.
6 moving diagrams: rework loop, funnel, state machine, work queue, staged rollout and loading sequence, as one HTML page that plays, or a still for docs.
Exports: text, Markdown, MDX (static, or components for Astro and React), HTML prototypes, presentable decks, A4 reports as PDF, SVG and PNG. Four palettes.
Design-system map: the agent builds screens with your real components and tokens.
Data guardrails: no source, no numbers; made-up data is stamped SAMPLE DATA in every format; data read from CSV or JSON files; each kind refuses data that can't be true.
Token guardrails: pass specs, not drawings; --compact plain ASCII for model context; a token estimate and a warning when text likely costs more than an image.
Layout rules and a checker: measured characters, closed frames, padding inside boxes, one line height, a density scale.
Install as a Claude Code plugin, with npx skills add, or by copying the folder for Claude Code or Codex.