PluginBench
Skill
Pass
Audit score 90

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
Prerequisites
  • Node.js or Bun runtime
  • Basic familiarity with React or Solid (if using those bindings)
Claude Code
Cursor
Windsurf
Cline

How to use opentui

  1. 1.Choose your package: @opentui/core for imperative, @opentui/react for React, or @opentui/solid for Solid
  2. 2.Read the quickstart at /docs/getting-started/quickstart
  3. 3.Check runtime support at /docs/getting-started/runtime-support for your environment
  4. 4.Review the relevant binding docs (React or Solid) or Core concepts
  5. 5.Consult component docs (/docs/components) for available UI elements
  6. 6.Use the API index (/docs/reference/api-index) to find specific exports

Use cases

Good for
  • 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
Who it's for
  • CLI/terminal application developers
  • Full-stack developers building SSH-accessible tools
  • Node.js and Bun developers
  • Teams shipping interactive command-line experiences

opentui FAQ

Should I use React, Solid, or Core?

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.

Can I serve a terminal UI over SSH?

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.

What runtimes are supported?

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.

How do I handle keyboard input?

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.

Can I display images or embedded terminals?

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

  • /docs maps to docs/getting-started.mdx.
  • /docs/components maps to docs/components/overview.mdx.
  • Every other /docs/<slug> URL maps to docs/<slug>.mdx relative 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 with createCliRenderer().
  • @opentui/react: use React components, JSX, and hooks with createRoot().
  • @opentui/solid: use Solid components, JSX, and signals with render().
  • @opentui/keymap: centralize keyboard bindings and named commands across views. The package supports focus-scoped layers, configurable shortcuts, and multi-key sequences. Start with createDefaultOpenTuiKeymap() from @opentui/keymap/opentui. Use @opentui/keymap/react or @opentui/keymap/solid for 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. Import createServer() 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 a QRCodeRenderable. For JSX, use registerQRCode() from @opentui/qrcode/react or @opentui/qrcode/solid. See the QR code component.
  • @opentui/three: render Three.js WebGPU scenes in the terminal with ThreeRenderable. 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-skilldocs/getting-started.mdx
installation, quickstartdocs/getting-started/quickstart.mdx
runtime-support, bun, nodejs, native-artifacts, ffi, permissions, libc, runtime-assetsdocs/getting-started/runtime-support.mdx
react, jsx, hooks, keyboard, paste, focus, blur, selection, animation, testingdocs/bindings/react.mdx
solid, jsx, signals, hooks, keyboard, animation, testingdocs/bindings/solid.mdx
core, renderer, terminal, scrollback, lifecycledocs/core-concepts/renderer.mdx
layout, flexbox, yoga, positioningdocs/core-concepts/layout.mdx
keyboard, input, keybindings, paste, focusdocs/core-concepts/keyboard.mdx
components, component, component-support, support-matrix, react-components, solid-componentsdocs/components/overview.mdx
text, styling, content, selectiondocs/components/text.mdx
input, form, editing, focusdocs/components/input.mdx
image, image-renderable, image-display, kitty, sixeldocs/components/image.mdx
embedded-terminal, terminal-renderable, ghostty, vt, ptydocs/components/embedded-terminal.mdx
clipboard, copy, osc52, host-clipboarddocs/core-concepts/clipboard.mdx
audio, native-audio, sound, playback, mixer, devices, tapdocs/core-concepts/audio.mdx
audio-streaming, audio-stream, pcm, f32le, radio, mp3, flac, icy, backpressure, reconnectdocs/application-apis/audio-streaming.mdx
audio-capture, microphone, pcm, recording, wav, audio-recorderdocs/application-apis/audio-capture.mdx
animation, timeline, easing, use-timelinedocs/application-apis/animation.mdx
testing, test-renderer, snapshots, framesdocs/core-concepts/testing.mdx
troubleshooting, terminal-reset, ffi-errors, native-loading, runtime-plugins, protocols, test-timeoutsdocs/test-and-debug/troubleshooting.mdx
plugins, plugin, slots, registry, extensionsdocs/plugins/slots.mdx
runtime-plugins, dynamic-import, external-modules, bun-plugin, module-maps, plugin-loadingdocs/extend/runtime-plugins.mdx
keymap, keybindings, shortcuts, commands, leader, ex-commandsdocs/keymap/overview.mdx
ssh, remote-tui, ssh-server, authentication, middlewaredocs/reference/ssh.mdx
three, threejs, webgpu, 3d, sprites, physicsdocs/reference/three.mdx
qr, qrcode, qr-encoder, svg-qr, gs1, eci, structured-appenddocs/reference/qr-encoder.mdx
deploy, bundle, bun-executable, nodejs-esm, node-sea, ssh-deploymentdocs/ship/deploy.mdx
standalone, executable, bun-compile, node-sea, node-assetsdocs/reference/standalone-executables.mdx
api, symbols, exports, public-api, api-index, lookupdocs/reference/api-index.mdx
package-exports, entrypoints, subpath-exports, importsdocs/reference/package-entrypoints.mdx
env, environment, configuration, flagsdocs/reference/env-vars.mdx
native-image, image-decode, png, jpeg, webp, gif, rgba, pixels, resizedocs/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.mdx
  • docs/getting-started/quickstart.mdx
  • docs/getting-started/runtime-support.mdx
  • docs/bindings/react.mdx
  • docs/bindings/solid.mdx
  • docs/core-concepts/renderer.mdx
  • docs/core-concepts/layout.mdx
  • docs/core-concepts/keyboard.mdx
  • docs/components/overview.mdx
  • docs/components/text.mdx
  • docs/components/input.mdx
  • docs/components/image.mdx
  • docs/components/embedded-terminal.mdx
  • docs/core-concepts/clipboard.mdx
  • docs/core-concepts/audio.mdx
  • docs/application-apis/audio-streaming.mdx
  • docs/application-apis/audio-capture.mdx
  • docs/application-apis/animation.mdx
  • docs/core-concepts/testing.mdx
  • docs/test-and-debug/troubleshooting.mdx
  • docs/plugins/slots.mdx
  • docs/extend/runtime-plugins.mdx
  • docs/keymap/overview.mdx
  • docs/reference/ssh.mdx
  • docs/reference/three.mdx
  • docs/reference/qr-encoder.mdx
  • docs/ship/deploy.mdx
  • docs/reference/standalone-executables.mdx
  • docs/reference/api-index.mdx
  • docs/reference/package-entrypoints.mdx
  • docs/reference/env-vars.mdx
  • docs/reference/native-image.mdx

Working rules

  • Read an entry page first, then read the narrower canonical page for the task.
  • Read the sibling docs/**/*.mdx files directly. Do not copy their prose into this file.
  • Use canonical /docs URLs for references between documentation pages. For links in this file, use the corresponding relative docs/**/*.mdx paths.