Skip to content

Repository files navigation

termchart

A rich canvas your AI draws on — a companion screen for everything your agent wants to show you, instead of scrolling back through walls of chat.

Coding agents bury their answers in long text conversations. termchart gives yours a canvas: it pushes native visuals to a browser tab in real time — architecture maps, dashboards, PR reviews, charts, call graphs, live progress — so you glance at a companion screen (a second monitor or an iPad) and just see what your agent is doing and thinking, no scrolling required. It ships as a CLI (termchart) plus a Claude Code plugin (skills + the /termchart:diagram-remote command):

  • The canvas. Run the viewer locally (or deploy it); agents push rich, native visuals over SSE — React Flow graphs, Vega-Lite charts, Mantine UI dashboards, markdown, and split panes — plus live status overlays (toasts / progress bars / loaders). Best on a second monitor or an iPad.
  • Inline terminal text (deprecated). A deterministic Mermaid → ASCII/Unicode renderer is still bundled (termchart <file>), but it's no longer the focus — push to the viewer instead.

termchart viewer rendering a narrative PR review — before/after cards, a timeline, a validation banner, and an FAQ, with a link out to the pull request

Example — an agent reviewing a pull request on the canvas: a before/after summary, a timeline, a validation banner, and an FAQ, linking out to the PR. This is one thing an agent can draw for you — not termchart's own UI.

🖼️ Browse the gallery → — real diagrams across DevOps, SRE, data/ML, research, product, security, finance, and consumer-shopping personas.

🚀 Open the live demo → — a read-only workspace with full example boards (a multi-pane system overview, a DIY plan with video + map, an explainer, a PR review, an algorithm walkthrough) you can click through in the actual viewer.


Use it — just ask your agent

You never write diagram syntax. Install once, then ask in plain language and your agent picks the right visual and draws it:

/termchart:diagram-remote a sequence diagram of the OAuth login flow → on the canvas
/termchart:diagram-remote a state machine for an order's lifecycle → on the canvas

Or just say it in any message — “put that on the termchart canvas”, “draw that as a diagram” — and the skill triggers on its own. The agent writes the native spec, validates it, and pushes it to your viewer (or prints aligned text). Then a quick “flip the deploy node to error” or “update the latency stat” and it patches the live view — no rebuild, no scrolling back.

Install — Claude Code:

/plugin marketplace add ivanmkc/termchart
/plugin install termchart@termchart

Install — any other agent (Cursor, Codex, Antigravity/agy, Gemini CLI, … 70+):

npx skills add ivanmkc/termchart # drops the skills into whichever agents you have
npm i -g @ivanmkc/termchart # the CLI they drive

For the canvas, start the viewer (below) and point TERMCHART_VIEWER_URL at it; open that URL on a second monitor or iPad. The inline terminal renderer needs nothing else.


The live viewer

Agents push diagrams to boards keyed by project/agent (a board is one such view; a workspace holds many); the browser updates instantly over SSE, and an agent can add --focus to switch the screen to its board. You author each framework's native JSON — there is no termchart DSL.

Run it locally (recommended)

The viewer is a tiny Node server — no cloud account needed. Clone the repo, build once, run:

git clone https://github.com/ivanmkc/termchart &&cd termchart
npm install && npm run build
PUSH_TOKEN=dev PORT=8080 node packages/viewer/dist/server.js

Open http://localhost:8080/w/me/ in a browser (any workspace id works — here, me). Point the CLI at it and push:

export TERMCHART_VIEWER_URL="http://localhost:8080/w/me"export TERMCHART_VIEWER_TOKEN="dev"# push a diagram (any --type — see the table below)
termchart push --project demo --agent me --type flow \
plugin/skills/diagram-recipes/examples/user-journey.flow.json --focus
# …or stream progress while you work
termchart status --loader --id build --message "Building…"
termchart status --id build --progress 60 --message "Compiling"
termchart status --success --message "Done"

The tab updates the moment you push. Want it on an iPad or a second monitor on your LAN? Point TERMCHART_VIEWER_URL at your machine's IP (e.g. http://192.168.1.20:8080/w/me) instead of localhost, and open the same URL on the device.

Deploy to Cloud Run (optional)

Prefer an always-on screen you can reach from anywhere? The same server deploys as a container:

cd packages/viewer
gcloud run deploy termchart-viewer --source . \
--min-instances=1 --max-instances=1 --allow-unauthenticated \
--set-env-vars PUSH_TOKEN="$(openssl rand -hex 24)"

Then set TERMCHART_VIEWER_URL=https://<service-url>/w/<wsid> and TERMCHART_VIEWER_TOKEN to the token you generated. More notes — incl. security — in packages/viewer/.

Content types

--typeRenderscontent
flowReact Flow node graph — pan/zoom, dagre auto-layout, legends, status colors{ nodes, edges, direction?, legend? }
componentMantine UI — cards, tables, badges, stats, tabs, timeline, images, links, interactive checklists, embedded maps, video cardsa { type, props, children } tree
vegalitea Vega-Lite chart (incl. scientific: binning, regression, log scales)a Vega-Lite spec
markdownGitHub-flavored markdownmarkdown text
panesa split layout (columns/rows/grid) of any of the above{ layout, panes: [{ title?, type, content }] }
mermaid / textterminal-style ASCII/Unicodemermaid source / text

Each rich renderer is a lazy-loaded chunk, so the core bundle stays tiny.

Status updates

Narrate long-running work — builds, deploys, test runs — as transient overlays, keyed by id so the same id updates in place (a progress bar advances; a loader becomes a success toast). They stack in the corner and never disturb the main diagram.

the viewer showing a color-coded journey diagram with status overlays stacked in the corner — a green “Published” toast, a 72% progress bar, and a spinning “Deploying” loader

Recipes

The diagram-recipes skill turns the raw formats into good diagrams for common personas, with copy-paste examples in plugin/skills/diagram-recipes/examples/:

RecipeTypeWhat it is
PR review — narrativecomponentBefore/After → timeline → validation → FAQ, with a PR link
PR review — change graphflowadded / removed / modified entities, status-colored edges
Product comparisoncomponenta logo image + an outbound link + rating per option
Stacktrace / call pathcomponenta colored monospace call hierarchy (not a graph)
User journey / pipelineflowcolor-coded entry → steps → success / error
Metrics dashboardcomponentstat cards + an embedded Vega-Lite trend
System architectureflowtiered service/infra topology, colored by layer, animated streams
Zoned architectureflownodes clustered into labeled, non-overlapping zones (tiers/swimlanes)
C4 architecturepanesone system at three zoom levels — Context → Container → Component
Concept explainerpanesteach a hard idea: hook → reasoning chain → quantitative chart → grounding
Task tracker / boardcomponenta cohesive status board — tasks by lane, owners, due, progress
Observability dashboardpanesdense 2×2 — SLO rings + latency chart + error table + throughput
Data lineageflowsources → staging → marts → consumers, zoned, freshness-colored
Query planflowa SQL EXPLAIN operator tree, colored by cost
Event-drivenflowproducers → broker/topic → consumers, with a dead-letter path
Recursion treeflowa top-down call tree (base cases / memoized hits colored)
Deep-code answerpanesannotated code + a step trace table + a complexity curve
Big-O complexityvegalitegrowth-class curves on a symlog scale
Risk matrixcomponentlikelihood × impact heat-grid with risks in cells
Critical pathflowtask schedule with the critical chain highlighted
Sprint burndownvegaliteideal vs actual remaining over a sprint
RACI matrixcomponenttasks × roles with R/A/C/I badges
Map — routescomponenta Leaflet/OSM map with markers + color-coded route polylines (origin → N destinations)
Task checklistcomponenta two-way checklist — the agent ticks progress, you tick sign-off; synced live
DIY / project plancomponenta top-down build plan — badges, materials table, interactive step checklist, video tutorials, a where-to-buy map, and a budget chart
Trace waterfallvegalitedistributed-trace spans by start/duration, by service
Flame graphcomponentCPU profile — stacked frames, width ∝ time
Calendar heatmapvegaliteactivity grid (week × day), sequential color
Matrix heatmapvegaliteN×N values (e.g. latency/correlation) with cell labels
Sequence · call-hierarchy · state · ER · classflowthe classic software diagrams, hand-tuned
persona intro gallery — several example diagrams across backend, SRE, ML, code-review, and docs scenariosmetrics dashboard — stat cards above an embedded area chart
product comparison — three cards, each with a logo, rating, feature list, and a Visit-site linkuser journey — a color-coded React Flow graph from entry through steps to a success/error result
stacktrace rendered as a colored monospace call hierarchy with a legendPR-review change graph — code entities colored green/red/amber for added/removed/modified

Validation

Structured pushes are validated server-side, so a malformed payload is rejected with a precise, path-pointed reason that termchart push prints — the agent fixes it and re-pushes, instead of silently rendering something broken:

$ printf '{"panes":[{"type":"component","content":{}}]}' | termchart push --type panes …
push failed: HTTP 400 — panes[0].content must be a JSON string (got object)

