unstale

npm / ink

ink

What changed in ink 6 to 8, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-17.

15 breaking32 new APIs and options2 performance11 behavior and defaults1 tooling56 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.1.1 on npm

ink 853 changes

Breaking changes 11

  • 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.0release notes

  • The <Box> prop now only accepts numbers; use a number for a relative width calculated from window or parent metrics.

    8.0.0release notes

  • The <Box> prop now only accepts numbers; use a number for a relative width calculated from window or parent metrics.

    8.0.0release notes

  • onRender is called after the frame is written.

    8.0.0release notes

  • React 19.3 or later is now required.

    8.0.0release notes

  • <Static> output is no longer replayed on full-clear frames and is replayed when resuming re-enters the alternate screen.

    8.0.0release notes

  • 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.0release notes

  • 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.0release notes

  • Control characters other than tab and newline are stripped; tabs expand, and CRLF and zero-width spaces no longer overwrite nearby output.

    8.0.0release notes

  • Unrecognized terminal control sequences, including mouse reports and focus events, are dropped instead of being delivered to input handlers.

    8.0.0release notes

  • React DevTools now uses the native WebSocket instead of the ws dependency.

    8.0.0release notes

New APIs and options 6

  • A new <Box> prop supports building scrollable views when combined with overflow="hidden".

    8.0.0release notes

  • A new <Box> prop supports building scrollable views when combined with overflow="hidden".

    8.0.0release notes

  • measureElement() now provides clientHeight, the element's content-available height excluding borders.

    8.0.0release notes

  • measureElement() now provides clientWidth, the element's content-available width excluding borders.

    8.0.0release notes

  • useBoxMetrics() now provides clientHeight, the element's content-available height excluding borders.

    8.0.0release notes

  • useBoxMetrics() now provides clientWidth, the element's content-available width excluding borders.

    8.0.0release notes

Performance 1

  • Incremental rendering skips unchanged line prefixes and writes only the changed part of a line, reducing output and flicker.

    8.0.0release notes

Behavior and default changes 7

  • Application keypad Enter is now recognized as key.return.

    8.0.0release notes

  • render() accepts any Node.js stream for stderr, including PassThrough or other Writable streams.

    8.0.0release notes

  • render() accepts any Node.js stream for stdin; raw mode is used only when stdin is a TTY with setRawMode().

    8.0.0release notes

  • render() accepts any Node.js stream for stdout, including PassThrough or other Writable streams.

    8.0.0release notes

  • Enabling reportAssociatedText now automatically enables reportAllKeysAsEscapeCodes.

    8.0.0release notes

  • The render() option and useStderr() expose generic Node.js streams rather than TTY-specific types.

    8.0.0release notes

  • 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.0release notes

Fixes and other changes 28

  • Styles are preserved across explicit newlines and combining marks across nested text styles; colon and C1 SGR sequences are normalized before layout.

    8.0.0release notes

  • Background colors now inherit correctly for <Static> and nested <Text>.

    8.0.0release notes

  • Terminal history is preserved after clear(), and rerendering restores the unchanged frame.

    8.0.0release notes

  • Invalid color names no longer crash rendering, and whitespace in RGB colors is handled correctly.

    8.0.0release notes

  • Ctrl+C is handled when it arrives together with ordinary input.

    8.0.0release notes

  • disableFocus() blurs the focused component as documented and prevents new components from auto-focusing when disabled.

    8.0.0release notes

  • Incremental rendering is corrected for single-line updates, new blank rows, and changed rows.

    8.0.0release notes

  • Legacy keyboard modifiers, modified SS3 keys, and Kitty keyboard parsing and detection are fixed.

    8.0.0release notes

  • Fractional percentages are no longer truncated in layout sizes, and layout defaults are restored when style props are undefined.

    8.0.0release notes

  • Parsing Meta keys no longer mutates the caller's buffer.

    8.0.0release notes

  • The callback remains stable across rerender() calls.

    8.0.0release notes

  • Clipping works when the overflow shorthand and an explicit axis are both set, and <Transform> line indices are preserved.

    8.0.0release notes

  • render() uses defaults for options that are undefined.

    8.0.0release notes

  • 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.0release notes

  • renderToString() no longer swallows a thrown undefined, and effect cleanup runs when output rendering fails.

    8.0.0release notes

  • 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.0release notes

  • <Static> output now handles repeated padding, margins, hidden ancestors, abandoned concurrent renders, identity changes, blank rows, and indirect subtree removal correctly.

    8.0.0release notes

  • 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.0release notes

  • Cursor placement is corrected for output without a trailing newline, skipped component renders, and application exit.

    8.0.0release notes

  • 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.0release notes

  • Clearing the viewport preserves scrollback and terminal history.

    8.0.0release notes

  • Output is preserved during non-interactive terminal suspension.

    8.0.0release notes

  • Text is remeasured when its wrapping mode or <Transform> wrap points change, and truncated-text measurement preserves available width.

    8.0.0release notes

  • useAnimation() values reset while paused.

    8.0.0release notes

  • Box metrics are tracked when a child attaches the ref after mount.

    8.0.0release notes

  • useWindowSize() no longer misses resizes that happen before it subscribes.

    8.0.0release notes

  • Visibility is preserved across Suspense transitions.

    8.0.0release notes

  • Styles and columns are preserved for clipped or overwritten wide characters.

    8.0.0release notes

