Skip to main content

Crate ravenrs

Crate ravenrs 

Source
Expand description

§RavenRS

Beautiful native interfaces, powered by Rust.

The whole toolkit for serious applications, free and open source: 100+ components, a data grid for 100,000+ rows, a reporting suite with a server, ravenrs-app, which turns a Rust struct into a working application, training films that ship inside your app, and AI that stays on the machine. One codebase, drawn on the GPU, on Windows, macOS, Linux and the web.

Try the live gallery · Playground · Report designer · Install a real app · An app from two structs · Getting started · Components · API docs

License: MIT or Apache-2.0 Rust 1.88+ Platforms

The RavenRS component gallery running natively on macOS

§What you get

Building a business application usually means assembling a UI kit, a commercial grid, a reporting product and a stack of custom screens. RavenRS is all of it, in one language, under one license.

ravenrs-appDeclare a Rust struct and get the application: navigation, lists, forms, rules, security and an audit trailGenerated app
Raven FinançasA complete family finance app, built with all of this, to install on your computerInstall
Components100+ designed, tested components: ribbon, scheduler, command palette, charts, forms, wizards, 200 iconsGallery
DataGrid100,000+ rows at 2 ms a frame, grouping, summaries, editing, master-detail, Excel and PDFGallery
ReportingEngine, end-user designer, viewer, PDF and XLSX, and a server that emails reports on a scheduleDesigner
Training filmsVector films of your real app that weigh kilobytes, re-recorded by a script when screens changeravenrs-movie
Local AIModels that run on the CPU in plain Rust, with nothing sent anywhereravenrs-ai

§ravenrs-app: declare a record, get the application

The newest and biggest part of RavenRS. The screens most business software spends its budget on come from a Rust struct, and you write only what makes your application different:

ⓘ
use ravenrs_app::BusinessObject;
use ravenrs_app_ui::App;

#[derive(BusinessObject)]
#[object(caption = "Accounts", navigation = "Records", icon = "wallet")]
#[rule(criteria = "[opening] >= 0", message = "An account cannot open negative")]
struct Account {
    #[field(key)]
    id: i64,
    #[field(caption = "Name", default_property, required)]
    name: String,
    #[field(caption = "Opening balance", money)]
    opening: i64,
}

fn main() -> Result<(), ravenrs::native::PlatformError> {
    let window = App::new("Accounts").entity::<Account>().into_view();
    ravenrs::native::run(window, ravenrs::native::WindowOptions::new("Accounts"))
}

That is the whole application: navigation, a list with search, filters and export to Excel, PDF and CSV, a form, and every command from New to Save and close. A wrong attribute is a compile error that points at it. See one running in your browser, generated from two structs:

A list screen generated by ravenrs-app, with search, grouping, filters and export

From there it grows with you:

  • Rules and logic: validation of every kind, warnings that let people go on, conditional appearance, state machines, reminders, actions and controllers.
  • Security: sign-in with lockout, roles and permissions on entities, records, fields, navigation and actions, enforced in the data layer even with no screen, and a full audit trail.
  • Data: SQLite on a schema it manages or on tables you already have, migrations, relations, attachments, and concurrent changes that merge.
  • Views: dashboards, charts, trees, calendars and timelines over a list, and reports your users design and keep as records.
  • Customization at run time: a model in layers, so a module, an administrator or a user can change the application as a JSON difference, and even add fields.

Status: usable today, with the API still moving, and shipped as separate crates: cargo add ravenrs ravenrs-app ravenrs-app-ui. See docs/APP-FRAMEWORK.md, and run cargo run -p feature-center for a demonstration of every feature.

§Install a real app

Want to see what all of this adds up to? Raven Finanças is a complete desktop app for a family’s expenses and bills to pay, built with RavenRS and free to install on your own computer. Its interface is in Brazilian Portuguese, and it opens on a sample family, so there is something to explore right away.

The Raven Finanças dashboard, with balances, a chart and the next bills to pay

  • Your data stays with you, in one SQLite file on your computer, with backups and reports you can export.
  • A real workout for the framework: dashboard, DataGrid, scheduler, budgets, reports, command palette and generated forms in everyday use.
  • Six training films inside the app, about 16 minutes in all at about 700 KB, and a question opens the moment that answers it.
  • An optional local AI assistant that answers about your money and prepares entries, with nothing leaving the machine.

The installer compiles the app on your machine and gets what it needs first, Rust and a C compiler, so the first run can take a while. It asks for an administrator’s permission only to install those tools, and the app then keeps itself up to date.

