Maw
A minimal web framework for Rust. No macros, just functions.
Why Maw?
- No macros - Rust already looks beautiful, no need to hide it. Some frameworks go heavy on type gymnastics—we'd rather keep things readable
- Express-style
next()- Callc.next().await, then inspect/modify the response after. Most Rust frameworks don't let you do this - Debug your routes - Print the router to see exactly what handlers run where, with source locations
- Fast enough - High RPS, competitive performance. Some APIs trade microseconds for ergonomics, but Rust is already faster than Go/Node anyway
Quick Start
use *;
async
Middleware
Works like Express/Fiber. Call next(), do stuff before/after:
new
.middleware
.get
Or attach middleware to specific routes:
.get
.get
Three Ways to Write Handlers
// 1. Async closure
.get
.get
// 2. Function
async
async
.get
// 3. Struct - implement Handler (AsyncFn1) for stateful handlers, you can
.middleware
//
.get
Route Groups
let api = group
.get
.post;
let admin = group
.middleware
.get;
new
.push
.push
Debug Your Routes
let router = new
.middleware
.push
.push;
println!;
// Shows every route, its handlers, and where they're defined
Features
Enable what you need:
[]
= { = "0.19", = ["minijinja", "websocket"] }
| Feature | What |
|---|---|
minijinja |
Template rendering |
xml |
XML request/response support |
websocket |
WebSocket support |
static_files |
Serve embedded files |
middleware-cookie |
Cookie parsing/setting |
middleware-session |
Session management |
middleware-csrf |
CSRF protection |
middleware-logging |
Request logging |
middleware-catch_panic |
Panic recovery |
middleware-body_limit |
Request body size limits |
middleware |
All middleware features |
full |
Everything |
Templates
Uses MiniJinja:
let app = new
.views
.router;
WebSocket
.ws
Server-Sent Events (SSE)
use Bytes;
use stream;
.get
License
MIT