ink
Scannednpx machina-cli add skill georg-unterholzner/ink-skill/ink --openclawInk - React for CLIs
React for CLIs. Build and test your CLI output using components.
Ink provides the same component-based UI building experience that React offers in the browser, but for command-line apps. It uses Yoga for Flexbox layouts in the terminal.
Important: All text must be wrapped in a <Text> component.
Quick Example
import {render, Text, Box} from 'ink';
render(
<Box borderStyle="round" padding={1}>
<Text color="green">Hello World</Text>
</Box>
);
Components
<Text>- Display text with styling (color, bold, italic, underline, etc.)<Box>- Flexbox container for layouts- Layout Properties - dimensions, flex, spacing, alignment
- Visual Properties - borders, colors, backgrounds
<Newline>- Insert newline characters<Spacer>- Flexible space that expands to fill available space<Static>- Permanently render output above everything else (for logs, completed tasks)<Transform>- Transform string representation before output
Hooks
Interaction
useInput()- Handle keyboard input (arrow keys, enter, escape, etc.)useFocus()- Make components focusable with Tab keyuseFocusManager()- Programmatically manage focus
Lifecycle & Streams
useApp()- Exit the app programmaticallyuseStdin()- Access stdin stream and setRawModeuseStdout()- Access stdout stream and write outputuseStderr()- Access stderr stream
Accessibility
useIsScreenReaderEnabled()- Detect if screen reader is active
API
render(tree, options?)- Mount and render your app- Instance Methods - rerender(), unmount(), waitUntilExit(), clear()
measureElement(ref)- Get width and height of a component
Guides
- Accessibility & Screen Readers - ARIA support, screen reader integration
- Testing - Test Ink components with ink-testing-library
- React DevTools - Debug with React DevTools
Third-Party Components
See references/third-party.md for a comprehensive list of community components including:
- Text inputs, spinners, select menus
- Progress bars, tables, charts
- Markdown rendering, syntax highlighting
- And many more
Source
git clone https://github.com/georg-unterholzner/ink-skill/blob/main/ink/SKILL.mdView on GitHub Overview
Ink lets you build interactive terminal UIs using React components. It brings React-style layout and styling to the command line, powered by Yoga for flexbox, and requires all text to be wrapped in a Text component for consistent styling and accessibility.
How This Skill Works
Code your UI with components like Box for layout and Text for styling; Ink renders your tree to the terminal via render. It exposes hooks such as useInput, useFocus, and useApp to handle keyboard input, focus management, and lifecycle events, enabling dynamic and accessible CLIs.
When to Use It
- Create interactive CLI tools with menus and keyboard navigation
- Design complex, responsive terminal layouts using Box and Text
- Build live-updating dashboards or log viewers in the terminal
- Develop accessible CLIs that work with screen readers
- Prototype and test UIs with ink-testing-library
Quick Start
- Step 1: Install Ink with npm i ink
- Step 2: Create a component using Box and Text and render it with render
- Step 3: Add interactivity using useInput and useFocus, then run your CLI
Best Practices
- Always wrap text in the Text component
- Use Box for flex layouts powered by Yoga for predictable terminal layouts
- Leverage useInput to respond to keyboard input and implement shortcuts
- Use useFocus and useFocusManager to control focus order
- Use Static for persistent logs or important output above other content
Example Use Cases
- Interactive installer wizard with step-by-step prompts
- Live monitoring dashboard showing real-time stats
- Keyboard-navigable settings menu for CLI apps
- Styled log viewer with colors and borders
- Progress indicators and spinners inside a textual UI