shadcn/ui for the terminal — copy-paste TUI components with a design system. You own the code.
shadcn/ui proved that the right model for UI components isn't a package you install — it's code you copy into your project and own. tuikit applies that philosophy to terminal UIs.
- Design system first — 4 built-in themes (dark, catppuccin, nord, light), semantic color tokens, consistent spacing
- Copy-paste ownership — components live in your codebase, not behind a library version
- AI-native components —
AgentLog,DiffViewer,ThinkingStream— things every AI CLI needs but nobody has built yet - Browse in the terminal — the showcase is itself a TUI app
npx tuikit browse # open the interactive showcase
npx tuikit add agent-log # copy AgentLog into your projectimport { ThemeProvider, AgentLog } from "@tuikit/ink";
export function App() {
const [entries, setEntries] = useState([]);
// Add a tool call
useEffect(() => {
setEntries([{ id: "1", name: "read_file", status: "running",
args: [{ key: "path", value: "src/index.ts" }] }]);
setTimeout(() =>
setEntries(prev => prev.map(e => e.id === "1"
? { ...e, status: "success", result: "120 lines", durationMs: 43 }
: e
)), 1500);
}, []);
return (
<ThemeProvider theme="catppuccin">
<AgentLog entries={entries} title="Claude" />
</ThemeProvider>
);
}cargo run --bin tuikit # open the interactive showcaseuse tuikit_widgets::AgentLog;
use tuikit_core::themes::catppuccin;
let theme = catppuccin();
let widget = AgentLog::new(&entries, &theme).title("Claude");
frame.render_widget(widget, area);| Component | Status | Stack | Description |
|---|---|---|---|
AgentLog |
✅ MVP | Ink + Ratatui | Streaming AI agent tool call log |
CommandPalette |
🔜 | Ink + Ratatui | Fuzzy-searchable command overlay |
DiffViewer |
🔜 | Ink + Ratatui | Side-by-side diff with syntax highlight |
ThinkingStream |
🔜 | Ink + Ratatui | Animated streaming text |
FileTree |
🔜 | Ink + Ratatui | Interactive file tree with git status |
ToolCallCard |
🔜 | Ink + Ratatui | Single tool call display card |
ConfirmDanger |
🔜 | Ink + Ratatui | Destructive action confirmation modal |
All components respond to theme changes instantly. Cycle themes with t in the browse app.
| Theme | Source |
|---|---|
dark |
GitHub Dark |
catppuccin |
Catppuccin Mocha |
nord |
Nord |
light |
GitHub Light |
tuikit/
├── packages/
│ └── ink/ # @tuikit/ink — TypeScript / Ink
│ └── src/
│ ├── tokens/ # Design system (themes, tokens, ThemeProvider)
│ ├── components/ # Components (copy into your project)
│ │ └── agent-log/
│ ├── browse/ # Interactive showcase TUI
│ └── cli/ # npx tuikit CLI
└── crates/
├── tuikit-core/ # Design tokens for Ratatui
├── tuikit-widgets/ # Ratatui widgets
└── tuikit-browse/ # Interactive showcase TUI (Rust)
Components in tuikit are not a dependency. They're a starting point.
When you run npx tuikit add agent-log, it copies the source into ./components/tui/agent-log/. You can read it, modify it, delete parts you don't need. It belongs to your project.
This is the shadcn model — and it works just as well for terminals as it does for the web.
Components that would make AI CLI tools better are the priority:
- If you're hand-rolling a diff viewer in your agent tool, open a PR here instead
- If you've built something with tuikit, add it to the showcase
MIT