revue 2.31.10

A Vue-style TUI framework for Rust with CSS styling
Documentation

/rɪˈvjuː/Re + Vue — A Vue-style TUI framework for Rust

crates.io docs.rs GitHub Stars

CI codecov license Rust 1.87+ downloads

Quick Start · Examples · Documentation · Contributing

Why Revue?

Build terminal UIs like you build web apps — with CSS and reactive state.

  • CSS Styling — Write styles in familiar CSS syntax with variables, selectors, and animations
  • Reactive State — Vue-inspired Signal/Computed/Effect system for automatic UI updates
  • 100+ Widgets — Rich component library: inputs, tables, charts, markdown, images, and more
  • Hot Reload — See CSS changes instantly without restarting your app
  • Developer Tools — Widget inspector, snapshot testing, and performance profiler built-in
  • Single Binary — Pure Rust, no runtime dependencies, blazing fast

Quick Start

cargo add revue
use revue::prelude::*;

fn main() -> Result<()> {
    let mut app = App::builder()
        .style("styles.css")
        .build();

    let counter = Counter::new();
    app.run(counter, |event, counter, _app| {
        if let Event::Key(key) = event {
            counter.handle_key(&key.key)
        } else {
            false
        }
    })
}

struct Counter {
    count: Signal<i32>,
}

impl Counter {
    fn new() -> Self {
        Self { count: signal(0) }
    }

    fn handle_key(&mut self, key: &Key) -> bool {
        match key {
            Key::Up => { self.count.update(|n| *n += 1); true }
            Key::Down => { self.count.update(|n| *n -= 1); true }
            _ => false,
        }
    }
}

impl View for Counter {
    fn render(&self, ctx: &mut RenderContext) {
        let count = self.count.get();
        vstack()
            .class("container")
            .child(Text::new(format!("Count: {}", count)).bold())
            .child(
                hstack().gap(1)
                    .child(Text::new("↑/↓ to change, q to quit"))
            )
            .render(ctx);
    }
}
/* styles.css */
.container {
    padding: 2;
    gap: 1;
    border: rounded cyan;
    align-items: center;
}

button {
    padding: 0 2;
    background: var(--primary);
}

button:hover {
    background: var(--primary-dark);
}

Widgets

Category Components
Layout vstack hstack grid scroll tabs accordion splitter
Input input textarea select checkbox radio switch slider
Display text markdown table tree list progress badge image presentation
Feedback modal toast notification tooltip popover
Charts barchart line_chart sparkline heatmap gauge

Examples

cargo run --example counter      # Basic counter
cargo run --example todo         # Todo app
cargo run --example dashboard    # Charts & widgets
cargo run --example slideshow    # Slidev-style presentations

Comparison

Revue Ratatui Cursive Textual
Language Rust Rust Rust Python
Styling CSS Code Theme CSS
Reactivity Signal Manual Event Reactive
Hot Reload
Devtools

Documentation

Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

git clone https://github.com/hawk90/revue.git
cd revue && cargo test

License

MIT License — see LICENSE for details.

↑ Back to Top

Built with Rust