ASCIICHARTS
An agent skill for charts made of text — drawn right
Ask Claude for a chart in a reply, a PR, a commit message or a terminal: bars, lines, sparklines, histograms, pies, heatmaps — lengths that match the values, frames that stay straight in any font, series you can tell apart without color. It draws them by hand from the principles, or renders them exactly when a renderer is at hand.
/plugin marketplace add boligolov/asciicharts /plugin install asciicharts@asciicharts
claude plugin marketplace add boligolov/asciicharts claude plugin install asciicharts@asciicharts
curl -fsSL https://asciicharts.online/asciicharts.skill -o /tmp/asciicharts.zip mkdir -p ~/.claude/skills && unzip -o /tmp/asciicharts.zip -d ~/.claude/skills
Invoke-WebRequest https://asciicharts.online/asciicharts.skill -OutFile $env:TEMP\asciicharts.zip Expand-Archive $env:TEMP\asciicharts.zip $env:USERPROFILE\.claude\skills -Force
Then just ask for a chart. More on installing
╭──────────────────────────────────────────────────────────────────────╮ │ Build time by stage (s) │ ├──────────────────────────────────────────────────────────────────────┤ │ Compile │ │ before caching │ ██████████████████████████████████████████████ 64 │ │ after caching │ █████████████████████████████░░░░░░░░░░░░░░░░░ 40 │ │ │ │ Test │ │ before caching │ ███████████████████████░░░░░░░░░░░░░░░░░░░░░░░ 32 │ │ after caching │ ████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 22 │ │ │ │ Lint │ │ before caching │ ████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 16 │ │ after caching │ ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 10 │ │ │ │ Package │ │ before caching │ ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 8 │ │ after caching │ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 5 │ ╰──────────────────────────────────────────────────────────────────────╯╭──────────────────────────────────────────────────────────────────────╮ │ Build time by stage (s) │ ├──────────────────────────────────────────────────────────────────────┤ │ Compile │ │ before caching │ ██████████████████████████████████████████████ 64 │ │ after caching │ █████████████████████████████░░░░░░░░░░░░░░░░░ 40 │ │ │ │ Test │ │ before caching │ ███████████████████████░░░░░░░░░░░░░░░░░░░░░░░ 32 │ │ after caching │ ████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 22 │ │ │ │ Lint │ │ before caching │ ████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 16 │ │ after caching │ ███████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 10 │ │ │ │ Package │ │ before caching │ ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 8 │ │ after caching │ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 5 │ ╰──────────────────────────────────────────────────────────────────────╯
Real render_chart() output, frame and title included — flip MONO / COLOR or BLACK / WHITE right on the chart.
// knowledge first
The principles
asciicharts principles v1.4 — how to build charts out of text characters right, for a person, an agent, or a port to another language. A chart conforms when it meets the requirements; a renderer conforms when it reproduces theconformance suitebyte for byte. Licensed CC BY 4.0: use them, adapt them, build on them — with credit.
A grid of equal cells
A text chart is a rectangle of cells, one glyph each. Lengths are counted in cells — never eyeballed — and every line has the same display width: CJK counts two columns, a combining accent none.
Glyphs every font has
A glyph missing from the reader's font is borrowed from another one and breaks the alignment. The safe alphabet is WGL4 — whole █ blocks, light box lines, four shades — plus a pure-ASCII mode for anywhere.
Arithmetic, written down
cells = round(v / max × W), half away from zero. A non-zero value never disappears. Stacks split by the largest remainder, so equal totals get equal lengths.
Zero is an axis
Negative values grow the other way from a zero line that belongs to no bar — stacked bars too — so +3 and −3 are the same length and zero draws nothing.
Identity without color
Text often has no color. Every series gets its own glyph, densest first, and a legend with the same glyph; numbers are printed wherever the grid is only approximate.
Every rule has a reason
Each rule is tied to the mistake that made it: a pie slice that vanished, a label that read −28.00 for −28, a boxplot median missing from Consolas. Normative requirements, MUST and SHOULD, in §15.
// the reference implementations
Two, byte for byte
Go — one static binary for the command line, a library, an MCP server — and Python, one standard-library file. Both pass the conformance suite and agree on tens of thousands of random specs.
Deterministic
A pure function of the spec: no clock, no randomness, no terminal probing. Same input, same bytes — safe to snapshot, diff and commit.
Built to be called by machines
Strict, bounded input and one-line errors that say what to fix — error: row 3, column "v" is not a number: "n/a" — so a script or an agent can correct itself. Text from untrusted data can't smuggle escape codes into a terminal.
Gets the hard cases right
Negative values grow both ways from a zero line, stacked ones too. Dirty CSV numbers ($1,200, 12%, decimal commas) are parsed, not silently dropped. Labels in any script — 東京, été, 🍕 — keep the frame straight.
Font-safe by default
Whole █ blocks, glyphs even Consolas has, a pure-ASCII mode for terminals and mail. No ragged right edges.
No side effects
The renderer writes nothing and opens no sockets. The server is stateless and records nothing.
// four ways in
Pick the one that fits
Agent skill
Claude Code and other agents
Teaches an agent to draw a correct text chart by hand — lengths computed, rows counted, then checked — and to use a renderer when there is one.
Command line
scripts, CI, terminals
One static binary (Go), or one Python file. A JSON spec or a CSV file in, a chart out.
Library
Go and Python programs
The same renderer in your code: a pure function from a spec to a string, standard library only.
MCP server
any MCP client, one shared deployment
Two tools: list_charts (the catalogue) and render_chart. stdio or stateless streamable HTTP. One static Go binary.
// the gallery
Every one of these is real render_chart() output
Bars, stacks, diverging values, lines with labelled thresholds, two y-axes, pies, heatmaps, a pure-ASCII style for when Unicode isn't safe to assume. See every chart type and style →
╭──────────────────────────────────────╮ │ Browser share │ ├──────────────────────────────────────┤ │ ░░░░░░██████ │ │ ▒▒▒▒▒░░░░░██████████ │ │ ▒▒▒▒▒▒▒▒░░░░████████████ │ │ ▒▒▒▒▒▒▒▒▒▒░░░░██████████████ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒░░░████████████████ │ │ ▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░█████████████████ │ │ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒░░█████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒░██████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒██████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█████████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓██████████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓████████████████████████ │ │ ▓▓▓▓▓▓▓▓████████████████████████ │ │ ▓▓▓▓████████████████████████ │ │ ████████████████████████ │ │ ████████████████████ │ │ ████████████ │ │ │ │ █ Chrome: 62 (62.0%) │ │ ▓ Safari: 21 (21.0%) │ │ ▒ Firefox: 12 (12.0%) │ │ ░ Other: 5 (5.0%) │ ╰──────────────────────────────────────╯╭──────────────────────────────────────╮ │ Browser share │ ├──────────────────────────────────────┤ │ ░░░░░░██████ │ │ ▒▒▒▒▒░░░░░██████████ │ │ ▒▒▒▒▒▒▒▒░░░░████████████ │ │ ▒▒▒▒▒▒▒▒▒▒░░░░██████████████ │ │ ▒▒▒▒▒▒▒▒▒▒▒▒▒░░░████████████████ │ │ ▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░█████████████████ │ │ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒░░█████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒░██████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒██████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█████████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓▓▓██████████████████████ │ │ ▓▓▓▓▓▓▓▓▓▓████████████████████████ │ │ ▓▓▓▓▓▓▓▓████████████████████████ │ │ ▓▓▓▓████████████████████████ │ │ ████████████████████████ │ │ ████████████████████ │ │ ████████████ │ │ │ │ █ Chrome: 62 (62.0%) │ │ ▓ Safari: 21 (21.0%) │ │ ▒ Firefox: 12 (12.0%) │ │ ░ Other: 5 (5.0%) │ ╰──────────────────────────────────────╯
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Revenue by quarter ┃ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ ░░░░░░░░░░ ░░░░░░░░░░ ░░░░░░░░░░ ░░░░░▓▓▓▓▓ ┃ ┃ ░░░░░░░░░░ ░░░░░░░░░░ ░░░░░▓▓▓▓▓ ░░░░░▓▓▓▓▓ ┃ ┃ ░░░░░░░░░░ ░░░░░▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ ░░░░░▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ ░░░░░▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ Q1 Q2 Q3 Q4 ┃ ┃ ┃ ┃ █ 2025 ▓ 2026 ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Revenue by quarter ┃ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ ░░░░░░░░░░ ░░░░░░░░░░ ░░░░░░░░░░ ░░░░░▓▓▓▓▓ ┃ ┃ ░░░░░░░░░░ ░░░░░░░░░░ ░░░░░▓▓▓▓▓ ░░░░░▓▓▓▓▓ ┃ ┃ ░░░░░░░░░░ ░░░░░▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ ░░░░░▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ ░░░░░▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ █████▓▓▓▓▓ ┃ ┃ Q1 Q2 Q3 Q4 ┃ ┃ ┃ ┃ █ 2025 ▓ 2026 ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Latency p99 (ms) │ ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ 140.00 ┤- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SLA: 140 │ │ 134.67 ┤ │ │ 129.33 ┤ ···●·· │ │ 124.00 ┤ ······ ···· │ │ 118.67 ┤ ·●··· ···· │ │ 113.33 ┤ ··· ··●··· │ │ 108.00 ┤- - - - - - - - - ····- - - - - - - - - - - - - - - - - ······- - - - - - - - - target: 106 │ │ 102.67 ┤ ··· ···●······ │ │ 97.33 ┤ ······●· ·······● │ │ 92.00 ┤●······ │ │ Mon Tue Wed Thu Fri Sat Sun │ └───────────────────────────────────────────────────────────────────────────────────────────────────────┘┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Latency p99 (ms) │ ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ 140.00 ┤- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SLA: 140 │ │ 134.67 ┤ │ │ 129.33 ┤ ···●·· │ │ 124.00 ┤ ······ ···· │ │ 118.67 ┤ ·●··· ···· │ │ 113.33 ┤ ··· ··●··· │ │ 108.00 ┤- - - - - - - - - ····- - - - - - - - - - - - - - - - - ······- - - - - - - - - target: 106 │ │ 102.67 ┤ ··· ···●······ │ │ 97.33 ┤ ······●· ·······● │ │ 92.00 ┤●······ │ │ Mon Tue Wed Thu Fri Sat Sun │ └───────────────────────────────────────────────────────────────────────────────────────────────────────┘
╭────────────────────────────────────────────────────╮ │ Revenue vs refunds │ ├────────────────────────────────────────────────────┤ │ EMEA │ ▓▓▓▓▓▓▓¦███████████████████ 25 │ │ APAC │ ▓▓▓▓▓▓▓▓▓¦████████████ 5 │ │ Americas │ ▓▓▓▓¦██████████████████████████ 47 │ │ │ │ █ Product ▓ Refunds │ ╰────────────────────────────────────────────────────╯╭────────────────────────────────────────────────────╮ │ Revenue vs refunds │ ├────────────────────────────────────────────────────┤ │ EMEA │ ▓▓▓▓▓▓▓¦███████████████████ 25 │ │ APAC │ ▓▓▓▓▓▓▓▓▓¦████████████ 5 │ │ Americas │ ▓▓▓▓¦██████████████████████████ 47 │ │ │ │ █ Product ▓ Refunds │ ╰────────────────────────────────────────────────────╯
╔════════════════════════════════════════════════╗ ║ Requests by hour x day ║ ╠════════════════════════════════════════════════╣ ║ Mon Tue Wed Thu Fri Sat Sun ║ ║ 00h ░░░░░ ░░░░░ ░░░░░ ░░░░░ ▒▒▒▒▒ ▓▓▓▓▓ ▒▒▒▒▒ ║ ║ 08h █████ █████ █████ █████ █████ ▒▒▒▒▒ ░░░░░ ║ ║ 16h ▓▓▓▓▓ █████ █████ █████ █████ ▓▓▓▓▓ ▒▒▒▒▒ ║ ║ 22h ▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒ ▓▓▓▓▓ █████ █████ ▓▓▓▓▓ ║ ║ ║ ║ ░ 1..3 ▒ 3..5 ▓ 5..7 █ 7..9 ║ ╚════════════════════════════════════════════════╝╔════════════════════════════════════════════════╗ ║ Requests by hour x day ║ ╠════════════════════════════════════════════════╣ ║ Mon Tue Wed Thu Fri Sat Sun ║ ║ 00h █████ █████ █████ █████ █████ █████ █████ ║ ║ 08h █████ █████ █████ █████ █████ █████ █████ ║ ║ 16h █████ █████ █████ █████ █████ █████ █████ ║ ║ 22h █████ █████ █████ █████ █████ █████ █████ ║ ║ ║ ║ ████████████████ 1..9 ║ ╚════════════════════════════════════════════════╝
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Temperature (left) vs humidity (right) │ ├────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ 20.00 ┤▒▒▒▒▒▒▒▒ ███████████ ├ 80.00 │ │ 18.89 ┤ ▒▒▒▒▒▒▒▒▒ ████████ █████████├ 77.22 │ │ 17.78 ┤ ▒▒▒▒ ██████ ├ 74.44 │ │ 16.67 ┤ ▒▒▒▒ █████ ├ 71.67 │ │ 15.56 ┤ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒█████ ├ 68.89 │ │ 14.44 ┤ ██▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒ ├ 66.11 │ │ 13.33 ┤ ████████ ▒▒▒▒▒ ├ 63.33 │ │ 12.22 ┤ ███████ ▒▒▒▒▒▒ ├ 60.56 │ │ 11.11 ┤ ████████ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒├ 57.78 │ │ 10.00 ┤████ ▒▒▒▒▒▒▒▒▒▒▒ ├ 55.00 │ │ │ │ left: █ Temp °C │ │ right: ▒ Humidity % │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Temperature (left) vs humidity (right) │ ├────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ 20.00 ┤▒▒▒▒▒▒▒▒ ███████████ ├ 80.00 │ │ 18.89 ┤ ▒▒▒▒▒▒▒▒▒ ████████ █████████├ 77.22 │ │ 17.78 ┤ ▒▒▒▒ ██████ ├ 74.44 │ │ 16.67 ┤ ▒▒▒▒ █████ ├ 71.67 │ │ 15.56 ┤ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒█████ ├ 68.89 │ │ 14.44 ┤ ██▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒ ├ 66.11 │ │ 13.33 ┤ ████████ ▒▒▒▒▒ ├ 63.33 │ │ 12.22 ┤ ███████ ▒▒▒▒▒▒ ├ 60.56 │ │ 11.11 ┤ ████████ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒├ 57.78 │ │ 10.00 ┤████ ▒▒▒▒▒▒▒▒▒▒▒ ├ 55.00 │ │ │ │ left: █ Temp °C │ │ right: ▒ Humidity % │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
┌─────────────────────────────────────────────────────┐ │ Slowest endpoints, p99 ms │ ├─────────────────────────────────────────────────────┤ │ /upload │ ██████████████████████████████████ 4200 │ │ /search │ ███████████████░░░░░░░░░░░░░░░░░░░ 1900 │ │ /checkout │ ████████░░░░░░░░░░░░░░░░░░░░░░░░░░ 950 │ └─────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────┐ │ Slowest endpoints, p99 ms │ ├─────────────────────────────────────────────────────┤ │ /upload │ ██████████████████████████████████ 4200 │ │ /search │ ███████████████░░░░░░░░░░░░░░░░░░░ 1900 │ │ /checkout │ ████████░░░░░░░░░░░░░░░░░░░░░░░░░░ 950 │ └─────────────────────────────────────────────────────┘
+----------------------------------------------------+ | Tests by suite | +----------------------------------------------------+ | unit | ################################ 480 | | integration | ########,,,,,,,,,,,,,,,,,,,,,,,, 120 | | e2e | ##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 30 | +----------------------------------------------------++----------------------------------------------------+ | Tests by suite | +----------------------------------------------------+ | unit | ################################ 480 | | integration | ########,,,,,,,,,,,,,,,,,,,,,,,, 120 | | e2e | ##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 30 | +----------------------------------------------------+