Rezi is a free, open source frameworks & platforms project written in TypeScript and released under Apache-2.0. It has 677 GitHub stars, 16 forks and 5 open issues, and was last pushed 5 months ago. On this registry it ranks #132 of 139 tracked projects in Frameworks & Platforms, with 5 head-to-head comparisons available.

What is Rezi?

Rezi is an Apache-2.0 licensed TypeScript framework for building terminal user interfaces on Node.js and Bun, aimed at developers who need structured, multi-panel terminal applications rather than line-oriented console output.

What it is

Rezi is a TypeScript framework that provides a structured app model for terminal applications: layout, focus and input handling, routing, theming, widgets, and testing tools. Rendering is handled by Zireael, a terminal engine written in C, which performs native framebuffer diffing and terminal output. The framework is distributed as @rezi-ui/core for the application and widget API, @rezi-ui/node for the Node.js runtime binding, and @rezi-ui/native for the prebuilt engine binaries.

The concrete problem it solves is the assembly work that otherwise falls to anyone building a serious terminal tool. Instead of hand-rolling a rendering loop, diffing frames, and wiring keyboard and mouse routing, an application declares a view and lets the framework manage layout, focus, and redraws. It also replaces the ceiling of line-oriented output: multi-panel layouts, routed screens, focusable controls, forms, tables, and overlays become first-party concerns rather than bespoke code. The declarative widget API does not require React, and the same widget surface drives both full-screen alternate-buffer presentation and an inline screen mode that keeps terminal scrollback intact above a bounded region.

Key capabilities

  • A declarative widget API imported as ui from @rezi-ui/core, covering forms, tables, trees, overlays, charts, file pickers, and command palettes.
  • Full-screen and inline screen modes from the same widget API, configured with screen: { mode: "inline", inlineRows: 9 }.
  • Native framebuffer diffing and terminal output through Zireael, a fuzz-tested engine written in C.
  • A structured app model with layout, focus and input handling, routing, and theming built in rather than assembled by the application.
  • Reproducible rendering and input contracts, so application behavior is testable.
  • Prebuilt @rezi-ui/native binaries for Linux x64/arm64 (glibc), macOS x64/arm64, and Windows x64/arm64, so npm install never compiles C.
  • Explicit per-widget stability tiers — stable, beta, and experimental — documented in docs/widgets/stability.md.

Who uses it and how

  • Teams building dashboards, control planes, and internal tools that need multi-panel layouts and focusable controls.
  • Developers writing log viewers and agent consoles, where inline screen mode preserves scrollback above the live region and leaves the final frame in scrollback on exit.
  • Authors of agent CLIs, progress UIs, and REPLs that want a bounded region on the primary screen rather than taking over the alternate buffer.
  • Developer-workflow tools that need routed screens, forms, tables, and overlays with predictable behavior under keyboard and mouse input.
  • Projects running on Node.js 18+ or Bun 1.3+ across Linux, macOS, and Windows.

Getting started

Scaffold a project with npm create rezi my-app (or bun create rezi my-app) and run it with npm run start; three templates are offered — minimal, cli-tool, and starship. To add Rezi to an existing project instead, install @rezi-ui/core and @rezi-ui/node.

How it compares

Among the similar tools named in its topic list, Rezi sits alongside React-oriented terminal libraries such as Ink, but its declarative widget API does not require React and its rendering path runs through a native C engine rather than a JavaScript renderer. It also treats routing, focus management, and inline screen mode as first-party parts of the framework rather than patterns an application assembles itself.

When to use it — and when not to

Rezi is in beta: the core API is stable enough to build on and the public surface of @rezi-ui/core is recorded and diffed in CI, but breaking changes still occur before 1.0, batched and documented in the changelog with migration notes. Alpine and musl-based environments are not yet supported, so musl container images should not be chosen for deployment, and anyone requiring a frozen 1.0 API contract should wait. The project is also small — roughly 677 stars, 16 forks, and 5 open issues — so third-party examples and community packages are limited compared with more established terminal UI libraries.

project readme (upstream, from github) — read inline

Rezi

CI npm license

Rezi is a TypeScript framework for building terminal applications on Node.js and Bun. It provides structured layout, focus and input handling, routing, widgets, and testing tools, with rendering handled by Zireael, a terminal engine written in C.

Links: Website · Docs · Quickstart · Widgets · Benchmarks

Rezi command console demo

Status

Rezi is in beta. The core API — the app model, layout, input routing, theming, and the widget surface — is stable enough to build on, and the public API of @rezi-ui/core is recorded and diffed in CI. Breaking changes still happen before 1.0, but they are deliberate, batched, and documented in the changelog with migration notes.

Individual widgets carry explicit stability tiers (stable, beta, experimental), so the guarantees that apply to what you use are spelled out rather than implied.

What Rezi Is For

Dashboards, control planes, internal tools, log viewers, agent consoles, and developer workflows that need more than line-oriented output: multi-panel layouts, routed screens, focusable controls, forms, tables, overlays, and predictable behavior under keyboard and mouse input.

