{"full_name":"vadimdemedes/ink","owner":"vadimdemedes","name":"ink","url":"https://github.com/vadimdemedes/ink","description":"🌈 React for interactive command-line apps","homepage":"https://term.ink","topics":[],"language":"TypeScript","license":"MIT","avatar":"https://avatars.githubusercontent.com/u/697676?u=7b74c85cca011ffd18cf20668cc0d8a9b30938cf&v=4","created_at":"2017-06-12T06:12:28Z","pushed_at":"2026-11-10T05:28:45Z","metrics":{"stars":40253,"forks":1062,"watchers":124,"issues":460,"prs":557,"releases":82,"issues_open":null,"issues_closed":null,"prs_open":null,"prs_closed":null,"prs_merged":null,"discussions":46},"growth":{"day":{"stars":1,"forks":-2,"base_day":"2026-11-09"},"week":{"stars":42,"forks":-1,"base_day":"2026-11-03"},"month":{"stars":172,"forks":1,"base_day":"2026-10-11"}},"history":{"dates":["2026-09-06","2026-09-07","2026-09-08","2026-09-09","2026-09-10","2026-09-11","2026-09-12","2026-09-13","2026-09-14","2026-09-15","2026-09-16","2026-09-17","2026-09-18","2026-09-19","2026-09-20","2026-09-21","2026-09-22","2026-09-23","2026-09-24","2026-09-25","2026-09-26","2026-09-27","2026-09-28","2026-09-29","2026-09-30","2026-10-01","2026-10-02","2026-10-03","2026-10-04","2026-10-05","2026-10-06","2026-10-07","2026-10-08","2026-10-09","2026-10-10","2026-10-11","2026-10-12","2026-10-13","2026-10-14","2026-10-15","2026-10-16","2026-10-17","2026-10-18","2026-10-19","2026-10-20","2026-10-21","2026-10-22","2026-10-23","2026-10-24","2026-10-25","2026-10-26","2026-10-27","2026-10-28","2026-10-29","2026-10-30","2026-10-31","2026-11-01","2026-11-02","2026-11-03","2026-11-04","2026-11-09","2026-11-10"],"stars":[39816,39823,39829,39834,39842,39847,39854,39863,39871,39871,39871,39879,39889,39901,39912,39914,39916,39926,39936,39939,39946,39955,39966,39972,39983,39990,39999,40007,40022,40035,40043,40054,40064,40072,40079,40081,40090,40094,40100,40102,40110,40115,40114,40116,40122,40129,40136,40143,40155,40156,40169,40176,40182,40191,40198,40203,40204,40208,40211,40214,40252,40253],"forks":[1045,1044,1046,1046,1049,1050,1051,1050,1050,1050,1050,1050,1050,1052,1052,1051,1052,1052,1053,1053,1052,1052,1053,1052,1052,1052,1054,1057,1058,1058,1059,1059,1059,1059,1061,1061,1061,1060,1061,1061,1062,1062,1062,1062,1060,1062,1062,1063,1063,1063,1063,1063,1063,1063,1063,1064,1063,1063,1063,1063,1064,1062],"watchers":[128,129,129,129,129,129,130,130,130,130,130,130,130,130,130,129,129,129,129,129,128,128,128,128,128,128,128,128,128,128,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,124,124,124,124,124,124,124,124,124,124,124,124,124],"issues_open":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"prs_open":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},"boards":{},"same_owner":[],"issues":[{"number":222,"title":"Scrolling","comments":23,"created_at":"2019-08-29T14:48:30Z"},{"number":973,"title":"<Static> commit taller than the viewport overwrites its own last line (incremental path ignores static-chunk height)","comments":8,"created_at":"2026-06-24T05:42:07Z"},{"number":676,"title":"Feature request: Multi-line input element","comments":6,"created_at":"2024-10-24T17:26:36Z"},{"number":251,"title":"Add cursor support","comments":5,"created_at":"2019-12-16T17:19:39Z"},{"number":1032,"title":"Output caches are rebuilt on every render, so each frame re-tokenizes and re-measures the whole screen","comments":4,"created_at":"2026-09-24T07:48:06Z"},{"number":978,"title":"Native (external) memory leak on repeated render/unmount of a component using useStdin().setRawMode()","comments":3,"created_at":"2026-07-18T15:08:02Z"},{"number":921,"title":"Deprecate pasted-text fallback in `useInput` and make `usePaste` the only paste API","comments":3,"created_at":"2026-03-30T21:01:28Z"},{"number":870,"title":"useCursor requires component to know the position it's displayed at","comments":3,"created_at":"2026-02-10T22:51:32Z"}],"discussions":[{"number":993,"title":"ink-cartridge - A terminal application framework built on Ink","comments":0,"category":"Show and tell","created_at":"2026-08-16T13:09:37Z"},{"number":983,"title":"Can the React Compiler have any effect on Ink?","comments":1,"category":"Q&A","created_at":"2026-08-02T08:49:28Z"},{"number":977,"title":"Ink for Golang","comments":0,"category":"General","created_at":"2026-07-18T05:02:28Z"},{"number":959,"title":"Pilates — pure-TypeScript layout engine inspired by Ink's space","comments":0,"category":"Show and tell","created_at":"2026-05-23T10:24:19Z"},{"number":939,"title":"@real-router/react/ink — a packaged alternative to the MemoryRouter routing recipe","comments":0,"category":"Show and tell","created_at":"2026-04-20T15:29:51Z"},{"number":924,"title":"Claude code third party license","comments":2,"category":"Q&A","created_at":"2026-04-02T00:16:13Z"},{"number":903,"title":"ORCH — AI agent team orchestrator TUI built with Ink + React (1493 tests)","comments":0,"category":"Show and tell","created_at":"2026-03-17T15:26:34Z"},{"number":897,"title":"Question: Place element on last line of terminal","comments":1,"category":"Q&A","created_at":"2026-03-08T12:55:45Z"}],"latest_release":{"name":"","tag":"v8.0.0","published_at":"2026-10-03T11:25:42Z","body":"### Breaking\r\n\r\n- Require React 19.3+  7829102\r\n- `minWidth` and `maxWidth` on `<Box>` now only accept numbers ([#1029](https://github.com/vadimdemedes/ink/issues/1029))  7cd7fd9\r\n  - Percentage strings were never documented as supported, and Yoga resolved them against the wrong ancestor\r\n- `stdin`, `stdout`, and `stderr` are now typed as generic Node.js streams ([#981](https://github.com/vadimdemedes/ink/issues/981))  eb82d8f\r\n  - This applies to the `render()` options and to `useStdin()`, `useStdout()`, and `useStderr()`. TTY-only properties like `stdout.columns` are no longer part of the types\r\n- `useInput` no longer receives unrecognized terminal control sequences (#1014)  c76893e\r\n  - 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\r\n\r\n### New\r\n\r\n- Add [`contentOffsetX`](https://github.com/vadimdemedes/ink#contentoffsetx) and [`contentOffsetY`](https://github.com/vadimdemedes/ink#contentoffsety) props to `<Box>` for building scrollable views ([#765](https://github.com/vadimdemedes/ink/issues/765))  3ba5828\r\n  - Combine with `overflow=\"hidden\"`. See the [scroll example](https://github.com/vadimdemedes/ink/tree/master/examples/scroll)\r\n- Add [`clientWidth`](https://github.com/vadimdemedes/ink#clientwidth) and [`clientHeight`](https://github.com/vadimdemedes/ink#clientheight) to `useBoxMetrics()` and [`measureElement()`](https://github.com/vadimdemedes/ink#measureelementref) (#988)  3ba5828\r\n  - The element size excluding borders, which is the space its content can occupy\r\n- Accept any Node.js stream for the `stdin`, `stdout`, and `stderr` options of `render()` ([#981](https://github.com/vadimdemedes/ink/issues/981))  eb82d8f\r\n  - For example, `PassThrough` or other `Readable`/`Writable` streams. Raw mode is used only when `stdin` is a TTY with `setRawMode()`\r\n- Skip unchanged line prefixes in [`incrementalRendering`](https://github.com/vadimdemedes/ink#incrementalrendering) mode (#1036)  91eb50a\r\n  - Only the changed part of a line is written, which reduces output and flicker\r\n- Drop the `ws` dependency in favor of the native `WebSocket` for React DevTools ([#976](https://github.com/vadimdemedes/ink/issues/976))  33567ed\r\n- Recognize application keypad Enter as `key.return`  b73ebf4\r\n\r\n### Fixes\r\n\r\n#### Rendering\r\n\r\n- Preserve scrollback when clearing the viewport (#994)  fe1d123\r\n- Preserve terminal history after `clear()`  494ebeb\r\n- Restore the unchanged frame when rerendering after `clear()`  fc358c2\r\n- Redraw the frame when the terminal loses rows (#1025)  f603aeb\r\n- Keep content above the frame when rows shrink while the cursor is shown (#1031)  c800284\r\n- Keep the cursor on the last line when output has no trailing newline (#982)  cdc18fa\r\n- Restore the terminal cursor below the frame on exit  06385e9\r\n- Preserve the cursor position when its component skips rendering  013feb2\r\n- Fix incremental rendering of single-line updates, new blank rows, and changed rows (#1039)  9a501e4 507c0c9 509ea75\r\n- Fix overflow clipping when both the shorthand and an explicit axis are set, and preserve `<Transform>` line indices when clipping  4f3c7aa\r\n- Fix background color inheritance for `<Static>` and nested `<Text>`  753a5f8\r\n- Fix fractional percentages being truncated in layout sizes, and restore layout defaults when style props are `undefined`  274b15a\r\n- Preserve visibility across Suspense transitions  fc685bc\r\n- Call `onRender` after the frame is written  83d7de5\r\n\r\n#### `<Static>`\r\n\r\n- Stop replaying `<Static>` output on full-clear frames (#1005)  d661543\r\n- Replay `<Static>` output when resuming re-enters the alternate screen (#1012)  9235028\r\n- Fix repeated padding, ignored margins, and output inside hidden ancestors  793fe59\r\n- Keep `<Static>` output after abandoned concurrent renders  8678b76\r\n- Reset captured `<Static>` output when its identity changes  cfdd9e6\r\n- Preserve blank `<Static>` rows  f6b26"},"readme":true,"readme_zh":false,"news":[],"stale":false,"snapshot_at":"2026-11-10T09:35:25Z","history_start":"2026-09-06"}