17 unstable releases (4 breaking)

0.9.2 Feb 5, 2024
0.9.1 Nov 27, 2023
0.8.2 Oct 22, 2023
0.8.0 Jun 7, 2023
0.7.0 Nov 17, 2022

#1536 in Development tools

Download history 1178/week @ 2024-01-29 1104/week @ 2024-02-05 984/week @ 2024-02-12 650/week @ 2024-02-19 857/week @ 2024-02-26 915/week @ 2024-03-04 809/week @ 2024-03-11 1048/week @ 2024-03-18 609/week @ 2024-03-25 977/week @ 2024-04-01 872/week @ 2024-04-08 883/week @ 2024-04-15 1289/week @ 2024-04-22 1052/week @ 2024-04-29 1146/week @ 2024-05-06 1243/week @ 2024-05-13

4,766 downloads per month
Used in 11 crates (10 directly)


586 lines


Build Status Crates.io Lib.rs Documentation

A middleware for browser reloading, built on top of tower.


Note that axum is only used as an example here, pretty much any Rust HTTP library or framework will be compatible!

use axum::{response::Html, routing::get, Router};
use tower_livereload::LiveReloadLayer;

async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let app = Router::new()
        .route("/", get(|| async { Html("<h1>Wow, such webdev</h1>") }))

    let listener = tokio::net::TcpListener::bind("").await?;
    axum::serve(listener, app).await?;


If you continuously rebuild and rerun this example e.g. using watchexec, you should see your browser reload whenever the code is changed.

More examples can be found on GitHub under examples.

Manual reload

With the Reloader utility, it is possible to reload your web browser entirely using hooks from Rust code. See this example on GitHub for pointers on how to implement a self-contained live-reloading static server.

Ecosystem compatibility

tower-livereload has been built from the ground up to provide the highest amount of ecosystem compatibility.

The provided middleware uses the http and http_body crates as its HTTP abstractions. That means it is compatible with any library or framework that also uses those crates, such as hyper, axum, tonic, and warp.


To provide LiveReload functionality, we have to inject code into HTML web pages. To determine whether a page is injectable, some header-based heuristics are used. In particular, Content-Type has to start with text/html, Content-Length must be set, and Content-Encoding must not be set.

If LiveReload is not working for some of your pages, ensure that these heuristics apply to your responses. In particular, if you use middleware to compress your HTML, ensure that the LiveReload middleware is applied before your compression middleware.


tower-livereload is free and open source software distributed under the terms of either the MIT or the Apache 2.0 license, at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


~64K SLoC