On macOS and Linux, in a terminal:

curl -fsSL https://raw.githubusercontent.com/alexkads/RavenRS/master/examples/family-finance/install.cmd -o /tmp/install.cmd && sh /tmp/install.cmd

On Windows 11, in PowerShell:

irm https://raw.githubusercontent.com/alexkads/RavenRS/master/examples/family-finance/install.cmd -OutFile "$env:TEMP\install.cmd"; & "$env:TEMP\install.cmd"

Already have the repository? cargo run -p family-finance runs it without installing. The app’s README shows which component each screen uses.

§Why RavenRS

  • One UI, every platform. Desktop windows and a browser <canvas> share the renderer, the layout engine and every component. No webview, no DOM widgets, and the same pixels everywhere.
  • Fast, and quiet when idle. A form with 40 cards takes 1.6 ms a frame, against a 16.7 ms budget at 60 Hz. State<T> knows who reads it, so a change redraws only what depends on it, and an idle app uses no CPU or GPU.
  • Finished by default. Three themes (Raven Dark, Raven Light, Raven Glass) built from semantic design tokens, with text contrast checked against WCAG AA in the test suite. ThemeEditor changes any token live and copies the result as JSON.
  • Accessible. Keyboard operation follows the WAI-ARIA patterns, and screen readers get a real tree: AccessKit on the desktop, an ARIA mirror on the web. The gallery’s test suite fails on any unnamed control.
  • Built to be extended. Your components use the same public API as the built-in ones, from a simple Component to a fully custom View that draws, scrolls, opens overlays and handles input.
  • Ready for coding assistants. A skill and an offline MCP server let them write against the real API instead of guessing it.

§Quick start

Add RavenRS from crates.io:

cargo add ravenrs

Write your UI:

use ravenrs::prelude::*;

fn app() -> impl View {
    let count = State::new(0);
    let increment = count.clone();

    VStack::new((
        Text::new("Welcome to RavenRS").style(TextStyle::Display),
        Card::new(VStack::new((
            Text::new("REVENUE").style(TextStyle::Caption).foreground(Semantic::InkMuted),
            Text::new("R$ 128.450").style(TextStyle::Metric),
            Text::bound(&count, |n| format!("Clicked {n} times")).foreground(Semantic::InkMuted),
        ))),
        Button::new("Get Started").icon(IconName::Sparkles).on_click(move || increment.update(|n| *n += 1)),
    ))
    .spacing(24.0)
    .padding(32.0)
}

fn main() -> Result<(), ravenrs::native::PlatformError> {
    ravenrs::native::run(app(), ravenrs::native::WindowOptions::new("Hello"))
}

The getting started guide covers the browser build, state, components of your own, themes and the data grid.

§A data grid for real data

DataGrid draws a frame over 100,000 rows in 2 ms. Measured on an Apple M-series laptop, every operation people wait for stays inside one 60 Hz frame:

Over 100,000 rowsMeasured
Filter by a range0.9 ms
Search across columns3.2 ms
Sort by a number7.9 ms
Filter by an expression over three conditions8.6 ms
Group with summaries11.3 ms
  • Find: multi-column sort, filter row with operators and expressions such as [Seats] > 10 And [Country] = 'Brazil', checklists of values, a visual filter builder, search across columns.
  • Organize: nested grouping by dragging headers, group and footer summaries with formulas, columns that reorder, resize and pin, master-detail rows, saved layouts and named scenarios.
  • Edit: typed cell editing with edits that can be refused, adding and deleting rows, buttons on rows, any view as a cell template.
  • Scale and ship: rows from a server with bounded memory, paging or infinite scroll, and export to Excel, PDF and CSV with real numbers and dates.

§Reporting, from designer to inbox

A complete reporting suite in Rust, on the desktop, in the browser and on servers. Open the designer in your browser and build a report without installing anything.

The RavenRS report designer, with bands, a field list and properties

  • Engine: banded reports with nested groups, master-detail, summaries, expressions, parameters, conditional formatting, charts, barcodes and watermarks. A report is a JSON document, so it can live in git or a database, and be written by code. A grouped report of 10,000 rows and 305 pages lays out in 80 ms.
  • Designer: a wizard, a ribbon, drag and drop, a field list, a live preview and undo, ready to embed in your own app for your users.
  • Viewer: page navigation, zoom, thumbnails, text search and a parameter panel.
  • Export: vector PDF with embedded font subsets and selectable text, XLSX with real numbers and dates, CSV and SVG, all in pure Rust.
  • Server: ravenrs-report-server stores layouts with versions, renders over HTTP, and delivers scheduled reports by email or to a folder, with cron schedules, time zones, retries and a history of every run.

