tokio-rs

    tokio-rs/axum

    #336 this week

    HTTP routing and request-handling library for Rust that focuses on ergonomics and modularity

    networking
    http
    routing
    rust
    Rust
    MIT
    26.3K stars
    1.4K forks
    26.3K GitHub watchers
    Updated 6/24/2026
    View on GitHub

    Backblaze Generative Media Hackathon

    Build the next generation of AI media apps with Genblaze, stored on Backblaze B2. $10,000 in prizes.

    Enter the hackathon

    Loading star history...

    Use Cases & Benefits

    • Axum is a modular and ergonomic Rust web framework built on Tokio, Tower, and Hyper for building asynchronous web applications.
    • Key features include macro-free routing, declarative request parsing, predictable error handling, and integration with Tower middleware ecosystem.
    • Axum is implemented in 100% safe Rust with minimal overhead, offering performance comparable to Hyper and a stable API with ongoing improvements.
    • With over 22,000 stars and 1,200 forks, Axum shows strong community adoption and active maintenance since its creation in 2021.
    • Ideal for developers seeking a high-performance, safe, and extensible Rust web framework leveraging async Tokio runtime and Tower middleware.

    About axum

    axum

    axum is a web application framework that focuses on ergonomics and modularity.

    Build status Crates.io Documentation

    More information about this crate can be found in the crate documentation.

    High level features

    • Route requests to handlers with a macro free API.
    • Declaratively parse requests using extractors.
    • Simple and predictable error handling model.
    • Generate responses with minimal boilerplate.
    • Take full advantage of the tower and tower-http ecosystem of middleware, services, and utilities.

    In particular the last point is what sets axum apart from other frameworks. axum doesn't have its own middleware system but instead uses tower::Service. This means axum gets timeouts, tracing, compression, authorization, and more, for free. It also enables you to share middleware with applications written using hyper or tonic.

    ⚠ Breaking changes ⚠

    We are currently working towards axum 0.9 so the main branch contains breaking changes. See the 0.8.x branch for what's released to crates.io.

    Usage example

    use axum::{
        routing::{get, post},
        http::StatusCode,
        Json, Router,
    };
    use serde::{Deserialize, Serialize};
    
    #[tokio::main]
    async fn main() {
        // initialize tracing
        tracing_subscriber::fmt::init();
    
        // build our application with a route
        let app = Router::new()
            // `GET /` goes to `root`
            .route("/", get(root))
            // `POST /users` goes to `create_user`
            .route("/users", post(create_user));
    
        // run our app with hyper, listening globally on port 3000
        let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
        axum::serve(listener, app).await.unwrap();
    }
    
    // basic handler that responds with a static string
    async fn root() -> &'static str {
        "Hello, World!"
    }
    
    async fn create_user(
        // this argument tells axum to parse the request body
        // as JSON into a `CreateUser` type
        Json(payload): Json<CreateUser>,
    ) -> (StatusCode, Json<User>) {
        // insert your application logic here
        let user = User {
            id: 1337,
            username: payload.username,
        };
    
        // this will be converted into a JSON response
        // with a status code of `201 Created`
        (StatusCode::CREATED, Json(user))
    }
    
    // the input to our `create_user` handler
    #[derive(Deserialize)]
    struct CreateUser {
        username: String,
    }
    
    // the output to our `create_user` handler
    #[derive(Serialize)]
    struct User {
        id: u64,
        username: String,
    }
    

    You can find this example as well as other example projects in the example directory.

    See the crate documentation for way more examples.

    Performance

    axum is a relatively thin layer on top of hyper and adds very little overhead. So axum's performance is comparable to hyper. You can find benchmarks here and here.

    Safety

    This crate uses #![forbid(unsafe_code)] to ensure everything is implemented in 100% safe Rust.

    Minimum supported Rust version

    axum's MSRV is 1.78.

    Examples

    The examples folder contains various examples of how to use axum. The docs also provide lots of code snippets and examples. For full-fledged examples, check out community-maintained showcases or tutorials.

    Getting Help

    In the axum's repo we also have a number of examples showing how to put everything together. Community-maintained showcases and tutorials also demonstrate how to use axum for real-world applications. You're also welcome to ask in the Discord channel or open a discussion with your question.

    Community projects

    See here for a list of community maintained crates and projects built with axum.

    Contributing

    🎈 Thanks for your help improving the project! We are so happy to have you! We have a contributing guide to help you get involved in the axum project.

    License

    This project is licensed under the MIT license.

    Contribution

    Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in axum by you, shall be licensed as MIT, without any additional terms or conditions.

    Discover Repositories

    Search across tracked repositories by name or description