terminaltui

MIT
Node >=18

A standardized engine for terminal apps.

Write a pages directory of TypeScript. Get a navigable terminal app you can ship with npx or host over SSH.

npx terminaltui try
Star on GitHub37

A five-page guided tour. Nothing to install.

       ████████╗███████╗██████╗ ███╗   ███╗██╗███╗   ██╗ █████╗ ██╗     ████████╗██╗   ██╗██╗
       ╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██║████╗  ██║██╔══██╗██║     ╚══██╔══╝██║   ██║██║
          ██║   █████╗  ██████╔╝██╔████╔██║██║██╔██╗ ██║███████║██║        ██║   ██║   ██║██║
          ██║   ██╔══╝  ██╔══██╗██║╚██╔╝██║██║██║╚██╗██║██╔══██║██║        ██║   ██║   ██║██║
          ██║   ███████╗██║  ██║██║ ╚═╝ ██║██║██║ ╚████║██║  ██║███████╗   ██║   ╚██████╔╝██║
          ╚═╝   ╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚═╝╚═╝  ╚═══╝╚═╝  ╚═╝╚══════╝   ╚═╝    ╚═════╝ ╚═╝

                                      Next.js for the terminal

────────────────────────────────────────────────────────────────────────────────────────────────────

   ◆ // Home [1]
  >> Showcase [2]
  ## Themes [3]
  ~~ Live Data [4]
  ++ Get Started [5]
  [] Images [6]

────────────────────────────────────────────────────────────────────────────────────────────────────

  ↑↓ navigate  ⏎ select  q quit  : command

The welcome tour, flintNight theme, 100 columns. Not a mockup: this is the real cell grid, dumped out of a headless PTY.

01Routing

The file is the screen.

A directory of TypeScript files becomes a navigable app. Brackets make a route dynamic. A file under api/ is an HTTP endpoint. You do not design an architecture, because there is one.

Nothing else routes terminal screens this way. Ink is a component library. Pastel routes CLI subcommands. Bubble Tea gives you an update loop and a blank canvas.

pages/index.ts/
pages/about.ts/about
pages/projects/index.ts/projects
pages/projects/[slug].ts/projects/:slug
api/stats.tsGET /api/stats
← back  >> Projects
────────────────────────────────────────────────────────────────────────────────────────────────────

▌╭─────────────────────────────────────────────────────────────────────────────────────────────────╮
▌│ Search projects...                                                                              
▌╰─────────────────────────────────────────────────────────────────────────────────────────────────╯



 ╭──────────────────────────────────────────────╮  ╭──────────────────────────────────────────────╮
  Patchwork            Lead Engineer @ Stit…    Vektor                 Open Source (2024)  
  A collaborative document editor built on        A type-safe database query builder and       
  CRDTs that handles 50k+ concurrent users.       migration toolkit for TypeScript. Compiles   
  Real-time cursors, inline comments, version     queries at build time for zero-runtime       
  history, and a plugin SDK used by 200+          overhead. Supports PostgreSQL, SQLite, and   
  teams. Built with React, Hocuspocus, and        MySQL with full IntelliSense. 4.2k GitHub    
  Y.js.                                           stars.                                       
                                                                                               
  [React] [CRDTs] [WebSockets] [TypeScript]       [TypeScript] [PostgreSQL] [CLI]              
 ╰──────────────────────────────────────────────╯   [Open Source]                                
                                                   ╰──────────────────────────────────────────────╯

 ╭──────────────────────────────────────────────╮  ╭──────────────────────────────────────────────╮

pages/projects.ts in the developer-portfolio demo. Cards, focus ring and keyboard navigation, none of it hand-drawn.

02Distribution

Two ways to ship. Both are one line.

Over npm

npx your-app

Publish the bundle and anyone runs it. No install step, no binary to build for three platforms, no Electron, no browser.

Over SSH

terminaltui serve

One server, many sessions. Colour depth is negotiated per client from its TERM, so the same app is correct in Apple Terminal and in kitty.

