thcThought Control

Ink

React for interactive command-line apps.

github.com ↗repo ↗docs ↗ink-testing-library ↗Claude Code renderer rewrite (issue #769 comment) ↗Claude Code fullscreen renderer docs ↗v8.0.0 release ↗

license
MIT
language
TypeScript / JavaScript (React reconciler, Yoga layout)
backing
Individuals: Vadim Demedes (creator) and Sindre Sorhus (most active maintainer recently). No company.
stars
40,079 (as of 2026-10-09)
downloads
7.79M/week npm (api.npmjs.org, 2026-10-01..07)
latest release
v8.0.0, 2026-10-03
first release
2017-07
complement

Ink is the terminal target of the JS/A2UI world; scene should interoperate with the specs that target Ink rather than compete with Ink itself.

Complement it: it does a neighbouring job; interoperate.

the steelman: the best honest case for it

Ink made the terminal a React target, and that single idea is why the agent CLI wave happened in JavaScript: Claude Code, Gemini CLI, Copilot CLI, Wrangler, Shopify and Prisma all shipped on it, and 7.8M installs a week follow. Every frontend engineer — and every model — already knows how to write it; components, hooks, context and Suspense just work, with Yoga flexbox for layout. Its default inline mode with <Static> output keeps native scrollback, selection and Cmd+F, a trade-off Anthropic explicitly defended for Claude Code. Ink is also where declarative agent UI lands in the terminal today: A2UI's official terminal renderer and json-render both target Ink, so a JSON spec from an agent becomes a live Ink tree with no new runtime. React DevTools lets you inspect and edit a running CLI's props live. In 2026 it is actively maintained again, with incremental rendering, kitty keyboard, scroll views and screen-reader support.

scores
datadriveseeedittimeratetermpxteachmatureopen
UI as data3 scene 5JSX; A2UI/json-render add a JSON layer on top, but that is not Ink
Agent can drive it2 scene 5React DevTools live prop editing is an API, but human-oriented; no agent protocol
Agent can see it3 scene 5Structured tree via DevTools; lastFrame() in tests
Small, targeted edits2 scene 5
Time travel0 scene 0
Live data rate3 scene 530 fps default cap; no throughput numbers
Terminal native5 scene 5
Pixel graphics0 scene 4No image support in core found
Teaching1 scene 3
Maturity5 scene 1
Openness5 scene 4MIT, individual community maintainers

Ink scene now scene planned

how agents use it

How

Code generation (agents write Ink/React fluently). Live: React DevTools over its WebSocket backend can inspect the tree and edit props of a running CLI (DEV=true). Declarative-UI projects use Ink as the terminal target: A2UI (a2ui-ink) and json-render (@json-render/ink) map JSON specs onto Ink components.

Wiring it in

Low for code-gen; for live control you either speak the React DevTools protocol or put a JSON spec layer (A2UI/json-render) in front of Ink.

Seeing the result

React DevTools shows the component tree and props; ink-testing-library gives lastFrame() text in tests; otherwise screen scraping.

Small edits

DevTools prop edits (human-oriented); via json-render/A2UI, spec-level patches.

History

None built in.

In short

Not agent-drivable by itself, but the de facto terminal backend that JSON agent-UI specs compile to.

architecture

A custom React reconciler builds a tree of Box/Text host nodes laid out with Yoga (flexbox); on each commit Ink renders the tree to a string and writes it to stdout, either redrawing the dynamic region or, with incrementalRendering, only changed lines (v8 skips unchanged line prefixes). <Static> writes permanent output above the live region, which is what lets CLIs keep native scrollback. Hooks (useInput, usePaste, useFocus, useBoxMetrics, useWindowSize) give input and measurement; options cover alternateScreen, maxFps (default 30), concurrent React, kitty keyboard, screen-reader output.

performance

Ink publishes no benchmarks; the best public evidence is negative (Claude Code's rewrite) plus upstream fixes (incremental rendering, PR #781; v8 prefix skipping).

adoption and upkeep

Adoption

The default terminal renderer for the JS agent wave; README lists Claude Code, Gemini CLI and Copilot CLI first.

Used by: Claude Code (originally; now React on Anthropic's own renderer), Gemini CLI, GitHub Copilot CLI, Cloudflare Wrangler, Shopify CLI, Prisma, Canva CLI, Linear (internal), Qodo Command, A2UI's terminal renderer (a2ui-ink) and json-render's @json-render/ink

Maintainability

Revived and moving fast in 2026 (v7 overhauled input, v8 requires React 19.3+, adds scroll offsets and finer incremental rendering).

Releases: Active: v7.0.4 2026-05-24, v7.0.5 05-29, v7.0.6 06-12, v7.1.0 06-17, v7.1.1 07-16, v8.0.0 10-03. · Contributors: ~181 (GitHub contributors API incl. anonymous) · Recent: ~89 commits, 28 merged PRs since 2026-07-11 (GitHub API) · Bus factor: medium: two well-known maintainers, no company; very wide downstream use

weaknesses
and thc-scene

Overlap

Declarative component tree, keyed reconciliation preserving view state (scene's ids work like React keys), terminal renderer for JSON agent-UI specs (via A2UI/json-render).

What scene would be reinventing

Reconciliation keyed by id and a component vocabulary; for JS hosts, A2UI+Ink already gives 'agent sends JSON, terminal renders it'.

The gap it leaves

Cell-level diffing renderer, socket control of a live instance, readback of state + screen, data streams that bypass the model, pixel layer, hot-swap, time travel.

What to borrow

  • <Static>/inline mode: an optional non-fullscreen scene mode that keeps native scrollback
  • ink-testing-library's lastFrame()/frames[] as the shape of scene's screen readback
  • React DevTools' live prop editing as a model for patch-by-id UX
  • Interop: accept the same JSON A2UI/json-render emit to Ink
sources
  1. GitHub API repos/vadimdemedes/ink api.github.com
  2. npm downloads ink last week api.npmjs.org
  3. Ink README (users, options, DevTools) github.com
  4. Ink v8.0.0 release notes github.com
  5. Claude Code renderer rewrite comment (2025-12-17) github.com
  6. Claude Code fullscreen rendering docs code.claude.com
  7. The Signature Flicker (Peter Steinberger) steipete.me
  8. Heise: Ink 7.0 revises input handling heise.de