Skip to content

krishna-kudari/tuikit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tuikit

shadcn/ui for the terminal — copy-paste TUI components with a design system. You own the code.

TypeScript Rust


What is this?

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 componentsAgentLog, DiffViewer, ThinkingStream — things every AI CLI needs but nobody has built yet
  • Browse in the terminal — the showcase is itself a TUI app

Quickstart

TypeScript / Ink

npx tuikit browse           # open the interactive showcase
npx tuikit add agent-log    # copy AgentLog into your project
import { 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>
  );
}

Rust / Ratatui

cargo run --bin tuikit      # open the interactive showcase
use tuikit_widgets::AgentLog;
use tuikit_core::themes::catppuccin;

let theme = catppuccin();
let widget = AgentLog::new(&entries, &theme).title("Claude");
frame.render_widget(widget, area);

Components

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

Themes

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

Monorepo structure

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)

Philosophy

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.


Contributing

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

License

MIT

About

shadcn/ui for the terminal — Ink + Ratatui component library

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors