Resuma — resumable SSR web framework for Rust
Instantly-interactive Rust web apps — without hydration. Not a résumé/CV builder.
Ship HTML from the server. The browser resumes serialized state and lazy handler chunks — it never re-runs your components. Static pages ship zero client JS.
Official repo: github.com/GoldevLab/resuma · Docs: resuma-docs.fly.dev · Crate: crates.io/crates/resuma
Get started · Benchmark · Docs · API
&&
Measured: smallest interactive runtime in class
Same UX everywhere — SSR counter (heading + increment button). Production builds, gzip transfer sizes. Full methodology →
| Framework | Initial load | First click | Static page |
|---|---|---|---|
| Resuma | 1021 B | 9.90 KiB | 0 B |
| Leptos | 79.02 KiB | 79.02 KiB | — |
| Next.js (App Router) | 142.43 KiB | 142.43 KiB | — |
| React (Vite SPA) | 57.99 KiB | 57.99 KiB | — |
| Astro (React island) | 57.76 KiB | 57.76 KiB | — |
| SvelteKit | 27.71 KiB | 27.71 KiB | — |
| Qwik | 1.96 KiB | 22.32 KiB | — |
| SolidStart | 16.75 KiB | 16.75 KiB | — |
| templ + HTMX | 16.21 KiB | 16.21 KiB | — |
Regenerate locally: node benchmark/run.mjs (or --resuma-only to refresh just Resuma) · Independent sources in benchmark/README.md
If you like Qwik's resumability and a Rust-first stack, Resuma is that model with native SSR, server actions, and no WASM bundle by default.
Why Resuma?
| Classic SSR + hydration | Resuma |
|---|---|
| Re-run components to attach listeners | Resume serialized state and handlers |
| JS grows with the whole app upfront | ~1 KiB loader + lazy handler chunks |
| Manual interactive boundaries | Every #[component] is resumable by default |
| Custom server RPC wiring | #[server] + built-in Axum routes |
| Static docs/marketing pages still ship JS | 0 B on non-interactive pages |
Mental model: components run once on the server. SSR embeds signals and handler refs in HTML; a tiny client runtime resumes on first click or when an island enters the viewport. Multiplayer apps can use resuma::realtime for WebSocket rooms and peers.
Quick start
Requires: Rust 1.91+ (rustup)
Templates: basic · todo · flow · flow-booking · flow-fullstack · production
AI assistants (Cursor, Codex, Gemini)
Teach your editor Resuma patterns — view!, Flow, HtmlTheme / Popup / Modal, SeoKit, deploy — with one command:
Skill vs MCP: start with the skill (guidance for writing code). An official MCP for docs search / CLI tools may come later.
Guide: resuma-docs.fly.dev/docs/integrations/ai_assistant
use *;
Handlers compile to JavaScript automatically — lazy-loaded on first interaction, wired to resumed signal state.
Library only:
[]
= "1.3"
= { = "1", = ["full"] }
Server actions
async
#[server] registers POST /_resuma/action/search. Call from the client with js! or Flow forms — no custom wiring.
Resuma Flow
Full-stack layer inside the same crate — file-based pages, loaders, submits (like Qwik City or SolidStart):
| API | Purpose |
|---|---|
FlowApp |
Resuma Flow app builder |
#[load] |
Server data before render |
#[submit] |
Form mutations |
src/pages/ |
File-based routing |
Guide: resuma-docs.fly.dev/docs/flow
Product map
| Product | Crate / path | Role |
|---|---|---|
| Resuma | resuma |
Core — signals, resumability, ResumaApp, resuma::realtime |
| Resuma Flow | resuma::flow + resuma-flow |
Pages/routing in resuma; UI widgets crate (flow_graph, dashboard, worker_panel) |
| Resuma Macros | resuma-macros |
view!, #[component], rs2js |
| Resuma Runtime | runtime/ |
Browser loader + core + flow |
| Resuma Client | client-sdk/ |
TypeScript widgets (ClientComponent) |
| Resuma CLI | resuma + cli feature |
new, dev, build |
Details: docs/NAMING.md
CLI
| Command | What it does |
|---|---|
resuma new |
Scaffold a project |
resuma dev |
Hot reload |
resuma build |
Release binary + JS bundles |
resuma routes --generate |
Discover src/pages/ → _registry.rs |
resuma add sqlx / turso |
DB scaffolding |
resuma update / doctor |
Align deps · sanity check |
Architecture
┌──────────────────────────────────────────────────────────┐
│ resuma crate │
│ core → ssr → server (axum) → flow + router │
│ resuma-macros (view!, #[component], rs2js → JS) │
└───────────────────────────┬──────────────────────────────┘
│ HTTP
▼
┌──────────────────────────────────────────────────────────┐
│ Browser (~1 KiB loader, lazy core) │
│ parse resuma/state · delegate events · lazy handlers │
└──────────────────────────────────────────────────────────┘
Deep dive: docs/ARCHITECTURE.md · Security: docs/SECURITY.md · Backend patterns: docs/BACKEND.md
Resources
| Documentation | resuma-docs.fly.dev/docs |
| API reference | docs.rs/resuma |
| Examples | examples/ — counter, todo, flow-demo, flow-pages, resuma-audit (full docs QA) |
| Benchmark | benchmark/ — multi-framework comparison + run.mjs |
| Markdown docs | docs/ — offline / GitHub reference |
| Security | SECURITY.md · security guide |
| Contributing | CONTRIBUTING.md |
Project layout
resuma/
├── assets/ # logo + GitHub social preview
├── crates/
│ ├── resuma/ # runtime, SSR, server, flow, CLI
│ ├── resuma-macros/ # view!, #[component], rs2js
│ └── resuma-flow/ # Flow UI widgets (flow_graph, dashboard, worker_panel)
├── runtime/ # TypeScript client (~1 KiB loader; see benchmark/)
├── benchmark/ # measured comparisons vs Qwik, Next, etc.
├── examples/ # runnable demos
└── docs/ # markdown reference
Docs site (separate repo): resuma-docs.fly.dev
From source:
Manual apps can mount no-props components without the verbose render path:
new
.component
.serve
.await
What ships in 1.3
view!/#[component]— JSX-like templates; resumable by default#[server]/#[submit]/#[load]— server RPC, form mutations, and Flow data loaders#[island]— optional lazy client bundles- SPA
NavLink+ view transitions ResumaError::Redirect+ middleware auth gating- Cookies / session helpers (
Redirect::with_session_cookie) - Workers, artifacts, and uploads
resuma::realtime— WebSocket rooms / peers- WebGPU CSP defaults
- Client asset cache-busting
- Per-action rate limits
- Flow file-based routing (
FlowApp,src/pages/) - CLI:
new,add,dev,build,routes,update,doctor
Community
- Issues & ideas: GitHub Issues
- Security: see SECURITY.md — please do not file public issues for exploitable bugs
Contributions welcome — read CONTRIBUTING.md first.
Why "Resuma"?
Spanish for both resumes (continues) and summary — the framework resumes execution from a serialized summary of the server-side render.
Looking for a resume/CV app? This repository is a Rust full-stack web framework (SSR, Axum, server actions). Resume-builder projects on GitHub use the same name but are unrelated.
Find this project (search & links)
| If you searched for… | You want |
|---|---|
resuma github + Rust / SSR / framework |
This repo — GoldevLab/resuma |
resuma rust framework |
Getting started · cargo install resuma |
rust web framework no hydration |
Architecture · Benchmark |
qwik rust / resumability |
Flow guide · Qwik-style lazy handlers in Rust |
Topics: Rust · SSR · resumability · Axum · server actions · islands · zero hydration · resuma on crates.io.
License
Dual-licensed under MIT OR Apache-2.0.