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
UI as data
3 scene 5
JSX; A2UI/json-render add a JSON layer on top, but that is not Ink
Agent can drive it
2 scene 5
React DevTools live prop editing is an API, but human-oriented; no agent protocol
Agent can see it
3 scene 5
Structured tree via DevTools; lastFrame() in tests
Small, targeted edits
2 scene 5
Time travel
0 scene 0
Live data rate
3 scene 5
30 fps default cap; no throughput numbers
Terminal native
5 scene 5
Pixel graphics
0 scene 4
No image support in core found
Teaching
1 scene 3
Maturity
5 scene 1
Openness
5 scene 4
MIT, 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.
Full React: components, hooks, context, Suspense, concurrent mode
Yoga flexbox layout
Inline (scrollback-preserving) by default; alternateScreen optional
maxFps throttle, default 30
React DevTools integration: inspect and edit props live in a running CLI
Ink publishes no benchmarks; the best public evidence is negative (Claude Code's rewrite) plus upstream fixes (incremental rendering, PR #781; v8 prefix skipping).
Claude Code left Ink's renderer: '<Static> creates a hard boundary… updates were suppressed or triggered full redraws'; Anthropic's React-based rewrite (cell diffing, double buffering, damage tracking, DEC 2026) cut offscreen flicker ~85% github.com ↗
Claude Code later added a fullscreen NO_FLICKER renderer that virtualizes the viewport; default for users first seen on/after 2026-05-06 code.claude.com ↗
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
Line-oriented string rendering: Anthropic left it for a cell-diffing renderer because <Static> 'fights React's model' and caused full redraws
Node/React runtime cost; maxFps 30 default
No images/pixel graphics
No agent protocol or structured readback outside DevTools/tests
Maintained by individuals; breaking majors in 2026 (v7, v8)
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