Changelog
New Features
- 57bb1e7: feat(docker): add rate limiting label parsing for containers (@almeidapaulopt)
- 98cc7c0: feat(list): add rate limiting config to list provider (@almeidapaulopt)
- 00fa7c2: feat(model): add configurable rate limiting defaults and config fields (@almeidapaulopt)
- f60ea8d: feat(server): add shutdownDrainSeconds for load balancer convergence (@almeidapaulopt)
- 8c3e380: feat(tlsproviders): add Closer interface for ACME certmagic cache lifecycle (@almeidapaulopt)
Bug fixes
- 26b2bc2: fix(cmd): use interface type for TracerProvider to avoid nil panic (@almeidapaulopt)
- f19590c: fix(config): add Close() to configfile watcher and add bounds validation (@almeidapaulopt)
- beb4e51: fix(docker): add NetworkList timeout and nil-guard GetFirstTarget (@almeidapaulopt)
- 72d21ad: fix(list): add mutex protection for ctx, eventsChan, errChan in WatchEvents (@almeidapaulopt)
- fb6cd70: fix(metrics): use checked Gatherer assertion with safe fallback (@almeidapaulopt)
- 053d9ad: fix(model): validate proxy protocol, redirect URLs, and return nil from GetFirstTarget (@almeidapaulopt)
- 3d54d50: fix(proxymanager): add acceptWg to tcpPort for proper connection drain on shutdown (@almeidapaulopt)
- a0e0997: fix(proxymanager): add keyedLocks primitive and parent proxy context under pm.ctx (@almeidapaulopt)
- 7d13dcc: fix(proxymanager): fix concurrency bugs and integrate configurable rate limiting (@almeidapaulopt)
- f041f40: fix(proxymanager): guard TCP handleConn against double-close with sync.Once (@almeidapaulopt)
- 5a44384: fix(proxymanager): guard UDP port close-while-starting race and fix provider proxy leak on register failure (@almeidapaulopt)
- db732a3: fix(proxymanager): retry transient TCP errors, deterministic rate limiter eviction, UDP double-close guard (@almeidapaulopt)
- e533b03: fix(proxymanager): serialize eventStop with hostname lock and make reconnectBackoff context-aware (@almeidapaulopt)
- 1c69693: fix(proxymanager): use DNSProviderMagicDNS constant, drop t.Parallel from providers tests (@almeidapaulopt)
- 394e95f: fix(tailscale): guard nil onEvent in StatusWatcher to prevent panic (@almeidapaulopt)
- 308d045: fix(tailscale): improve exposure logging, accept logger, add dropped connection counter (@almeidapaulopt)
- fe1b302: fix(test): replace nil context in eventloop tests to satisfy staticcheck (@almeidapaulopt)
- cbd5d93: fix(webhook): handle json.Marshal errors with fallback JSON (@almeidapaulopt)
- 9950202: fix: harden TLS validation, identity trust, and proxy lifecycle (@almeidapaulopt)
- be214be: fix: log errors in cleanup paths and return silenced errors (@almeidapaulopt)
- f75f379: fix: resolve errcheck warnings in test files (@almeidapaulopt)
- dfcb6e7: fix: resolve remaining mnd and nolint warnings (@almeidapaulopt)
- 395388d: fix: return errors from generateproviders instead of printing to stderr (@almeidapaulopt)
- deb180d: fix: specify linter in bare nolint directives and replace context.TODO (@almeidapaulopt)
- 8559058: fix: verify Tailscale API client initialization instead of discarding return (@almeidapaulopt)
Documentation updates
- bc18a78: docs(agents): update nolint and magic number conventions (@almeidapaulopt)
- 3193153: docs(config): update AGENTS.md for injected static snapshot model (@almeidapaulopt)
- 21b241d: docs: trim anti-patterns section to actionable warnings only (@almeidapaulopt)
- 51f3254: docs: update AGENTS.md files for Phase 4 lifecycle changes (@almeidapaulopt)
- 3ac79ae: docs: update AGENTS.md files to reflect completed anti-pattern work (@almeidapaulopt)
- 48afc8b: docs: update anti-patterns section in AGENTS.md (@almeidapaulopt)
Build process updates
- b879bf0: build(deps): bump codeberg.org/miekg/dns from 0.6.80 to 0.6.81 (#475) (@dependabot[bot])
- 8acaec9: build(deps): bump golang.org/x/crypto from 0.52.0 to 0.53.0 (#476) (@dependabot[bot])
- 8391ad8: build: fix Makefile ldflags and remove inert prod build tag (@almeidapaulopt)
Other work
- 406ae3e: fix(api,dashboard): use GetFirstTargetString to nil-guard target URLs (@almeidapaulopt)
- 2dd4203: lint: extract string constants for goconst compliance (@almeidapaulopt)
- f7c78a7: refactor(config): inject zerolog.Logger into InitializeConfig (@almeidapaulopt)
- 53cf7d8: refactor(config): remove Provider interface and Data.Clone() (@almeidapaulopt)
- 8cdb0ca: refactor(config): replace global singleton with dependency injection (@almeidapaulopt)
- efc14a3: refactor(core): extract ProxyAuth struct from package-level mutable state (@almeidapaulopt)
- e87cabb: refactor(core): extract VersionInfo struct from sync.Once singleton (@almeidapaulopt)
- 01b12e6: refactor(core): inject logger into admin middleware (@almeidapaulopt)
- 59c9b6b: refactor(core): introduce httpclient.Doer interface for HTTP dependency injection (@almeidapaulopt)
- 585e0c1: refactor(core): remove dead trace.Span parameter from ErrorResponse (@almeidapaulopt)
- abae3c3: refactor(core): separate webhook Sender Start() from constructor (@almeidapaulopt)
- b809e6c: refactor(dashboard): separate Dashboard Start() from constructor (@almeidapaulopt)
- 946f4f5: refactor(docker): extract APIClient interface from Docker SDK (@almeidapaulopt)
- 4040f70: refactor(docker): update test helpers for injected Assets (@almeidapaulopt)
- 3f01613: refactor(metrics): inject prometheus.Registerer into Metrics (@almeidapaulopt)
- c1a8d06: refactor(proxymanager): document lock hierarchy, add urlReady signal, protect SetDNSAndTLSProviders (@almeidapaulopt)
- b33aa6c: refactor(proxymanager): extract port orchestration and TLS methods from proxy.go (@almeidapaulopt)
- fa07eb6: refactor(proxymanager): inject TracerProvider for explicit OTEL wiring (@almeidapaulopt)
- d32e567: refactor(proxymanager): introduce ProxyParams struct for NewProxy (@almeidapaulopt)
- 1bad3d3: refactor(proxymanager): replace newPortProxy positional params with struct (@almeidapaulopt)
- a4cc96b: refactor(proxymanager): replace sync.Map mutexes with keyedLocks and add targetIndex (@almeidapaulopt)
- b755b59: refactor(proxymanager): split proxymanager.go into focused files (@almeidapaulopt)
- 229885d: refactor(tailscale): extract TSNetServer interface from tsnet.Server (@almeidapaulopt)
- d06ed5f: refactor(tailscale): separate provider Start() from constructor (@almeidapaulopt)
- 1f7044d: refactor(web): inject Assets into Docker target provider (@almeidapaulopt)
- 2c47385: refactor(web): remove dead GuessIcon shim and add nil-guard (@almeidapaulopt)
- dcc6713: refactor(web): replace init() with explicit Assets constructor (@almeidapaulopt)
- a3ae4fc: refactor: extract named constants (@almeidapaulopt)
- d474282: refactor: resolve goconst warnings with shared constants (@almeidapaulopt)
- 707ec67: refactor: thread ProxyAuth token through proxymanager constructors (@almeidapaulopt)
- 11645b7: style(proxymanager): reorder Proxy and ProxyParams struct fields (@almeidapaulopt)
- 3bd518e: style(server): remove redundant comments from bootstrap (@almeidapaulopt)
- e6bcffa: style: fix whitespace and formatting issues (@almeidapaulopt)
- 65703d4: test(api): extend REST API tests with webhook and proxy action coverage (@almeidapaulopt)
- b293e48: test(config): add validation and secrets loading tests (@almeidapaulopt)
- 972f4e3: test(config): strengthen assertions in generateproviders and secrets tests (@almeidapaulopt)
- e5cd856: test(core): add sessions, csrf, version, healthcheck, and concurrent tests (@almeidapaulopt)
- a9def63: test(dns,acme): add interface compliance, lifecycle error path, and ACME tests (@almeidapaulopt)
- 3e9f137: test(docker): add APIClient mock tests for container lifecycle (@almeidapaulopt)
- db0710e: test(docker): add NoValidTargetFoundError Error() tests (@almeidapaulopt)
- a0c00a9: test(docker): add autodetect probing and legacy label parsing tests (@almeidapaulopt)
- 900b13c: test(dom): add ID generation tests (@almeidapaulopt)
- d2c9603: test(list): add processPortRange tests (@almeidapaulopt)
- e681873: test(model,dashboard): add whois, status, stream, and viewmodel tests (@almeidapaulopt)
- 8002398: test(proxymanager): add concurrency regression tests and extract shared test helpers (@almeidapaulopt)
- 32870d7: test(proxymanager): add domain lifecycle, port handler, and concurrent tests (@almeidapaulopt)
- beee375: test(tailscale): add proxy, eventloop, helpers, certs, and server tests (@almeidapaulopt)
- 5bbe590: test(tailscale): add test files for IsOAuth, router management, services, dropped connections, cache eviction (@almeidapaulopt)
- bb32124: test(tailscale): extend exposure, state manager, lifecycle, reconciler, port router tests (@almeidapaulopt)
- 693bb1a: test(webhook,cloudflare): add httpclient.Doer mock tests for error paths (@almeidapaulopt)