NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #149 most downloaded on crates.io
Tower is a library of modular and reusable components for building robust clients and servers.
Last release 8 months ago
12 Jan 2026
Ships unpredictably
gaps range from 2 weeks to 2.2 years
Nearly every release is documented
notes for 21 of 22 stable releases
1 version withdrawn
withdrawn after publishing
10 years old
26 releases · first in 2016
builder : Add ServiceBuilder::boxed_clone_sync() helper
ServiceBuilder::boxed_clone_sync() helper (#804)util : Add BoxCloneSyncService which is a Clone + Send + Sync boxed Service
One column per quarter.
Fix minimum version of tower-layer dependency
tower-layer dependency (#787)retry : Breaking Change retry::Policy::retry now accepts &mut Req and &mut Res instead of the previous mutable versions. This increases the flexibilit…
BoxService is now Sync (#702)ServiceExt::ready_and method and ReadyAndretry::Policy::retry now accepts &mut Req and &mut Res instead of the previous mutable versions. Thismut for both parameters. (#584)Reconnect::new (#755)Clone for Change (#701)Clone for AsyncFilterLayer (#731)BoxService is now Sync (#702)ServiceExt::ready_and method and ReadyAnd
future (#652)retry::Policy::retry now accepts &mut Req and &mut Res instead of the previous mutable versions. This
increases the flexibility of the retry policy. To update, update your method signature to include mut for both parameters. (#584)Budget is now a trait. This allows end-users to implement their own budget and bucket implementations. (#703)Reconnect::new (#755)Clone for Change (#701)Clone for AsyncFilterLayer (#731)Either::A and Either::B have been renamed Either::Left and Either::Right, respectively. (#637)Either now requires its two services to have the same error type. (#637)Either no longer implemenmts Future. (#637)Buffer<S, Request> is now generic over Buffer<Request, S::Future>. (#654)Buffer's capacity now correctly matches the specified size. Previously, the
capacity was subtly off-by-one, because a slot was held even while the worker task was processing a message. (#635)load_shed : Public constructor for Overloaded error
hedge , load , retry : Fix use of Instant operations that can panic on platforms where Instant is not monotonic
Instant operations that can panicInstant is not monotonic (#633)attributes feature on tracing dependency (#623)Buffer (#622)util: Add BoxCloneService which is a Clone + Send boxed Service ([#615])
BoxCloneService which is a Clone + Send boxed Service (#615)ServiceExt::boxed and ServiceExt::boxed_clone for applying the
BoxService and BoxCloneService middleware (#616)ServiceBuilder::boxed and ServiceBuilder::boxed_clone for
applying BoxService and BoxCloneService layers (#616)F: Clone bound from ServiceExt::map_request (#607)Debug bounds from impl Debug for BoxService (#617)Debug bounds from impl Debug for UnsyncBoxService (#617)Req: Clone bound from Clone impls
for MakeBalance, and MakeBalanceLayer (#607)Req: Debug bound from Debug impls
for MakeBalance, MakeFuture, Balance, and Pool (#607)Req: Debug bound from Debug impl
for ReadyCache (#607)Req: Debug bound from Debug impl
for Steer (#607)doc(cfg(...)) attributes
of PeakEwmaDiscover, and PendingRequestsDiscover (#610)Fix accidental breaking change when using the rustdoc::broken_intra_doc_links lint ([#605])
Migrate to [pin-project-lite] ([#595])
Layer for ServiceBuilder (#600)ServiceBuilder::and_then analogous to
ServiceExt::and_then (#601)builder: Add ServiceBuilder::map_result analogous to ServiceExt::map_result ([#583])
builder: Add ServiceBuilder::check_service to check the request, response, and error types of the output service. ([#576])
ServiceBuilder::check_service to check the request,
response, and error types of the output service. (#576)ServiceBuilder::check_service_clone to check the output
service can be cloned. (#576)SpawnReady service
is dropped, fixing a potential task/resource leak (#[581])util: Deprecated ServiceExt::ready_and (renamed to ServiceExt::ready). ([#567])
ServiceExt::ready_and (renamed to ServiceExt::ready).
(#567)ReadyAnd future (renamed to Ready). (#567)ServiceBuilder::layer_fn to add a layer built from a
function. (#560)ServiceBuilder::map_future for transforming the futures
produced by a service. (#559)ServiceBuilder::service_fn for applying Layers to an
async function using util::service_fn. (#564)service_fn. (#563)BoxLayer for creating boxed Layer trait objects. (#569)util: Add ServiceExt::map_future. ([#542])
ServiceExt::map_future. (#542)ServiceBuilder::option_layer to optionally add a layer. (#555)Shared which lets you implement MakeService by cloning a
service. (#533)Debug. They
previously wouldn't since closures never implement Debug. (#552)Clone for Steer. (#554)tracing span to
spawned tasks (#557)tracing for the features that need it. (#551)util: Implement Layer for Either . ([#531])
filter: Filter::check and AsyncFilter::check methods which check a request against the filter's Predicate ([#521])
Filter::check and AsyncFilter::check methods which check a
request against the filter's Predicate (#521)get_ref, get_mut, and into_inner methods to Filter
and AsyncFilter, allowing access to the wrapped service (#522)layer associated function to AndThen, Then,
MapRequest, MapResponse, and MapResult types. These return a Layer
that produces middleware of that type, as a convenience to avoid having to
import the Layer type separately. (#524)Clone impls to AndThenLayer, MapRequestLayer,
and MapErrLayer, when the mapped function implements Clone (#525)FutureService::new constructor, with less restrictive bounds
than the future_service free function (#523)Export layer_fn and LayerFn from the tower::layer module. ([#516])
Updated tower-layer to 0.3.1 to fix broken re-exports.
tower-layer to 0.3.1 to fix broken re-exports.This is a major breaking release including a large number of changes. In particular, this release updates tower to depend on Tokio 1.0, and moves all
This is a major breaking release including a large number of changes. In
particular, this release updates tower to depend on Tokio 1.0, and moves all
middleware into the tower crate. In addition, Tower 0.4 reworks several
middleware APIs, as well as introducing new ones.
This release does not change the core Service or Layer traits, so tower
0.4 still depends on tower-service 0.3 and tower-layer 0.3. This means that
tower 0.4 is still compatible with libraries that depend on those crates.
MakeService::into_service and MakeService::as_service for
converting MakeServices into Services (#492)steer middleware for routing requests to one of a set of
services (#426)MapRequest middleware and ServiceExt::map_request, for
applying a function to a request before passing it to the inner service
(#435)MapResponse middleware and ServiceExt::map_response, for
applying a function to the Response type of an inner service after its
future completes (#435)MapErr middleware and ServiceExt::map_err, for
applying a function to the Error returned by an inner service if it fails
(#396)MapResult middleware and ServiceExt::map_result, for
applying a function to the Result returned by an inner service's future
regardless of whether it succeeds or fails (#499)Then middleware and ServiceExt::then, for chaining another
future after an inner service's future completes (with a Response or an
Error) (#500)AndThen middleware and ServiceExt::and_then, for
chaining another future after an inner service's future completes successfully
(#485)layer_fn, for constructing a Layer from a function taking
a Service and returning a different Service (#491)FutureService, which implements Service for a
Future whose Output type is a Service ([#496])BoxService::layer and UnsyncBoxService::layer, to make
constructing layers more ergonomic (#503)Layer impl for &Layer (#446)Retry::get_ref, Retry::get_mut, and Retry::into_inner
to access the inner service (#463)Timeout::get_ref, Timeout::get_mut, and
Timeout::into_inner to access the inner service (#463)Clone and Copy impls for BufferLayer (#[493])tower-* crates were merged into tower and placed
behind feature flags (#432)ServiceBuilder::service take self by reference rather
than by value (#504)MakeService in the response future, rather than
in poll_ready, allowing the reconnect service to be reused when a reconnect
fails (#386, #437)Discover to be a sealed trait alias for a
TryStream<Item = Change>. Discover implementations are now written by
implementing Stream. (#443)Instrument trait to TrackCompletion (#445)NoInstrument to CompleteOnResponse (#445)BalanceLayer to MakeBalanceLayer (#449)BalanceMake to MakeBalance (#449)ready_cache::error::Failed's fmt::Debug impl to
require the key type to also implement fmt::Debug (#467)Filter and Predicate to use a synchronous function as
a predicate (#508)Filter and Predicate (where Predicates
returned a Future) to AsyncFilter and AsyncPredicate (#508)Predicates now take a Request type by value and may return a
new request, potentially of a different type (#508)Predicates may now return an error of any type (#508)RateLimit services do not reset the remaining
count when rate limiting (#438, [#439])oneshot futures panic if the service does not
immediately become ready (#447)ready_cache::error::Failed not returning inner error types
via Error::source (#467)buffer where buffer slots were
eagerly reserved for hedge requests even if they were not sent (#472)Allow opting out of tracing/log (#410).
Update all tower based crates to 0.3.
0.3.tokio 0.2futures 0.3Update tower-buffer to 0.3.0-alpha.1b
tower-buffer to 0.3.0-alpha.1bMove to futures-*-preview 0.3.0-alpha.19
futures-*-preview 0.3.0-alpha.19pin-project 0.4- Move to std::future
std::future- Add ServiceBuilder::into_inner
ServiceBuilder::into_inner- Initial release
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →