plain-tunnel changelog
0.12.1 (2026-03-06)
What's changed
- Fixed duplicate
Host header in WebSocket proxy — the client was manually setting Host after forwarding headers, but websockets.connect already derives it from the URL. This caused connection failures with some servers (83d1143a24bd)
Upgrade instructions
0.12.0 (2026-03-06)
What's changed
- WebSocket proxy support — the tunnel now proxies WebSocket connections between the browser and the local dev server. New
ws-open, ws-message, and ws-close message types handle the full WebSocket lifecycle, including binary messages (base64-encoded) and message queuing during connection setup (5d9cea8ff72f)
- Improved WebSocket proxy reliability — fixed header forwarding to skip hop-by-hop and WebSocket handshake headers, rewrites
Host to match the local server, and properly cleans up proxied connections on tunnel disconnect (b55306047384, e3a3fc5019ba)
- Tunnel WebSocket endpoint moved — the control WebSocket now connects to
/__tunnel__ path instead of the root, freeing the root path for WebSocket proxying (5d9cea8ff72f)
- Fixed stream-end on cancel —
stream-end is no longer sent when a stream is cancelled by the server, preventing spurious messages (b55306047384)
- Styled error pages — tunnel error responses now render as styled HTML pages when the browser accepts HTML (5d9cea8ff72f)
- Protocol version bumped to 3 — both client and server now require protocol version 3 due to the new WebSocket proxy message types (5d9cea8ff72f)
Upgrade instructions
- The tunnel server must be updated alongside the client due to the protocol version bump to v3.
- No application code changes required.
0.11.0 (2026-03-06)
What's changed
- Streaming response support — the tunnel now forwards
text/event-stream responses as a live stream instead of buffering the entire response. The client detects SSE responses, sends stream-start/stream-end messages over the WebSocket, and streams body chunks incrementally. The server resolves the HTTP response immediately with a ReadableStream so the browser receives events in real time (dfa436ff5df7)
- Stream cancellation — when the browser disconnects from a streaming response, the server sends a
stream-cancel message back to the client, which stops reading from the upstream response (dfa436ff5df7)
- Local development support — the tunnel client now detects
localhost/127.0.0.1 hosts and uses ws:///http:// instead of wss:///https://, enabling local testing with wrangler dev. Added a server README documenting the local dev workflow (dfa436ff5df7)
- Protocol version bumped to 2 — both client and server now require protocol version 2 due to the new streaming message types (dfa436ff5df7)
Upgrade instructions
- The tunnel server must be updated alongside the client due to the protocol version bump to v2.
- No application code changes required.
0.10.0 (2026-02-25)
What's changed
- Added protocol version handshake — the client now sends a version query parameter and the server rejects incompatible clients with a clear error message (a173676c0f3c)
- Fixed tunnel connection reliability with improved reconnection logic and exponential backoff (4c09c9893528)
- Replaced urllib with httpx for HTTP forwarding in the client (4c09c9893528)
- Simplified binary message parsing using struct-based framing instead of custom delimiters (a9d11c51351b)
- Refactored client and server into cleaner request/response handling with dedicated
TunnelRequest and TunnelResponse dataclasses (4c09c9893528)
- Renamed
PLAIN_DEV_TUNNEL_URL environment variable to DEV_TUNNEL_URL (6154e6ef8693)
Upgrade instructions
- Rename
PLAIN_DEV_TUNNEL_URL to DEV_TUNNEL_URL in your .env file.
- The tunnel server must be updated alongside the client due to the new protocol version handshake.
0.9.0 (2026-01-13)
What's changed
- Improved README documentation with better structure, FAQs section, and clearer examples (da37a78)
Upgrade instructions
0.8.2 (2025-11-08)
What's changed
- Fixed logger configuration to prevent propagation to root logger, avoiding duplicate log messages (c714606)
Upgrade instructions
0.8.1 (2025-11-03)
What's changed
- Added command description to CLI for improved help text (fdb9e80)
Upgrade instructions
0.8.0 (2025-10-06)
What's changed
- Added type annotations to all functions and methods for improved IDE/type checker support (c87ca27)
Upgrade instructions
0.7.0 (2025-09-22)
What's changed
- Removed manual ALLOWED_HOSTS configuration documentation from README as it's now handled automatically by the Plain framework (d3cb771)
Upgrade instructions
- Changed ALLOWED_HOSTS default to
[] with a deploy-only preflight check to ensure it's set in production environments
0.6.0 (2025-09-19)
What's changed
- Updated minimum Python version requirement from 3.11 to 3.13 (d86e307)
- Enhanced README documentation with improved structure, table of contents, and detailed usage examples (4ebecd1)
- Added proper project description to pyproject.toml (4ebecd1)
Upgrade instructions
- Update your Python environment to Python 3.13 or higher
0.5.5 (2025-07-07)
What's changed
- No user-facing changes. Internal code cleanup and Biome linter fixes in the Cloudflare worker implementation (3265f5f, 9327384).
Upgrade instructions