skill/lede/SKILL.md, laid out
The reference, for people.
A model reads Lede's reference as 2,908 tokens of dense notes. This is the same language set out to read: one section per kind of block, and an example in each that opens in the playground, so you can change it and watch the page.
The shape of a page
- One line is one block. Nothing nests and nothing closes, except
```code fences and thealt/optblocks in a sequence diagram. Indentation never matters. - You write content; the compiler owns the look. Layout, color, dark mode and the phone layout are decided for you, so a page never carries styling.
- Keywords are lowercase and start the line:
datacharttablekpidiagramimagegridcardsstep. A mistyped keyword fails loudly instead of turning into prose. - Declare before use. A data set or a diagram is declared above the first line that uses it.
- Escape with a backslash. Prose that begins with a keyword, or with
#->!, takes a\in front.
Text
Most of Markdown works as you expect. A few lines at the top describe the page.
@title@subtitle@author Name, Role@date@width wide- The page's title block and settings.
######- Headings, three levels.
- Plain lines
- Paragraphs. Consecutive lines join; a blank line ends the paragraph.
-1.- [ ]- [x]- Bullets, numbered items, open and done tasks.
--or-- 1.nests one level under the item above. >- A quote. A last quote line that starts with
—is the attribution. ---- A horizontal rule.
- Inline
`code`,**bold**,*italic*,[link text](https://…).```lang- A code fence with an optional language.
```=htmlfences raw HTML, which is sanitized.
@title Checkout, week 42 @subtitle Weekly status for the payments team # Where we are Plain lines are paragraphs. Use **bold**, *italic*, `code` and [links](https://example.com) inline. - Card retries ship Thursday - [x] Migrate the ledger - [ ] Remove the old webhook -- Waits on the partner's cutover > Ship the boring version first. > — The on-call handbook ! The cache now expires on write. \table stakes: a line that starts with a keyword takes a backslash.
Callouts
!- A note.
!!- A warning.
!!!- Critical: an outage, data loss, stop the line.
! The cache now expires on write. !! Two flags depend on billing_v2. !!! Writes are paused until 04:00.

Data
Declare a data set once and refer to it by name from charts, tables and tiles.
- Rows are separated by
;and fields by,. The first row is the header. - Quote a field that contains
,or;:"Smith, J","$1,450". A comma inside**bold**does not split a field. data runs += …appends rows later in the page.- Chart cells are plain numbers. Put the unit in the chart's
unit=, not in the cell.
data runs = week,deploys,rollbacks; W1,14,2; W2,19,1; W3,23,3 data runs += W4,31,1; W5,28,2 kpi Deploys this week | =runs.deploys chart bar runs y=deploys labels title="Deploys per week" table runs sort=-deploys limit=3 title="Busiest weeks"
Charts
chart KIND DATA [options] draws a data set by name.
| Kind | Use it for |
|---|---|
line | Longer trends. |
area | A trend where the total matters; stacks with stack. |
bar | Up to 12 points, vertical. Several y columns are grouped. |
hbar | Long category names and rankings. |
range | Spans on a real scale: schedules, deadlines, safe ranges. |
data runs = week,deploys,rollbacks; W1,14,2; W2,19,1; W3,23,3; W4,31,1; W5,28,2; W6,34,1 chart line runs mark="W3 freeze lifted" title="Deploys per week"

Options
| Option | What it does |
|---|---|
x=col | The x column. Default: the first column. |
y=col,col | The series. Default: every numeric column. Names may contain spaces: y=open bugs,closed bugs. |
title="…" | A title above the chart. |
unit=ms | A unit for the values: $, % or any suffix. |
stack | Stacks the series (bar, hbar, area). |
labels | Prints the values. labels=end labels only the last point; labels=all every one. Bars get labels on their own when they fit. |
min= max= | The axis range. |
focus=col or focus="Thu" | Highlights one series and greys the rest, or emphasizes one bar by its x value. |
target="99.9 SLO" | A dashed reference line at that value, with an optional label. |
mark="W3 deploy" | An event: the x value as written, then a label under 24 characters. Repeat it 2 to 4 times; not on hbar. |
hatch="Thu" | Stripes a bar to show it is an estimate. |
from=col to=col | Range charts: the start and end columns, numbers or ISO dates. Add at=col for a marker per row and bands=400,5000 for up to 4 labelled thresholds. |
Series named good, neutral and bad, or done, at risk and blocked, take status colors on their own.
data latency = day,p50,p99; Mon,82,190; Tue,85,240; Wed,80,180; Thu,88,410; Fri,84,200 chart bar latency y=p99 unit=ms focus="Thu" target="250 SLO" title="p99 latency" data cost = service,usd; Compute,18400; "Storage, S3",6100; Network,3900 chart hbar cost unit=$ title="Cost by service"
data plan = task,start,end; Design,2026-03-02,2026-03-20; Build,2026-03-16,2026-05-08; Test,2026-04-27,2026-05-22 chart range plan from=start to=end target="2026-05-01 freeze"

Tables
table runs- Every column of a data set.
cols=week,deploys- Only these columns.
sort=colsort=-col- Ascending, or descending.
limit=5title="…"- The first rows only; a title.
table = a,b; 1,2- A one-off table written inline.
heatheat=col,col- Shades numeric cells by rank, for scorecards.
bar=coltarget=col- A bar behind that column's numbers, and a tick at a target.
A cell that is just a status word (Done, On track, Ready, At risk, In progress, Blocked, Failed, Go, No-go) becomes a colored pill, so write the plain word. Cells may use inline markup.
table = service,owner,p99,status; Checkout,Ana,182 ms,On track; Search,Wei,240 ms,At risk; Ledger,Sam,95 ms,Blocked; Billing,Ola,120 ms,Done

data teams = team,coverage,open bugs,target; Payments,82,4,90; Search,64,11,80; Ledger,91,2,90 table teams heat=open bugs table teams bar=coverage target=target
Metric tiles
kpi label | value | change | tone. Consecutive kpi lines form one row; a lone one is a large hero number.
- The tone is
good,badorneutraland colors the change. A short note can take its place; a note that is just a status word or a date shows as a chip. =runs.deploysas the value takes the last value of a data column.baras the tone draws a progress bar from 0 to 100.
kpi Uptime | 99.97% | +0.02 pts | good kpi p99 latency | 182 ms | -12% | good kpi Cost | $41,200 | +8% | bad

Diagrams
Declare a diagram with diagram NAME, then write its lines prefixed with the name and a colon. The compiler lays it out.
id "Label" kind "sub label" focus- A node. The kind is a short tag: user, svc, fn, db, queue, cache, lb, ext, store, team, or decision (a diamond; label its exits yes and no). Put
focuson the one or two nodes that matter. An id you never declare still becomes a node. a -> b : label- An edge.
-->is dashed (async, reply, optional),<->runs both ways,-x-is a path that must not exist. Chain witha -> b -> c; fan out witha -> b, c. Keep labels to three words. group id "Label" members…- A box around nodes. A member can be another group, which nests it (account, VPC, subnet), and an edge can point at a group.
dir=LRdir=TB- Left to right, or top to bottom (the default).
legendadds a key.
diagram arch dir=LR arch: user "Customer" user arch: api "Payments API" svc focus arch: db "Orders DB" db arch: q "Events" queue arch: user -> api : https arch: api -> db : sql arch: api --> q : async arch: group vpc "VPC 10.0.0.0/16" api, db, q

Sequence diagrams
diagram NAME sequence, then the participants, the messages in order, and notes such as login: note app : checks password. alt "cond" … else "cond" … end and opt "cond" … end mark branches; they do not nest.
diagram login sequence login: browser "Browser" user login: app "Web app" svc login: idp "Identity" ext login: browser -> app : POST /login login: app -> idp : verify login: idp --> app : ok login: app --> browser : 302 + cookie

Layout
cards- The
###sections that follow become a grid of cards, for options side by side. step Action | by 03:00 | Owner- Consecutive step lines become numbered step cards, the deadline as a chip.
grid 2grid 3grid 2 count=4- The next blocks sit side by side.
image file.png "Alt text" caption="…"- An image, with alt text that describes it.
step Rotate the certificate | by 03:00 | Ana step Drain the old pool | by 03:30 | Wei step Re-enable writes | by 04:00 | Sam

grid 2 kpi Error budget left | 62% | on track | bar kpi Pages this week | 3 | -2 | good --- cards ### Retry with backoff Simple, and the queue absorbs the spikes. ### Circuit breaker Fails fast, but needs a fallback path.
Choosing a block
| To show | Use |
|---|---|
| A trend | chart line, or chart bar for up to 12 points |
| Exact values | table; repeat a chart's data in one only when the exact values matter |
| The headline number | A lone kpi line |
| Thresholds or contacts in a runbook | A row of kpi tiles at the top |
| Structure | diagram |
| A scorecard, progress or share | table … heat, bar= |
| Options side by side | cards |
| Dated actions | step |
| Spans on a scale | chart range |
Write numbers with their unit: 54.7%, $17.2M, 182 ms. Lede pages carry no HTML unless there is no other way, and no Markdown tables or Mermaid.
As a model reads it
The text below is the reference exactly as the skill gives it to a model. The project caps it at 2,910 tokens, counted the way Claude 5.5 counts them: a word is added only if it still fits. The full specification has the grammar.
Show the 2,908-token reference
Lede is a line-oriented page format. One line is one block; nothing nests or closes (except ``` fences and sequence alt/opt blocks); indentation never matters. You write content; the compiler owns layout, color, dark mode and phone layout, so never write styling. Text ``` @title Page title (meta: also @subtitle, @author Name, Role, @date, @width wide) # Heading 1 / ## Heading 2 / ### Heading 3 Plain lines are paragraphs; consecutive lines join. A blank line ends a paragraph. - bullet 1. numbered - [ ] task - [x] done task -- sub-bullet -- 1. sub-step (one level, under the item above) > quote line > — Attribution (last quote line starting with —) ! A note callout. !! A warning callout. !!! A critical callout (outage, data loss, stop-the-line). --- (horizontal rule) \Escape: a leading backslash makes the line plain text (for prose starting with a keyword like "table" or "data", or with #, -, >, !). ``` Inline: `code`, **bold**, *italic*, [link text](https://example.com). Code: a ``` fence with an optional language; ```=html fences raw HTML (sanitized). Data: declare once, reference by name. Rows are separated by `;`, fields by `,`. Quote fields containing `,` or `;`: "Smith, J", "$1,450". A comma inside **bold** does not split the field. The first row is the header. ``` data runs = week,deploys,rollbacks; W1,14,2; W2,19,1; W3,23,3 data runs += W4,31,1; W5,28,2 (append rows later) ``` Charts: `chart KIND DATA [options]`. KIND is `line`, `area`, `bar` (vertical; grouped for several y columns), `hbar` (horizontal; use for long category names or rankings) or `range` (to-scale spans: schedules, deadlines, safe ranges). ``` chart line runs x=week y=deploys,rollbacks title="Deploys per week" chart bar runs y=deploys labels data cost = service,usd; Compute,18400; "Storage, S3",6100 chart hbar cost unit=$ title="Cost by service" data plan = task,start,end; Design,2026-03-02,2026-03-20; Build,2026-03-16,2026-05-08 chart range plan from=start to=end target="2026-05-01 freeze" title="Plan" ``` Options: `x=col` (default: first column), `y=col,col` (default: every numeric column; column names may contain spaces: `y=open bugs,closed bugs`), `title="..."`, `unit=ms` (or `$`, `%`, any suffix), `stack` (bar/hbar/area), `labels` (print values), `min=` / `max=` (axis range), `focus=col` (highlight one series, grey the rest) or `focus="Thu"` (emphasize one bar by its x value), `target="99.9 SLO"` (a dashed reference line at that value, with an optional label), `mark="W3 deploy"` (an event: the x value as written in the column, then a label; repeatable, 2 to 4 per chart, under 24 characters; not hbar). `range` takes `from=col to=col` (numbers or ISO dates), optionally `at=col` (a marker per row) and `bands=400,5000` (labelled threshold ticks, up to 4). `labels=end` labels only the last point; `labels=all` labels every value. `hatch="Thu"` stripes an estimated bar. Series named good/neutral/bad, done/at risk/blocked and similar take status colors. Bars get value labels automatically when they fit. Cells must be plain numbers (no units inside cells; put the unit in `unit=`). Tables: ``` table runs (all columns) table runs cols=week,deploys sort=-deploys limit=5 title="Busiest weeks" table = option,cost,verdict; SQS,low,**chosen**; Kafka,high,overkill (inline, one-off) table runs heat (rank numeric cells by value; or heat=col,col) table runs bar=deploys (a bar behind that column's numbers) table runs bar=deploys target=rollbacks (a tick per bar at the target value) ``` `sort=col` ascending, `sort=-col` descending. Cells may use inline markup. A cell that is just a status word (Done, On track, Ready, At risk, In progress, Blocked, Failed, Go, No-go…) renders as a colored status pill, so write the plain word. Numbered lists render as step lists. Metric tiles: consecutive kpi lines form one row. ``` kpi Uptime | 99.97% | +0.02 pts | good kpi p99 latency | 182 ms | -12% | good kpi Cost | $41,200 | +8% | bad kpi Deploys | =runs.deploys (last value of a data column) kpi Migrated | 58% | on track | bar (progress bar, 0 to 100) ``` A lone kpi line renders as one large hero number. A note that is just a status word or a date shows as a chip. Fields: label | value | change | tone (`good`, `bad`, `neutral`) or a short note. Tone colors the change. Diagrams: declare, then write lines prefixed with the diagram's name and a colon. ``` diagram arch dir=LR title="Production topology" arch: user "Customer" user arch: api "Payments API" svc "ECS, 6 tasks" focus arch: db "Orders DB" db arch: user -> api : https arch: api -> db, cache : sql arch: q --> worker : async arch: a <-> b arch: group priv "Private subnets" api, db arch: group vpc "VPC 10.0.0.0/16" priv, lb arch: legend (a key to node kinds and arrows) ``` - Node: `id "Label" [kind] ["sub label"] [focus]`. Kind is a short lowercase tag: user, svc, fn, db, queue, cache, lb, ext, store, team, decision (diamond; label its exits yes/no)... Use `focus` on the 1–2 nodes that matter most. Undeclared ids become nodes. - Edge: `a -> b : label`; `-->` dashed (async, reply, optional); `<->` both ways; `-x-` a blocked path that must not exist; chains `a -> b -> c`; fan-out `a -> b, c`. Keep labels short (≤ 3 words). - Group: `group id "Label" members...`; members may be other group ids, which nests them (account > VPC > subnet). - An edge may point at a group id (`vpc -> tgw : attach`). - `dir=LR` (left to right) or `dir=TB` (top to bottom, default). Sequence diagrams: `diagram NAME sequence`, then participants, messages in order, and notes. ``` diagram login sequence title="Login" login: browser "Browser" user login: app "Web app" svc login: browser -> app : POST /login login: note app : checks password login: alt "password ok" login: app --> browser : 302 + cookie login: else "bad password" login: app --> browser : 401 login: end ``` `opt "cond"` also works; blocks do not nest. Layout: ``` cards (the ### sections that follow become a grid of cards) step Rotate the cert | by 03:00 | Ana (consecutive step lines: numbered step cards, deadline as a chip) image chart.png "Alt text describing it" caption="Optional caption" grid 2 (the next 2 blocks sit side by side; `grid 3`, or `grid 2 count=4` for 4 blocks in 2 columns) ``` Rules: keywords (`data chart table kpi diagram image grid cards step`) are lowercase and start the line. Declare every data name and diagram above its first use. Charts for trends, tables for exact values, kpi tiles for headline numbers, diagrams for structure. `bar` for up to 12 points of one series, `line` for longer trends. The one headline number goes on a lone kpi line; a runbook opens with a kpi row of thresholds or contacts. Repeat a chart's data in a table only when exact values matter. `heat` for scorecards, `bar=` for progress or share columns. Write numbers with their unit: 54.7%, $17.2M, 182 ms, never "percent" or "million". `cards` compare options side by side, `step` lists dated actions, `chart range` shows spans on a scale. Lede only: no HTML unless unavoidable, no Markdown tables, no Mermaid.