Ink: React for interactive CLI apps

Overall reaction to Ink

  • Many find Ink an impressive and creative use of React, showing the “UI as declarative/composable tree” pattern works well beyond the browser.
  • Others feel it’s overkill for most CLIs, which are better kept simple, verbose, and CI-friendly.
  • Some users report positive real-world use (e.g., complex dev tools, microfrontend tooling), calling it ergonomic and maintainable.

Suitability of JS/Node/React for CLIs

  • Skeptics see JS for CLIs as “janky” or misaligned, preferring Go, Nim, or other languages with DSLs/macros.
  • Supporters argue JS is natural when the tool already lives in a JS/TS ecosystem and can reuse libraries.
  • Some say “just because you can doesn’t mean you should,” while others counter there’s room for more TUIs regardless of language.

React beyond the DOM

  • Strong thread insisting React is not tied to the DOM: it’s a generic declarative runtime that builds and diffs a tree, with pluggable renderers (web, native, terminal, etc.).
  • This model is seen as especially apt for terminals, which are more immediate-mode than the browser DOM.
  • Alternatives like Jetpack Compose-based Mosaic and various Go JSX-like libraries are mentioned as similar patterns.

Performance and complexity

  • One side doubts Node/React for performance-heavy tools; another notes V8 is “insanely fast” and premature optimization is a trap.
  • Concerns remain about scaling (e.g., tens of thousands of list items, log viewers) where React’s rendering model can become slow.
  • For many CLI use cases, rendering cost is viewed as negligible.

Ink’s strengths and rough edges

  • Pros: easier composition of reusable TUI components (e.g., file browsers), pleasant React mental model.
  • Cons: lack of absolute positioning, difficulty stacking elements, flickering with complex rerenders, hard to debug.
  • Some teams ended up removing Ink when their tools were primarily non-interactive or CI-focused.

Type systems and XML/JSX digression

  • Heated debate on TypeScript’s type system: praised as powerful and mainstreaming advanced type concepts; criticized as unsound, structurally confusing, and weaker than Haskell/ML/Rust.
  • Discussion of runtime vs compile-time safety and tools like Zod and other languages with runtime checks.
  • Extended side thread comparing XML/XSLT and JSX: XML defended as powerful but over-engineered; JSX praised as a simpler, JS-aligned declarative syntax.

Project status and context

  • Ink’s original maintainer has stepped away due to the war in Ukraine and handed off control; some worry about vulnerabilities and the need to self-maintain forks.