03Images + video

Photographs, in a grid of characters.

On kitty and Ghostty the renderer draws real pixels through the kitty graphics protocol. Everywhere else it paints coloured cells with block glyphs at the same row count, so the layout never moves and images survive tmux, SSH and Apple Terminal.

image("./cover.png", { width: 60 })

3 runtime dependencies hold the whole thing up: esbuild, jpeg-js, pngjs. No sharp, no node-gyp, no postinstall build. Video uses the same pipeline over prepacked frames: real pixels on Kitty and Ghostty, coloured cells elsewhere.

Rendering proof

Now watch it move.

A real three-second capture of Cinema running inside Kitty—not a browser mock-up. Play it here, then open the dedicated page for the rendering paths, measurements and reproducible command.

Open the video rendering showcase

Real Kitty capture · 24 frames
Cinema running in Kitty on macOS. The moving image is rendered through Kitty's graphics protocol; terminaltui owns the page, transport, navigation and layout. The same block falls back to coloured cells on other terminals. Recording: 3 seconds, 1920×1132, silent. Sintel © Blender Foundation, CC-BY 3.0.
04In the box

Designed before you start.

42 components, 12 themes, a 12-column grid, 14 ASCII fonts and 15 scenes. The first commit already looks considered.

Content
section · card · timeline · table · list · quote · hero · gallery · tabs · accordion · link · skillBar · progressBar · badge · image · text · ascii · markdown · gradient · sparkline · divider · spacer
Input
textInput · textArea · select · checkbox · toggle · radioGroup · numberInput · searchInput · button · form · asyncContent
Layout
columns · rows · grid · panel · col · row · container
Navigation
menu · chat
  • flintNight
  • flintDay
  • cyberpunk
  • dracula
  • nord
  • monokai
  • solarized
  • gruvbox
  • catppuccin
  • tokyoNight
  • rosePine
  • hacker
← back  ## Themes
────────────────────────────────────────────────────────────────────────────────────────────────────
  ↑ more above


 ──────────────────────────────────────────────── = ────────────────────────────────────────────────



   ╭────────────────────────────────────╮            ╭───────────────────────────╮
   │  cyberpunk — neon green / magenta  │              dracula — purple / teal  
   ╰────────────────────────────────────╯            ╰───────────────────────────╯

   ╭────────────────────────────╮                    ╭─────────────────────────────────╮
     nord — icy blues + greys                        monokai — warm reds + oranges  
   ╰────────────────────────────╯                    ╰─────────────────────────────────╯

   ╭───────────────────────────────────╮             ╭──────────────────────────╮
     solarized — muted, eye-friendly                 gruvbox — earthy retro  
   ╰───────────────────────────────────╯             ╰──────────────────────────╯

   ╭──────────────────────────────╮                  ╭─────────────────────────────────╮
     catppuccin — pastel mauves                      tokyoNight — deep blue + neon  
   ╰──────────────────────────────╯                  ╰─────────────────────────────────╯

The theme picker, live. Switching a theme re-colours every component; you do not restyle anything.

05Demos

12 demos. One command each.

  • Welcome Tournpx terminaltui tryflintNight
  • Developer Portfolionpx terminaltui demo developer-portfolioflintNight
  • Restaurantnpx terminaltui demo restaurantflintNight
  • Dashboardnpx terminaltui demo dashboardflintNight
  • Cinemanpx terminaltui demo cinemadracula
  • Server Dashboardnpx terminaltui demo server-dashboardflintNight
  • Mac Monitornpx terminaltui demo mac-monitorflintNight
  • Startupnpx terminaltui demo startuptokyoNight
  • Conferencenpx terminaltui demo conferenceflintNight
  • Bandnpx terminaltui demo bandrosePine
  • Coffee Shopnpx terminaltui demo coffee-shopflintNight
  • Freelancernpx terminaltui demo freelancercustom
← back  * Menu
────────────────────────────────────────────────────────────────────────────────────────────────────