ink 738 changes

Breaking changes 4

  • Pressing Backspace now sets key.backspace instead of key.delete; use key.backspace to detect physical Backspace presses.

    7.0.0release notes

  • Plain Escape no longer sets key.meta; key.meta is reserved for actual Alt/Meta modifier combinations.

    7.0.0release notes

  • Ink now requires Node.js 22.

    7.0.0release notes

  • Ink now requires React 19.2 or later.

    7.0.0release notes

New APIs and options 19

  • Adds suspendTerminal() to hand the terminal to a child process.

    7.1.0release notes

  • Adds the alignContent layout prop to Box.

    7.0.0release notes

  • Adds the aspectRatio layout prop to Box.

    7.0.0release notes

  • Adds borderBackgroundColor and per-side variants to Box, allowing border background color to be set independently from the box content background.

    7.0.0release notes

  • Adds the bottom layout prop to Box.

    7.0.0release notes

  • Adds the left layout prop to Box.

    7.0.0release notes

  • Adds the maxHeight prop to Box.

    7.0.0release notes

  • Adds the maxWidth prop to Box.

    7.0.0release notes

  • Adds position="static" as a Box layout prop.

    7.0.0release notes

  • Adds the alternateScreen option to render into the terminal's alternate screen buffer and restore previous terminal content on exit.

    7.0.0release notes

  • Adds the interactive option to override automatic interactive-mode detection when the built-in heuristic does not fit.

    7.0.0release notes

  • Adds the right layout prop to Box.

    7.0.0release notes

  • Adds the top layout prop to Box.

    7.0.0release notes

  • Adds built-in animation support with a frame counter, configurable interval, pause/resume support, and automatic cleanup on unmount.

    7.0.0release notes

  • Adds a hook for measuring box dimensions at runtime.

    7.0.0release notes

  • Adds activeId, which returns the ID of the currently focused component or undefined if nothing is focused.

    7.0.0release notes

  • Adds a hook for clipboard paste events that enables bracketed paste mode so pasted text arrives as a single string.

    7.0.0release notes

  • Adds a hook that returns terminal columns and rows and re-renders automatically when the terminal resizes.

    7.0.0release notes

  • Adds wrap="hard" to Text; it fills each line to the full column width, breaking words mid-word as needed.

    7.0.0release notes

Behavior and default changes 2

  • Also returns position coordinates.

    7.1.1release notes

  • Auto mode now queries all terminals instead of relying on a hardcoded allowlist.

    7.0.0release notes

Fixes and other changes 13

  • Preserves the last <Static> line that was erased after a full-clear frame.

    7.1.1release notes

  • Fixes stale frames on Windows when output exactly fills the terminal.

    7.0.6release notes

  • Handles incomplete stack frames in the error overview.

    7.0.5release notes

  • Full static output no longer retains stale <Static> output when identity changes.

    7.0.3release notes

  • A <Static> remount caused by a key change no longer drops new items.

    7.0.3release notes

  • Accepts ref objects whose initial value is null.

    7.0.3release notes

  • Defers disabling raw mode to prevent the process from hanging when a component is swapped.

    7.0.2release notes

  • Escape handling now respects disableFocus().

    7.0.1release notes

  • Restores the exit typing for useApp.

    7.0.1release notes

  • Fixes CJK text truncation that exceeded the Box width.

    7.0.0release notes

  • Fixes incremental rendering when output ends with a trailing newline.

    7.0.0release notes

  • Fixes a crash when useInput receives unmapped key codes.

    7.0.0release notes

  • Fixes splitting emoji and CJK wide characters when overlapping writes occur.

    7.0.0release notes

ink 626 changes

New APIs and options 7

Performance 1

  • Improves performance by caching some expensive calls.

    6.8.0release notes

Behavior and default changes 2

Tooling 1

Fixes and other changes 15

  • Fixes handling of colored output from child processes.

    6.8.0release notes

  • Fixes support for hyperlinks.

    6.8.0release notes

  • Prevents keypresses from being dropped when multiple inputs arrive in one readable tick.

    6.8.0release notes

  • Fixes duplicated Static output on exit.

    6.8.0release notes

  • Handles stdout ending during unmount.

    6.8.0release notes

  • Fixes wrapping with nested Text components.

    6.8.0release notes

  • Fixes the trailing newline on the initial fullscreen render.

    6.7.0release notes

  • Fixes handling of Option+Return, or soft return, on macOS.

    6.7.0release notes

  • Adds synchronized updates, fixing flickering in many modern terminals.

    6.7.0release notes

  • Improves terminal size detection for piped processes.

    6.7.0release notes

  • Unmount now flushes pending renders and waits for stdout to drain.

    6.7.0release notes

  • Fixes MaxListenersExceededWarning when many useInput hooks are used.

    6.7.0release notes

  • Fixes some flicker during incremental rendering.

    6.6.0release notes

  • Fixes handling of terminal resize.

    6.5.1release notes

  • Fixes the color of .dim.bold.

    6.4.0release notes