NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1144 most downloaded on PyPI
A Rust HTTP server for Python applications
Last release 4 days ago
30 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of 60 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
60 releases · first in 2022
One column per quarter.
Fix ASGI query-string encoding in access log
Patch release
Changes since 2.8.3:
send callsNotify ASGI/RSGI apps of client disconnection on HTTP/2 stream close
Patch release
Changes since 2.8.2:
Fix a regression bug causing issues with multiprocessing and fork_server method
Patch release
Changes since 2.8.1:
multiprocessing and fork_server methodwsgi.input_terminated in WSGI environ
Fix a performance regression on ASGI websockets
Patch release
Changes since 2.8.0:
PyFutureAwaitable Python interfaceAdd header atom to access log format (#829 by @nitrag)
header atom to access log format (#829 by @nitrag)debug severitynet.ipv4.tcp_migrate_req sysctl option enabled when using multiple workers and respawn featuresFix a bug in the blocking threadpool scheduler heuristics causing starving/underscaling with WSGI protocol and long-running requests
Patch release
Changes since 2.7.8:
Switch ASGI websockets teardown to optimistic locking to further avoid blocking Python's event-loop
Patch release
Changes since 2.7.7:
Fix a bug in ASGI protocol websockets teardown leading to Python's event-loop blocking
Patch release
Changes since 2.7.6:
Fix a logical bug in workers shutdown flow leading to kill timeout not being respected
Patch release
Changes since 2.7.5:
Fix a bug in IPC implementation causing crashes on shutdown (#847 by @askedrelic)
Patch release
Changes since 2.7.4:
Fix a bug in ASGI protocol leading to panics on malformed websocket subprotocol headers
Patch release
Changes since 2.7.3:
Fix a bug in ASGI protocol preventing to receive websocket disconnection messages before accept
Patch release
Changes since 2.7.2:
Review ASGI websockets' rejection flow
Patch release
Changes since 2.7.1:
Fix websockets' handles cleanup on shutdown
Patch release
Changes since 2.7.0:
Cannot drop pointer into Python heap without the thread being attachedwebsocket.disconnect event after server-initiated close (#801 by @JaeHyuckSa)
PyFutureAwaitable callback dispatch (#802 by @ColemanDunn)Add prometheus metrics export (based on @butlerx preliminary work)
--blocking-threads-idle-timeout minimum accepted value to 5 secondsauto runtime mode optionclick dependencyUpgrade type annotations (#753, #755 by @oliverlambson)
Patch release
Changes since 2.6.0:
Add winloop support (#682 by @jpagh)
winloop support (#682 by @jpagh)response_file_range protocol interface (#159 by @myers)--rss-samples option--rss-sample-interval minimum accepted value to 1 secondmimalloc to v3auto runtime mode optionFix a Python 3.9 compatibility issue with utils.proxies module
Patch release
Changes since 2.5.6:
utils.proxies moduleFix a bug on WSGI protocol causing wrong PATH_INFO values in environ when --url-path-prefix used
Patch release
Changes since 2.5.5:
PATH_INFO values in environ when --url-path-prefix usedFallback to spawn multiprocessing start method when the default is not compatible
Patch release
Changes since 2.5.4:
spawn multiprocessing start method when the default is not compatible
forkserver spawn methodFix query string encoding on WSGI protocol to only allow ISO-8859-1 representable unicode characters
Patch release
Changes since 2.5.3:
Fix Cookie header concatenation on WSGI protocol under HTTP/2
Patch release
Changes since 2.5.2:
Cookie header concatenation on WSGI protocol under HTTP/2Add __all__ definition to package (#671 by @anuraaga)
Patch release
Changes since 2.5.1:
__all__ definition to package (#671 by @anuraaga)Fix Python path on CLI invocation
Patch release
Changes since 2.5.0:
Human-readable CLI duration arguments (#622 by @3ok)
--workers-lifetime 6h--workers-max-rss option)--static-path-expires 0)tokio::selectcode and reason values in ASGI websocket close messagesFix working directory option resolution to always be lazy
Patch release
Changes since 2.4.1:
Fix a bug in dotenv files support (#625 by @adhami3310)
Patch release
Changes since 2.4.0:
Startup, shutdown and reload hooks support (#584 by @adhami3310)
jemalloc allocator behind a feature flagFix a bug in ASGI protocol with Server-Sent events preventing response headers from being sent before first message
Patch release
Changes since 2.3.3:
Fix deprecation warnings (#593 by @matthiask)
Patch release
Changes since 2.3.2:
Fix an ASGI flow error on websockets occurring with applications calling receive before sending the accept message (thanks @jthorniley)
Patch release
Changes since 2.3.1:
receive before sending the accept message (thanks @jthorniley)
ASGI Flow Error under some circumstancesFix a bug on TCP accept loop causing workers to stop accepting new requests under some circumstances (thanks @nggit)
Patch release
Changes since 2.3.0:
Support for direct static files serving from a folder
Avoid to raise RuntimeError on RSGI headers methods when decoding fails
Patch release
Changes since 2.2.5:
RuntimeError on RSGI headers methods when decoding failsFix a regression bug involving the event loop initialization and causing tasks to be attached to the wrong loop under some circumstances
Patch release
Changes since 2.2.4:
Improve performance on iter-based responses on all protocols
Patch release
Changes since 2.2.3:
response_file and ASGI pathsendREMOTE_ADDR environ varImprove wording in WSGI warnings (#549 by @janbrasna)
Patch release
Changes since 2.2.2:
i686 and armv7 wheelsProper connections load balancing across workers on Linux (#546, special thanks to @aldem)
Patch release
Changes since 2.2.1:
Make PyFutureAwaitable compatible with anyio cancel scopes
Patch release
Changes since 2.2.0:
PyFutureAwaitable compatible with anyio cancel scopesraw_pathAllow to ignore workers failure with reload enabled (#528 by @adhami3310)
Revert a change in WSGI implementation causing issues with threading module usage
Patch release
Changes since 2.1.1:
threading module usageFix a bug in RSGI implementation preventing HTTP protocol client_disconnect usage with access log enabled
Patch release
Changes since 2.1.0:
client_disconnect usage with access log enabledSupport Server header value to be customized in applications
Server header value to be customized in applicationsclient_disconnect coroutine to HTTP protocolFix a regression bug preventing anyio.to_thread.run_sync to run properly
Patch release
Changes since 2.0.0:
anyio.to_thread.run_sync to run properlyExperimental support for *free-threaded* Python
runtime-blocking-threads optionblocking-threads-idle-timeout optionhttp1-header-read-timeout optiongranian.server.embed moduleuvloop dependency is now optional and gated behind the relevant dependency extrathreads option to runtime-threadsblocking-threads option now affects Python interop threads onlythreading-mode in favor of runtime-mode
workers option is now struntime option is now mtblocking-threads is now limited to 1 on ASGI and RSGI protocolsrust task implementation is now available on Python < 3.12 onlyloops registry to facilitate customisationsjemalloc as default option and mimalloc as gated feature, used by default in the following cases:
Fix a utf8 decoding bug on request paths leading to panics (#492 by @ritesh)
Patch release
Changes since 1.7.5:
watchfiles dependency versions >= 1.0 (#496 by @RafaelWO)asyncio the default task implementation due to instability of the rust onePrevent async callbacks tasks to be GCollected before completion
Patch release
Changes since 1.6.3:
_granian logger is missing (#438 by @monosans)Address CVE-2024-28854 (TLS slow loris vulnerability)
Patch release
Changes since 1.5.1:
Enhance memory allocations in WSGI input iterator (fix memory leaks in certain conditions)
Patch release
Changes since 1.4.3:
Fix headers chaining in WSGI protocol
Patch release
Changes since 1.3.1:
Use jemalloc allocator on unix platforms
Patch release
Changes since 1.2.2:
jemalloc allocator on unix platformsReview bytes encoding in ASGI protocol scope elements
Patch release
Changes since 1.1.1:
Mapping methods to RSGIHeadersFix missing host header on HTTP/2 connections on ASGI and WSGI protocols
Patch release
Changes since 1.0.1:
host header on HTTP/2 connections on ASGI and WSGI protocolsauthority pseudo-header on HTTP/2 connections on RSGI protocolPatch release Changes since 0.7.5: * Fix ASGI disconnect on Django
Patch release
Changes since 0.7.5:
fix concurrent borrowing error on Windows
Patch release
Changes since 0.6.0:
save 1 GIL token call in Rust awaitables
Patch release
Changes since 0.5.2:
re-added unoptimised Python loop tasks code
Patch release
Changes since 0.4.2:
contextvars issues like #80)Patch release Changes since 0.3.1: - Enhance WSGI protocol code
Patch release
Changes since 0.3.1:
Enable mimalloc on aarch64 linux wheels
Patch release
Changes since 0.2.5:
mimalloc on aarch64 linux wheelsfix ASGI websocket.send message parsing
Patch release
Changes since 0.1.4:
websocket.send message parsing (#19)Your coding agent can read these notes before it upgrades. Set up the MCP server →