Viewer features

  • A live persona gallery on an empty workspace, replaced the moment you push.
  • Fullscreen any pane; a collapsible sidebar of boards; deep-linkable #project/agent URLs.
  • Six themes — System (follows the OS) plus Dark · Midnight · OLED (dark) and Light · Paper · Google Cloud (light) — from a header picker. Each has a distinct accent and a per-theme chart palette, and every renderer follows (React Flow, Vega-Lite, Mantine, and the chrome), persisted locally.
  • Interactive checklists — a Checklist the agent ticks off via patchand you tick in the UI; the checked state lives in the spec (so pull reads it back) and syncs live to every screen.
  • Embedded maps — a Map component (Leaflet + OpenStreetMap, no API key) with markers and route polylines, for location/route views right inside a dashboard.
  • Experimental agent↔human console (off by default) — flip the "Console (beta)" toggle to send the agent feedback / commands and click agent-pushed suggestion chips; the agent reads them back with termchart inbox and offers choices with termchart suggest. Instead of a coding harness, you can also run a standalone Python agent that listens to a scope's console and responds by rendering + replying — see integrations/adk-agent/ (Google ADK). Want the console to be your PRIMARY channel for talking to agents (iPad-on-the-desk, steer a long-running agent without touching the terminal)? See the inbox-centric quickstart — 60-second setup + 5-step walkthrough covering --wait / --follow, suggestion chips, targeted feedback, nudges, and the trust model.
  • Flows re-fit on resize (iPad rotation), carry legends, and use measured layout; a server-side geometry lint flags edges that run over or too close to nodes so tangled graphs get fixed.
  • Durable & retrievable. Views live server-side, so a new agent session can pick up where the last left off — termchart listpull → edit → push, or patch a small change in place. State is in-memory by default; set TERMCHART_STATE_BUCKET to persist to GCS across restarts, or bring your own GitHub repo (see below) for user-owned, git-versioned state.

State backends

Persistence is pluggable and opt-in. Precedence: GitHub > GCS > in-memory (if both GitHub and GCS env are set, GitHub wins and a line is logged).

  • GitHub (bring-your-own repo) — one file state/<wsid>.json per workspace, committed via the GitHub Contents API. Every save is a commit, so your dashboard history is a git log you can time-travel. Ideal for self-hosted / local termchart serve.
    • TERMCHART_STATE_GITHUB_REPO = owner/name — presence selects this backend.
    • TERMCHART_STATE_GITHUB_TOKEN = a PAT with repo write access (required; missing ⇒ skipped).
    • TERMCHART_STATE_GITHUB_BRANCH = target branch (optional, default main).
    • TERMCHART_STATE_GITHUB_CREATE = 1/true to auto-create a private repo if it's missing (optional; otherwise a missing repo logs an error and falls back to in-memory).
    • Saves are debounced (one commit per burst, not per keystroke) and use the file SHA for optimistic concurrency (a conflict re-reads the SHA and retries once).
  • GCS — set TERMCHART_STATE_BUCKET to persist to a bucket; the zero-config default for the hosted viewer.

In the terminal (deprecated)

⚠️Deprecated. The terminal Mermaid → ASCII/Unicode renderer still works but is no longer the focus of termchart — prefer the live viewer above (termchart serve + termchart push). It remains bundled for backward compatibility; this section is kept as reference.

Deterministic Mermaid → ASCII/Unicode from the same termchart CLI. Built on beautiful-mermaid — a synchronous, no-DOM grid renderer, so the same input + flags always produce the same bytes.

$ printf 'graph LR\n A[Client] --> B[API] --> C[(DB)]' | termchart
┌────────┐ ┌─────┐ ┌──────┐
│ Client ├────►│ API ├────►│ DB │
└────────┘ └─────┘ └──────┘

CLI

termchart [file] # render a Mermaid file, or stdin if omitted
termchart lint [file] # check source is within the renderable subset
termchart serve [flags] # start a local viewer + print its URL and env exports
termchart begin [flags] # show a board as "composing" instantly (placeholder + focus + loader)
termchart push [flags] # push a diagram to the live viewer (--description required)
termchart patch [flags] # merge a small change into a live view (flow/component/panes; --check too)
termchart status [flags] # push a status update — toast / progress / loader
termchart list [flags] # catalog live views: board · type · description · updated
termchart pull [flags] # print a stored spec (re-pushable; --json for the full record)
termchart suggest [flags] # push clickable suggestion chips to the console (agent → human)
termchart inbox [flags] # read the human's console feedback / clicks (--wait long-polls)
termchart clear [flags] # remove one board (--project/--agent) or --all
termchart --version
Render flags:
--ascii # pure ASCII (+,-,|) instead of Unicode box-drawing
--safe, --portable # alias for --ascii — guaranteed alignment in any terminal
--color <auto|none|16|256|truecolor> # default auto (color on a TTY, plain when piped)
--theme <name> # zinc-dark (default), zinc-light, tokyo-night, dracula, nord, github-dark, …
--padding-x <n> / --padding-y <n>
--rounded # rounded corners/elbows (╭╮╰╯); not usable with --ascii
--fit / --width <n> # auto-compact spacing to fit terminal width (80 if piped)

