| Crates.io | heisenberg |
| lib.rs | heisenberg |
| version | 0.1.1 |
| created_at | 2025-08-25 01:51:17.001011+00 |
| updated_at | 2025-08-25 02:48:17.600189+00 |
| description | Framework-agnostic dual-mode web serving for Rust applications. Seamlessly switch between development mode (proxying to frontend dev servers) and production mode (serving embedded static assets). |
| homepage | https://github.com/username/heisenberg |
| repository | https://github.com/username/heisenberg |
| max_upload_size | |
| id | 1808968 |
| size | 210,221 |
Framework-agnostic dual-mode web serving for Rust applications. Seamlessly switch between development mode (proxying to frontend dev servers) and production mode (serving embedded static assets).
tracing[dependencies]
heisenberg = "0.1"
axum = "0.7"
tokio = { version = "1.35", features = ["full"] }
use axum::{routing::get, Router};
use heisenberg::Heisenberg;
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/api/hello", get(|| async { "Hello API!" }))
.layer(Heisenberg::new().spa("./dist"));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
# Development mode - proxies to frontend dev server
cargo run
# Production mode - serves embedded assets
cargo build --release && ./target/release/your-app
That's it! Heisenberg automatically:
package.json and extracts the dev commandnpm run dev)Works automatically with any Tower-based framework:
// Axum
let app = Router::new().layer(heisenberg_config);
// Warp
let routes = routes.with(heisenberg_config);
Helper functions for non-Tower frameworks:
// Actix-web
use heisenberg::actix::serve_spa;
// Rocket
use heisenberg::rocket::serve_spa;
// Infers everything from your project structure
Heisenberg::new().spa("./dist")
Heisenberg::new()
.spa("./frontend/dist")
.dev_server("http://localhost:3000")
.dev_command(["npm", "run", "dev"])
.open_browser(true)
.build()
Heisenberg::new()
.spa("/admin/*", "./admin/dist")
.dev_server("http://localhost:3001")
.spa("/*", "./app/dist")
.dev_server("http://localhost:3000")
.build()
| Build Command | Mode | Behavior |
|---|---|---|
cargo run |
Development | Proxy to dev server |
cargo build --release |
Production | Embed assets |
HEISENBERG_MODE=embed cargo run |
Production | Force embed mode |
HEISENBERG_MODE=proxy cargo build --release |
Development | Force proxy mode |
Enable structured logging:
[dependencies]
heisenberg = { version = "0.1", features = ["logging"] }
tracing-subscriber = "0.3"
RUST_LOG=debug,heisenberg=trace cargo run
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Licensed under either of:
at your option.