See docs/REPORTING.md. The expressions come from ravenrs-criteria, one language that filters a grid, totals a report, guards a rule or becomes a parameterized SQL WHERE.

§Training that ships inside your app

ravenrs::movie makes a film of your app with no pixels in it. It stores what the app drew, so it stays sharp at any zoom, and a minute costs kilobytes instead of megabytes.

  • Recorded by a script. It runs the real app, needs no GPU, and clicks by the names screen readers see. When the screens change, run it again.
  • Edited on a timeline. Cuts, speed, callouts, captions, spotlight and zoom in MovieEditor, all non-destructive.
  • Interactive. MoviePlayer has chapters and steps that wait for the viewer’s click, with sounds and voice computed at play time.
  • Answers questions. MovieAssistant and MovieChat open the film at the moment that answers what someone asked.
  • Reports bugs that show what happened. FlightRecorder and BugReporter keep the recent past of the app the same way.

§AI that stays on the machine

ravenrs-ai runs models on the CPU with plain Rust, so building your app still needs nothing but Cargo, and what people ask never leaves their computer.

  • Offers only what fits. ModelManager checks memory and disk, then downloads with progress and verified hashes. The catalog has LFM3, Gemma 3, Qwen, Llama 3.2, Phi-3 and Mistral, from 0.4 to 5 GB.
  • Takes actions safely. A model can choose among your app’s tools, but your code reads the data and does the work, so it never makes up a number.
  • Speaks. A local voice model gives assistants a voice and narrates training films.

Chat, ModelPicker and FloatingPanel put it on screen. Local models run on the desktop, not in the browser.

§Components

GroupComponents
Buttons and commandsButton (4 styles, 3 sizes, icons, loading, selected), IconButton, ToggleButton, ToggleGroup, ButtonGroup, SplitButton, SegmentedControl, Toolbar, FloatingToolbar, ThemePicker, ThemeEditor, ThemeSwitcher
Text and choicesTextField, TextArea, CodeEditor, Playground, NumberField, MaskedField, InputOtp, Select, Combobox, LookupField, TagBox, Checkbox, RadioGroup, Toggle, Slider, ValueSlider, InlineRename, Stepper, Rating, FavoriteToggle, ColorPicker, ColorSwatch, SwatchGrid, ColorPair, NinePointAnchor, FileUpload, DropZone, ImageField
FormsFormField with validate::{required, email, min_length} and custom rules, FormLayout, FilterBuilder, Wizard, StepIndicator, StepBadge, Label, HelpTip
Dates and schedulingCalendar, DatePicker, DateRangePicker, TimePicker, DateTimePicker, YearView, EventCalendar, Scheduler (a timeline per resource), RecurrenceEditor, Timeline
NavigationRibbon, Menubar, Tabs, DocumentTabs, Sidebar, SidebarBrand, Breadcrumb, Pagination, Disclosure, Collapse, Accordion, CommandPalette (⌘K)
OverlaysDialog, ConfirmDialog, Sheet, FloatingPanel, SplashScreen, Popover, HoverCard, Tooltip, DropdownMenu, ContextMenu, Toaster
DataDataGrid, TreeView, CardView, Table, List, VirtualList, SortableList, FileBrowser, Stat, Barcode (QR Code and linear codes)
ChartsChart (line, area, bar, pie, doughnut, radar, radial, scatter, sparkline, candlestick), ChartCard, ChartReference, SankeyChart, BarChart, AreaChart: all 70 patterns of the shadcn/ui chart catalog are in the gallery
LayoutTileLayout, VStack, HStack, Grid, ScrollView, Sticky, ScrollScene, ScrollLinked, Anchor, Ticker, Link, QuadField, ScrollEdgeArrow, Splitter, SplitPanes, SplitHandle, DockArea, Card, GlassCard, Section, AspectRatio, ZStack, PropertyRow, PageHeader, Spacer, Footer, StatusBar, TitleBar, ToolRail, responsive, and .padding(), .background(), .frame(), .grow() on any view
Media and feedbackImage (PNG/JPEG), Icon (200 Lucide icons), Filmstrip, PagedDocumentView, ImageLightbox, CompareView, Eyedropper, CropOverlay, Protractor, TransformHandles, Marquee, RubberBand, RuleOfThirdsGrid, Minimap, ZoomPanView, ZoomControl, CurveEditor, ColorWheel, Ruler, Histogram, Carousel, Avatar, Badge, Dot, OverlayBadge, IconTile, EmptyState, Alert, HeroBanner, ProgressBar, MultiProgress, ShimmerText, Spinner, Skeleton, Kbd, ShortcutSheet, ShortcutHintBar, Divider, DaySeparator, Canvas, CodeBlock, ReleaseNotes, Lottie
AssistantsChat, RichText, AttachmentStrip, AudioPlayerButton, SelectionBar, ModelPicker
Training and support (ravenrs::movie)Recorder, MoviePlayer, MovieAssistant, MovieChat, MovieEditor, FlightRecorder, BugReporter

Every component is in examples/component-gallery, which runs natively and in your browser. For a whole app, install Raven Finanças.

§Your own components

use ravenrs::prelude::*;

/// State lives in the struct; `body` composes views and runs on every rebuild.
struct Counter {
    count: State<i32>,
}

impl Component for Counter {
    fn body(&self) -> impl View {
        let count = self.count.clone();
        HStack::new((
            Text::bound(&self.count, |c| format!("{c}")).style(TextStyle::Title),
            Button::new("+1").on_click(move || count.update(|c| *c += 1)),
        ))
    }
}

Need full control? Implement View and use BuildCx: layout boxes, any drawing through Paint::Custom, per-instance state with cx.use_state, floating layers with cx.overlay, virtualized scrolling, timers with cx.wake_at, and input through on_click, on_key, on_drag, on_context_menu and shortcut. Every built-in component is written this way.

§Getting started

npx create-ravenrs minha-loja

The guided setup prepares Rust and the matching CLI, then creates an app with the RavenRS MCP server, skill and instructions for coding assistants. Choose hello, app, app-sqlite or relatorios, and desktop, web or both. Use --yes for noninteractive setup. Existing installations are reused and system packages are reported with manual instructions. See create-ravenrs.

If Rust is already installed:

cargo install --git https://github.com/alexkads/RavenRS --locked cargo-ravenrs
cargo ravenrs new minha-loja

Use --tag vYY.R.P when installing to match a particular release. See the CLI guide.

§Run the examples

Requirements: Rust stable 1.88+. For the browser: the wasm32-unknown-unknown target and wasm-bindgen-cli 0.2.130 (it must match the crate version).

cargo run -p component-gallery --release
rustup target add wasm32-unknown-unknown
cargo install wasm-bindgen-cli --version 0.2.130 --locked
./scripts/build-web.sh component-gallery && python3 -m http.server -d examples/component-gallery/web 8080

Then open http://localhost:8080 in a current browser. RavenRS draws with WebGPU where the browser has it and with WebGL2 otherwise, so it also opens on phones and browsers without WebGPU; WebOptions::backend can ask for one of them.

§Quality you can check

  • More than 1,400 tests, including accessibility audits, property tests, and GPU golden images in dark and light.
  • Performance budgets with published numbers, kept by benchmarks: see docs/QUALITY.md.
  • Small enough for the web: a hello-world is about 1.2 MB gzipped, and the whole gallery with every chart about 1.5 MB.
  • Almost no unsafe: one call in the workspace, for touchpad pinches on Wayland.
  • An open scorecard: docs/PARITY.md tracks 113 component families of shadcn/ui and two commercial component suites: 72 done, 7 partial and 34 planned, with what is missing named row by row. docs/REPORTING-PARITY.md and docs/APP-PARITY.md do the same for reporting and the application framework.

Versions follow the component-vendor model, YY.R.P, with new features in .2 and monthly fixes. Until 28.1.0 any release may hold breaking changes, so pin an exact version if that matters to you; from then on they come only in each year’s .1 (docs/VERSIONING.md).

§AI assistants

RavenRS ships a skill and an MCP server so coding assistants write against the real API instead of guessing it.

  • The skill teaches how to compose screens, use tokens instead of literal values, meet the quality bar and build for the web.
  • The MCP server (ravenrs-mcp) is read-only and works offline. It lists components, shows their API and real examples, looks up design tokens, reports parity status and validates expressions.

cargo ravenrs new registers cargo ravenrs mcp for Claude Code, VS Code / Copilot, Cursor and Codex, copies the version-matched skill, and writes project instructions. For an existing app, run cargo ravenrs ai, then cargo ravenrs doctor to verify it. Use --plugin to select the versioned Claude marketplace plugin instead of the local skill.

