# Uvicorn changelog > A lightning-fast ASGI server for Python web applications. - Vendor: Encode - Category: Frameworks & Libraries - Official site: https://www.uvicorn.org - Tracked by: What's New (https://whatsnew.fyi/product/uvicorn) - Harvested from: GitHub (encode/uvicorn) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### 0.52.1 — Version 0.52.1 - Date: 2026-08-01 - Version: 0.52.1 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.52.1 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.52.1 - **fixed** — Complete the closing handshake on server-initiated WebSocket closes in the websockets-sansio and wsproto implementations, waiting for the client's close reply with a 10 second timeout instead of resetting the connection - **fixed** — Add missing write flow control to the websockets-sansio implementation, preventing data truncation on server-initiated closes with large in-flight payloads - **fixed** — Handle connection loss while a WebSocket write is waiting on backpressure - **fixed** — Remove duplicate Content-Type and Content-Length headers from WebSocket denial responses on the websockets-sansio implementation, and deliver non-UTF-8 denial bodies intact ###### Fixed * Complete the closing handshake on server-initiated WebSocket closes in the `websockets-sansio` and `wsproto` implementations, waiting for the client's close reply with a 10 second timeout instead of resetting the connection (#3053) * Add missing write flow control to the `websockets-sansio` implementation, preventing data truncation on server-initiated closes with large in-flight payloads (#3048) * Handle connection loss while a WebSocket write is waiting on backpressure (#3050) * Remove duplicate `Content-Type` and `Content-Length` headers from WebSocket denial responses on the `websockets-sansio` implementation, and deliver non-UTF-8 denial bodies intact (#3041) **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.52.0...0.52.1 ### 0.52.0 — Version 0.52.0 - Date: 2026-07-29 - Version: 0.52.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.52.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.52.0 - **added** — Add an experimental zttp HTTP/1.1 implementation, selectable with --http zttp - **fixed** — Keep non-ASCII WebSocket request headers intact with websockets 17.0, which encodes them with ISO-8859-1 This release adds an experimental HTTP/1.1 implementation backed by [zttp](https://zttp.marcelotryle.com/), a sans-IO HTTP parser I've been developing on the side: a core written in Zig, with bindings to Python. It has been running under a fuzzer for some weeks now, and has been through multiple rounds of security auditing. It is still **experimental**, so don't put it in front of production traffic yet. Try it with `--http zttp`, and please send any feedback to the [issue tracker](https://github.com/Kludex/uvicorn/issues). ###### Added * Add an experimental `zttp` HTTP/1.1 implementation, selectable with `--http zttp` (#2979) ###### Fixed * Keep non-ASCII WebSocket request headers intact with websockets 17.0, which encodes them with ISO-8859-1 (#3036) **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.51.0...0.52.0 ### 0.51.0 — Version 0.51.0 - Date: 2026-07-08 - Version: 0.51.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.51.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.51.0 - **changed** — Restart workers with overlap on SIGHUP for near-zero-downtime reloads - **removed** — Remove colorama from the standard extra ##### What's Changed * Restart workers with overlap on SIGHUP for near-zero-downtime reloads by @Kludex in https://github.com/Kludex/uvicorn/pull/3025 * Remove colorama from the standard extra by @Kludex in https://github.com/Kludex/uvicorn/pull/3027 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.50.2...0.51.0 ### 0.50.1 — Version 0.50.1 - Date: 2026-07-06 - Version: 0.50.1 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.50.1 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.50.1 - **fixed** — Split comma-separated Sec-WebSocket-Protocol values in the websockets-sansio implementation ##### What's Changed * Split comma-separated `Sec-WebSocket-Protocol` values in the websockets-sansio implementation by @Aayush7352 in https://github.com/Kludex/uvicorn/pull/3019 ##### New Contributors * @Aayush7352 made their first contribution in https://github.com/Kludex/uvicorn/pull/3019 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.50.0...0.50.1 ### 0.50.0 — Version 0.50.0 - Date: 2026-07-04 - Version: 0.50.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.50.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.50.0 - **changed** — Memoize trusted host checks to avoid re-parsing the client IP per request - **changed** — Cache the asgi scope sub-dict per connection - **changed** — Build a fresh asgi scope dict per request - **changed** — Replace click.style with an internal ANSI style helper - **changed** — Avoid copying single-frame WebSocket payloads in websockets-sansio - **deprecated** — Deprecate the legacy websockets implementation and default auto to websockets-sansio - **changed** — Exit with a dedicated code on startup failure and stop the supervisor when a worker can't boot - **changed** — Skip the eager app import in the parent when spawning workers ##### What's Changed * Memoize trusted host checks to avoid re-parsing the client IP per request by @Kludex in https://github.com/Kludex/uvicorn/pull/2970 * Cache the `asgi` scope sub-dict per connection by @Kludex in https://github.com/Kludex/uvicorn/pull/2976 * Build a fresh `asgi` scope dict per request by @Kludex in https://github.com/Kludex/uvicorn/pull/2977 * Replace click.style with an internal ANSI style helper by @Kludex in https://github.com/Kludex/uvicorn/pull/2981 * Avoid copying single-frame WebSocket payloads in websockets-sansio by @Kludex in https://github.com/Kludex/uvicorn/pull/2983 * Deprecate the legacy websockets implementation and default `auto` to websockets-sansio by @Kludex in https://github.com/Kludex/uvicorn/pull/2985 * Exit with a dedicated code on startup failure and stop the supervisor when a worker can't boot by @Kludex in https://github.com/Kludex/uvicorn/pull/3001 * Skip the eager app import in the parent when spawning workers by @Kludex in https://github.com/Kludex/uvicorn/pull/3012 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.49.0...0.50.0 ### 0.49.0 — Version 0.49.0 - Date: 2026-06-03 - Version: 0.49.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.49.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.49.0 - **changed** — Bump httptools minimum version to 0.8.0 - **changed** — Consume duplicate forwarding headers in ProxyHeadersMiddleware (reverses the 0.48.0 behavior of ignoring them) ##### What's Changed * Bump httptools minimum version to 0.8.0 by @Kludex in https://github.com/Kludex/uvicorn/pull/2962 * Consume duplicate forwarding headers in ProxyHeadersMiddleware (reverses the 0.48.0 behavior of ignoring them) by @Kludex in https://github.com/Kludex/uvicorn/pull/2971 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.48.0...0.49.0 ### 0.48.0 — Version 0.48.0 - Date: 2026-05-24 - Version: 0.48.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.48.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.48.0 - **changed** — Default ssl_ciphers to None and use OpenSSL defaults - **changed** — Ignore duplicate forwarding headers in ProxyHeadersMiddleware ##### What's Changed * Default `ssl_ciphers` to `None` and use OpenSSL defaults by @Kludex in https://github.com/Kludex/uvicorn/pull/2940 * Ignore duplicate forwarding headers in `ProxyHeadersMiddleware` by @Kludex in https://github.com/Kludex/uvicorn/pull/2944 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.47.0...0.48.0 ### 0.47.0 — Version 0.47.0 - Date: 2026-05-14 - Version: 0.47.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.47.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.47.0 - **changed** — Eagerly import the ASGI app in the parent process - **added** — Add ssl_context_factory for custom SSLContext configuration - **fixed** — Treat fd=0 as a valid file descriptor with reload/workers ##### What's Changed * Eagerly import the ASGI app in the parent process by @Kludex in https://github.com/Kludex/uvicorn/pull/2919 * Add `ssl_context_factory` for custom `SSLContext` configuration by @Kludex in https://github.com/Kludex/uvicorn/pull/2920 * Treat `fd=0` as a valid file descriptor with reload/workers by @eltoder in https://github.com/Kludex/uvicorn/pull/2927 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.46.0...0.47.0 ### 0.46.0 — Version 0.46.0 - Date: 2026-04-23 - Version: 0.46.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.46.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.46.0 - **added** — Support `ws_max_size` in `wsproto` implementation - **added** — Support `ws_ping_interval` and `ws_ping_timeout` in `wsproto` implementation - **changed** — Use `bytearray` for incoming WebSocket message buffer in websockets-sansio ##### What's Changed * Support `ws_max_size` in `wsproto` implementation by @Kludex in https://github.com/Kludex/uvicorn/pull/2915 * Support `ws_ping_interval` and `ws_ping_timeout` in `wsproto` implementation by @Kludex in https://github.com/Kludex/uvicorn/pull/2916 * Use `bytearray` for incoming WebSocket message buffer in websockets-sansio by @Kludex in https://github.com/Kludex/uvicorn/pull/2917 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.45.0...0.46.0 ### 0.45.0 — Version 0.45.0 - Date: 2026-04-21 - Version: 0.45.0 - Original notes: https://github.com/Kludex/uvicorn/releases/tag/0.45.0 - Permalink: https://whatsnew.fyi/product/uvicorn/releases/0.45.0 - **changed** — Preserve forwarded client ports in proxy headers middleware - **added** — Accept os.PathLike for log_config - **changed** — Accept log_level strings case-insensitively - **added** — Raise helpful ImportError when PyYAML is missing for YAML log config - **fixed** — Revert empty context for ASGI runs - **added** — Add --reset-contextvars flag to isolate ASGI request context - **fixed** — Revert emission of http.disconnect on server shutdown for streaming responses ##### What's Changed * Preserve forwarded client ports in proxy headers middleware by @Kludex in https://github.com/Kludex/uvicorn/pull/2903 * Accept `os.PathLike` for `log_config` by @Kludex in https://github.com/Kludex/uvicorn/pull/2905 * Accept `log_level` strings case-insensitively by @Kludex in https://github.com/Kludex/uvicorn/pull/2907 * Raise helpful `ImportError` when PyYAML is missing for YAML log config by @Kludex in https://github.com/Kludex/uvicorn/pull/2906 * Revert empty context for ASGI runs by @Kludex in https://github.com/Kludex/uvicorn/pull/2911 * Add `--reset-contextvars` flag to isolate ASGI request context by @Kludex in https://github.com/Kludex/uvicorn/pull/2912 * Revert "Emit `http.disconnect` on server shutdown for streaming responses" (#2829) by @Kludex in https://github.com/Kludex/uvicorn/pull/2913 ##### New Contributors * @Krishnachaitanyakc made their first contribution in https://github.com/Kludex/uvicorn/pull/2870 **Full Changelog**: https://github.com/Kludex/uvicorn/compare/0.44.0...0.45.0