Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.0.12] - 2026-09-29¶
Fixed¶
3xx responses without a
Locationheader no longer collapse to status 0 with all headers dropped; the real status, headers and body are returned for GET and POST whether or not redirect following is enabled (upstream #406).Fingerprint fidelity:
ja4rprofiles now emit ciphers, extensions andsupported_groupsin the browser’s captured wire order (restored from the profile’sja3), so the emitted JA3 and JA4_r match the profile byte-for-byte instead of JA4_r’s sorted order.Chromium-family profiles emit the GREASE placeholders real Chrome sends (cipher, supported version, group, key share and first/last extensions); Firefox stays grease-free and
disableGreasesuppresses all of them.TLS 1.3
key_sharenow offers an X25519MLKEM768 share, fixing handshakes against servers that select the advertised post-quantum group via HelloRetryRequest.compress_certificateuses the real uTLS extension soCompressedCertificateresponses can actually be decoded; Firefox profiles advertise its real zlib/brotli/zstd algorithm list.
Changed¶
ja3is sent to the Go backend alongsideja4r(previously suppressed);ja4rremains authoritative whileja3provides wire-order hints.Removed unused
websocketsandwebsocket-clientcore dependencies; README now documents installation via the fork’s PEP 503 index.CI now runs a strict-server handshake smoke test (Google, Cloudflare, Fastly, AWS) on every push/PR and daily.
[0.0.11] - 2026-09-29¶
Fixed¶
Fingerprinted requests (any
ja4rprofile) no longer fail the TLS handshake against strict servers (Google, Cloudflare, Fastly): extension0xfe0d(ECH) is now emitted as a valid randomized GREASE ECH instead of an all-zero placeholder that triggeredtls: error decoding messagealerts.supported_groupson the JA4R path no longer lists X25519 twice; TLS 1.3 hellos now lead with the post-quantum hybrid X25519MLKEM768, matching real browser fingerprints.
Changed¶
Bumped
github.com/quic-go/quic-goto 0.63.0,golang.org/x/netto 0.59.0 andgithub.com/andybalholm/brotlito 1.2.5 in the Go backend;github.com/valyala/fasthttpto 1.74.0 in benchmarks.Bulk-updated Python dependencies in
uv.lock.Bumped
github/codeql-actionto 4.38.2,astral-sh/setup-uvto 10.2.0 andactions/download-artifactto v8 in CI.Fingerprint registry refreshed from scheduled CI captures.
[0.0.9] - 2026-08-31¶
Fixed¶
Request.to_dict()no longer suppressesja3whenhttp2_fingerprintorquic_fingerprintis set, so built-infingerprint="..."profiles now send their stored JA3.
Changed¶
Bumped
golang.org/x/netto 0.58.0 in the Go backend.Bumped
github/codeql-actionto 4.37.8.Bumped
astral-sh/setup-uvto 10.0.1.
[0.0.8] - 2026-07-08¶
Fixed¶
Brotli decompression no longer fails when servers append trailing bytes after a valid Brotli stream (e.g. Brave Search over HTTP/2)
Added¶
local_addressparameter to bind outgoing TCP connections to a specific local IP for outbound interface/IP selection (#65)Regression test for Brotli responses with trailing bytes
Fixed¶
Do()droppedServerName,TLS13AutoRetry, andDisableGreaserequest fields when constructing the underlying request (#65)TLS13AutoRetryproactive upgrade corrupted JA3supported_groups; the original JA3 ordering is now preserved across the retry (#65)dispatchSSEAsynccould enter an infinite loop on stream cancel/EOF (#65)