NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4570 most downloaded on npm
React for CLI
Last release today
03 Oct 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
106 releases · first in 2013
minWidth and maxWidth on <Box> now only accept numbers ( #1029 ) 7cd7fd9
minWidth and maxWidth on <Box> now only accept numbers (#1029) 7cd7fd9
stdin, stdout, and stderr are now typed as generic Node.js streams (#981) eb82d8f
render() options and to useStdin(), useStdout(), and useStderr(). TTY-only properties like stdout.columns are no longer part of the typesuseInput no longer receives unrecognized terminal control sequences (#1014) c76893e
input with the ESC stripped, as if typed. They are now droppedcontentOffsetX and contentOffsetY props to <Box> for building scrollable views (#765) 3ba5828
overflow="hidden". See the scroll exampleclientWidth and clientHeight to useBoxMetrics() and measureElement() (#988) 3ba5828
stdin, stdout, and stderr options of render() (#981) eb82d8f
PassThrough or other Readable/Writable streams. Raw mode is used only when stdin is a TTY with setRawMode()incrementalRendering mode (#1036) 91eb50a
ws dependency in favor of the native WebSocket for React DevTools (#976) 33567edkey.return b73ebf4clear() 494ebebclear() fc358c2<Transform> line indices when clipping 4f3c7aa<Static> and nested <Text> 753a5f8undefined 274b15aonRender after the frame is written 83d7de5<Static><Static> output on full-clear frames (#1005) d661543<Static> output when resuming re-enters the alternate screen (#1012) 9235028<Static> output after abandoned concurrent renders 8678b76<Static> output when its identity changes cfdd9e6<Static> rows f6b2620 c0fa4ef 5911f44staticNode reference on indirect subtree removal (#979) 5448e6b<Text> vanishing when it starts above the top of the output (#1001) 77aba4a<Transform> wrap points change fc685bc 9c323f6reportAssociatedText now enables reportAllKeysAsEscapeCodes automaticallyonKittyQueryResponse stable across rerender() calls (#1007) 70beca5suspendTerminal() handles idempotent, and do not restore input modes that were released or belong to an unmounted app a7297c4 b35e89a c613707disableFocus() blur the focused component as documented, and respect it when new components auto-focus d130588<Transform> labels, rewrapping when the terminal widens, and restoring output after console writes (#1028) f480301 bebfe2drenderToString() swallowing thrown undefined, and run effect cleanup when output rendering fails 9f7c1d0useWindowSize() missing resizes before it subscribes fab670buseAnimation() values while paused f25d312render() options that are undefined 659249dwrapText cache returning results for the wrong text or width (#998) 3809accwaitUntilExit() after unmount 1fcd380Upgrade react (and @types/react) to 19.3 or later.
minWidth and maxWidthUse a number. If you need a relative minimum or maximum width, compute it from useWindowSize() or useBoxMetrics() of the parent.
-<Box minWidth="50%">
+<Box minWidth={Math.floor(columns / 2)}>useStdout().stdout is now typed as NodeJS.WritableStream, so TTY properties like columns and rows are no longer available in the types. Use useWindowSize() instead, which also re-renders on resize.
-const {stdout} = useStdout();
-const width = stdout.columns;
+const {columns: width} = useWindowSize();useInputIf your useInput handler parsed mouse reports, focus events, or other terminal replies from input, it will no longer receive them. Keys that Ink recognizes, including Kitty keyboard protocol events, are not affected.
One column per quarter.
Fix: Preserve last <Static> line erased after a full-clear frame ( #974 ) e51dfdd
Add suspendTerminal() to hand the terminal to a child process ( #972 ) 9e8ed1f
Fix stale frames on Windows when output exactly fills the terminal ( #971 ) 2c08d55
Fix: Handle incomplete stack frames in error overview ( #965 ) b2350c1
Fix: Share resize listener via emitLayoutListeners instead of per-hook listeners ( #952 ) 89d43d8
Fix: Drop stale <Static> output from fullStaticOutput on identity change ( #950 ) 669c438
Fix: Defer raw mode disable to prevent process hang on component swap dd052ea
Fix: Restore useApp exit typing 42ddd40
Ink now uses useEffectEvent internally to avoid re-subscribing input handlers on every render
useEffectEvent internally to avoid re-subscribing input handlers on every renderkey.backspace instead of key.delete (#634) 321a2e8
key.delete to handle backspace, switch to key.backspacekey.meta is no longer set to true when Escape is pressed e195912
key.escape and key.meta. Now only key.escape is true. key.meta is reserved for actual Alt/Meta modifier combinationsusePaste hook for handling clipboard paste events fbbeb23
useInputuseWindowSize hook 7047795
{columns, rows} and re-renders automatically on terminal resizeuseBoxMetrics hook for measuring box dimensions at runtime (#433) 88731d1useAnimation hook for built-in animation support (#142) ada019c
alternateScreen option to render() (#263) 5a60eb9
interactive option to render() (#888) 02490f6
activeId to useFocusManager() (#661) eb2f470
undefined if nothing is focusedborderBackgroundColor (and per-side variants) to <Box> (#906) d3c6d14
wrap="hard" to <Text> (#925) 2b1e3a6
maxWidth and maxHeight props to <Box> (#713) 9291794aspectRatio, alignContent, position="static", and top/right/bottom/left layout props to <Box> c2f4b86useInput crash on unmapped key codes (#902) 969a4f1<Box> width b5f3e3astaticNode reference (#905) 0dc4dfakey.backspace vs key.delete// Before — physical backspace was reported as key.delete
useInput((input, key) => {
if (key.delete) { /* was catching physical backspace key */ }
});
// After
useInput((input, key) => {
if (key.backspace) { /* physical backspace key (0x7F) */ }
if (key.delete) { /* actual Delete key (e.g. Fn+Backspace) */ }
});key.meta no longer set on plain Escape// Before — key.meta was true for both Escape AND Alt+key
useInput((input, key) => {
if (key.meta) { /* fired on plain Escape too */ }
});
// After — check key.escape explicitly for the Escape key
useInput((input, key) => {
if (key.escape) { /* plain Escape */ }
if (key.meta) { /* Alt/Meta combos only */ }
});Add renderToString() for synchronous string output (#868) 0a0c549
renderToString() for synchronous string output (#868) 0a0c549exit() to pass a result value to waitUntilExit() 20b4a3dText (#879) 1761c3a<Static> output on exit 5815651https://github.com/vadimdemedes/ink/compare/v6.7.0...v6.8.0
Add support for React concurrent rendering (opt-in) (#850) c587da3
MaxListenersExceededWarning when using many useInput hooks 390549dhttps://github.com/vadimdemedes/ink/compare/v6.6.0...v6.7.0
Add home and end key support in useInput (#829) 969cae4
home and end key support in useInput (#829) 969cae4https://github.com/vadimdemedes/ink/compare/v6.5.1...v6.6.0
Fix handling of terminal resize (#828) 557b029
https://github.com/vadimdemedes/ink/compare/v6.5.0...v6.5.1
Add `incrementalRendering` option (#781) 5402c66
incrementalRendering option (#781) 5402c66https://github.com/vadimdemedes/ink/compare/v6.4.0...v6.5.0
Add `onRender` hook (#795) deff4ef
onRender hook (#795) deff4ef.dim.bold color (#798) 5ae461ehttps://github.com/vadimdemedes/ink/compare/v6.3.1...v6.4.0
Fix extra newline in fullscreen mode (#769) fe40d42
https://github.com/vadimdemedes/ink/compare/v6.3.0...v6.3.1
Add `maxFps` option (#756) 875b0c1
Fix nested newlines in screen reader mode (#754) c95ed99
https://github.com/vadimdemedes/ink/compare/v6.2.2...v6.2.3
Fix screen reader static rendering (#749) e4eb92b
https://github.com/vadimdemedes/ink/compare/v6.2.1...v6.2.2
Fix issue with screen reader mode re-rendering (#747) e932f15
https://github.com/vadimdemedes/ink/compare/v6.2.0...v6.2.1
Add screen reader and ARIA support (#746) 21f4592
https://github.com/vadimdemedes/ink/compare/v6.1.1...v6.2.0
Fix text measuring bug (#744) 789516d
https://github.com/vadimdemedes/ink/compare/v6.1.0...v6.1.1
Add `backgroundColor` support to Box component (#729) c28a89c
backgroundColor support to Box component (#729) c28a89chttps://github.com/vadimdemedes/ink/compare/v6.0.1...v6.1.0
Fix a bug that causes static content to not be updated in time (#723) 03872b2
https://github.com/vadimdemedes/ink/compare/v6.0.0...v6.0.1
Require React 19 (#719) b9e9466
outputHeight changes from above stdout.rows to below stdout.rows (#717) 8f2ad8fhttps://github.com/vadimdemedes/ink/compare/v5.2.1...v6.0.0
Fix: Correctly detect Shift key only for uppercase letters (#712) f6faae1
https://github.com/vadimdemedes/ink/compare/v5.2.0...v5.2.1
Use official yoga-layout package instead of yoga-wasm-web (#703) d46348f
yoga-layout package instead of yoga-wasm-web (#703) d46348fhttps://github.com/vadimdemedes/ink/compare/v5.1.1...v5.2.0
Fix input parsing of control characters (#699) 4dc1a87
https://github.com/vadimdemedes/ink/compare/v5.1.0...v5.1.1
Support space-evenly value for justifyContent attribute (#678) 1588397
space-evenly value for justifyContent attribute (#678) 1588397https://github.com/vadimdemedes/ink/compare/v5.0.1...v5.1.0
Fix: Only focus active elements (#631) d8bcff8
https://github.com/vadimdemedes/ink/compare/v5.0.0...v5.0.1
Even though this release is major, it doesn't have any breaking changes. The reason it's 5.0.0 is because after #635, Ink requires Node.js 18.
Even though this release is major, it doesn't have any breaking changes. The reason it's 5.0.0 is because after #635, Ink requires Node.js 18.
Huge thanks to @sindresorhus for maintaining Ink 💛
https://github.com/vadimdemedes/ink/compare/v4.4.1...v5.0.0
Fix React Devtools integration (#626) 3d02a16
https://github.com/vadimdemedes/ink/compare/v4.4.0...v4.4.1
Add index property to Transform (#619) 0ee8e89
index property to Transform (#619) 0ee8e89readable event instead of data to read from stdin (#616) 814f33eThanks to @isaacs and @matteodepalo for contributing to this release!
https://github.com/vadimdemedes/ink/compare/v4.3.1...v4.4.0
This release brings back compatibility with Node.js v14.x. See https://github.com/vadimdemedes/ink/issues/617 for details. Thanks @newhouse and @AlCal
This release brings back compatibility with Node.js v14.x. See https://github.com/vadimdemedes/ink/issues/617 for details. Thanks @newhouse and @AlCalzone for handling it!
https://github.com/vadimdemedes/ink/compare/v4.3.0...v4.3.1
Speed up generation of output (#564) 9ff4d20
useInput callback (#581) eed2a11Huge shoutout goes to @AlCalzone for performance improvements in the generation of output, which speeds up rendering and significantly reduces CPU usage 🔥
https://github.com/vadimdemedes/ink/compare/v4.2.0...v4.3.0
With the addition of `borderStyle` prop to `Box`, you can define custom border style for rendering borders.
fb66872
With the addition of borderStyle prop to Box, you can define custom border style for rendering borders.
<Box
borderStyle={{
topLeft: '↘',
top: '↓',
topRight: '↙',
left: '→',
bottomLeft: '↗',
bottom: '↑',
bottomRight: '↖',
right: '←'
}}
>
<Text>Content</Text>
</Box>
<img src="https://user-images.githubusercontent.com/697676/233922514-e4718f2e-b4ed-4e94-8092-35b43d970b24.png" width="300">
015202c
Box has supported borderColor prop for a while now to change the color of the border. In this release, there are new borderTopColor, borderBottomColor, borderLeftColor and borderRightColor props to change the color for each border side individually.
<Box
borderStyle="single"
borderTopColor="magenta"
borderBottomColor="green"
borderLeftColor="yellow"
borderRightColor="cyan"
>
<Text>So colorful</Text>
</Box>
<img src="https://user-images.githubusercontent.com/697676/233923741-91f0064b-504a-415c-9089-603d4ef6e9a7.png" width="300">
3e0aeab
As you can see, this is a pretty border-themed release. Continuing with the trend, now you toggle visibility of any border side individually via borderTop, borderBottom, borderLeft and borderRight props.
For example, if you wanted to hide top and bottom borders, you'd pass false to borderTop and borderBottom props respectively.
<Box
borderStyle="single"
borderTop={false}
borderBottom={false}
>
<Text>Content</Text>
</Box>
<img src="https://user-images.githubusercontent.com/697676/233924735-2ffb7858-c4b9-4f1c-94f6-1f94cae19771.png" width="300">
useInput (#576) 6f99ca3ctrl equal to true 26b8364https://github.com/vadimdemedes/ink/compare/v4.1.0...v4.2.0
`Box` supports `gap` prop now to easily add space between columns and rows without manually assigning margins. Similar to CSS, `gap` is a shorthand fo
gap in Box4a67772
Box supports gap prop now to easily add space between columns and rows without manually assigning margins. Similar to CSS, gap is a shorthand for setting both columnGap and rowGap at the same time.
<Box gap={1}>
<Text>A</Text>
<Text>B</Text>
</Box>
// A B
7bdbde5
@jodevsa contributed support for wrapping of flex items in via flexWrap prop, similar to flex-wrap CSS property.
<Box width={2} flexWrap="wrap">
<Text>A</Text>
<Text>BC</Text>
</Box>
// A
// B C
Box6278b81
Box supports an overflow prop, which controls the visibility of an element's overflow. It can be set to "visible" (default) and "hidden", which hides any content that overflows element's boundaries. Like in CSS, overflow is a shorthand for setting both overflowX and overflowY.
<Box width={6} overflow="hidden">
<Box width={16} flexShrink={0}>
<Text>Hello World</Text>
</Box>
</Box>
// Hello
c97a2ee
Thanks to @amitdahan, Ink now uses a WASM build of Yoga provided by the yoga-wasm-web package. Starting with this release, Ink no longer uses yoga-layout-prebuilt package that is lagging behind Yoga releases.
e635106
@AlCalzone contributed an impressive performance boost (~150%) to slice-ansi, which Ink heavily uses for generating output before writing it to the terminal. This release updates Ink to use a newer version of slice-ansi, so this should translate to faster rendering in Ink as well.
https://github.com/vadimdemedes/ink/compare/v4.0.0...v4.1.0
This package is now pure ESM. Please read this.
hsl, hsv, hwb and ansi color formats in Text's color prop.react-devtools-core to optional peer dependency (#498) 8c2378aMajor shoutout goes to @pepicrft and @amitdahan for leading the migration of Ink to ESM 💛
Thanks to @sindresorhus for support and helping reviewing these massive changes 👏
https://github.com/vadimdemedes/ink/compare/v3.2.0...v4.0.0
Update ws dependency to fix a security alert 7fac58a
ws dependency to fix a security alert 7fac58ahttps://github.com/vadimdemedes/ink/compare/v3.1.0...v3.2.0
Add programmatic focus (#427) 5809621
https://github.com/vadimdemedes/ink/compare/v3.0.9...v3.1.0
Fix border rendering containing emojis and wide characters (#444) a8f563c
undefined errors for focusing unmounted elements (#404) deb9d96backgroundColor prop of the <Box> component (#451) 7a3b32dhttps://github.com/vadimdemedes/ink/compare/v3.0.8...v3.0.9
Fix React Devtools integration (regression after 3.0.7 release) (#390) 1396566
3.0.7 release) (#390) 1396566https://github.com/vadimdemedes/ink/compare/v3.0.7...v3.0.8
Remove import type statements 8389496
import type statements 8389496borderColor type (#379) ac28ae4https://github.com/vadimdemedes/ink/compare/v3.0.6...v3.0.7
Add remove escape keyboard sequence as delete key in `useInput` (#364) 96568dd
useInput (#364) 96568ddhttps://github.com/vadimdemedes/ink/compare/v3.0.5...v3.0.6
Fallback to 80 if number of columns isn't set (#368) 447078b
https://github.com/vadimdemedes/ink/compare/v3.0.4...v3.0.5
Fix `Static` rendering stale items on unmount (#361) 6ae66e6
Static rendering stale items on unmount (#361) 6ae66e6https://github.com/vadimdemedes/ink/compare/v3.0.3...v3.0.4
Let `useInput` handle Ctrl+C if `exitOnCtrlC` is disabled (#353) 7de558e
useInput handle Ctrl+C if exitOnCtrlC is disabled (#353) 7de558einverse prop to Text component (#347) 8e8c1bahttps://github.com/vadimdemedes/ink/compare/v3.0.2...v3.0.3
Export DOMElement type (#351) 950b1d2
DOMElement type (#351) 950b1d2https://github.com/vadimdemedes/ink/compare/v3.0.1...v3.0.2
Throw error when ` ` is nested inside ` ` component (#346) 377adbb
<Box> is nested inside <Text> component (#346) 377adbbuseInput for Page Up and Page Down keys (#336) 4a94374color and backgroundColor props for <Text> (#338) 66cb353https://github.com/vadimdemedes/ink/compare/v3.0.0...v3.0.1
This day is finally here - Ink 3 is out! Read the full announcement at https://vadimdemedes.com/posts/ink-3.
This day is finally here - Ink 3 is out! Read the full announcement at https://vadimdemedes.com/posts/ink-3.
measureElement() API (#307) d0c4417<Box> component (#300) 96625bfalign-self property to <Box> (#296) 125148a<Spacer> component e8ae2af<Newline> component 9f4c6f8console.* logs above main output acb6ed2clear() method to clear output fec1c4duseStderr hook to access and write to stderr stream (#286) 360d2dawrite() function to write any string to stdout (#285) 27e313e<Transform> component (#277) 9ed46a5false a056565isActive option to useInput hook f419028<Box display="none"> b51476chttps://github.com/vadimdemedes/ink/compare/v2.7.1...v3.0.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix error when squashing empty text nodes (#260) 23563ed
https://github.com/vadimdemedes/ink/compare/v2.7.0...v2.7.1
Your coding agent can read these notes before it upgrades. Set up the MCP server →