v0.1.0 — Public Preview

TypeScript TUI.
Near-Native Performance.

56 widgets, functional or JSX syntax, and a native rendering engine. Build rich terminal interfaces with the DX you already know.

~/my-app

What You Can Build

From dashboards to developer tools — Rezi ships canvas graphics, data visualization, a code editor, and 50+ more widgets out of the box.

canvas.tsx
  ⡠⠔⠊⠉⠉⠉⠉⠊⠒⢄
            
  ⠣⡀        ⢀⠜
    ⠈⠢⣀  ⣀⠔⠁
       ⠈⠒⠊⠁

  
  █ ▲       draw shapes
  █ █ ▲     in braille,
  █ █ █ ▲   sextant,
  ▀ ▀ ▀ ▀   or blocks

Canvas API — lines, arcs, circles, rects with sub-cell precision

dashboard
  CPU  ▁▂▃▅▇▅▃▂▁▂▃▅▇█▇▅
  MEM  ▂▂▃▃▃▄▄▅▅▅▆▆▆▆▇▇

  Disk ████████████░░░░ 74%
  Mem  ██████████░░░░░░ 61%

  PID   NAME       CPU%
  1024  node       12.4
  1031  zireael     8.1
  1042  postgres    3.7

Data Viz — sparklines, gauges, bar charts, tables, and heatmaps

editor.ts
1  import { ui } from 'rezi';
2
3  app.view((s) =>
4    ui.column([
5      ui.text('Hello'),
6      ui.text(s.name),
7    ]),
8  );

Code Editor — syntax highlighting, search, undo/redo, diagnostics

Two Syntaxes, One Framework

Use the functional ui.* API or opt into JSX with zero React overhead. Same engine, same widgets — pick the style you prefer.

Functional API
counter.ts
import { ui } from '@rezi-ui/core';
import { createNodeApp } from '@rezi-ui/node';

const app = createNodeApp<{ count: number }>({
  initialState: { count: 0 },
});

app.view((s) =>
  ui.column({ gap: 1 }, [
    ui.text(`Count: ${s.count}`),
    ui.button('inc', '+1', {
      onPress: () =>
        app.update((prev) => ({
          count: prev.count + 1,
        })),
    }),
  ]),
);

await app.start();
JSX — No React Runtime
counter.tsx
/** @jsxImportSource @rezi-ui/jsx */
import { createNodeApp } from '@rezi-ui/node';
import { Column, Text, Button } from '@rezi-ui/jsx';

const app = createNodeApp<{ count: number }>({
  initialState: { count: 0 },
});

app.view((s) => (
  <Column gap={1}>
    <Text>Count: {'{s.count}'}</Text>
    <Button
      id="inc"
      label="+1"
      onPress={() =>
        app.update((prev) => ({
          count: prev.count + 1,
        }))
      }
    />
  </Column>
));

await app.start();

Everything You Need

A batteries-included framework for building production terminal applications.

// widgets

56 Widgets

The most comprehensive widget library for terminal UIs. Buttons, tables, charts, modals, command palettes, and more — all out of the box.

// engine

Native C Rendering

The Zireael engine handles layout, diffing, and painting in native C. Your TypeScript code drives state; the engine drives pixels.

// syntax

JSX Without React

Familiar JSX syntax with zero React overhead. The same mental model you already know, compiled to direct Zireael calls.

// themes

6 Themes

Built-in theme system with 6 hand-crafted palettes. Switch themes at runtime or let users choose their own.

// dataviz

Charts & Graphics

Sparklines, bar charts, line charts, and a full canvas API. Render data visualizations directly in the terminal.

// types

Type-Safe

Full TypeScript with strict types across every API surface. Catch errors at compile time, not at runtime in production.

Up and Running in Seconds

One command to scaffold, one to run. No config files, no boilerplate.

terminal
$ npm create rezi my-app
> Created my-app/ with template "default"
$ cd my-app && npm run dev
Rezi Dev Server
Ready in 142ms
Press q to quit

Performance

Rezi offloads layout and painting to a native C engine. Here’s how it compares in our benchmark suite.

Re-render
59.1x
59.1x
Table
53.6x
53.6x
Virtual List
33.5x
33.5x
Form
18.2x
18.2x
Layout
12.7x
12.7x
Startup
7.3x
7.3x

vs Ink · Lower-level operations show larger gains