01 Rust terminal UI library

One visual
language.
Every terminal surface.

Urushi is a UI library for Rust terminals. Style plain output, build interactive prompts, or build a full-screen TUI on one shared presentation foundation.

  • Styled text
  • CLI
  • Prompts
  • Full-screen TUI
URUSHI / Rust UI preview
80 × 24
use urushi_cli::{CliTheme, Summary};
✓ Build complete
Targetaarch64-apple-darwin
Profilerelease
Outputtarget/release/app
Theme→View→stdout

Different interfaces.

One underlying model.

01 / SURFACES

Different interfaces.
One underlying model.

Choose the surface that fits the application. Urushi keeps styling, composition, and terminal behavior coherent across all of them.

01

Styled text

Color, emphasis, links, and terminal-aware rendering without an event loop.

let text = StyledText::new(
    "Build complete",
    TextStyle::new().bold(),
);
urushi::println(&text)?;
02

CLI presentation

Opinionated CLI presentations, beginning with structured summaries and warnings.

let view = cli.summary(
    &Summary::new("Done")
        .field(
            "Output",
            "app",
        ),
);
03

Interactive prompts

Theme-aware input, selection, confirmation, and validation flows.

let field = Input::new(
    FieldKey::new("name"),
    "What is your name?",
    "",
)?;
04

Full-screen TUI

A runnable TEA-style application runtime, plus a separate adapter for applications that already own a Ratatui loop.

fn view(
    &self,
    model: &Model,
) -> View {
    status_view(model)
}
Shared foundationTheme·View·Layout·Terminal

02 / FOUNDATION

Share presentation.
Not control flow.

Plain output, prompts, and TUIs own different kinds of interaction. Urushi keeps their lifecycle ownership distinct while sharing the presentation decisions that should stay consistent.

  • 01
    One semantic theme

    Success, warning, focus, and other roles mean the same thing on every surface.

  • 02
    One composition model

    Components produce renderer-neutral views instead of terminal-specific output.

  • 03
    One layout pass

    The same box model and CJK-aware width rules resolve each view.

Surface-specificWho controls the terminal
CLI outputStatic write
PromptBlocking form
TUITEA runtime
shares presentation through
Shared foundationWhat the interface means and how it lays out
Theme→Components→View→Layout
Backend-independent terminalCommandsGeometry

03 / START

Use only the surface you need.

Begin with the core crate, then add CLI presentation, prompts, graphics, or full-screen support as the application requires. Run a TEA application with urushi_tui_app::run, or add Urushi views to an existing Ratatui loop through the adapter.

Read the documentation
$cargo add urushi