Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
dimitrigilbert avatar

Opentui

  • 12 installs
  • 5 repo stars
  • Updated June 3, 2026
  • dimitrigilbert/ai-skills

Build terminal UIs with OpenTUI's imperative core API in vanilla TypeScript, including layout and input handling.

About

Expert guidance for building terminal UIs with OpenTUI's imperative core API in vanilla TypeScript. A developer uses it for component creation, layout, input handling, and styling in the terminal.

  • Imperative OpenTUI core API with TextRenderable, BoxRenderable, and Yoga flexbox layout
  • Vanilla TypeScript patterns for input handling, styling, and animations (requires Zig)

Opentui by the numbers

  • 12 all-time installs (skills.sh)
  • Ranked #383 of 550 CLI & Terminal skills by installs in the Skillselion catalog
  • Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dimitrigilbert/ai-skills --skill opentui

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs12
repo stars5
Last updatedJune 3, 2026
Repositorydimitrigilbert/ai-skills

What it does

Build terminal UIs with OpenTUI's imperative core API in vanilla TypeScript, including layout and input handling.

Files

SKILL.mdMarkdownGitHub ↗

OpenTUI Core Development

Expert assistance for building terminal user interfaces with OpenTUI's imperative API.

Quick Start

# Install dependencies
bun install @opentui/core

# Zig is required for native modules
# Install from: https://ziglang.org/download/

Core Components

ComponentPurposeImport
TextRenderableText display with stylingimport { TextRenderable } from "@opentui/core"
BoxRenderableContainer with borders/backgroundsimport { BoxRenderable } from "@opentui/core"
GroupRenderableLayout containersimport { GroupRenderable } from "@opentui/core"
InputRenderableSingle-line text inputimport { InputRenderable } from "@opentui/core"
SelectRenderableDropdown selectionimport { SelectRenderable } from "@opentui/core"
ScrollBoxRenderableScrollable content areasimport { ScrollBoxRenderable } from "@opentui/core"
CodeRenderableSyntax-highlighted codeimport { CodeRenderable } from "@opentui/core"

Basic Pattern

import { createCliRenderer } from "@opentui/core"
import { BoxRenderable, TextRenderable } from "@opentui/core"

async function main() {
  const renderer = await createCliRenderer()

  const box = new BoxRenderable()
  const text = new TextRenderable("Hello, OpenTUI!")
  box.add(text)

  renderer.getRoot().add(box)
  renderer.start()

  // Handle Ctrl+C to exit
  renderer.on("key", (key) => {
    if (key.name === "c" && key.ctrl) {
      renderer.destroy()
      process.exit(0)
    }
  })
}

main()

Layout with Yoga (CSS Flexbox)

import { Yoga } from "@opentui/core"

const group = new GroupRenderable()
group.setStyle({
  flexDirection: "column",
  justifyContent: "center",
  alignItems: "center",
  width: 80,
  height: 24,
})

See LAYOUT.md for all Yoga properties.

Input Handling

Keyboard Events

renderer.on("key", (key: KeyEvent) => {
  if (key.name === "escape") process.exit(0)
  if (key.name === "c" && key.ctrl) process.exit(0)
})

Component Input Events

const input = new InputRenderable()
input.on("submit", (value: string) => {
  console.log("Submitted:", value)
})
input.on("change", (value: string) => {
  console.log("Changed:", value)
})

See INPUT.md for complete event handling patterns.

Styling & Colors

import { Color, parseColor } from "@opentui/core"

// Create colors
const red = new Color(255, 0, 0)        // RGB integers
const blue = Color.fromInts(0, 0, 255) // Static method
const green = parseColor("#00FF00")     // Parse hex

// Apply styles
box.setStyle({
  backgroundColor: red,
  foregroundColor: blue,
  borderStyle: "double",
  paddingLeft: 2,
  paddingRight: 2,
})

See STYLING.md for color system and style properties.

Animations

import { Timeline } from "@opentui/core"

const box = new BoxRenderable()
const timeline = new Timeline({
  duration: 1000,
  easing: (t) => t * (2 - t), // easeOutQuad
})

timeline.to(box, {
  backgroundColor: new Color(255, 0, 0),
}, {
  onUpdate: () => renderer.render()
})

timeline.play()

See ANIMATION.md for animation patterns.

Debugging

// Enable console overlay
import { consoleOverlay } from "@opentui/core"
renderer.attach(consoleOverlay())

// Now console.log() appears in terminal overlay
console.log("Debug: initialized")

When to Use This Skill

Use /opentui for:

  • Building TUIs with vanilla TypeScript/JavaScript
  • Creating custom OpenTUI components
  • Understanding core OpenTUI architecture
  • Performance optimization
  • Low-level debugging

For React-specific development, use /opentui-react For SolidJS-specific development, use /opentui-solid For project scaffolding and examples, use /opentui-projects

Common Tasks

  • Create a form: Use BoxRenderable + InputRenderable components with Yoga layout
  • Handle keyboard shortcuts: Listen to renderer "key" events
  • Make scrollable lists: Use ScrollBoxRenderable with dynamic content
  • Display code: Use CodeRenderable for syntax highlighting
  • Add borders: Use BoxRenderable with borderStyle property

Resources

  • Component API - Complete component reference
  • Layout Guide - Yoga flexbox properties
  • Event Handling - Keyboard, mouse, clipboard
  • Styling - Colors, borders, spacing
  • Animations - Timeline and easing
  • Testing - Testing utilities

Key Knowledge Sources

  • OpenTUI GitHub: https://github.com/sst/opentui
  • Context7: /sst/opentui (168 code snippets, High reputation)
  • Research: .search-data/research/opentui/

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.