LeadershipNot yet confirmed elsewhere1 publisher3 min readPublished
Ink 8 requires React 19.3 or later, adds scrollable-view props and fixes terminal rendering issues
Ink 8, the React library for command-line interfaces, requires React 19.3 or later and adds Box props for building scrollable terminal views. Teams running tools on an older React have to move React first, then recheck how their tools handle input and how they type their output streams.
The Board Room · Leadership desk

What happened
- The stdin, stdout and stderr streams in render() and the matching hooks are now typed as generic Node.js streams, so TTY-only properties such as stdout.columns leave the types.
- minWidth and maxWidth on Box now accept only numbers; the notes say percentage strings were never documented and Yoga resolved them against the wrong ancestor.
- The Rendering, Static and Text sections of the release notes list 33 fixes between them, including preserved scrollback after the viewport is cleared.
Compiled by The Board RoomSomething wrong?How this is made
Why it matters
- decision Teams on React older than 19.3 must schedule a React migration before they can use the scroll props or any Ink 8 fix, so the Ink upgrade becomes a two-step project.
- exposure CLIs whose input handlers acted on mouse or focus sequences arriving as text will stop receiving them after upgrading, and the difference appears in live terminal sessions.
- constraint TypeScript code that reads stdout.columns or other TTY-only properties through useStdout() has to change before it compiles cleanly against Ink 8's types.
- capability With PassThrough and other streams accepted, and raw mode reserved for a real TTY, an Ink app can be driven without a terminal attached.
The React requirement decides what happens first. A command-line tool on a React release older than 19.3 has to move React before it can take Ink 8 [1]. Only after that do the new `contentOffsetX` and `contentOffsetY` props on `<Box>` become available. Paired with `overflow="hidden"`, they are how Ink 8 builds a scrollable view [5].
Most of the release is repair work. The notes list four breaking changes [17] against 33 fixes in the Rendering, `<Static>` and Text sections alone [18]. Separate keyboard fixes cover legacy modifiers, modified SS3 keys and Kitty protocol parsing [15]. Among the rendering entries: scrollback survives when the viewport is cleared, terminal history survives `clear()` [10], and the cursor goes back below the frame on exit [14]. Control characters other than tab and newline are now stripped from text content [11].
The trade-off is a React migration in exchange for those fixes. In my view, two of the four breaking changes add little to that cost. Percentage strings for `minWidth` and `maxWidth` were never documented, and Yoga resolved them against the wrong ancestor [2]. Any layout that breaks was already being sized against the wrong parent. The stream typing change shows up at compile time. TypeScript code that reads `stdout.columns` through `useStdout()` is reading a property the types no longer declare [3].
Input handling needs a check in a real terminal. Mouse reports, focus in and out events and cursor position reports used to reach `useInput` with the escape character stripped, as if a user had typed them [4]. Ink 8 drops them [4]. For a tool that was misreading those sequences as keystrokes, that is a fix. A tool that had come to act on that text, by design or by accident, will stop receiving it in the same terminal sessions where it used to arrive [4].
The release also widens where an Ink app can run. Any Node.js stream, `PassThrough` included, can now be passed to `render()`, and raw mode is used only when stdin is a TTY with `setRawMode()` [7]. `useBoxMetrics()` and `measureElement()` gain `clientWidth` and `clientHeight`, the space inside an element's borders [6]. In `incrementalRendering` mode only the changed part of a line is written, which the notes say reduces output and flicker [8]. React DevTools now connects over the native `WebSocket`, and the `ws` dependency is gone [9].
Each team sets its own timing. Every entry sits under Breaking, New or Fixes, and the fixes describe rendering, text and keyboard behaviour [13]. The notes do not say whether the 7.x line will receive any of them. Until a backport appears, a team that defers the React move this quarter keeps its current scrollback and `<Static>` behaviour into next quarter. A team that schedules the move now gets the fixes and the scroll props on one branch [5].
What to watch
- Whether the Ink maintainers ship a 7.x release carrying the scrollback, cursor and Static fixes for teams still below React 19.3.
- Issues filed against Ink 8 by tool authors whose input handling depended on mouse or focus sequences arriving through useInput as text.
- How quickly widely used Ink-based CLIs move to 8.0, a sign of how many already run React 19.3.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence72
- Adoption
- Insufficient
- Hype gap+5
- Incentives
- Insufficient
- Confidence70
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
Ink 8.0.0 requires React 19.3 or later, listed as a breaking change.
- [2]
minWidth and maxWidth on <Box> now only accept numbers; percentage strings were never documented as supported, and Yoga resolved them against the wrong ancestor.
- [3]
stdin, stdout and stderr are now typed as generic Node.js streams, applying to the render() options and to useStdin(), useStdout() and useStderr(); TTY-only properties like stdout.columns are no longer part of the types.
- [4]
useInput no longer receives unrecognized terminal control sequences. Mouse reports, focus in/out events, cursor position reports and other terminal replies used to arrive in input with the ESC stripped, as if typed; they are now dropped.
- [5]
Ink 8 adds contentOffsetX and contentOffsetY props to <Box> for building scrollable views, combined with overflow="hidden".
- [6]
clientWidth and clientHeight are added to useBoxMetrics() and measureElement(), giving the element size excluding borders, the space its content can occupy.
- [7]
render() accepts any Node.js stream for its stdin, stdout and stderr options, for example PassThrough or other Readable/Writable streams; raw mode is used only when stdin is a TTY with setRawMode().
- [8]
In incrementalRendering mode, Ink 8 skips unchanged line prefixes so only the changed part of a line is written, which the notes say reduces output and flicker.
- [9]
Ink 8 drops the ws dependency in favor of the native WebSocket for React DevTools.
- [10]
Ink 8 fixes include preserving scrollback when clearing the viewport and preserving terminal history after clear().
- [11]
Ink 8 strips control characters, except tab and newline, from text content.
- [12]
The Ink 8 release notes list 14 fixes under Rendering, 7 under <Static> and 12 under Text.
- [13]
The Ink 8 release notes group changes under Breaking, New and Fixes, with fixes subdivided into Rendering, <Static>, Text and Input.
- [14]
Ink 8 restores the terminal cursor below the frame on exit.
- [15]
Ink 8 input fixes cover legacy keyboard modifiers, modified SS3 keys, and Kitty keyboard parsing and detection.
- [16]
Ink is React for command-line interfaces (CLIs).
- [17]
The Ink 8 release notes list four breaking changes.
- [18]
The Rendering, <Static> and Text fix sections of the Ink 8 release notes list 33 fixes combined.
Sources
1 independent publisher whose own reporting we read for this story.
- github.comInk 8: React for CLIs Gets Scrollable Views
1 article · October 9, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.