# What changed in ink

> 117 changes in ink 6 to 8 from its official release notes, upgrade guides and advisories: 15 breaking, 32 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/npm/ink/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## ink 8

### Breaking changes

- Components sharing a focus ID are treated as one Tab stop, automatically generated IDs no longer collide, and an empty string is a valid focus ID. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- The <Box> prop now only accepts numbers; use a number for a relative width calculated from window or parent metrics. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- The <Box> prop now only accepts numbers; use a number for a relative width calculated from window or parent metrics. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- onRender is called after the frame is written. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- React 19.3 or later is now required. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- <Static> output is no longer replayed on full-clear frames and is replayed when resuming re-enters the alternate screen. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- The render() option and useStdout() expose generic Node.js streams; TTY-only properties such as columns are no longer part of the types. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Multiline text truncates each line separately, remains at natural width when there is no room to wrap, and no longer vanishes when it starts above the output. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Control characters other than tab and newline are stripped; tabs expand, and CRLF and zero-width spaces no longer overwrite nearby output. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Unrecognized terminal control sequences, including mouse reports and focus events, are dropped instead of being delivered to input handlers. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- React DevTools now uses the native WebSocket instead of the ws dependency. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)

### New APIs and options

- A new <Box> prop supports building scrollable views when combined with overflow="hidden". (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- A new <Box> prop supports building scrollable views when combined with overflow="hidden". (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- measureElement() now provides clientHeight, the element's content-available height excluding borders. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- measureElement() now provides clientWidth, the element's content-available width excluding borders. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- useBoxMetrics() now provides clientHeight, the element's content-available height excluding borders. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- useBoxMetrics() now provides clientWidth, the element's content-available width excluding borders. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)

### Performance

- Incremental rendering skips unchanged line prefixes and writes only the changed part of a line, reducing output and flicker. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)

### Behavior and default changes

- Application keypad Enter is now recognized as key.return. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- render() accepts any Node.js stream for stderr, including PassThrough or other Writable streams. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- render() accepts any Node.js stream for stdin; raw mode is used only when stdin is a TTY with setRawMode(). (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- render() accepts any Node.js stream for stdout, including PassThrough or other Writable streams. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Enabling reportAssociatedText now automatically enables reportAllKeysAsEscapeCodes. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- The render() option and useStderr() expose generic Node.js streams rather than TTY-specific types. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- The render() option and useStdin() expose generic Node.js streams rather than TTY-specific types; raw mode is used only for a TTY with setRawMode(). (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)

### Fixes and other changes

- Styles are preserved across explicit newlines and combining marks across nested text styles; colon and C1 SGR sequences are normalized before layout. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Background colors now inherit correctly for <Static> and nested <Text>. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Terminal history is preserved after clear(), and rerendering restores the unchanged frame. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Invalid color names no longer crash rendering, and whitespace in RGB colors is handled correctly. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Ctrl+C is handled when it arrives together with ordinary input. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- disableFocus() blurs the focused component as documented and prevents new components from auto-focusing when disabled. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Incremental rendering is corrected for single-line updates, new blank rows, and changed rows. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Legacy keyboard modifiers, modified SS3 keys, and Kitty keyboard parsing and detection are fixed. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Fractional percentages are no longer truncated in layout sizes, and layout defaults are restored when style props are undefined. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Parsing Meta keys no longer mutates the caller's buffer. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- The callback remains stable across rerender() calls. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Clipping works when the overflow shorthand and an explicit axis are both set, and <Transform> line indices are preserved. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- render() uses defaults for options that are undefined. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Error source excerpts work for file URLs and multiline messages, non-Error throws are treated as rendering failures, and renderToString() no longer swallows thrown undefined. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- renderToString() no longer swallows a thrown undefined, and effect cleanup runs when output rendering fails. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Screen-reader output fixes cover semantic text and labels, empty <Transform> labels, rewrapping when the terminal widens, and restoring output after console writes. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- <Static> output now handles repeated padding, margins, hidden ancestors, abandoned concurrent renders, identity changes, blank rows, and indirect subtree removal correctly. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Input-hook side effects are deferred while the terminal is suspended; suspension handles are idempotent and no longer restore released or unmounted-app input modes. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Cursor placement is corrected for output without a trailing newline, skipped component renders, and application exit. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- The frame is redrawn when the terminal loses rows, and content above it is kept when rows shrink while the cursor is shown. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Clearing the viewport preserves scrollback and terminal history. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Output is preserved during non-interactive terminal suspension. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Text is remeasured when its wrapping mode or <Transform> wrap points change, and truncated-text measurement preserves available width. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- useAnimation() values reset while paused. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Box metrics are tracked when a child attaches the ref after mount. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- useWindowSize() no longer misses resizes that happen before it subscribes. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Visibility is preserved across Suspense transitions. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)
- Styles and columns are preserved for clipped or overwritten wide characters. (8.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v8.0.0)

## ink 7

### Breaking changes

- Pressing Backspace now sets key.backspace instead of key.delete; use key.backspace to detect physical Backspace presses. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Plain Escape no longer sets key.meta; key.meta is reserved for actual Alt/Meta modifier combinations. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Ink now requires Node.js 22. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Ink now requires React 19.2 or later. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)

