Repository navigation
Releases: CIAUB/C-Tunnel
Release list
v0.4.1
Changelog
[0.4.1] - 2026-11-02
Fixed
- README panel screenshots show the 0.4 panel (desktop, mobile and settings) instead of the 0.2.1 ones.
0.4.0 - 2026-11-02
Added
- Web panel rebuilt after BackPack's current panel: server strip with processor, memory, disk, swap, download and upload meters and their recent history; a dock with Overview, Connection test, Tunnels and Manage; light, dark and automatic appearance.
- Hash routes for every screen (
#/tunnels,#/t/<name>/logs,#/t/<name>/edit,#/health,#/settings…). Dialogs open over their section and closing one returns there. - Tunnel cards with state colour, live rate, traffic history and Start/Stop, Restart, Live log, Setup link, Edit and Delete.
- Live log per tunnel (
GET /api/tunnels/{name}/logs): journal lines coloured by level, filter, line count, follow, copy. - Start and stop a tunnel (
POST /api/tunnels/{name}/start,/stop). A stopped tunnel stays stopped after a reboot. - Health check in the panel (
GET /api/health), the same checks as the CLI. They moved topkg/health. - Backup and restore (
GET /api/backup,POST /api/backup/restore): every tunnel in one JSON file; restore creates and starts the tunnels a server does not have and leaves the others alone. - Restart all (
POST /api/restart-all), update check from Manage, random padding field for UDP-Crypt methods in the tunnel form. GET /api/session, so the page finds out it is signed out without an error in the browser console.- Traffic totals survive restarts, edits and reboots.
ctunnel-kernel downfolds the interface counters into/etc/ctunnel/traffic/<name>before the interface is deleted, and the panel checkpoints them every minute, so a power cut loses at most a minute. Deleting a tunnel deletes its total. - New tunnels are named after their end and port:
ir-24001on Iran,kh-24001on Kharej (the tunnel's port, or the first forwarded port for a portless kernel tunnel;ir-t3when there is none or the name is taken). A setup link fromir-24001buildskh-24001on the other server. Names may be up to 10 characters. Existing tunnels keep their names. - Chart history is sampled by the panel service in the background every 4 seconds, so the charts are already filled when the panel is opened.
- The panel reads every tunnel's state with one
systemctlcall per refresh instead of one per tunnel, and the health check tests tunnels side by side. cmd/ctunnel-local: runs the panel on a desktop with simulated tunnels, for trying the UI (go run ./cmd/ctunnel-local).
Fixed
- Restarting a tunnel named
allrestarted every tunnel on the server. - Copy buttons failed on a plain-HTTP panel, where the browser clipboard API is not available.
- Busy buttons replaced their label and icon with "Working…" and lost the icon afterwards.
- Delete used the browser's native confirm box; Stop, Delete, Restart all and Restore now ask in the panel.
- The tunnel form offered GRE lanes and tunnel ID for every method; they now show only for methods that use them.
- The header could push the page wider than a phone screen when an update was available.
Upgrade note
- Traffic totals start counting from this version; what tunnels carried before the update is not in them.
0.3.0 - 2026-11-01
Fixed
- Reverse carrier: each TCP stream now has its own keys and replay window, derived from a random stream ID in the handshake. With one shared window, a stream stalled by a TCP retransmit fell behind the other streams and its whole backlog was dropped as replays once traffic passed about 8,000 packets in the stall, which collapsed throughput on lossy links. A recorded connection is still refused, because its handshake is checked against the carrier-wide window.
Upgrade note
- Update the Iran server before the Kharej servers. A new Iran server still accepts old Kharej servers; an old Iran server cannot read traffic from a new Kharej server.
0.2.7 - 2026-10-30
Added
- Real-time telemetry backend in
pkg/webpanel/telemetry.go: per-tunnel and aggregate RX/TX rates computed from live tunnel counters, with a 60-sample sliding history, counter-reset handling, and pruning when a tunnel disappears. - Segmented workspace shell:
OverviewandTunnelsare ARIA tabs witharia-selected/aria-controls, whileConnection TestandSettingsopen their existing consoles from the same navigation bar. - Overview telemetry strip: active tunnels (
UP / TOTAL), aggregate download and upload rates, cumulative data, host IP, and load average. - Aggregate dual-series RX/TX SVG area chart plus inline per-tunnel sparklines that update their existing DOM nodes in place on every poll, so hover and focus state survive refreshes.
- Instant filter pills (
All,Iran,Kharej,Direct,Reverse,Up,Down) and a search field matching name, IP, method and port, with an explicit empty state when nothing matches. - Server-side GitHub release checker at
GET /api/version: 4-second timeout, 30-minute in-memory cache, 64 KiB response cap, and a silentupdate_available: falsefallback on networks without GitHub access. When a newer tag exists the panel shows an update pill and a modal with the release link and the install command.
Changed
- Tunnel cards keep their existing Edit modal (
PUT /api/tunnels/{name}) and Copy link action, now inside the Tunnels workspace behind the filters. - Panel surfaces use frosted translucent cards with 1px specular borders, tabular-numeral telemetry, and system UI/monospace fonts only. No external fonts, CDNs or bundled assets, so the panel still renders on isolated networks.
Security
GET /api/versionis authenticated, calls one fixed GitHub URL, and only returns a release link that starts withhttps://github.com/.- Telemetry history is mutex-guarded and bounded to 60 samples per tunnel; the inline CSP hashes stay generated from the LF-normalized style and script blocks.
0.2.6 - 2026-10-30
Added
- Two-mode Connection Test: Iran listener with a generated
ctunnel-test://link, live status, one-click copy, open UDP/TCP ports and a 15-minute self-closing lifecycle; Kharej async live tester with method table, Path MTU, and Best Direct / Best Reverse deployment. - Tunnel Edit modal backed by
PUT /api/tunnels/{name}, plus a quick Copy Setup Link action on every tunnel card. - Operations-grade dark panel: tabular-nums telemetry, role/family badges, status badges, responsive benchmark tables, and clear loading/error states.
Security
- Bounded login-limiter eviction, an 8 KiB setup-link cap, HSTS on HTTPS, and ownership/TTL bounds for test listeners and async test jobs.
0.2.5 - 2026-10-30
Fixed
- Stop an existing tunnel before replacing its env file, so old xfrm, L2TP, FOU and route state is torn down with the old config.
- Keep tunnel state and env when teardown fails; deletion no longer loses the only record of leftover interfaces and iptables rules.
- Fail
ctunnel-kernel downwhen an iptables rule cannot be removed, and delete FOU/GUE receive ports during teardown. - Fail tunnel startup when port forwards are configured but iptables is unavailable.
- Verify old systemd units are inactive before starting, restarting or deleting a tunnel.
0.2.4 - 2026-10-30
Fixed
- Normalize inline CSP hashes for CRLF checkouts so the web panel is not blocked on Windows builds.
- Fix the duplicate import field ID and keep tunnel action buttons attached across status refreshes.
- Retry atomic file replacement on Windows and serialize env reads and writes.
- Reject FOU and duplicate forward-port collisions; trim IP fields before writing env files.
- Invalidate sessions on logout and fall back to an interface IPv4 address when no default route exists.
Changed
- Automated panel screenshot commits use the
CIAUBidentity instead ofgithub-actions[bot]. - Repository checkout enforces LF line endings except for
.batfiles.
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
[0.2.2] - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the termin...
v0.4.0
Changelog
0.4.0 - 2026-11-02
Added
- Web panel rebuilt after BackPack's current panel: server strip with processor, memory, disk, swap, download and upload meters and their recent history; a dock with Overview, Connection test, Tunnels and Manage; light, dark and automatic appearance.
- Hash routes for every screen (
#/tunnels,#/t/<name>/logs,#/t/<name>/edit,#/health,#/settings…). Dialogs open over their section and closing one returns there. - Tunnel cards with state colour, live rate, traffic history and Start/Stop, Restart, Live log, Setup link, Edit and Delete.
- Live log per tunnel (
GET /api/tunnels/{name}/logs): journal lines coloured by level, filter, line count, follow, copy. - Start and stop a tunnel (
POST /api/tunnels/{name}/start,/stop). A stopped tunnel stays stopped after a reboot. - Health check in the panel (
GET /api/health), the same checks as the CLI. They moved topkg/health. - Backup and restore (
GET /api/backup,POST /api/backup/restore): every tunnel in one JSON file; restore creates and starts the tunnels a server does not have and leaves the others alone. - Restart all (
POST /api/restart-all), update check from Manage, random padding field for UDP-Crypt methods in the tunnel form. GET /api/session, so the page finds out it is signed out without an error in the browser console.- Traffic totals survive restarts, edits and reboots.
ctunnel-kernel downfolds the interface counters into/etc/ctunnel/traffic/<name>before the interface is deleted, and the panel checkpoints them every minute, so a power cut loses at most a minute. Deleting a tunnel deletes its total. - New tunnels are named after their end and port:
ir-24001on Iran,kh-24001on Kharej (the tunnel's port, or the first forwarded port for a portless kernel tunnel;ir-t3when there is none or the name is taken). A setup link fromir-24001buildskh-24001on the other server. Names may be up to 10 characters. Existing tunnels keep their names. - Chart history is sampled by the panel service in the background every 4 seconds, so the charts are already filled when the panel is opened.
- The panel reads every tunnel's state with one
systemctlcall per refresh instead of one per tunnel, and the health check tests tunnels side by side. cmd/ctunnel-local: runs the panel on a desktop with simulated tunnels, for trying the UI (go run ./cmd/ctunnel-local).
Fixed
- Restarting a tunnel named
allrestarted every tunnel on the server. - Copy buttons failed on a plain-HTTP panel, where the browser clipboard API is not available.
- Busy buttons replaced their label and icon with "Working…" and lost the icon afterwards.
- Delete used the browser's native confirm box; Stop, Delete, Restart all and Restore now ask in the panel.
- The tunnel form offered GRE lanes and tunnel ID for every method; they now show only for methods that use them.
- The header could push the page wider than a phone screen when an update was available.
Upgrade note
- Traffic totals start counting from this version; what tunnels carried before the update is not in them.
0.3.0 - 2026-11-01
Fixed
- Reverse carrier: each TCP stream now has its own keys and replay window, derived from a random stream ID in the handshake. With one shared window, a stream stalled by a TCP retransmit fell behind the other streams and its whole backlog was dropped as replays once traffic passed about 8,000 packets in the stall, which collapsed throughput on lossy links. A recorded connection is still refused, because its handshake is checked against the carrier-wide window.
Upgrade note
- Update the Iran server before the Kharej servers. A new Iran server still accepts old Kharej servers; an old Iran server cannot read traffic from a new Kharej server.
0.2.7 - 2026-10-30
Added
- Real-time telemetry backend in
pkg/webpanel/telemetry.go: per-tunnel and aggregate RX/TX rates computed from live tunnel counters, with a 60-sample sliding history, counter-reset handling, and pruning when a tunnel disappears. - Segmented workspace shell:
OverviewandTunnelsare ARIA tabs witharia-selected/aria-controls, whileConnection TestandSettingsopen their existing consoles from the same navigation bar. - Overview telemetry strip: active tunnels (
UP / TOTAL), aggregate download and upload rates, cumulative data, host IP, and load average. - Aggregate dual-series RX/TX SVG area chart plus inline per-tunnel sparklines that update their existing DOM nodes in place on every poll, so hover and focus state survive refreshes.
- Instant filter pills (
All,Iran,Kharej,Direct,Reverse,Up,Down) and a search field matching name, IP, method and port, with an explicit empty state when nothing matches. - Server-side GitHub release checker at
GET /api/version: 4-second timeout, 30-minute in-memory cache, 64 KiB response cap, and a silentupdate_available: falsefallback on networks without GitHub access. When a newer tag exists the panel shows an update pill and a modal with the release link and the install command.
Changed
- Tunnel cards keep their existing Edit modal (
PUT /api/tunnels/{name}) and Copy link action, now inside the Tunnels workspace behind the filters. - Panel surfaces use frosted translucent cards with 1px specular borders, tabular-numeral telemetry, and system UI/monospace fonts only. No external fonts, CDNs or bundled assets, so the panel still renders on isolated networks.
Security
GET /api/versionis authenticated, calls one fixed GitHub URL, and only returns a release link that starts withhttps://github.com/.- Telemetry history is mutex-guarded and bounded to 60 samples per tunnel; the inline CSP hashes stay generated from the LF-normalized style and script blocks.
0.2.6 - 2026-10-30
Added
- Two-mode Connection Test: Iran listener with a generated
ctunnel-test://link, live status, one-click copy, open UDP/TCP ports and a 15-minute self-closing lifecycle; Kharej async live tester with method table, Path MTU, and Best Direct / Best Reverse deployment. - Tunnel Edit modal backed by
PUT /api/tunnels/{name}, plus a quick Copy Setup Link action on every tunnel card. - Operations-grade dark panel: tabular-nums telemetry, role/family badges, status badges, responsive benchmark tables, and clear loading/error states.
Security
- Bounded login-limiter eviction, an 8 KiB setup-link cap, HSTS on HTTPS, and ownership/TTL bounds for test listeners and async test jobs.
0.2.5 - 2026-10-30
Fixed
- Stop an existing tunnel before replacing its env file, so old xfrm, L2TP, FOU and route state is torn down with the old config.
- Keep tunnel state and env when teardown fails; deletion no longer loses the only record of leftover interfaces and iptables rules.
- Fail
ctunnel-kernel downwhen an iptables rule cannot be removed, and delete FOU/GUE receive ports during teardown. - Fail tunnel startup when port forwards are configured but iptables is unavailable.
- Verify old systemd units are inactive before starting, restarting or deleting a tunnel.
0.2.4 - 2026-10-30
Fixed
- Normalize inline CSP hashes for CRLF checkouts so the web panel is not blocked on Windows builds.
- Fix the duplicate import field ID and keep tunnel action buttons attached across status refreshes.
- Retry atomic file replacement on Windows and serialize env reads and writes.
- Reject FOU and duplicate forward-port collisions; trim IP fields before writing env files.
- Invalidate sessions on logout and fall back to an interface IPv4 address when no default route exists.
Changed
- Automated panel screenshot commits use the
CIAUBidentity instead ofgithub-actions[bot]. - Repository checkout enforces LF line endings except for
.batfiles.
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
[0.2.1] - 2026-10-28
Added
- Persi...
v0.3.0
Changelog
0.3.0 - 2026-11-01
Fixed
- Reverse carrier: each TCP stream now has its own keys and replay window, derived from a random stream ID in the handshake. With one shared window, a stream stalled by a TCP retransmit fell behind the other streams and its whole backlog was dropped as replays once traffic passed about 8,000 packets in the stall, which collapsed throughput on lossy links. A recorded connection is still refused, because its handshake is checked against the carrier-wide window.
Upgrade note
- Update the Iran server before the Kharej servers. A new Iran server still accepts old Kharej servers; an old Iran server cannot read traffic from a new Kharej server.
0.2.7 - 2026-10-30
Added
- Real-time telemetry backend in
pkg/webpanel/telemetry.go: per-tunnel and aggregate RX/TX rates computed from live tunnel counters, with a 60-sample sliding history, counter-reset handling, and pruning when a tunnel disappears. - Segmented workspace shell:
OverviewandTunnelsare ARIA tabs witharia-selected/aria-controls, whileConnection TestandSettingsopen their existing consoles from the same navigation bar. - Overview telemetry strip: active tunnels (
UP / TOTAL), aggregate download and upload rates, cumulative data, host IP, and load average. - Aggregate dual-series RX/TX SVG area chart plus inline per-tunnel sparklines that update their existing DOM nodes in place on every poll, so hover and focus state survive refreshes.
- Instant filter pills (
All,Iran,Kharej,Direct,Reverse,Up,Down) and a search field matching name, IP, method and port, with an explicit empty state when nothing matches. - Server-side GitHub release checker at
GET /api/version: 4-second timeout, 30-minute in-memory cache, 64 KiB response cap, and a silentupdate_available: falsefallback on networks without GitHub access. When a newer tag exists the panel shows an update pill and a modal with the release link and the install command.
Changed
- Tunnel cards keep their existing Edit modal (
PUT /api/tunnels/{name}) and Copy link action, now inside the Tunnels workspace behind the filters. - Panel surfaces use frosted translucent cards with 1px specular borders, tabular-numeral telemetry, and system UI/monospace fonts only. No external fonts, CDNs or bundled assets, so the panel still renders on isolated networks.
Security
GET /api/versionis authenticated, calls one fixed GitHub URL, and only returns a release link that starts withhttps://github.com/.- Telemetry history is mutex-guarded and bounded to 60 samples per tunnel; the inline CSP hashes stay generated from the LF-normalized style and script blocks.
0.2.6 - 2026-10-30
Added
- Two-mode Connection Test: Iran listener with a generated
ctunnel-test://link, live status, one-click copy, open UDP/TCP ports and a 15-minute self-closing lifecycle; Kharej async live tester with method table, Path MTU, and Best Direct / Best Reverse deployment. - Tunnel Edit modal backed by
PUT /api/tunnels/{name}, plus a quick Copy Setup Link action on every tunnel card. - Operations-grade dark panel: tabular-nums telemetry, role/family badges, status badges, responsive benchmark tables, and clear loading/error states.
Security
- Bounded login-limiter eviction, an 8 KiB setup-link cap, HSTS on HTTPS, and ownership/TTL bounds for test listeners and async test jobs.
0.2.5 - 2026-10-30
Fixed
- Stop an existing tunnel before replacing its env file, so old xfrm, L2TP, FOU and route state is torn down with the old config.
- Keep tunnel state and env when teardown fails; deletion no longer loses the only record of leftover interfaces and iptables rules.
- Fail
ctunnel-kernel downwhen an iptables rule cannot be removed, and delete FOU/GUE receive ports during teardown. - Fail tunnel startup when port forwards are configured but iptables is unavailable.
- Verify old systemd units are inactive before starting, restarting or deleting a tunnel.
0.2.4 - 2026-10-30
Fixed
- Normalize inline CSP hashes for CRLF checkouts so the web panel is not blocked on Windows builds.
- Fix the duplicate import field ID and keep tunnel action buttons attached across status refreshes.
- Retry atomic file replacement on Windows and serialize env reads and writes.
- Reject FOU and duplicate forward-port collisions; trim IP fields before writing env files.
- Invalidate sessions on logout and fall back to an interface IPv4 address when no default route exists.
Changed
- Automated panel screenshot commits use the
CIAUBidentity instead ofgithub-actions[bot]. - Repository checkout enforces LF line endings except for
.batfiles.
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.
v0.2.7
Changelog
0.2.7 - 2026-10-30
Added
- Real-time telemetry backend in
pkg/webpanel/telemetry.go: per-tunnel and aggregate RX/TX rates computed from live tunnel counters, with a 60-sample sliding history, counter-reset handling, and pruning when a tunnel disappears. - Segmented workspace shell:
OverviewandTunnelsare ARIA tabs witharia-selected/aria-controls, whileConnection TestandSettingsopen their existing consoles from the same navigation bar. - Overview telemetry strip: active tunnels (
UP / TOTAL), aggregate download and upload rates, cumulative data, host IP, and load average. - Aggregate dual-series RX/TX SVG area chart plus inline per-tunnel sparklines that update their existing DOM nodes in place on every poll, so hover and focus state survive refreshes.
- Instant filter pills (
All,Iran,Kharej,Direct,Reverse,Up,Down) and a search field matching name, IP, method and port, with an explicit empty state when nothing matches. - Server-side GitHub release checker at
GET /api/version: 4-second timeout, 30-minute in-memory cache, 64 KiB response cap, and a silentupdate_available: falsefallback on networks without GitHub access. When a newer tag exists the panel shows an update pill and a modal with the release link and the install command.
Changed
- Tunnel cards keep their existing Edit modal (
PUT /api/tunnels/{name}) and Copy link action, now inside the Tunnels workspace behind the filters. - Panel surfaces use frosted translucent cards with 1px specular borders, tabular-numeral telemetry, and system UI/monospace fonts only. No external fonts, CDNs or bundled assets, so the panel still renders on isolated networks.
Security
GET /api/versionis authenticated, calls one fixed GitHub URL, and only returns a release link that starts withhttps://github.com/.- Telemetry history is mutex-guarded and bounded to 60 samples per tunnel; the inline CSP hashes stay generated from the LF-normalized style and script blocks.
0.2.6 - 2026-10-30
Added
- Two-mode Connection Test: Iran listener with a generated
ctunnel-test://link, live status, one-click copy, open UDP/TCP ports and a 15-minute self-closing lifecycle; Kharej async live tester with method table, Path MTU, and Best Direct / Best Reverse deployment. - Tunnel Edit modal backed by
PUT /api/tunnels/{name}, plus a quick Copy Setup Link action on every tunnel card. - Operations-grade dark panel: tabular-nums telemetry, role/family badges, status badges, responsive benchmark tables, and clear loading/error states.
Security
- Bounded login-limiter eviction, an 8 KiB setup-link cap, HSTS on HTTPS, and ownership/TTL bounds for test listeners and async test jobs.
0.2.5 - 2026-10-30
Fixed
- Stop an existing tunnel before replacing its env file, so old xfrm, L2TP, FOU and route state is torn down with the old config.
- Keep tunnel state and env when teardown fails; deletion no longer loses the only record of leftover interfaces and iptables rules.
- Fail
ctunnel-kernel downwhen an iptables rule cannot be removed, and delete FOU/GUE receive ports during teardown. - Fail tunnel startup when port forwards are configured but iptables is unavailable.
- Verify old systemd units are inactive before starting, restarting or deleting a tunnel.
0.2.4 - 2026-10-30
Fixed
- Normalize inline CSP hashes for CRLF checkouts so the web panel is not blocked on Windows builds.
- Fix the duplicate import field ID and keep tunnel action buttons attached across status refreshes.
- Retry atomic file replacement on Windows and serialize env reads and writes.
- Reject FOU and duplicate forward-port collisions; trim IP fields before writing env files.
- Invalidate sessions on logout and fall back to an interface IPv4 address when no default route exists.
Changed
- Automated panel screenshot commits use the
CIAUBidentity instead ofgithub-actions[bot]. - Repository checkout enforces LF line endings except for
.batfiles.
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.
v0.2.6
Changelog
0.2.6 - 2026-10-30
Added
- Two-mode Connection Test: Iran listener with a generated
ctunnel-test://link, live status, one-click copy, open UDP/TCP ports and a 15-minute self-closing lifecycle; Kharej async live tester with method table, Path MTU, and Best Direct / Best Reverse deployment. - Tunnel Edit modal backed by
PUT /api/tunnels/{name}, plus a quick Copy Setup Link action on every tunnel card. - Operations-grade dark panel: tabular-nums telemetry, role/family badges, status badges, responsive benchmark tables, and clear loading/error states.
Security
- Bounded login-limiter eviction, an 8 KiB setup-link cap, HSTS on HTTPS, and ownership/TTL bounds for test listeners and async test jobs.
0.2.5 - 2026-10-30
Fixed
- Stop an existing tunnel before replacing its env file, so old xfrm, L2TP, FOU and route state is torn down with the old config.
- Keep tunnel state and env when teardown fails; deletion no longer loses the only record of leftover interfaces and iptables rules.
- Fail
ctunnel-kernel downwhen an iptables rule cannot be removed, and delete FOU/GUE receive ports during teardown. - Fail tunnel startup when port forwards are configured but iptables is unavailable.
- Verify old systemd units are inactive before starting, restarting or deleting a tunnel.
0.2.4 - 2026-10-30
Fixed
- Normalize inline CSP hashes for CRLF checkouts so the web panel is not blocked on Windows builds.
- Fix the duplicate import field ID and keep tunnel action buttons attached across status refreshes.
- Retry atomic file replacement on Windows and serialize env reads and writes.
- Reject FOU and duplicate forward-port collisions; trim IP fields before writing env files.
- Invalidate sessions on logout and fall back to an interface IPv4 address when no default route exists.
Changed
- Automated panel screenshot commits use the
CIAUBidentity instead ofgithub-actions[bot]. - Repository checkout enforces LF line endings except for
.batfiles.
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.
v0.2.5
Changelog
0.2.5 - 2026-10-30
Fixed
- Stop an existing tunnel before replacing its env file, so old xfrm, L2TP, FOU and route state is torn down with the old config.
- Keep tunnel state and env when teardown fails; deletion no longer loses the only record of leftover interfaces and iptables rules.
- Fail
ctunnel-kernel downwhen an iptables rule cannot be removed, and delete FOU/GUE receive ports during teardown. - Fail tunnel startup when port forwards are configured but iptables is unavailable.
- Verify old systemd units are inactive before starting, restarting or deleting a tunnel.
0.2.4 - 2026-10-30
Fixed
- Normalize inline CSP hashes for CRLF checkouts so the web panel is not blocked on Windows builds.
- Fix the duplicate import field ID and keep tunnel action buttons attached across status refreshes.
- Retry atomic file replacement on Windows and serialize env reads and writes.
- Reject FOU and duplicate forward-port collisions; trim IP fields before writing env files.
- Invalidate sessions on logout and fall back to an interface IPv4 address when no default route exists.
Changed
- Automated panel screenshot commits use the
CIAUBidentity instead ofgithub-actions[bot]. - Repository checkout enforces LF line endings except for
.batfiles.
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.
v0.2.4
Changelog
0.2.4 - 2026-10-30
Fixed
- Normalize inline CSP hashes for CRLF checkouts so the web panel is not blocked on Windows builds.
- Fix the duplicate import field ID and keep tunnel action buttons attached across status refreshes.
- Retry atomic file replacement on Windows and serialize env reads and writes.
- Reject FOU and duplicate forward-port collisions; trim IP fields before writing env files.
- Invalidate sessions on logout and fall back to an interface IPv4 address when no default route exists.
Changed
- Automated panel screenshot commits use the
CIAUBidentity instead ofgithub-actions[bot]. - Repository checkout enforces LF line endings except for
.batfiles.
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.
v0.2.3
Changelog
0.2.3 - 2026-10-28
Hotfix - 2026-10-29
- Isolate panel session cookies by HTTP/HTTPS, host, port and base path so legacy Secure cookies cannot block HTTP login.
- Wait for any pre-login overview request before loading the authenticated dashboard; show dashboard-loading failures instead of silently returning to login.
- Open the menu automatically after installation in a terminal, releasing the install lock and cleaning temporary files first. Set
CTUNNEL_NO_MENU=1for automation. - Rebuild the existing v0.2.3 release assets and tag after validation; no new version is introduced.
Fixed
- A version appended to the documented
sudo bash -c "$(curl ...)" v0.2.1command is now recognized, including Bash's special$0handling. Script arguments also work, with or without the leadingv. - Explicit version arguments take precedence over
CTUNNEL_VERSION; invalid tags or extra arguments fail before installation.
Changed
- No version selects GitHub's latest stable release, excluding draft and pre-release entries. All assets remain pinned to one resolved tag and verified against SHA256SUMS.
- Release titles contain only the tag/version.
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.
v0.2.2
Changelog
0.2.2 - 2026-10-28
Changed
- The initial web panel port is now 6969 instead of 8443. New installations and stores without a configured panel port use this default.
- Updated the panel URL examples in the English, Persian and Russian documentation.
- Existing saved panel ports are preserved; change an existing installation through the terminal Web Panel menu if needed.
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.
v0.2.1
Changelog
0.2.1 - 2026-10-28
Added
- Persisted, random panel base paths with editable routing and custom domain settings.
- Validated custom TLS certificate/key paths and PEM uploads; automatic HTTPS with graceful listener reload.
- Measured per-method testing and session-bound, expiring, idempotent Deploy Best Tunnel.
- Desktop/mobile Chromium interaction checks and real DIRECT/REVERSE GRE integration tests.
Changed
- Rebuilt the web panel with a restrained dark design, compact telemetry, accessible forms, keyboard navigation, loading states and toast feedback.
- Initial panel startup now uses HTTP. Open the exact random URL printed by the CLI; configure a domain and valid certificate pair in Panel settings for HTTPS.
- Added reproducible panel screenshots using synthetic data.
Fixed
- Settings menu clipping and overlap with telemetry cards.
- Create validation hidden inside advanced fields, missing failure feedback and duplicate creation after failed startup.
- Reverse GRE idle-read stalls by attaching the TUN device before registering its descriptor with Go's network poller.
- Cross-origin mutation handling, strict JSON validation, session expiration, session invalidation after panel address/transport changes, and CSP without unsafe-inline scripts.
Upgrade notes
- Update both endpoints to 0.2.1, then restart the panel and the affected tunnel services.
- Existing panel URLs change to a persisted random base path. Obtain the current URL and login code from the terminal Web Panel menu.
- Certificate uploads containing a private key require HTTPS or a loopback connection; over HTTP, configure existing certificate paths on the server.
- Deployment creates the local endpoint and returns a setup link for the peer. Carrier-shape tests do not prove kernel tunnel connectivity.
- No kernel throughput improvement is claimed without measurements on the deployed route.
Validation
Go tests, vet, race checks, ShellCheck, Python automation tests, Chromium desktop/mobile flows, and isolated real-kernel GRE tests passed for the implementation. The GRE job verifies both directions after idle and reproduces the 0.2.0 regression before checking the fix.