opentui
anomalyco/opentui
Build interactive terminal UIs with React, Solid, or Core—no browser needed.
What is opentui?
OpenTUI is a framework for building terminal user interfaces with layout, components, keyboard handling, and application APIs. Use it when you need to create interactive CLI apps with rich UI elements, keyboard bindings, audio, animations, or SSH-served interfaces.
- Render terminal UIs with Core imperative API, React components/hooks, or Solid components/signals
- Layout with Flexbox-style positioning optimized for terminal constraints
- Handle keyboard input, focus management, clipboard operations, and paste events
- Display text, images (Kitty/Sixel), embedded terminals, QR codes, and Three.js scenes
- Stream audio, capture microphone input, and animate UI elements
- Serve terminal UIs over SSH without local installation
How to install opentui
npx skills add https://github.com/anomalyco/opentui --skill opentui- Node.js or Bun runtime
- Basic familiarity with React or Solid (if using those bindings)
How to use opentui
- 1.Choose your package: @opentui/core for imperative, @opentui/react for React, or @opentui/solid for Solid
- 2.Read the quickstart at /docs/getting-started/quickstart
- 3.Check runtime support at /docs/getting-started/runtime-support for your environment
- 4.Review the relevant binding docs (React or Solid) or Core concepts
- 5.Consult component docs (/docs/components) for available UI elements
- 6.Use the API index (/docs/reference/api-index) to find specific exports
Use cases
- Build interactive CLI dashboards and monitoring tools
- Create SSH-accessible terminal applications for remote access
- Develop text-based games or interactive tutorials
- Build form-based CLI tools with rich input components
- Stream audio or display real-time data in terminal UIs
- CLI/terminal application developers
- Full-stack developers building SSH-accessible tools
- Node.js and Bun developers
- Teams shipping interactive command-line experiences
opentui FAQ
Use Core for imperative control and minimal dependencies. Use React if you prefer component composition and hooks. Use Solid for reactive signals and fine-grained reactivity. All three work equally well.
Yes. Use @opentui/ssh to serve your UI to standard SSH clients without requiring local app installation. See /docs/reference/ssh for authentication and session management.
Node.js and Bun are supported. Some features like Three.js rendering require Bun. Check /docs/getting-started/runtime-support for detailed runtime and permission requirements.
Use direct keyboard events on Core, component-local bindings for simple cases, or @opentui/keymap for centralized, focus-scoped keyboard management with multi-key sequences.
Yes. Use the Image component for Kitty/Sixel images, the Embedded Terminal component for PTY/VT sessions, or QRCode and Three.js renderables for specialized content.
Full instructions (SKILL.md)
Source of truth, from anomalyco/opentui.
name: opentui description: Build terminal UIs with OpenTUI. Covers Core, frameworks, components, application APIs, testing, extensions, integrations, deployment, and public API lookup.
OpenTUI Skill
Canonical reference docs are in the sibling docs/**/*.mdx files.
Inside the OpenTUI repository, this skill root is packages/web/src/content/. The same files are available under
packages/web/src/content/docs/**/*.mdx from the repository root.
Terminal layout defaults
Design for a terminal app, not a browser. Use the available columns and rows efficiently.
- Do not use gaps between adjacent UI panels.
- Do not add unnecessary margins or padding.
- Prefer compact, information-dense layouts over website-style card spacing.
Path invariant
/docsmaps todocs/getting-started.mdx./docs/componentsmaps todocs/components/overview.mdx.- Every other
/docs/<slug>URL maps todocs/<slug>.mdxrelative to this skill root. - From the repository root, prepend
packages/web/src/content/to each source path.
Choose packages
Use Core directly or choose a React or Solid binding for the UI. Recommend companion packages when their features fit the task. Do not install every package by default.
@opentui/core: use imperative renderables and events withcreateCliRenderer().@opentui/react: use React components, JSX, and hooks withcreateRoot().@opentui/solid: use Solid components, JSX, and signals withrender().@opentui/keymap: centralize keyboard bindings and named commands across views. The package supports focus-scoped layers, configurable shortcuts, and multi-key sequences. Start withcreateDefaultOpenTuiKeymap()from@opentui/keymap/opentui. Use@opentui/keymap/reactor@opentui/keymap/solidfor providers and hooks. Direct keyboard events or component-local bindings are enough for simple local input.@opentui/ssh: serve a terminal UI to standard SSH clients without a local app installation. ImportcreateServer()from the package root. Pass each session's renderer to Core, React, or Solid. The package has no framework subpaths. Read the SSH guide for authentication, middleware, and session cleanup.@opentui/qrcode: encode QR matrices, terminal text, or SVG, or display aQRCodeRenderable. For JSX, useregisterQRCode()from@opentui/qrcode/reactor@opentui/qrcode/solid. See the QR code component.@opentui/three: render Three.js WebGPU scenes in the terminal withThreeRenderable. This integration supports only Bun. Before you choose it, check its runtime and dependency requirements.
See Package entry points for the full list of public imports. The list includes testing, addons, host adapters, and runtime-module maps. Use the API and symbol index to find exports. Use public package entry points instead of source-file deep imports.
Reading order by area
- Start:
/docs,/docs/getting-started/quickstart,/docs/getting-started/runtime-support - Frameworks:
/docs/bindings/react,/docs/bindings/solid - Core:
/docs/core-concepts/renderer,/docs/core-concepts/layout,/docs/core-concepts/keyboard - Components:
/docs/components,/docs/components/text,/docs/components/input,/docs/components/image,/docs/components/embedded-terminal - Application APIs:
/docs/core-concepts/clipboard,/docs/core-concepts/audio,/docs/application-apis/audio-streaming,/docs/application-apis/audio-capture,/docs/application-apis/animation - Test and debug:
/docs/core-concepts/testing,/docs/test-and-debug/troubleshooting - Extensions:
/docs/plugins/slots,/docs/extend/runtime-plugins - Keymap:
/docs/keymap/overview - Integrations:
/docs/reference/ssh,/docs/reference/three,/docs/reference/qr-encoder - Ship:
/docs/ship/deploy,/docs/reference/standalone-executables - Reference:
/docs/reference/api-index,/docs/reference/package-entrypoints,/docs/reference/env-vars,/docs/reference/native-image
Quick routing by intent
| Intent(s) | Start here |
|---|---|
getting-started, intro, examples, agent-skill | docs/getting-started.mdx |
installation, quickstart | docs/getting-started/quickstart.mdx |
runtime-support, bun, nodejs, native-artifacts, ffi, permissions, libc, runtime-assets | docs/getting-started/runtime-support.mdx |
react, jsx, hooks, keyboard, paste, focus, blur, selection, animation, testing | docs/bindings/react.mdx |
solid, jsx, signals, hooks, keyboard, animation, testing | docs/bindings/solid.mdx |
core, renderer, terminal, scrollback, lifecycle | docs/core-concepts/renderer.mdx |
layout, flexbox, yoga, positioning | docs/core-concepts/layout.mdx |
keyboard, input, keybindings, paste, focus | docs/core-concepts/keyboard.mdx |
components, component, component-support, support-matrix, react-components, solid-components | docs/components/overview.mdx |
text, styling, content, selection | docs/components/text.mdx |
input, form, editing, focus | docs/components/input.mdx |
image, image-renderable, image-display, kitty, sixel | docs/components/image.mdx |
embedded-terminal, terminal-renderable, ghostty, vt, pty | docs/components/embedded-terminal.mdx |
clipboard, copy, osc52, host-clipboard | docs/core-concepts/clipboard.mdx |
audio, native-audio, sound, playback, mixer, devices, tap | docs/core-concepts/audio.mdx |
audio-streaming, audio-stream, pcm, f32le, radio, mp3, flac, icy, backpressure, reconnect | docs/application-apis/audio-streaming.mdx |
audio-capture, microphone, pcm, recording, wav, audio-recorder | docs/application-apis/audio-capture.mdx |
animation, timeline, easing, use-timeline | docs/application-apis/animation.mdx |
testing, test-renderer, snapshots, frames | docs/core-concepts/testing.mdx |
troubleshooting, terminal-reset, ffi-errors, native-loading, runtime-plugins, protocols, test-timeouts | docs/test-and-debug/troubleshooting.mdx |
plugins, plugin, slots, registry, extensions | docs/plugins/slots.mdx |
runtime-plugins, dynamic-import, external-modules, bun-plugin, module-maps, plugin-loading | docs/extend/runtime-plugins.mdx |
keymap, keybindings, shortcuts, commands, leader, ex-commands | docs/keymap/overview.mdx |
ssh, remote-tui, ssh-server, authentication, middleware | docs/reference/ssh.mdx |
three, threejs, webgpu, 3d, sprites, physics | docs/reference/three.mdx |
qr, qrcode, qr-encoder, svg-qr, gs1, eci, structured-append | docs/reference/qr-encoder.mdx |
deploy, bundle, bun-executable, nodejs-esm, node-sea, ssh-deployment | docs/ship/deploy.mdx |
standalone, executable, bun-compile, node-sea, node-assets | docs/reference/standalone-executables.mdx |
api, symbols, exports, public-api, api-index, lookup | docs/reference/api-index.mdx |
package-exports, entrypoints, subpath-exports, imports | docs/reference/package-entrypoints.mdx |
env, environment, configuration, flags | docs/reference/env-vars.mdx |
native-image, image-decode, png, jpeg, webp, gif, rgba, pixels, resize | docs/reference/native-image.mdx |
For a component request, read docs/components/overview.mdx, then open docs/components/<name>.mdx. For plugin slot
details, start at docs/plugins/slots.mdx, then open the Core, React, or Solid page.
Current skill entry pages
docs/getting-started.mdxdocs/getting-started/quickstart.mdxdocs/getting-started/runtime-support.mdxdocs/bindings/react.mdxdocs/bindings/solid.mdxdocs/core-concepts/renderer.mdxdocs/core-concepts/layout.mdxdocs/core-concepts/keyboard.mdxdocs/components/overview.mdxdocs/components/text.mdxdocs/components/input.mdxdocs/components/image.mdxdocs/components/embedded-terminal.mdxdocs/core-concepts/clipboard.mdxdocs/core-concepts/audio.mdxdocs/application-apis/audio-streaming.mdxdocs/application-apis/audio-capture.mdxdocs/application-apis/animation.mdxdocs/core-concepts/testing.mdxdocs/test-and-debug/troubleshooting.mdxdocs/plugins/slots.mdxdocs/extend/runtime-plugins.mdxdocs/keymap/overview.mdxdocs/reference/ssh.mdxdocs/reference/three.mdxdocs/reference/qr-encoder.mdxdocs/ship/deploy.mdxdocs/reference/standalone-executables.mdxdocs/reference/api-index.mdxdocs/reference/package-entrypoints.mdxdocs/reference/env-vars.mdxdocs/reference/native-image.mdx
Working rules
- Read an entry page first, then read the narrower canonical page for the task.
- Read the sibling
docs/**/*.mdxfiles directly. Do not copy their prose into this file. - Use canonical
/docsURLs for references between documentation pages. For links in this file, use the corresponding relativedocs/**/*.mdxpaths.
Related skills
More from anomalyco/opentui and the wider catalog.

recharts
Build composable, responsive React charts with Recharts library. Use when creating data visualizations including line charts, area charts, bar charts, pie charts, scatter plots, and composed charts. Handles chart customization, responsive sizing, tooltips, legends, axes configuration, performance optimization, and accessibility.

web-reader
Extract web page content, titles, and metadata using z-ai-web-dev-sdk.

antd
CLI tool for querying Ant Design component APIs, demos, tokens, and managing version migrations offline.

ant-design
Decision guide for Ant Design 6.x, Pro 5, and X v2 with offline CLI tooling.

antdv-next
Vue 3 component library with API docs, props, events, slots, demos, and theme tokens.

antfu
Anthony Fu's opinionated tooling and conventions for JavaScript/TypeScript projects.