### New APIs and options

- Adds suspendTerminal() to hand the terminal to a child process. (7.1.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.1.0)
- Adds the alignContent layout prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the aspectRatio layout prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds borderBackgroundColor and per-side variants to Box, allowing border background color to be set independently from the box content background. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the bottom layout prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the left layout prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the maxHeight prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the maxWidth prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds position="static" as a Box layout prop. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the alternateScreen option to render into the terminal's alternate screen buffer and restore previous terminal content on exit. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the interactive option to override automatic interactive-mode detection when the built-in heuristic does not fit. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the right layout prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds the top layout prop to Box. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds built-in animation support with a frame counter, configurable interval, pause/resume support, and automatic cleanup on unmount. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds a hook for measuring box dimensions at runtime. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds activeId, which returns the ID of the currently focused component or undefined if nothing is focused. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds a hook for clipboard paste events that enables bracketed paste mode so pasted text arrives as a single string. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds a hook that returns terminal columns and rows and re-renders automatically when the terminal resizes. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Adds wrap="hard" to Text; it fills each line to the full column width, breaking words mid-word as needed. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)

### Behavior and default changes

- Also returns position coordinates. (7.1.1) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.1.1)
- Auto mode now queries all terminals instead of relying on a hardcoded allowlist. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)

### Fixes and other changes

- Preserves the last <Static> line that was erased after a full-clear frame. (7.1.1) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.1.1)
- Fixes stale frames on Windows when output exactly fills the terminal. (7.0.6) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.6)
- Handles incomplete stack frames in the error overview. (7.0.5) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.5)
- Full static output no longer retains stale <Static> output when identity changes. (7.0.3) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.3)
- A <Static> remount caused by a key change no longer drops new items. (7.0.3) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.3)
- Accepts ref objects whose initial value is null. (7.0.3) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.3)
- Defers disabling raw mode to prevent the process from hanging when a component is swapped. (7.0.2) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.2)
- Escape handling now respects disableFocus(). (7.0.1) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.1)
- Restores the exit typing for useApp. (7.0.1) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.1)
- Fixes CJK text truncation that exceeded the Box width. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Fixes incremental rendering when output ends with a trailing newline. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Fixes a crash when useInput receives unmapped key codes. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)
- Fixes splitting emoji and CJK wide characters when overlapping writes occur. (7.0.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v7.0.0)

## ink 6

### New APIs and options

- Adds synchronous string output through renderToString(). (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Allows exit() to pass a result value to waitUntilExit(). (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Adds opt-in support for the kitty keyboard protocol. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Adds opt-in support for React concurrent rendering. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Adds an API for positioning the cursor for IME input. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Adds the incrementalRendering option. (6.5.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.5.0)
- Adds the onRender hook. (6.4.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.4.0)

### Performance

- Improves performance by caching some expensive calls. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)

### Behavior and default changes

- Adds support for the end key in useInput. (6.6.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.6.0)
- Adds support for the home key in useInput. (6.6.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.6.0)

### Tooling

- Adds support for react-devtools v7. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)

### Fixes and other changes

- Fixes handling of colored output from child processes. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Fixes support for hyperlinks. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Prevents keypresses from being dropped when multiple inputs arrive in one readable tick. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Fixes duplicated Static output on exit. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Handles stdout ending during unmount. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Fixes wrapping with nested Text components. (6.8.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.8.0)
- Fixes the trailing newline on the initial fullscreen render. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Fixes handling of Option+Return, or soft return, on macOS. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Adds synchronized updates, fixing flickering in many modern terminals. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Improves terminal size detection for piped processes. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Unmount now flushes pending renders and waits for stdout to drain. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Fixes MaxListenersExceededWarning when many useInput hooks are used. (6.7.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.7.0)
- Fixes some flicker during incremental rendering. (6.6.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.6.0)
- Fixes handling of terminal resize. (6.5.1) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.5.1)
- Fixes the color of `.dim.bold`. (6.4.0) — [release notes](https://github.com/vadimdemedes/ink/releases/tag/v6.4.0)