Apps choose their presentation: full-screen on the alternate buffer, or inline screen mode — a bounded region on the primary screen with terminal scrollback preserved above it and the final frame left in scrollback on exit (the presentation style of agent CLIs, progress UIs, and REPLs). See the Screen Modes guide.

Why Rezi

  • A structured app model instead of a rendering loop you assemble yourself
  • A declarative widget API that does not require React
  • Native framebuffer diffing and terminal output through a fuzz-tested C engine
  • First-party widgets for forms, tables, trees, overlays, charts, file pickers, and command palettes
  • Full-screen and inline screen modes from the same widget API (screen: { mode: "inline", inlineRows: 9 })
  • Reproducible rendering and input contracts, so application behavior is testable

Example

import { ui } from "@rezi-ui/core";
import { createNodeApp } from "@rezi-ui/node";

type State = { count: number };

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

app.view((state) =>
  ui.page({
    p: 1,
    gap: 1,
    header: ui.header({ title: "Counter" }),
    body: ui.panel("Count", [
      ui.row({ gap: 1, items: "center" }, [
        ui.text(String(state.count), { variant: "heading" }),
        ui.spacer({ flex: 1 }),
        ui.button({
          id: "inc",
          label: "+1",
          intent: "primary",
          onPress: () => app.update((s) => ({ count: s.count + 1 })),
        }),
      ]),
    ]),
  }),
);

app.keys({ q: () => app.stop() });
await app.run();

Quick Start

npm create rezi my-app
cd my-app
npm run start

With Bun:

bun create rezi my-app
cd my-app
bun run start

Or add Rezi to an existing project:

npm install @rezi-ui/core @rezi-ui/node

Three templates are available:

  • minimal — single-screen starter for focused utilities
  • cli-tool — routed multi-screen starter for product-style terminal tools
  • starship — large command-console showcase with routing, charts, canvas, forms, and overlays

Start with minimal or cli-tool. Use starship (npm create rezi my-console -- --template starship) when you want the full surface area in one app.

Requirements

  • Node.js 18+ or Bun 1.3+
  • Linux, macOS, or Windows

@rezi-ui/native ships prebuilt binaries for Linux x64/arm64 (glibc), macOS x64/arm64, and Windows x64/arm64, so npm install never compiles C. Alpine/musl is not yet supported. Terminal capabilities — color depth, mouse, bracketed paste, synchronized output — are probed at startup, and output adapts to what the terminal reports.

How It Works

Your application builds a widget tree in TypeScript. @rezi-ui/core lays it out and serializes the result into a compact binary drawlist. The Zireael engine validates the drawlist, diffs it against the previous frame, and writes the minimal terminal update; in the other direction it parses keyboard, mouse, paste, and resize input into event batches that core routes through focus and keybindings. The protocol at this boundary is versioned and documented.

The API stays in TypeScript; the hot path stays in C; both sides are tested in isolation. See Architecture.

Packages

Package Purpose
@rezi-ui/core Widget API, layout, routing, focus, forms, themes, test renderer
@rezi-ui/node Node/Bun backend: terminal I/O, scheduling, native engine integration
@rezi-ui/native N-API binding to the Zireael engine, with prebuilt binaries
@rezi-ui/jsx Optional JSX runtime over the core API
@rezi-ui/testkit Assertions, snapshot helpers, and deterministic fuzz utilities
create-rezi Project scaffolding CLI

All publishable packages share one version and release together.

Versioning

Rezi follows semantic versioning, applied through stability tiers during the beta line:

  • stable widgets and the core app, layout, and routing APIs do not change documented behavior without a changelog callout and a migration note
  • beta widgets are tested for their core invariants; contract details may still evolve
  • experimental widgets may change at any time

The full tier assignment per widget is in Widget Stability.

Testing

Applications are testable without a terminal: @rezi-ui/core includes a deterministic test renderer, and @rezi-ui/testkit adds assertions, frame snapshots, and seeded fuzz helpers on top of node:test. The framework holds itself to the same bar — behavior-contract tests, golden-frame tests, fuzzed parsers on both sides of the native boundary, and a Linux/macOS/Windows × Node 18/20/22 × Bun CI matrix. See the testing guide.

Performance

Rezi is designed to stay fast on structured terminal workloads. Benchmark methodology, caveats, and committed result snapshots are documented in BENCHMARKS.md and on the benchmarks page.

Documentation

Contributing

Bug reports and pull requests are welcome. Start with CONTRIBUTING.md; the short version:

npm ci
npm run build
npm test

For reporting security issues, see SECURITY.md.

License

Apache-2.0

Frequently asked questions

Is Rezi free to use?

Rezi is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Rezi do?

Build TypeScript TUI backed by fast native rendering engine

What is Rezi written in?

Rezi is primarily written in TypeScript. Its source is publicly available at https://github.com/RtlZeroMemory/Rezi, and it has 677 GitHub stars.