Preserve payload bytes across fragmented VLESS response headers, nonempty WebSocket Ping frames, and ShadowTLS authentication fallback. Expand authentication, buffering, half-close, flow-control, and TUN reload coverage; harden isolated test selection, enable macOS process-watcher tests, and document suite boundaries and remaining gaps.
cbindgen resolves Cargo metadata without --locked and can update Cargo.lock. Run it after the native builds so it cannot hide a stale lockfile from their checks.
Remove the Android Kotlin/Gradle wrapper, AAR and XCFramework packaging, and mobile SDK release publishing.
Preserve Rust JNI/C embedding and native cross-compilation CI, with checks for library outputs and the generated C header. Document app-owned integration and retain desktop release-notice verification.
Update Rust dependencies for current fixes, including ML-KEM's removal of secret-dependent table lookups, and refresh the BLAKE3 fork while retaining binary-context key derivation. Allow wildcard GotaTun updates with source-notice validation, replace unmaintained test-only PEM parsing, and update Android and CI tooling with current AGP source-set APIs. Preserve Web PKI protections and required fork patches; defer YAML parser migration.
Prevent TUN startup resets and orphaned connections by deferring inbound TCP publication until handshakes complete, bounding half-open admission, and propagating worker failures while preserving Linux link-down and Apple queue-backpressure recovery. Fix Naive HTTP/2 writes that stall despite available credit and improve transfer diagnostics. Preserve full-payload and clean-EOF Mihomo REALITY coverage with reply-first sequencing, retaining early half-close as an opt-in peer regression. Upgrade Xray test peers to the 26.10.21 security release after upstream withdrew the previous releases.
Update rustls-webpki to 0.103.16 and webpki-roots/webpki-root-certs to 1.0.10 for CVE-2026-111943. Remove emSign ECC Root CA - G3 from bundled roots and reject the eight compromised intermediate keys, including cross-signed chains. Refresh dependency notices and document the certificate-chain impact and rebuild requirement.
Compile routing rules into shared indexes while preserving ordered policy evaluation and DNS decisions. Add typed predicates and bounded local SRS, sing-box JSON, Mihomo YAML/text/MRS, and GeoSite/GeoIP DAT sources through named rule groups or inline masks, with format detection, source caching, pre-activation compilation, and source-aware reloads. Include configuration examples, regression coverage, benchmark tooling, and dependency notices.
Portions of src/anytls/, including the padding scheme, frame definitions,
settings map and stream tests, are derived from anytls-rs
(https://github.com/jxo-me/anytls-rs). Reproduce its MIT license notice in
THIRD_PARTY_NOTICES.md, which ships with release tarballs, the Android AAR
and the iOS XCFramework, and reference it from the module documentation.
Extend opt-in TCP sniffing to use cleartext HTTP/1.0 and HTTP/1.1 Host headers alongside TLS SNI for hostname-based routing. Preserve original destinations, byte replay, sniff limits, Fake DNS precedence, and one route per connection. Add strict parsing, transport and lifecycle coverage, documentation, and an authenticated example with local-address safeguards.
Add opt-in Fake DNS and TLS SNI routing for clients that connect by IP. Restore synthetic destinations across TCP, UDP, and TUN while preserving reply identities; prefer sniffed SNI for hostname rules without rewriting connection targets. Add persistent fake-IP mappings, stable WireGuard server identities through optional names or public keys, upstream-address guards, deadline-aware DNS fallback, configuration documentation, and examples.
The SOCKS5 client sent its greeting, credentials, and CONNECT request in one burst before reading any reply. RFC 1928 sends the request only after method negotiation, and servers such as Cloudflare WARP's local proxy drop the early bytes, so connections through them timed out (fixes#159, supersedes #188). The client now waits for each reply in turn and rejects methods it did not offer. Clients that wait like this stalled against shoes servers that left handshake replies unflushed, most visibly with SOCKS inside ShadowTLS, so the SOCKS and mixed inbounds now flush their negotiation and error replies, the WebSocket inbound flushes its 101 before the inner handshake, the local ShadowTLS handshake flushes each server flight, and ShadowTLS sends each record as it is written. Tests cover each handshake step and authenticated and ShadowTLS-wrapped SOCKS chains; servers running SOCKS or mixed inbounds inside ShadowTLS should be upgraded before or together with clients.
Make WireGuard use the same inline client and server protocol syntax as other proxies, replacing named endpoints before release. Add automatic sharing of equivalent clients, encrypted peer chains, explicit server routing policy, and validation that rejects conflicting settings while keeping unused clients inactive. Update examples, configuration documentation, and lifecycle and interoperability coverage.
Expand WireGuard coverage for TCP and UDP forwarding, peer isolation, transport outages, rekeying, reloads, DNS routing, native TUN, and FFI lifecycle behavior to catch failures that affect real deployments. Add macOS lifecycle coverage and portable fixtures, and fix IPv6 DNS upstream literals being misclassified as hostnames.
Expand legacy and encrypted VLESS coverage across peer transports, Vision transitions, session lifecycle, replay isolation, and chained connections, with Xray updated to 26.10.17. Preserve complete XHTTP HTTP/2 responses when peers gracefully stop an unfinished upload while continuing to reject truncated responses and incomplete packet uploads. Isolate the pinned sing-box server TLS 1.2 shutdown limitation in a test-only workaround, retaining an ignored reproducer and a reference to SagerNet/sing-vmess#16 for removal when the peer pin includes the fix.
Add named userspace WireGuard endpoints so Shoes can route inbound and outbound traffic through WireGuard without a kernel interface. Includes TCP/UDP forwarding, proxy-chain transports, reload lifecycle management, configuration validation, documentation, and dependency notices for release artifacts.
Preserve recognized TLS framing when backpressure requires resubmitting an unaccepted write tail, preventing eligible Vision connections from incorrectly falling back to END. Restrict DIRECT to supported TLS 1.3 cipher suites and keep ServerHello parsing within its declared handshake and extension boundaries. Add regression coverage for TLS and REALITY, fragmented and coalesced records, malformed handshakes, and exact-byte preservation across DIRECT and END transitions.
Add opt-in native VLESS Encryption with X25519 and ML-KEM key chains, authenticated record encryption, bounded session resumption, and native Vision support while preserving legacy TLS/REALITY behavior and outer transports. Include validated configuration, credential generation, examples, interoperability fixtures, and regression coverage.
Add standard HTTP/2 CONNECT to HTTP and mixed listeners and opt-in HTTP proxy clients, allowing concurrent TCP tunnels to share a connection while preserving legacy HTTP/1 and NaiveProxy behavior. Keep the H2 transport independent of NaiveProxy, preserve route isolation and per-stream authentication, require matching TLS ALPN for explicit H2 clients, and handle flow control, cancellation, and graceful shutdown. Include configuration documentation, an example, compatibility regressions, and interoperability coverage for sing-box, Mihomo, and the native Caddy-based Naive server.
Add server-side matching_headers to require exact header values and close connections that fail validation, plus an opt-in close_on_error setting to close the carrier instead of returning XHTTP errors or admission refusals. Return plain empty 400/404 responses by default to avoid exposing XHTTP-specific headers, and document shared-connection effects and transport exceptions.
parse bracketed IPv6 literals as IP addresses instead of hostnames so configured IPv6 destinations resolve correctly, while preserving numeric scope IDs for binds and rejecting malformed bracketed input. document the legacy Clash.Meta/Mihomo Snell version-to-cipher mapping, v0.3.3 salt requirements, and unsupported v2 connection reuse and half-close behavior, with address regressions and a single-request v2 compatibility test. thanks to @AYastrebov for identifying the IPv6 parsing gap in #155.
Improve XHTTP transfer reliability under slow destinations and resource pressure with bounded packet pipelining, admission before body reads, queue-acceptance acknowledgements, and cancellation-safe session handling. Preserve reusable H1 uploads, correct H2/H3 finalization, add configurable receive windows and download-tail timeouts, validate effective request capacity, and expand Xray/Mihomo interoperability coverage with pinned peers in CI.
Adds Xray-compatible XHTTP/SplitHTTP with packet-up, stream-up, and stream-one modes over HTTP/1.1, HTTP/2, and HTTP/3, including REALITY and existing proxy chains. Bounded buffering, flow-control-aware admission, connection pooling, and inactivity-based timeouts maintain backpressure without imposing a minimum upload rate. Preserves TLS key-exchange and ML-DSA policies, adds configuration examples and interoperability coverage, and vendors an h3 fix to prevent empty DATA frames from truncating streams.
Prefer X25519MLKEM768 with X25519 fallback for modern REALITY compatibility, and add optional pinned ML-DSA-65 authentication with configuration fields and key generation. Harden handshake validation and preserve transparent forwarding for incompatible targets or clients, with migration documentation and pinned Xray interoperability coverage.
Add ordered native rustls key-exchange allowlists for TLS and QUIC. Hybrid-only configurations require TLS 1.3 without classical fallback or early data; omitted settings preserve existing defaults. Reject incompatible or ignored security settings, document configuration, and cover transport and Xray/sing-box interoperability.
Add sing-box coverage for padded, single-carrier h2mux over REALITY, including concurrent TCP/UDP traffic and idle reuse. Verify GOAWAY carrier replacement, Shoes stream draining, and the forced-close deadline, and run peer lifecycle coverage in CI. Distinguish successful recovery from active-stream preservation, which sing-box does not provide on GOAWAY.
Disable unused TCP TLS early data while preserving resumption and QUIC behavior. Bound h2mux errors, reject invalid protocol placement and authentication secrets before startup or reload, validate Shadowsocks 2022 key lengths, replace configuration-triggered panics with credential-free errors, and escape untrusted controls in file logs.
Keep outbound padding buffers intact when inbound padding ends, and wait for application-data credit when an HTTP/2 write sends only the response status byte. Add regressions for both failure modes and sing-box interoperability coverage with h2mux, max_connections: 1, and padding enabled, including concurrent TCP/UDP traffic, bulk transfers, half-closes, and reuse of a single carrier.
Replace Debian-dependent REALITY separate-mode tests with an owned local TLS 1.3 template. Add structural handshake and fixture-cleanup coverage, and verify exact small and 200 KiB downloads and patterned uploads through sing-box in the local integration suite. Production REALITY behavior and the remaining external interoperability tests are unchanged.
Add coverage for buffered parsing, UDP fragment budgets, proxy handshakes, DNS fallback, and connection-capacity reuse. Fix dropped empty UDP replies and malformed HTTP CONNECT success-status acceptance, stabilize readiness timeout tests, run process contracts in regular CI, and add a manual kernel TUN workflow.
Allow Vision DIRECT relays to hand off to Linux TCP splice once both directions are raw and all buffered data and flush obligations have drained, reducing userspace copying for bulk traffic. Preserve buffered handling for ineligible streams, explicit-size copying, and non-Linux platforms, retain half-close and shutdown semantics, and cover transitions under bidirectional backpressure.
Reduce userspace copying and packet-processing overhead for sustained Linux traffic with adaptive, bounded TCP splice for plain socket relays and native IPv4 TCP transmit segmentation offload for owned TUN devices. Preserve buffered fallback, half-close and cancellation behavior, retain ordinary IPv6 transmission, and cover relay ordering, pipe-budget exhaustion, offload framing, and startup failure policies.
Prevent malformed traffic and replayed authentication from corrupting proxy sessions, preserve buffered handshake data and protocol compatibility, and report connection failures accurately. Validate replacement configurations before retiring listeners, handle process signals reliably, and make QUIC socket setup and synchronous FFI lifecycle calls safer across platforms.
Remove redundant buffer copies, framing work, and connection setup while preserving protocol ordering and flush barriers. Forward vectored writes through TLS, align legacy Shadowsocks records, batch TCP and AnyTLS output, reuse warm Naive sessions before dialing, retain DNS candidates with bounded TCP fallback, and keep small ordered UDP startup bursts instead of dropping packets during setup.
Close gaps around TUN wakeups, UDP routing, and concurrent traffic with deterministic wake/setup tests, rootless IPv4/IPv6 raw-FD coverage, and opt-in kernel tests for real IPv6 and mixed TCP/UDP progress. Add Linux host-FFI and macOS rootless CI coverage while keeping privileged device tests out of ordinary CI. Wait for Mihomo routing readiness to prevent startup packet loss in AnyTLS tests.
* tun/tcp_stack_direct.rs: separate bounded ingress processing from TCP egress
Process each incoming packet without repeatedly scanning every socket for egress. Give each socket one egress turn per iteration and recheck actionable bridge work before waiting. Reconcile timer-driven closures after egress, while retaining pending reset tuples, and use a monotonic clock for stack deadlines.
* tun: wake the stack on TCP and UDP work instead of polling
Poll the TUN descriptor together with a coalescing Unix wake socket. Notify after publishing TCP buffer changes, UDP responses, setup and shutdown, then acknowledge notifications before consuming shared work. Preserve timer deadlines and bounded queue draining so idle stacks no longer need a 10-ms fallback. Propagate wake and thread startup failures to the caller.
* tun: carry owned UDP payloads through forwarding queues
Move packet storage through ingress, parsing and both destination queues instead of copying full packets and payloads. Preserve payload-byte limit semantics by compacting explicitly capped packets, and compact oversized backing storage even without a cap.
Reuse bounded pooled storage for packet construction, remove the redundant response copy, and test parsing, queue rejection and permit lifetime through flush, timeout and cancellation.
* tun/tcp_stack_direct.rs: reuse transmit storage and preserve packet-atomic writes
Borrow one initialized scratch buffer from the stack device for TCP egress. Write packet information and payload with one writev instead of allocating a framed copy.
Retry complete packets only after EINTR. Treat short writes as errors rather than emitting a malformed suffix packet, while preserving EAGAIN and ENOBUFS drops. Cover buffer reuse, framing and injected syscall outcomes.
* tun/tcp_stack_direct.rs: refresh late TCP handler setup before publishing connections
A SYN may arrive after the loop snapshots setup but after another thread has already published its handler. Refresh an absent sender at connection publication so that this race does not abandon and reset a valid connection. Add a deterministic snapshot/publication interleaving regression.
* tun/tcp_stack_direct.rs: amortize TCP egress across bounded complete sweeps
A single packet per socket per outer iteration raised loop overhead and regressed bulk TCP in shipping-profile benchmarks. Allow up to eight complete sweeps, stopping on no progress, before reconciling sockets and revisiting ingress and wakeups.
This keeps every socket eligible in each sweep, including late-index resets, without restoring an unbounded drain. Matched trials recovered throughput while preserving sparse-response latency.
* tun/wake.rs: assert progress while saturating the wake socket
Check successful write lengths in the saturation regression instead of ignoring them. This catches zero-progress writes and keeps the test compliant with Clippy while preserving its partial-write behavior.
* tun: simplify packet handling and polling control flow
Flatten UDP reader and direct-device receive paths, and make the stack's
continue-before-wait decision explicit. Name the existing egress sweep
bound and TCP/ICMP queue, and reuse pure size and state calculations.
Keep wake ordering, ownership, control checks, error reporting, and batch
limits unchanged. Add deterministic reader coverage for invalid packets
followed by Pending, valid delivery, and EOF.
Keep TLS transport, framing, and session state under one owner from handshake through Vision to preserve fragmented and coalesced input. Maintain byte ordering across END and DIRECT, seal TLS output before raw writes, handle closure and transport keepalives consistently, and retain REALITY preread bytes during fallback forwarding. Cover fragmentation, transitions, closure, and backpressure with regression tests.