▌╭─────────────────────────────────────────────────────────────────────────────────────────────────╮
▌│ Search the menu...                                                                              
▌╰─────────────────────────────────────────────────────────────────────────────────────────────────╯



    Starters  [Mains] [Desserts] [Cocktails]
   ───────────────────────────────────────────────────────────────────────────────────────────────
   ╭────────────────────────────────────────────╮  ╭────────────────────────────────────────────╮
    Burrata & Heirloom Tomato           $16     Charred Octopus                     $19  
    Creamy burrata over vine-ripened heirloom     Spanish octopus grilled over binchotan     
    tomatoes with aged balsamic reduction,        charcoal, served with fingerling potatoes, 
    basil oil, and flaky Maldon sea salt.         smoked paprika aioli, and pickled fresno   
                                                  chilis.                                    
    [vegetarian] [gluten free]                                                               
   ╰────────────────────────────────────────────╯   [gluten free]                              
                                                   ╰────────────────────────────────────────────╯
   ╭────────────────────────────────────────────╮ 
    Bone Marrow & Toast                 $17    ╭────────────────────────────────────────────╮
    Roasted bone marrow with chimichurri,         Wild Mushroom Soup                  $14  
    capers, shallot jam, and grilled sourdough    A velvety blend of porcini, chanterelle,   
    from our house bakery.                        and hen-of-the-woods mushrooms finished    
   ╰────────────────────────────────────────────╯   with truffle cream and chive oil. Served   
                                                    with warm focaccia.                        
   ╭────────────────────────────────────────────╮                                              
  ↓ 1 item below
────────────────────────────────────────────────────────────────────────────────────────────────────
  ↑↓ navigate  ⏎ select  ← back  q quit  [1/5]

restaurant demo, gruvbox theme — one of twelve, captured at 100×32.

06Comparison

Against the alternatives.

Ink and Bubble Tea are excellent and far more mature. The difference is shape: they give you pieces, terminaltui gives you a structure.

terminaltui compared with Ink, Pastel and Bubble Tea
CapabilityterminaltuiInkPastelBubble Tea
LanguageTypeScriptTypeScript (React)TypeScript (Ink-based)Go
ShapeFramework — pages, routing, layoutsComponent libraryCLI command routerTUI framework (Elm-style)
File-based routing for screensYesNoRoutes CLI subcommandsNo
SSH hostingterminaltui serveNoNoVia charmbracelet/wish
npx distributionFirst-classFirst-classFirst-classNo — Go binary
Components included42Bring your ownInherits from InkVia bubbles
Images in-terminalYesNoNoNo
AI codegen-nativeShips claude/SKILL.mdNoNoNo
Star on GitHub37

4,223 tests across 68 suites. First published 23 Mar 2026.

07Testing

Playwright, but the browser is a terminal.

Launch the app in a real PTY, send keypresses, assert on what is on screen. The emulator ships in the package.

Every terminal screen on this page was produced with it: boot the demo, drive it, dump the coloured cell grid. That is why they are exact.

import { TUIEmulator } from "terminaltui/emulator";

const app = await TUIEmulator.launch("dist/cli.js");
await app.press("j");
await app.waitForText("Projects");
app.screen.cells();
08Roadmap

What exists, and what does not.

ShippedImages in the terminal
Real PNG and JPEG, drawn as colored cells everywhere and as true pixels on kitty and Ghostty.
ShippedHeadless terminal emulator
Drive a real PTY from tests, assert on screen contents. Every screenshot on this site was produced with it.
ShippedVideo rendering
Prepacked video with transport controls, Kitty/Ghostty pixels, and a portable coloured-cell fallback.

Planned, not built

  • A library you can ssh into
  • Comic reader
  • Agent manager
  • Latency and throughput work
Take it

Write pages. Ship a terminal app.

MIT, Node >=18, 3 runtime dependencies. First published in March 2026, so it is young. The count below is live, not a badge. Read the source and decide for yourself.

Star on GitHub37
npx terminaltui try