webapp.rs
A web application completely written in Rust
Target of this project is to write a complete web application including backend and frontend within Rust.
graph LR
A[Leptos / WASM<br>in browser] -->|SSR / RPC| B[Axum<br>HTTP Server]
B --> C[SQLx]
C --> D[(PostgreSQL)]
Blog Posts
- A Web Application completely in Rust.
- Lessons learned on writing web applications completely in Rust.
Architecture
| Component | Technology |
|---|---|
| Frontend | Leptos (WebAssembly with SSR + hydration) |
| Backend | Axum (via leptos_axum) |
| Database | PostgreSQL (via SQLx) |
| Auth | JWT tokens (jsonwebtoken) + Argon2 password hashing |
The application uses Leptos server functions to communicate between frontend and backend, eliminating the need for a separate REST API layer. Both server and client are compiled from a single Rust crate.
Features
- User registration with Argon2 password hashing
- Login with username and password
- JWT-based session management with automatic renewal
- PostgreSQL session and user storage
- CSRF protection via origin validation
- Health check endpoint (
/healthz) for container orchestration - Server-side rendering with client-side hydration
- Single binary deployment
Prerequisites
- Rust (stable)
- cargo-leptos:
cargo install cargo-leptos - PostgreSQL
wasm32-unknown-unknowntarget:rustup target add wasm32-unknown-unknown- wasm-bindgen-cli:
cargo install wasm-bindgen-cli
Getting Started
Start a PostgreSQL instance:
Run the application:
The application will be available at http://127.0.0.1:3000.
Register a new account using the "Register" link on the login page, then log in with your credentials.
Configuration
| Environment Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | postgres://localhost/webapp |
JWT_SECRET |
Secret key for JWT token signing | change-me-in-production |
LEPTOS_SITE_ADDR |
Server listen address | 127.0.0.1:3000 |
Container
Build and run as a container:
Development
Contributing
You want to contribute to this project? Wow, thanks! So please just fork it and send me a pull request.