Tunnellio v0.5.0
Summary
- This release adds native TCP bridge password support, a fully self-sufficient pure-Python TCP bridge client, and a keyless public launch endpoint.
- The client now works on Windows, Linux, and macOS without any external binaries — the bridge is implemented natively inside the package.
Highlights
- Native TCP bridge client (
src/tunnellio/bridge.py) — pure Python, no external binaries, bore-compatible wire protocol with HMAC-SHA256 auth
- Keyless
bridge command — tunnellio bridge --local-port 3000 --run works without API token, without SSH key, without any external binary
- TCP bridge password —
--tcp-bridge-password flag, passwordRequired and clientProtocol in connection profile, automatic password in hello/accept frames
- Native Tunnellio wire format —
{"type":"hello","hostname":"...","password":"..."} when clientProtocol.hello is present, bore-format fallback otherwise
- Public keyless endpoint —
POST /v1/tcp-bridge/launch without Bearer auth
- Auto-fallback —
--transport auto tries SSH first, falls back to TCP bridge on quick failure
- Cleaned repository — removed stray nested clone and obsolete bootstrap script
Artifacts
tunnellio.exe — standalone Windows binary (Python not required on target machine)
tunnellio-source-v0.5.0.zip — universal source archive (Python 3.11+ required)
Usage notes
Simplest tunnel (no token, no key, no external binary)
.\tunnellio.exe bridge --local-port 3000 --run --name my-bridge
With a chosen subdomain
.\tunnellio.exe bridge --domain new:my-app --local-port 3000 --run --name my-bridge
With TCP bridge password
.\tunnellio.exe --token YOUR_TOKEN connect --domain new:my-app --local-port 3000 --transport tcp-bridge --tcp-bridge-password demo-secret --run --name my-bridge
In a Unix sandbox
unzip tunnellio-source-v0.5.0.zip -d tunnellio && cd tunnellio
pip install .
tunnellio bridge --local-port 3000 --run --name my-bridge
Transport comparison
| Command |
Token |
SSH key |
External binary |
Platform |
bridge |
no |
no |
no |
Windows, Linux, macOS |
connect --transport tcp-bridge |
yes |
no |
no |
Windows, Linux, macOS |
connect --transport ssh |
yes |
yes |
OpenSSH |
any |
connect --transport auto |
yes |
yes |
OpenSSH |
any |
Changelog
- Added TCP bridge password support (
tcpBridgePassword, passwordRequired, clientProtocol)
- Added
--tcp-bridge-password CLI flag for plan, connect, and bridge commands
- Added
TcpBridgeClientProtocol model with hello template from server
- Added
passwordRequired and clientProtocol fields to TcpBridgeProfile
- Added
tcpBridgePassword field to DomainSummary
- Updated
bridge.py to send native Tunnellio wire format when clientProtocol.hello is provided
- Updated
bridge.py to send {"type":"accept","connectionId":"...","password":"..."} for connection accept
- Updated
cli.py to pass hello_template, password, password_required to launch_bridge()
- Updated
planner.py to pass tcpBridgePassword in launch-spec domain block and keyless bridge payload
- Updated config template and config example with
tcpBridgePassword field
- Added tests for password flow, hello template, and CLI flag parsing
- Backward compatible: bore-protocol mode still works when
clientProtocol is absent
- Implemented native TCP bridge client in pure Python (
tunnellio/bridge.py) — no external binaries needed
- Wire protocol: null-delimited JSON frames, bore-compatible control handshake, HMAC-SHA256 auth
cli.py runs the bridge natively via launch_bridge() instead of subprocess.Popen for tcp_bridge transport
TcpBridgeProcess provides the same pid/poll/terminate/kill/wait interface as subprocess.Popen
- Bidirectional TCP copy via
select for connection forwarding
- Client is now fully self-sufficient on Windows, Linux, and macOS — only Python 3.11+ required
- Added
bridge CLI command for one-shot keyless TCP bridge tunnels — no API token, no SSH key required
- Added public keyless endpoint
POST /v1/tcp-bridge/launch (no Bearer auth) in ApiClient
- Added
Planner.build_keyless_bridge_plan() that skips meta/capabilities/launch-spec and calls the public endpoint directly
- Added
requiresApiToken field to ConnectionProfile and TcpBridgeProfile
- Added
is_tokenless property to ConnectionProfile
- Made
PlanResult.meta and PlanResult.domain optional (None for keyless bridge flow)
- Made
bridge command exempt from the API token requirement
- Added TCP bridge transport (
connectionMode = tcp_bridge) as a keyless alternative to reverse SSH
- Added
--transport CLI flag (ssh, tcp-bridge, auto) for explicit transport selection
- Added automatic fallback from SSH to TCP bridge when
--transport auto is used and SSH fails quickly
- Removed stray nested clone and obsolete bootstrap script from repository
Notes for GitHub publication
- Upload
tunnellio.exe and tunnellio-source-v0.5.0.zip from this release subfolder.
- Version:
0.5.0 (verified in pyproject.toml and src/tunnellio/__init__.py).
- Commit:
813d289
- Changelog matches
CHANGELOG.md.