Exit codes: 0 ok · 1 lint/unsupported · 2 parse error · 3 bad usage.

Diagram types

Six types render deterministically as terminal text — flowchart, sequence, state, class, ER, and xychart. Two examples:

 (───────) ╭───────────╮ ◇───────────◇ ╭────────╮ ╭────────╮
│ Client├───►│API Gateway├───►│Authorized?│ ├──yes─►│Service ├───►│Database│
(───────) ╰───────────╯ ◇─────┬─────◇ ╰────────╯ ╰────────╯
│ (────────)
└──────no──────►│ 401 │
(────────)
┌────────┐ ┌─────┐ ┌──────┐
│ Client │ │ API │ │ Auth │
└────┬───┘ └──┬──┘ └───┬──┘
│ POST /login │ │
│────────────────▶ │
│ │ verify(creds) │
│ │──────────────────▶
│ 200 + token │ │
◀╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌│ │

termchart linterrors (exit 1) on constructs the renderer can't draw (sequence note/loop/alt/opt/par) and warns on fullwidth CJK/emoji labels (the grid allots one cell per character, so wide glyphs misalign borders). The full industry gallery shows all six types in Unicode and ASCII.


Install

Any coding agent — one command

npx skills add ivanmkc/termchart # skills → Claude Code, Cursor, Codex, Antigravity, Gemini CLI… (70+)
npm i -g @ivanmkc/termchart # the CLI those skills drive

The skills installer drops termchart's progressive-disclosure skills (with recipe examples) into whichever agents you have. See Any coding agent for details. The Claude Code plugin below is an alternative for Claude users.

As a Claude Code plugin (skill + commands + CLI)

/plugin marketplace add ivanmkc/termchart
/plugin install termchart@termchart

On session start the plugin ensures the termchart CLI is on your PATH (installing it from npm if missing). Then use /termchart:diagram-remote to draw on the live viewer.

Optional: a bare /diagram alias

Claude Code namespaces plugin commands (/termchart:diagram-remote). For a plain /diagram, drop a one-line user command that draws on the viewer:

mkdir -p ~/.claude/commands
cat >~/.claude/commands/diagram.md <<'EOF'---description: Draw a diagram on the termchart live viewerargument-hint: [a description of the diagram you want]---Push the following to the termchart viewer, following the `diagram-recipes` skill: pick theright rich type (component / flow / vegalite / panes / …), author its JSON, and`termchart push --type <type> …`.$ARGUMENTSEOF

Standalone CLI

npm i -g @ivanmkc/termchart # requires Node 18+

Using it from other agents

Point any agent's rules/skill file at the same CLI: have it write Mermaid in the supported subset, run termchart lint, then termchart to render — or termchart push to send rich JSON to the viewer. See plugin/skills/termchart/SKILL.md (terminal) and plugin/skills/diagram-recipes/SKILL.md (viewer) — both are written to be agent-agnostic.

Any coding agent — one-liner install

termchart's skills install into any coding agent (Claude Code, Cursor, Codex, Antigravity, Gemini CLI, Windsurf, Zed, Aider — 70+) with one command, via the open skills installer:

npx skills add ivanmkc/termchart # → the diagram-recipes + termchart skills (recipe examples included)
npm i -g @ivanmkc/termchart # the CLI those skills drive (Node ≥18; the skills also self-heal it)

That's the whole setup. The skills are progressive-disclosure (they load only when you ask for a diagram, so they don't tax every prompt) and they carry the recipe examples/ with them. For the live viewer, also set TERMCHART_VIEWER_URL + TERMCHART_VIEWER_TOKEN.

Verified: npx skills add installs both skills + all examples into Claude Code, and the same skills + CLI work in the Antigravity CLI (agy) — a real agy agent rendered and pushed with no agy-specific files.

Zero-install fallback: the cross-tool AGENTS.md at the repo root is read by any AGENTS.md-aware agent with no install at all (it just needs the CLI on PATH) — useful for agents without a skills mechanism. The Claude Code plugin (above) is optional sugar for Claude users (marketplace install + /termchart:* commands).

Development

npm install # workspace deps
npm run build # tsc + esbuild → packages/*/dist
npm test # vitest across workspaces
npm run -w @ivanmkc/termchart-viewer test:e2e # Playwright (rich renderers)

Design notes live in docs/specs/.

License

MIT

About

A live canvas your AI draws on — agents push native diagrams, charts & dashboards to a browser or iPad in real time. Works with any coding agent.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages