DocsThe ecosystem
Official packages
Rahti is published on crates.io as nine crates on three independent release lines: the framework itself, an optional icon package, and optional native packaging. This page says which line each crate is on, whether you install it or depend on it, and what happens if you never touch it at all.
Three release lines
Everything published under the framework's name is here. They are grouped by how they are versioned, because that is the thing you have to know before upgrading anything: crates on the same line move together, and crates on different lines do not.
The framework
Five crates, one version number, released in lockstep. html! expands to paths inside rahti, and rahti-build writes code that calls functions in it — a project that mixed versions would fail to compile with an error naming neither crate. Releasing them together is what makes that mismatch unreachable.
| Crate | How you get it | What it is |
|---|---|---|
| rahti | cargo add rahti | The server runtime: Html, layouts, error boundaries, RPC, streaming, uploads, auth, listen — and, behind the ws feature, sockets. |
| rahti-macros | nothing — re-exported | html!, #[component], #[rpc], #[socket]. Never named in a manifest; rahti carries it. |
| rahti-build | a build dependency | The build step: scans src/app/ and src/components/, writes the router and the module wiring, compiles CSS. |
| cargo-rahti | cargo install cargo-rahti | The scaffolder: cargo rahti new and cargo rahti upgrade. The one piece every project installs globally. |
| rahti-mcp | cargo install rahti-mcp | Optional developer tooling: a read-only stdio MCP server that answers what the build already knows. Installed per machine, never a project dependency. See MCP server. |
# The scaffolder. The only thing a Rahti project needs installed globally.
cargo install cargo-rahti
# Optional, on the same release line: read-only project context for an
# MCP client. A developer tool, not an application dependency.
cargo install rahti-mcp# What `cargo rahti new` writes. `rahti-macros` is never named here:
# `rahti` re-exports every macro, so one pin covers both.
[dependencies]
rahti = "0.0.24"
[build-dependencies]
rahti-build = "0.0.24"rahti-mcp is the odd one on this line: it shares the framework's version number because it reads the manifest that version of the build step writes, but it is an executable rather than a dependency — so it appears in no Cargo.toml, and a project that never asked for it has only a missing .mcp.json to show for it.
Icons
Two crates on their own version line, released together for the same reason the framework's four are: a file written by one version of the installer is read by the runtime of the same version. Optional — a project that never adds an icon has neither.
| Crate | How you get it | What it is |
|---|---|---|
| rahti-icons | cargo add rahti-icons | The runtime. Attribute merging behind the icon! macro, which is what a generated icon file expands through. |
| cargo-rahti-icons | cargo install cargo-rahti-icons | The installer: cargo rahti-icons add, update, remove, list. |
# Two halves of one release line: the runtime is a dependency, the
# installer is a tool.
cargo add rahti-icons
cargo install cargo-rahti-icons
cargo rahti-icons add userAn icon is fetched once and written into src/components/rahti_icons/, where the Rahti build already looks — so what compiles into the binary is the icons the application actually uses, not a catalog of 1,600. Icons has the props, the merge order and every command.
Native packaging
Two more crates on a third line, and the most optional thing here: nothing in them is compiled, downloaded or resolved by a project that has not run cargo rahti native init.
| Crate | How you get it | What it is |
|---|---|---|
| rahti-native | a dependency of native/ | The platform-neutral runtime: packaged paths, the loopback-only embedded server, the per-installation session key, the launch gate, the security headers, the native bridge. No Tauri dependency of its own. |
| cargo-rahti-native | cargo install cargo-rahti-native | The CLI: init, doctor, dev, build. Generates the Tauri shell and delegates the packaging to Tauri's own CLI. |
# The packaging tool, and the Tauri CLI it delegates to. Neither is
# compiled into your application.
cargo install cargo-rahti-native
cargo install tauri-cli --version "^2" --locked
cargo rahti native init --identifier com.example.myapp --windowsYou never write rahti-native into a manifest yourself — init puts it in the shell it generates under native/, which is excluded from your workspace. Native packaging has the paths, the database policy, the session key and the security model.
The whole list
Nine crates, three lines. Version numbers move; what does not move is which line a crate belongs to and how it reaches your project.
| Crate | Line | Reaches you as |
|---|---|---|
| rahti | framework | A dependency |
| rahti-macros | framework | Re-exported by rahti |
| rahti-build | framework | A build dependency |
| cargo-rahti | framework | An installed tool |
| rahti-mcp | framework | An installed tool, optional |
| rahti-icons | icons | A dependency |
| cargo-rahti-icons | icons | An installed tool |
| rahti-native | native | A dependency of the generated native/ shell |
| cargo-rahti-native | native | An installed tool |
The header badge on this site reports rahti's newest stable release, asked of crates.io rather than kept as a number in a file — so what it shows is what cargo add rahti would resolve to right now. The registry is the same place to check the rest: all nine are published from one crates.io account, and each crate's page names its repository.
Upgrading
One command moves the framework line. It refreshes the scaffold files whose recorded hashes show you never edited them, and moves the rahti and rahti-build pins in Cargo.toml to the version of the tool that is running — so upgrading the framework starts by upgrading cargo-rahti itself.
# The framework's crates move together, so one command moves the pins.
cargo rahti upgrade
# The optional lines are separate installs on their own schedule.
cargo install cargo-rahti-icons # re-install to move the icon line
cargo rahti-icons update # re-fetch what this project installedThe icon and native lines are separate installs, upgraded when you choose to. Neither is read by cargo rahti upgrade, and neither holds the framework back.
What is not on crates.io
- The demonstration application at the framework workspace root, which is marked
publish = falseso a straycargo publishcannot put it on the registry.
Editor support
Not a crate, and worth having: a VS Code extension that injects a grammar into Rust files so an html! block stops rendering as undifferentiated Rust tokens. Markup, component tags, @{rust} and {javascript} each get their own colour — which is exactly the distinction the framework asks you to keep straight.
Search Rahti in the extensions panel, or install the Rahti extension from the marketplace. It also flags the runtime-managed attributes you are not supposed to write — pp-component, data-pp-* — and the pp-* names that do not exist.
