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.