Whoever writes the code, a person or any agent, ravenrs-lint holds it to the same rules: it denies literal colors and sizes, spacing off the grid, unnamed icon buttons and state or blocking work in body, and cargo ravenrs-lint --init turns rustc and Clippy to their strictest and writes the rules into AGENTS.md, CLAUDE.md, GEMINI.md and Copilot’s instructions.

cargo install ravenrs-lint --locked && cargo ravenrs-lint --init

§Crates

Start with ravenrs. The others come in as you need them.

CrateWhat it does
ravenrsThe facade and prelude, with components, windows, the web and films. Start here.
ravenrs-report, -viewer, -designerThe report engine, the document viewer and the designer.
ravenrs-report-export, -pdf, -xlsxReports as files.
ravenrs-report-serverLayouts, rendering over HTTP and scheduled delivery.
ravenrs-spreadsheet, ravenrs-sheetA spreadsheet component and its engine: formulas, recalculation, .xlsx in and out.
ravenrs-grid-exportWhat a DataGrid shows, as Excel, PDF or CSV.
ravenrs-app, -derive, -uiThe application framework: model, attributes and generated screens.
ravenrs-app-i18nLanguages and words of the screens and components, by key, with English to fall back on.
ravenrs-app-sqlite, -report, -libraryStorage, reports inside an application, and ready-made records.
ravenrs-aiLocal models and voice.
ravenrs-movieVector training films and bug reports.
ravenrs-criteriaThe expression language, independent of any UI.
ravenrs-graphicsVector shapes, chart layout and barcodes, shared by every engine.
ravenrs-lottieA Lottie player of our own: reads the file and works out each frame’s curves.
ravenrs-widgetsEvery component, the View/Component/BuildCx API and the Ui runtime.
ravenrs-reactiveState, Binding, Derived and dependency-tracking observers.
ravenrs-animationSprings, easing and transitions.
ravenrs-styleDesign tokens and the Raven Dark, Light and Glass themes.
ravenrs-layoutFlexbox and grid layout on Taffy.
ravenrs-textText with Parley; Inter and the icon font embedded.
ravenrs-renderThe wgpu renderer: SDF shapes, shadows, gradients, images, glyph atlas, clipping.
ravenrs-coreGeometry, colors, input events and the Scene display list.
ravenrs-platform-nativeDesktop windows with winit.
ravenrs-platform-web<canvas> + WebGPU or WebGL2 in the browser.
ravenrs-wayland-gesturesTouchpad pinches on Wayland.
ravenrs-mcpA read-only MCP server for coding assistants. A tool, not a dependency of your app.
ravenrs-lintLints for applications: theme tokens, the 4px grid, named controls, no state or blocking work in body. A dev-dependency and cargo ravenrs-lint.

§Roadmap

RavenRS moves fast, and these are the known gaps.

  • Components: pivot grid, floating windows, rich text and spreadsheet editors.
  • DataGrid: multi-level headers, columns pinned to the right, row drag and drop, cell range copy.
  • Reporting: subreports, a table of contents, cross tabs, and DOCX, HTML and PNG export.
  • Application framework: a web API, other databases, multi-tenancy, a command-line tool for new projects.
  • Platform: IME composition display on the desktop, right-to-left layout, multiple windows, backdrop blur for Raven Glass.
  • Motion: rotation and true group opacity, which need transforms and layers in the renderer.

See docs/PARITY.md for the full list and CHANGELOG.md for what changed.

§Contributing

Issues, ideas and pull requests are welcome. CONTRIBUTING.md explains how to build, test and add a component. Please follow the code of conduct.

§License

Licensed under either of Apache License 2.0 or MIT, at your option. The embedded Inter font is under the SIL Open Font License 1.1; the icons come from Lucide under the ISC License.

Unless you state otherwise, any contribution you submit is dual-licensed as above, without additional terms.

§Crates behind this facade

core, animation, reactive, layout, text, style, render and widgets can also be used on their own.

Re-exports§

pub use ravenrs_animation as animation;
pub use ravenrs_core as core;
pub use ravenrs_layout as layout;
pub use ravenrs_movie as movie;
pub use ravenrs_reactive as reactive;
pub use ravenrs_render as render;
pub use ravenrs_style as style;
pub use ravenrs_text as text;
pub use ravenrs_widgets as widgets;

Modules§

native
Desktop windows (Windows, macOS, Linux).
prelude
Everything an app usually needs, in one import.