Rust for those who want to build, not suffer.

The developer-first full-stack web framework designed obsessively for emotional productivity. Ditch the boilerplate and ship your startup today.

See how it works
Crates.io License: MIT

The AI-Native Advantage

🤖

AI-Native by Design

Built from the ground up for AI coders. Zero runtime magic, pure compilation, and automatic `.ai-rules` context injection makes Rullst perfectly legible to Cursor and Copilot without hallucinations.

🔄

Autonomous Upgrades

Never fear breaking changes again. cargo rullst upgrade performs AST-based codemods in the background to automatically update your syntax when the framework evolves.

🌍

Edge Fusion & Replication

Compile to WebAssembly for Cloudflare Workers globally, backed by built-in Turso/libsql replication for 1ms database read latency worldwide.

📱

Omni-Frontend Wasm

Write frontend interactive components strictly in Rust (`#[client_component]`). They compile to lightweight Wasm, eliminating the need to write JavaScript for SPAs or Desktop apps.

The Interactive Experience

Stop memorizing flags. The Rullst CLI guides you through project setup, database migrations, authentication, and cloud deployment interactively.

bash

Crush the Competition

By combining Rust's memory safety, Tokio's async I/O, and Axum's routing, Rullst delivers unparalleled performance without sacrificing developer experience.

Requests per Second

Higher is better (Hello World endpoint)

Rullst (Rust)
420k req/s
Spring Boot (Java)
120k req/s
Express (Node)
65k req/s
Laravel (PHP)
32k req/s
Django (Python)
25k req/s

Memory Footprint

Lower is better (Idle memory usage)

Rullst (Rust)
18 MB
Laravel (PHP)
110 MB
Express (Node)
150 MB
Django (Python)
180 MB
Spring Boot (Java)
450 MB

Documentation

Getting started is simple. See the basics below or visit our GitHub for the full guide.

1. Define Your Model

No manual SQL. Use declarative macros to define your Active Record models.

#[derive(Orm, Clone)]
#[table("users")]
pub struct User {
    pub id: i32,
    pub name: String,
    pub email: String,
}

2. Create a Controller

Fetch data effortlessly and return JSON or HTML using concise syntax.

pub async fn get_users() -> Json<Vec<User>> {
    let users = User::all().await.unwrap();
    Json(users)
}

3. Register the Route

Bind your controller to an Axum-powered router natively.

Server::new()
    .route(get, "/api/users", get_users)
    .serve()
    .await;