NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1308 most downloaded on crates.io
Extra utilities for axum
Last release 5 months ago
14 Apr 2026
Release timing varies
gaps range from 2 weeks to 6 months
Nearly every release is documented
notes for 47 of 47 stable releases
2 versions withdrawn
withdrawn after publishing
5 years old
54 releases · first in 2021
One column per quarter.
vpath! macro now stops the compilation if your path is using deprecated path variables in the old 107 format, such as :var and *var . the only allowed…
Content-Disposition filenames to prevent header parameter injection in Attachment and FileStream (#3664)vpath! macro now stops the compilation if your path is using deprecated path variables in the old 107 format, such as :var and *var. the only allowed way now is {var}. (#3618)fixed: JsonLines now correctly respects the default body limit ([#3591])
JsonLines now correctly respects the default body limit (#3591)changed: Deprecated the Host and Scheme extractors ([#3595])
changed: Make the typed-routing feature enable the routing feature
Make it easier to visually scan for default features
This release contains no changes in code, only a small Cargo.toml fix for docs.rs.
This release contains no changes in code, only a small Cargo.toml fix for
docs.rs.
breaking: Remove unused async-stream feature, which was accidentally introduced as an implicit feature through an optional dependency which was no lon
async-stream feature, which was accidentally
introduced as an implicit feature through an optional dependency which was no
longer being used (#3298)option_layer now maps the Response body type to axum::body::Body (#3469)Cached extractor requires cached feature.handler feature.middleware feature.OptionalPath extractor requires optional-path feature.routing feature.WithRejection extractor requires with-rejection feature.prost dependency to v0.14. (#3517)Yanked from crates.io due to unforeseen breaking change, see [#3190] for details.
Yanked from crates.io due to unforeseen breaking change, see #3190 for details.
Released without changes to fix docs.rs build.
Released without changes to fix docs.rs build.
added: Implement OptionalFromRequest for Host ([#3177])
OptionalFromRequest for Host (#3177)fixed: Fix a broken link in the documentation of ErasedJson ([#3186])
changed: Deprecated OptionalPath ([#2475])
<details>
OptionalFromRequestParts impl for Query (#3088)serde_path_to_error to report fields that failed to parse (#3081)</details>
Protobuf extractor (#2829)OptionalPath<T> (#2475)serde_path_to_error to report fields that failed to parse (#3081)multipart feature is no longer on by default (#3058)Host extractor includes port number when parsing authority (#2242)RouterExt::typed_connect (#2961)json! for easy construction of JSON responses (#2962)InternalServerError response for logging an internal error
and returning HTTP 500 in a convenient way. (#3010)FileStream for easy construction of file stream responses (#3047)Scheme extractor (#2507)Option<Query<T>> no longer swallows all error conditions, instead rejecting the
request in many cases; see its documentation for details (#2475)OptionalPath<T> and OptionalQuery<T> (#2475)Host extractor includes port number when parsing authority (#2242)multipart feature is no longer on by default (#3058)RouterExt::typed_connect (#2961)json! for easy construction of JSON responses (#2962)InternalServerError response for logging an internal error
and returning HTTP 500 in a convenient way. (#3010)FileStream for easy construction of file stream responses (#3047)Scheme extractor (#2507)Nothing published for this version
Nothing published for this version
docs: Add links to features table ([#3030])
added: Add RouterExt::typed_connect ([#2961])
added: The response::Attachment type ([#2789])
response::Attachment type (#2789)added: New tracing feature which enables logging rejections from built-in extractor with the axum::rejection=trace target ([#2584])
tracing feature which enables logging rejections from
built-in extractor with the axum::rejection=trace target (#2584)added: Implement TypedPath for WithRejection
change: Update version of multer used internally for multipart ([#2433])
added: OptionalQuery extractor ([#2310])
OptionalQuery extractor (#2310)TypedHeader which used to be in axum (#1850)Protobuf extractortokio an optional dependencycookie dependency to 0.18 (#2343)Cookie
now accept any T: Into<Cookie> (#2348)breaking: Update to prost 0.12. Used for the Protobuf extractor ([#2224])
Protobuf extractor (#2224)added: Clone implementation for ErasedJson ([#2142])
Clone implementation for ErasedJson (#2142)fixed: Remove unused dependency ([#2135])
fixed: Remove explicit auto deref from PrivateCookieJar example ([#2028])
PrivateCookieJar example (#2028)added: Add Html response type ([#1921])
added: Implement Deref and DerefMut for built-in extractors ([#1922])
added: Implement IntoResponse for MultipartError ([#1861])
IntoResponse for MultipartError (#1861)- Updated to latest axum-macros
axum-macrosbreaking: Remove the spa feature which should have been removed in 0.6.0 ([#1802])
spa feature which should have been removed in 0.6.0 (#1802)Multipart. This is similar to axum::extract::Multipart
except that it enforces field exclusivity at runtime instead of compile time,
as this improves usability (#1692)Clone for CookieJar, PrivateCookieJar and SignedCookieJar (#1808)#[must_use] attributes to types that do nothing unless used (#1809)breaking: Change casing of ProtoBuf to Protobuf ([#1595])
breaking: Change casing of ProtoBuf to Protobuf (#1595)
breaking: SpaRouter has been removed. Use ServeDir and ServeFile
from tower-http instead:
// before
Router::new().merge(SpaRouter::new("/assets", "dist"));
// with ServeDir
Router::new().nest_service("/assets", ServeDir::new("dist"));
// before with `index_file`
Router::new().merge(SpaRouter::new("/assets", "dist").index_file("index.html"));
// with ServeDir + ServeFile
Router::new().nest_service(
"/assets",
ServeDir::new("dist").not_found_service(ServeFile::new("dist/index.html")),
);
See the static-file-server-example for more examples (#1784)
added: Add option_layer for converting an Option into a Layer ([#1696])
fixed: Bug fixes for RouterExt:{route_with_tsr, route_service_with_tsr} ([#1608]):
RouterExt:{route_with_tsr, route_service_with_tsr} (#1608):
/fixed: Fix wrong From impl for Resource ([#1589])
From impl for Resource (#1589)added: Add RouterExt::route_with_tsr for adding routes with an additional "trailing slash redirect" route ([#1119])
RouterExt::route_with_tsr for adding routes with an
additional "trailing slash redirect" route (#1119)HandlerCallWithExtractors::or (#1170)Either* types for combining extractors and responses into a
single type (#1263)WithRejection extractor for customizing other extractors' rejections (#1262)CookieJar, PrivateCookieJar, and
SignedCookieJar so they're easier to use in custom middlewareS: Service, the bounds have been
relaxed so the return type can be any type that implements IntoResponse rather than being a
literal ResponseForm has a new rejection type (#1496)Query has a new rejection type (#1496)Resource::nest and Resource::nest_collection have been
removed. You can instead convert the Resource into a Router and
add additional routes as necessary (#1086)SignedCookieJar and PrivateCookieJar now extracts the keys
from the router's state, rather than extensionsResource has a new S type param which represents the state (#1155)RouterExt::route_with_tsr now only accepts MethodRouters (#1155)RouterExt::route_service_with_tsr for routing to any Service (#1155)<details> <summary>0.4.0 Pre-Releases</summary>
breaking: Depend axum 0.6.0-rc.5 and axum-macros 0.3.0-rc.3
breaking: Form has a new rejection type ([#1496])
added: Add RouterExt::route_with_tsr for adding routes with an additional "trailing slash redirect" route ([#1119])
RouterExt::route_with_tsr for adding routes with an
additional "trailing slash redirect" route (#1119)Resource::nest and Resource::nest_collection has been
removed. You can instead convert the Resource into a Router and
add additional routes as necessary (#1086)S: Service, the bounds have been
relaxed so the response type must implement IntoResponse rather than being a
literal ResponseHandlerCallWithExtractors::or (#1170)SignedCookieJar and PrivateCookieJar now extracts the keys
from the router's state, rather than extensionsEither* types for combining extractors and responses into a
single type (#1263)WithRejection extractor for customizing other extractors' rejections (#1262)CookieJar, PrivateCookieJar, and
SignedCookieJar so they're easier to use in custom middlewareResource has a new S type param which represents the state (#1155)RouterExt::route_with_tsr now only accepts MethodRouters (#1155)RouterExt::route_service_with_tsr for routing to any Service (#1155)</details>
fixed: Depend on axum 0.5.15 which contains a fix for an accidental breaking change.
fixed: Fix feature labels missing in generated docs ([#1137])
added: Add JsonLines for streaming newline delimited JSON ([#1093])
fixed: Use impl IntoResponse less in docs ([#1049])
added: Add extract::Query which supports multi-value items ([#1041])
added: Add extract::Form which supports multi-value items ([#1031])
extract::Form which supports multi-value items (#1031)fixed: Option and Result are now supported in typed path route handler parameters ([#1001])
fixed: Don't depend on axum with default features enabled ([#913])
added: Re-export SameSite and Expiration from the cookie crate ([#898])
added: Add TypedPath::to_uri for converting the path into a Uri ([#790])
TypedPath::to_uri for converting the path into a Uri (#790)extract::cookies for more
details (#816)CachedRejection has been removed (#699)<Cached<T> as FromRequest>::Rejection is now T::Rejection. (#699)middleware::from_fn has been remove from axum-extra and moved into the main
axum crate (#719)HasRoutes has been removed. Router::merge now accepts Into<Router> (#819)RouterExt::with method has been removed. Use Router::merge instead. It works
identically (#819)added: Add TypedPath::to_uri for converting the path into a Uri ([#790])
TypedPath::to_uri for converting the path into a Uri (#790)fix: Depend on the right versions of axum and axum-macros ([#782])
change: middleware::from_fn has been deprecated and moved into the main axum crate ([#719])
fix: Depend on tower with default_features = false ([#666])
default_features = false ([#666])Add middleware::from_fn for creating middleware from async functions ([#656])
[Keep a Changelog]: https://keepachangelog.com/en/1.0.0/ [Semantic Versioning]: https://semver.org/spec/v2.0.0.html
Your coding agent can read these notes before it upgrades. Set up the MCP server →