Releases: rust-dd/tako
Release list
v2.0.1
- plugins: the compression middleware now uses
Iterator::findforAccept-Encodingnegotiation (choose_encoding) instead of a manual loop. Behavior identical. - Internal refactor: every source file over 400 lines (31 files across all crates) split into responsibility-based submodules. Public paths preserved via re-exports — module structure only, no functional change.
v2.0.0
See MIGRATION_1_TO_2.md for an upgrade walkthrough covering every breaking change, including code-mod recipes for the macros and typed-state APIs.
Added
- Per-router typed state —
Router::with_state(T)replaces the old per-typeGLOBAL_STATEslot; multiple routers in the same process can now hold independent state of the same type. - Sub-routing primitives —
Router::nest("/path", child)andRouter::scope("/api", |s| { … })replaceRouter::mergeand add a real prefix-stripping pass. Result-aware handlers — handlers may returnResult<R, E>whereE: Responder;error_handleris paired with a newclient_error_handler, anduse_problem_json()emits RFC 7807application/problem+jsonbodies.- Method-aware routing — non-matched verbs now return
405 Method Not Allowedwith the properAllowheader instead of404. Server::builder()— unified bootstrap across HTTP/1.1, HTTP/2, HTTP/3, TLS, mTLS, and Unix sockets; replaces the matrix ofserve_*/serve_tls_*entry points.- TLS knobs —
TlsCert::{Pem, Der, Resolver},ReloadableResolver,ClientAuthfor full mTLS, SNI-based cert selection, and hot reload. ConnInfo— unified peer extension; replaces theSocketAddr/UnixPeerAddrsplit.- Runtime-agnostic
ServerHandle— graceful-shutdown handle that works uniformly across the Tokio and Compio runtimes. - Thread-per-core runtime (
per-thread,per-thread-compiofeatures) — N×current-thread workers +SO_REUSEPORTbootstrap.
Changed
- MSRV: 1.95 — bumped from 1.87.
- Edition: 2024 — workspace-wide.
- Macros — route paths support both
{id}and{id: u64}forms; noParamsstruct is materialised unless a typed slot exists. - Workspace is fully publishable — every internal sub-crate now publishes on crates.io as
tako-rs-core,tako-rs-extractors,tako-rs-macros,tako-rs-plugins,tako-rs-server,tako-rs-server-pt,tako-rs-streamsalongside the umbrellatako-rscrate. Use the umbrella crate; the sub-crates are considered implementation detail. tako-core-local— the separate!Sendrouter was removed; the unifiedRouterisSend + Syncand serves both runtimes.- Compio runtime — feature flags
compio,compio-tls,compio-wsnow compose cleanly with the rest of the framework. Compio is treated as a first-class runtime alongside Tokio.
Removed
serve_*family of free functions — useServer::builder().Router::merge— usenest/scopeinstead.Router::state(T)global slot — useRouter::with_state(T).- 1.x
Paramsglobal struct — typed extractors replace it.
Security
cargo deny checkis a CI gate; the v2 advisories schema fails the build on unignored vulnerabilities, unsoundness, and unmaintained crates.- mTLS support via
ClientAuthfor hardened internal endpoints.
Deferred to 2.x (not in this release)
The migration guide enumerates these in full; tracked separately from breaking changes:
tako-stores-redis/tako-stores-postgrescompanion crates (multi-replica SessionStore / RateLimitStore / IdempotencyStore backends).TlsCert::Acme(rustls-acme integration).- HTTP/3 qlog (needs quinn bump).
- Multipart / byteranges responder + Linux
sendfile(2)path onFileStream. - Real WebTransport CONNECT handshake (currently aliased to raw-QUIC).
- gRPC reflection / health protobuf-generated stubs.
- Cluster
SignalBusRedis / NATS / Kafka implementations. - v2 client HTTP/2 + HTTP/3 + reqwest-style middleware.
- Hot-reload
Arc<Router>swap.
What's Changed
Full Changelog: v1.1.2...v2.0.0
v1.1.2
Performance improvements
- RPITIT handler dispatch — Handler trait switched to return-position impl trait, eliminating double
Box::pinallocation per request (1 heap alloc instead of 2) - Lock-free route config —
RwLock<Option<Duration>>andRwLock<Option<SimdJsonMode>>replaced withOnceLockfor zero-overhead reads on the hot path - Static router reference — Router is leaked into
&'staticto eliminate allArcrefcount bumps per connection and per request - Middleware emptiness flags —
AtomicBoolflags onRouterandRouteskipArcSwap::load()when no middleware is registered - HTTP/1.1 pipeline flush — Enabled
pipeline_flush(true)on the hyper HTTP/1 builder for better pipelining throughput - Method clone eliminated —
req.method().clone()removed from dispatch hot path, using direct reference instead - Inline dispatch —
#[inline]added to the dispatch function
v1.1.1
What's Changed
- feat: JWT middleware refactored to trait-based design (
JwtVerifiertrait) — no mandatory JWT dependency - feat:
jwt-simplecrate moved behind optionaljwt-simplefeature flag - fix: compiler error
Breaking Changes
jwt-simpleis no longer included by default. Enable thejwt-simplefeature to restore the previousAnyVerifyKey/MultiKeyVerifierAPI.- New
JwtVerifiertrait allows plugging in any JWT library.
tako v.1.1.0
Performance-focused release — routing, body handling, middleware, and connection setup all received significant optimizations.
Highlights
- O(1) method dispatch via
MethodMap— fixed-size array replacesHashMapfor HTTP method routing - Zero-allocation body — new
TakoBodyenum avoids boxing forFull,Empty, andIncomingvariants - Lock-free middleware —
ArcSwapreplacesRwLockfor route middleware storage - TCP_NODELAY on all connections — eliminates Nagle's algorithm latency
- Custom path params deserializer — zero-copy
str::parse()instead of JSON intermediary - LTO + codegen-units=1 in release profile for maximum binary optimization
- 111 tests across 8 test suites · 36 examples
What's New (since v1.0.0)
Performance
| Optimization | Before | After |
|---|---|---|
| Method dispatch | HashMap<Method, _> lookup |
MethodMap fixed-size array (O(1) index) |
| Response body | Always-boxed BoxBody |
TakoBody enum — Full/Empty/Incoming unboxed |
| Middleware reads | RwLock<Vec<BoxMiddleware>> |
ArcSwap<Vec<BoxMiddleware>> (lock-free) |
| TCP connections | Default (Nagle on) | TCP_NODELAY enabled |
| Path params | serde_json round-trip |
Custom Deserializer with str::parse() |
| Release binary | Default LTO | lto = "fat", codegen-units = 1 |
Routing Rework
- Complete routing rewrite for performance
MethodMapstores handlers in a[Option<RouteEntry>; 9]array indexed by method- Dispatch is a direct array index — no hashing, no branching
Auth Handlers
- Improved
BasicAuth,BearerAuth, andJwtAuthhandler ergonomics
Middleware & Routing Logic
- Updated middleware chaining and routing dispatch
ArcSwapload guard pattern for zero-contention middleware reads
Examples
- All 36 examples restructured as standalone crates with their own
Cargo.toml - Added
streams-compioandtls-compioexamples - Fixed dependency declarations across all example crates
Fixes
- Fixed
vespera_corecompatibility (pinned to v0.1.43) for OpenAPI integration - Fixed Compio feature dead-code warnings (
BodyInner::Incoming,incoming()) - Fixed missing dependencies in example crates (
graphql-generic-ws,openapi,openapi-utoipa,streams)
Breaking Changes
None. All changes are internal optimizations. Existing v1.0.0 code compiles without changes.
Full Changelog: tako-v.1.0.0...tako-v.1.1.0
tako v.1.0.0
The first stable release of Tako — a lightweight, high-performance async web framework for Rust built on Hyper 1.x and Tokio, with optional Compio runtime support.
Highlights
- Graceful shutdown across all server variants with configurable drain timeout
- 8 transports — HTTP/1.1, HTTP/2, HTTP/3, WebTransport, Unix sockets, raw TCP/UDP, PROXY protocol
- HTTP/2 on Compio — full ALPN-based H2 via
SendWrapperpattern - Background job queue — named queues, retry policies (fixed/exponential), delayed jobs, dead letter queue
- Route-level SIMD JSON config —
SimdJsonMode::Always | Never | Threshold(n)per route - 10 middleware · 5 plugins · 22+ extractors · 106 tests · 29 examples
What's New (since v0.7.2)
Transports
| Transport | Tokio | Compio | Shutdown |
|---|---|---|---|
| HTTP/1.1 | ✅ | ✅ | ✅ |
| HTTP/2 (TLS+ALPN) | ✅ | ✅ | ✅ |
| HTTP/3 (QUIC) | ✅ | — | ✅ |
| WebTransport | ✅ | — | ✅ |
| Unix Domain Socket | ✅ | — | ✅ |
| Raw TCP | ✅ | — | ✅ |
| Raw UDP | ✅ | — | — |
| PROXY protocol v1/v2 | ✅ | — | ✅ |
Core
serve_with_shutdown()— graceful shutdown for all server variantsrouter.error_handler()— global 5xx error hook- Per-router and per-route timeouts with custom fallback
Config<T>— env-var configuration loader- Job queue —
Queue::builder().workers(4).retry(RetryPolicy::exponential(3, 500ms)).build()withpush(),push_delayed(), dead letter queue, gracefulshutdown()
New Middleware
SecurityHeaders · RequestId · SessionMiddleware · Csrf · UploadProgress · BodyLimit (stream enforcement) · ApiKeyAuth
New Extractors
Accept · Protobuf<T>
Performance
- SIMD JSON auto-dispatch with route-level
SimdJsonModeconfig (default threshold: 2 MB) - Query/Form single-pass deserialization via
serde_urlencoded(eliminated double JSON serialization)
Stability
- Eliminated all runtime
.unwrap()panics (TLS cert loading, compression, config) - Fixed Compio + HTTP/3 and Compio + HTTP/2 feature conflicts
Full Inventory
Middleware (10): ApiKeyAuth · BasicAuth · BearerAuth · BodyLimit · Csrf · JwtAuth (14 algorithms) · RequestId · SecurityHeaders · SessionMiddleware · UploadProgress
Plugins (5): CorsPlugin · CompressionPlugin (Gzip/Brotli/DEFLATE/Zstd) · RateLimiterPlugin · MetricsPlugin (Prometheus/OTel) · IdempotencyPlugin
Extractors (22+): Accept · AcceptLanguage · BasicCredentials · BearerToken · Bytes · CookieJar · PrivateCookieJar · SignedCookieJar · Form<T> · HeaderMap · IpAddr · Json<T> · SimdJson<T> · Jwt<C> · Multipart · PathParams · Path<T> · Protobuf<T> · Query<T> · RangeHeader · State<T> · &mut Request
106 tests across 8 test suites · 29 examples including gRPC, WebTransport, job queue, GraphQL, OpenTelemetry
Breaking Changes
None. All new features are additive and feature-gated. Existing v0.7.x code compiles without changes.
Full Changelog: tako-v.0.7.1-2...tako-v.1.0.0
tako v.0.7.1-2
Full Changelog: tako-v.0.7.0...tako-v.0.7.1-2
tako v.0.7.0
What's Changed
- feat: migrate scc for better performance by @dancixx in #19
- feat: add compio support by @dancixx in #18
- feat: add vespera and utoipa support @dancixx in 7a2e1e3
Notes
Compio support is experimental. If you want to use WebSocket then pick tokio runtime
Full Changelog: tako-v.0.6.1...tako-v.0.7.0
tako-v.0.6.1
tako-v.0.6.0
tako-v.0.6.0
Features
- Signals system + examples (#11)
- Metrics plugin
- State extractor, protocol version guard
- Automatic fallback port if requested port is unavailable
Fixes
- Updated CORS defaults
- Stable global middleware execution
- Naming/visibility cleanups
- Import/module export fixes
- Misc feature-flag fix
Refactors / Internals
- Switch to
http/http-body - Replace
IncomingwithTakoBody - Remove lifetimes from header map / path types
- Introduce internal
RwLockusage - Version bumps + doc updates
Migration notes
- Update body types + imports to
http/http-body - Replace
IncomingwithTakoBody - Adjust code using header/path lifetimes
- Revisit CORS + middleware behavior if relying on old defaults
Full Changelog: tako-v.0.5.0...tako-v.0.6.0