-
v1.1.8
Stablereleased this
2026-07-19 14:13:04 +07:00 | 23 commits to main since this releaseConcurrency and lifecycle safety fixes across the session, transport, forwarder, and port-registry packages, plus a new
frontendURLenv var.-
Fix data race in
SetChannel()andChannel()by adding mutex protection -
Fix data race in
StartedAt()by adding mutex protection -
Fix
waitForTCPIPForward()failing on non-tcpip-forwardglobal requests -
Fix data races in the
forwarderstruct (SetType(),SetForwardedPort(),SetListener(),TunnelType(),ForwardedPort(),Listener()) viasync.RWMutex -
Fix data races in the
slugstruct (Set(),String()) viasync.RWMutex -
Fix data race in
HandleTCPForward()caused by a goroutine writing to an outer-scopeerrvariable -
Fix POST/PUT requests hanging in the HTTP handler
-
Fix
AddRangeinfinite loop whenendPort == 65535(uint16 wraparound) -
Fix
Claimbypassing the allowed port range — now rejects out-of-range ports -
Fix
Unassignedhanding out the same port to concurrent callers — now reserves atomically -
Fix
SetStatussilently creating entries for unknown ports — now returns an error -
Fix concurrent map read/write in
registry.Updatecrashing the server -
Refactor
Close()to release its mutex before calling external code, preventing deadlocks -
Make
CLOSEDa terminal state —SetChannel()andSetStatus()now reject/ignore calls afterClose() -
Add nil check to
SetChannel()to prevent masking upstream bugs -
Add
PortRegistryinterface for better interface segregation -
Set
startedAtwhen the session starts running, instead of at object creation -
Extract
Close()into helper methods:closeChannel(),closeConnection(),cleanupRegistry(),cleanupForwarder() -
Fix
isClosedError()redundant string comparison -
Make
cleanupRegistry()conditional on non-empty slug to avoid unnecessary registry calls -
Use
ForwardedPort()/Listener()getters consistently instead of direct field access -
Add
frontendURLenvironment variable -
#150 Fix race conditions and improve lifecycle safety
-
#151 fix(session): resolve race conditions
-
#154 fix(httphandler): post/put request hang
-
#155 fix(port, session): harden port registry and fix concurrent allocation
-
#156 fix(registry): data race registry update
Downloads
-
-
v1.1.7
Stablereleased this
2026-07-17 13:24:12 +07:00 | 41 commits to main since this releaseRace Condition Fixes:
- Fixed data races in SetChannel(), Channel(), and StartedAt()
- Fixed test race conditions in transport and interaction packages
Concurrency Safety:
- Refactored Close() to prevent deadlocks by releasing mutex before external calls
- Made SetChannel() reject calls after Close()
- Made SetStatus() ignore calls after Close() (terminal state)
- Added nil check to SetChannel()
Code Quality:
- Extracted helper methods in Close() for better separation of concerns
- Added PortRegistry interface for better interface segregation
- Fixed isClosedError() redundant string comparison
- Made cleanupRegistry() conditional on non-empty slug
- Fixed startedAt timestamp to reflect actual session start
Downloads
-
v1.1.6
Stablereleased this
2026-03-30 17:27:25 +07:00 | 45 commits to main since this releaseWhat's Changed
- refactor: move server, session, and types package to internal in #123
- refactor: move types package to internal in #122
- refactor: move session package to internal in #121
- refactor: move server package to internal in #120
Contributors
Full Changelog: v1.1.5...v1.1.6
Downloads
-
v1.1.5
Stablereleased this
2026-03-19 22:32:45 +07:00 | 65 commits to main since this releaseWhat's Changed
- chore(deps): update actions/checkout action to v6 in #75
- fix(deps): update module github.com/stretchr/testify to v1.11.1 in #79
- chore(deps): update dependency go to v1.25.6 in #78
- feat(testing): add comprehensive test coverage and code quality improvements in #76
- feat/restructure in #73
Contributors
Full Changelog: v1.1.4...v1.1.5
Downloads
-
v1.1.4
Stablereleased this
2026-01-21 14:06:46 +07:00 | 128 commits to main since this releaseWhat's Changed
- Reorganize internal packages and overall project structure
- Update imports and wiring to match the new layout
- Separate HTTP parsing and streaming from the server package
- Separate middleware from the server package
- Separate session registry from the session package
- Move HTTP, HTTPS, and TCP servers to the transport package
- Session package no longer starts the TCP server directly
- Server package no longer starts HTTP/HTTPS servers on initialization
- Forwarder no longer handles accepting TCP requests
- Move session details to the types package
- HTTP/HTTPS initialization is now the responsibility of main
Contributors
Full Changelog: v1.1.3...v1.1.4
Downloads
-
v1.1.3
Stablereleased this
2026-01-18 21:20:05 +07:00 | 136 commits to main since this releaserefactor: explicit initialization and dependency injection
- Replace init() with config.Load() function when loading env variables
- Inject portRegistry into session, server, and lifecycle structs
- Inject sessionRegistry directly into interaction and lifecycle
- Remove SetSessionRegistry function and global port variables
- Pass ssh.Conn directly to forwarder constructor instead of lifecycle interface
- Pass user and closeFunc callback to interaction constructor instead of lifecycle interface
- Eliminate circular dependencies between lifecycle, forwarder, and interaction
- Remove setter methods (SetLifecycle) from forwarder and interaction interfaces
Full Changelog: https://git.fossy.my.id/bagas/tunnel-please/compare/v1.1.2...v1.1.3
Downloads
-
v1.1.2
Stablereleased this
2026-01-17 17:33:10 +07:00 | 139 commits to main since this releaserefactor(interaction): separate view and update logic into modular files
- Extract slug editing logic to slug.go (slugView/slugUpdate)
- Extract commands menu logic to commands.go (commandsView/commandsUpdate)
- Extract coming soon modal to coming_soon.go (comingSoonView/comingSoonUpdate)
- Extract main dashboard logic to dashboard.go (dashboardView/dashboardUpdate)
- Create model.go for shared model struct and helper functions
- Replace math/rand with crypto/rand for random subdomain generation
- Remove legacy TLS cipher suite configuration
Full Changelog: https://git.fossy.my.id/bagas/tunnel-please/compare/v1.1.1...v1.1.2
Downloads
-
v1.1.1
Stablereleased this
2026-01-16 16:37:37 +07:00 | 142 commits to main since this releaserefactor: convert structs to interfaces and rename accessors
- Convert struct types to interfaces
- Rename getter and setter methods
- Add Close method to server interface
- Merge handler functionality into session file
- Handle lifecycle.Connection().Wait()
- fix panic on nil connection in SSH server
Full Changelog: https://git.fossy.my.id/bagas/tunnel-please/compare/v1.1.0...v1.1.1
Downloads
-
v1.1.0
Stablereleased this
2026-01-14 17:16:43 +07:00 | 148 commits to main since this releasefeat: integrate gRPC, session refactor, SSH headless support, and bug fixes
- gRPC integration: slug edit handling, get sessions by user, and session requests from gRPC server
- Refactor gRPC client: simplify processEventStream and handle authenticated user info
- Session management improvements: use session key for registry, forwarder session termination, inject SessionRegistry interface
- SSH enhancements: add headless mode support for SSH -N connections
- Bug fixes:
- prevent subdomain changes to already-in-use subdomains
- fix startup order and environment variable keys
- atomic ClaimPort() to prevent race conditions
- Refactors:
- consolidate error handling
- replace Get/Set patterns with idiomatic Go interfaces
- change enums from string to int
- CI cleanup: remove renovate bot
Reviewed-on: #65
Downloads
-
v1.1.0-rc.2
Stablereleased this
2026-01-14 16:54:10 +07:00 | 149 commits to main since this releaserefactor: replace Get/Set patterns with idiomatic Go interfaces
- rename constructors to New
- remove Get/Set-style accessors
- replace string-based enums with iota-backed types
Downloads