Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
361 commits
Select commit Hold shift + click to select a range
e7121b4
feature/conn25: connect the ExtraWireguardAllowedIPs hook (#19140)
george-tailscale Mar 26, 2026
2b1030a
release/dist/unixpkgs: include tailscale-online.target in packages
bradfitz Mar 22, 2026
d3bfc33
Add 'fish' to the list of scales
SamPlaysKeys Mar 27, 2026
70fabf1
.github: Bump actions/download-artifact from 8.0.0 to 8.0.1
dependabot[bot] Mar 16, 2026
156e6ae
feature/conn25: install all the hooks
mzbenami Mar 26, 2026
0694521
README: update the version of Go in the README (#19168)
Lykathia Mar 29, 2026
edb2be1
cmd/tailscale: improve `tailscale lock` error message if no keys
alexwlchan Mar 26, 2026
4c0f488
docker: add riscv64 to container image architectures
gounthar Mar 28, 2026
99f8039
tsnet: fix advertiseService dropping existing services
Mar 28, 2026
bf46772
control/controlclient,ipn/ipnlocal,wgengine: avoid restarting wiregua…
cmol Mar 30, 2026
87388ce
licenses: update license notices
Mar 30, 2026
61ac021
wgengine/magicsock: assume network up for tests
hwh33 Mar 28, 2026
4334dfa
control/controlclient: take mapsession and release lock early in sub …
cmol Mar 31, 2026
6f0ca94
tka: consolidate all the limits into a single file
alexwlchan Mar 31, 2026
fed0df6
tsnet: add test for advertising multiple Services
hwh33 Mar 29, 2026
1e2fdfd
tsnet: fix bug in closing multiple ServiceListeners at once
hwh33 Mar 30, 2026
88e7330
ipn,tka: improve Tailnet Lock logs
alexwlchan Apr 1, 2026
990d25c
go.toolchain.rev, version: bump Tailscale Go, add IsTailscaleGo
bradfitz Apr 1, 2026
4ffb92d
tka: refer consistently to "DisablementValues"
alexwlchan Mar 31, 2026
5b62f98
ipn, cmd/tailscale/cli: allow setting FQDN sans dot as an exit node
alexwlchan Mar 23, 2026
c76113a
wgengine/magicsock: send out disco keys over TSMP periodically (#19212)
cmol Apr 1, 2026
211ef67
tailcfg,ipn/ipnlocal: regulate netmap caching via a node attribute (#…
creachadair Apr 1, 2026
9c1d59f
version: parse Void Linux version strings
alexwlchan Mar 31, 2026
e82ffe0
cmd/k8s-operator: add further E2E tests for Ingress (#19219)
BeckyPauley Apr 2, 2026
ffaebd7
control/controlclient: filter out disco updates from full map (#19220)
cmol Apr 2, 2026
d6b626f
tstest: add test for connectivity to off-tailnet CGNAT endpoints
tendstofortytwo Apr 2, 2026
eaa5d9d
client,cmd/tailscale,ipn/{ipnlocal,localapi}: add debug CLI command t…
creachadair Apr 2, 2026
7ddbd84
ipn/ipnlocal: ensure TestServeUnixSocket actually serves a Unix socket
hwh33 Apr 3, 2026
5ba3015
flake.nix: add patch for debug/mod.go (#19238)
mikeodr Apr 3, 2026
0f02c20
tool/gocross: skip broken TestGocrossWrapper inside `git worktree` (#…
sfllaw Apr 5, 2026
5ef3713
cmd/vet: add subtestnames analyzer; fix all existing violations
bradfitz Apr 4, 2026
7b5b9f5
client/web: fix nil metricCapture crash in mockLocalAPI
bradfitz Apr 6, 2026
85827f7
ci: fix Windows benchmarks running all tests instead of just benchmarks
bradfitz Apr 6, 2026
5a899e4
ipn/ipnlocal: add health.Tracker to tests where it was warning in CI
bradfitz Apr 6, 2026
86f42ea
cmd/cloner, cmd/viewer: handle named map/slice types with Clone/View …
bradfitz Apr 5, 2026
9a43bca
tailcfg: fix ClientVersion.UrgentSecurityUpdate doc comment (#19214)
dylan-tailscale Apr 6, 2026
4111d4b
ssh/tailssh: fix integration test hang due to missing host keys
bradfitz Apr 5, 2026
58595a6
safeweb: add CSRF token helpers and set cookie path to root (#19265)
fserb Apr 6, 2026
d0cd090
go.toolchain.rev: bump our Go toolchain for caching fix
bradfitz Apr 6, 2026
21695cd
ipn/ipnlocal,net/netmon: make frequent darkwake more efficient
raggi Apr 3, 2026
82fa218
tempfork/gliderlabs/ssh: remove tempfork
kradalby Mar 9, 2026
dd3b613
ssh: replace tempfork with tailscale/gliderssh
kradalby Mar 16, 2026
6e44c68
.golangci.yml: enforce gliderssh import alias via importas linter
kradalby Apr 7, 2026
2b1cfa7
ssh/tailssh: fix race in session termination message delivery
bradfitz Apr 5, 2026
d44649a
control/controlclient: add rwlock to peers in mapsession (#19261)
cmol Apr 7, 2026
9a7f143
wgengine/userspace: add extra check for tsmp learned keys in engine (…
cmol Apr 7, 2026
1b5b437
ipn/localapi, cli, clientmetric: add ipnbus feature tag; fix omit.go …
bradfitz Apr 7, 2026
1f84729
ipn/desktop: use runtime.Pinner to force heap-allocation of msg
nickkhyl Apr 7, 2026
96c3ad5
feature/conn25: add IPv6 support
franbull Apr 6, 2026
8a7e160
ipn/desktop: move behind feature/condregister
bradfitz Apr 7, 2026
0739927
k8s-operator/sessionrecording/ws: unify Read/Write frame parsing (#19…
fserb Apr 7, 2026
bd09e84
licenses: update license notices
Apr 6, 2026
e689283
derp/derpserver: add per-connection receive rate limiting (#19222)
mikeodr Apr 7, 2026
8df8e9c
cmd/containerboot: rate-limit IPN bus netmap notifications
dougbryant-ant Apr 7, 2026
2aac2ab
derp: align FrameType docs casing
jwhited Apr 7, 2026
c4cb5eb
go.toolchain.rev: update to Go 1.26.2
bradfitz Apr 7, 2026
a182b86
tsd, all: add Sys.ExtraRootCAs, plumb through TLS dial paths
bradfitz Apr 7, 2026
5341b26
wgengine/netstack: allow UDP listeners to receive traffic on Service …
ChaosInTheCRD Apr 8, 2026
9e68841
control/controlclient: avoid calls to ms.netmap() (#19281)
cmol Apr 8, 2026
ccef06b
tstest/integration/testcontrol: notify peers when subnet routes change
bradfitz Apr 8, 2026
8141613
tstest/natlab/vnet: add multi-NIC node support, DHCP fixes, and VIPs
bradfitz Apr 8, 2026
8a9840d
tool: replace go.cmd with a 19KB Rust go.exe wrapper
bradfitz Apr 6, 2026
33cd8ea
tool/goexe: refactor to use windows_sys
npry Apr 8, 2026
647deed
misc: add install-git-hooks.go and git hook for Change-Id tracking
bradfitz Apr 5, 2026
d948b78
tsweb: add TS_DEBUG_TRUSTED_CIDRS envknob to debug (#19283)
jasonodonnell Apr 8, 2026
ec0b23a
vmtest: add VM-based integration test framework
bradfitz Apr 8, 2026
b25920d
tka: improve logging for Compact and Commit operations
alexwlchan Apr 1, 2026
85d6ba9
cmd/k8s-operator: migrate to tailscale-client-go-v2 (#19010)
davidsbond Apr 9, 2026
dca1d8e
tstest/natlab: add TestSubnetRouterFreeBSD with FreeBSD cloud image s…
bradfitz Apr 9, 2026
27e6fed
ssh/tailssh: fix default PATH for Debian
andrew-d Apr 7, 2026
6b7caaf
cmd/k8s-operator: set PreferDualStack on ProxyGroup egress services (…
fserb Apr 9, 2026
03c3551
ipn/ipnlocal: add netmap mutations to the ipn bus (#19120)
barnstar Apr 9, 2026
1ff369a
tka: keep the CompactionDefaults alongside the other limits
alexwlchan Apr 10, 2026
399f048
tka: Revert "improve logging for Compact and Commit operations"
alexwlchan Apr 10, 2026
5e81840
tstest: add RequireRoot helper
bradfitz Apr 10, 2026
b4c0d67
wgengine/router/osrouter: fix privileged tests missing fake netfilter…
amalscale Apr 9, 2026
ca5db86
cmd/derper,derp: add --rate-config file with SIGHUP reload (#19314)
mikeodr Apr 10, 2026
cf59a6f
.github, tool/listpkgs: automatically find tests which use tstest.Req…
bradfitz Apr 10, 2026
0e8ae9d
gokrazy: add arm64 natlab appliance image support
bradfitz Apr 10, 2026
674f866
tstest/tailmac: add headless mode for automated VM testing
bradfitz Apr 10, 2026
4fcce60
tailcfg,types/netmap: add (visible) Services to SelfNode Caps (#19335)
adrianosela Apr 13, 2026
d5341fd
tailscaleroot: add test that tsgo rev is in Go build cache keys
bradfitz Apr 13, 2026
aa9a76c
ssh/tailssh: gofmt
bradfitz Apr 13, 2026
2188045
ipn/localapi,client/local: add services over localapi
adrianosela Apr 13, 2026
929ad51
cmd/derper: mark rate-config flag as experimental and unstable
jwhited Apr 13, 2026
cfed69f
licenses: update license notices
Apr 13, 2026
e2fa9ff
ssh/tailssh: speed up SSH integration tests
bradfitz Apr 5, 2026
4ce1643
types/netmap,tailcfg: update documentation for Services cap
adrianosela Apr 13, 2026
5a7ef4a
ipn/ipnlocal: mark TestStateMachineSeamless as flaky
bradfitz Apr 13, 2026
9dfe787
version: show tailscale/go toolchain git hash in version output
bradfitz Apr 13, 2026
6500d3c
cmd/containerboot: mark TestContainerBoot as flaky
bradfitz Apr 13, 2026
50b8cfb
wgengine/netstack: fix data race on in-flight connection test globals
bradfitz Apr 13, 2026
dbd19e4
tstest: add AssertNotParallel helper
bradfitz Apr 13, 2026
7dcb378
tstest/integration/nat, tstest/natlab/vnet: fix natlab test flake
bradfitz Apr 13, 2026
a97850f
cmd/derper: fix TestLookupMetric to pass when run alone
bradfitz Apr 14, 2026
13d5370
.gitignore: explicitly include tool/go.exe
raggi Apr 13, 2026
9fbe4b3
all: fix six tests that failed with -count=2
bradfitz Apr 14, 2026
ab74ea0
tstest/integration: clear SSH_CLIENT env to prevent false positive de…
apenwarr Apr 13, 2026
75819ae
derp/derpserver: increase minimum token bucket size
jwhited Apr 13, 2026
0afaa29
go.mod: upgrade go-git to v5.17.1
patrickod Apr 13, 2026
27f1d4c
control/controlclient: improve filter on netmap updates (#19308)
cmol Apr 14, 2026
49eb1b5
net/dns: fix TestDNSTrampleRecovery failure under flakestress
bradfitz Apr 14, 2026
6aa1057
wgengine/magicsock: deflake TestTwoDevicePing compare-metrics-stats
bradfitz Apr 13, 2026
621dc9c
tstest: fix kernel version parsing for Debian-style version strings
apenwarr Apr 13, 2026
a0a8fae
tstest/integration: use linkat to hardlink test binaries on Linux
bradfitz Apr 14, 2026
943b426
util/linuxfw: fix nil deref in nftables chain check
bradfitz Apr 11, 2026
5834058
wgengine: replace reflect.DeepEqual with typed Equal for maybeReconfi…
fserb Apr 14, 2026
6301a6c
util/linuxfw,wgengine/router: allow incoming CGNAT range traffic with…
tendstofortytwo Apr 14, 2026
effbe67
wgengine/magicsock: remove pickPort, use port 0 to avoid TOCTOU race
apenwarr Apr 15, 2026
61c95f4
control/controlclient: accept key if last seen on exist node is absen…
cmol Apr 15, 2026
dbf4687
control/controlclient: add patchify miss stats
bradfitz Apr 15, 2026
5eb0b4b
cmd/containerboot,cmd/k8s-proxy,kube: add authkey renewal to k8s-prox…
ChaosInTheCRD Apr 15, 2026
d8190e0
derp/derpserver: implement hierarchical token bucket rate limiting
jwhited Apr 14, 2026
958bcda
control/controlclient: handle 429 responses during node registration
knyar Apr 14, 2026
1e49346
ipn/ipnlocal: discard cached netmaps upon panic during SetNetworkMap …
creachadair Apr 15, 2026
acc4335
control/controlclient: enable request signatures on macOS (#19317)
barnstar Apr 15, 2026
eea39ea
cmd/k8s-operator: add affinity rules to DNSConfig (#19360)
davidsbond Apr 15, 2026
b39ee04
util/httpm: open .git/index to defeat Go test caching
bradfitz Apr 15, 2026
d3ba148
magicsock: invalidate endpoint on trust timeout (#19415)
illotum Apr 16, 2026
4f47c3c
ipn/ipnlocal: log AUM hash on startup as base32, not hex
alexwlchan Apr 16, 2026
1dc08f4
appc,feature/conn25: prevent clients from forwarding DNS requests and
mzbenami Apr 7, 2026
69572c7
derp/derpserver: add rate limit config metrics
jwhited Apr 13, 2026
50d7176
control/tsp, cmd/tsp: add low-level Tailscale protocol client and tool
bradfitz Apr 16, 2026
c2da563
tstest/integration/vms: skip cloud-init package updates (#19443)
tomhjp Apr 17, 2026
00a08ea
control/tsp: add lite map update support
bradfitz Apr 17, 2026
47ecbe5
cmd/k8s-operator: add priorityClassName support to helm chart (#19236)
bjorn-stange-expel Apr 17, 2026
d52ae45
cmd/cloner: deep-clone pointer elements in map-of-slice values
andrew-d Apr 7, 2026
b239e92
cmd/k8s-operator: add e2e test setup and l7 ingress test for multi-ta…
BeckyPauley Apr 17, 2026
8dda62c
feature/clientupdate: windows update should use tailscale.exe update …
kari-ts Apr 17, 2026
1fbb834
logtail: add Logger.SetEnabled to toggle uploads at runtime
bradfitz Apr 17, 2026
514d7d2
misc/git_hook: extract shared githook package; auto-rebuild on versio…
fserb Apr 17, 2026
618dfd4
client/local,types/netmap: modify services format in local api
adrianosela Apr 17, 2026
cb5a53c
ipn/ipnlocal: preserve b.loginFlags in auto-login cc.Login calls
sgraham Apr 17, 2026
cf76202
ipn/ipnlocal: log the local and remote TKA HEADs during sync
alexwlchan Apr 19, 2026
dfc2667
tstest/integration/testcontrol: make Stream w/ capver >= 68 match doc…
bradfitz Apr 20, 2026
ec86f0f
ipn/ipnlocal: make TestStateMachine less flaky (#19434)
zofrex Apr 20, 2026
ffae275
ipn/ipnlocal,tailcfg: add /debug/tka c2n endpoint (#19198)
zofrex Apr 20, 2026
4a832d8
types/netmap,client/local: modify services format in local api
adrianosela Apr 20, 2026
5b06e32
logtail: add Config.Disabled to suppress the startup banner
bradfitz Apr 20, 2026
1e68a11
logtail: run HTTP tests in-memory with memnet + synctest
bradfitz Apr 20, 2026
1669b0d
misc/git_hook: fix building git_hook in a nested worktree (#19473)
fserb Apr 21, 2026
04415b8
misc/genreadme: port from corp (#19477)
WalterHub Apr 21, 2026
19544b4
feature/conn25: move byConnKey from addrAssignments to client
franbull Apr 16, 2026
d7916d4
feature/conn25: add expiresAt field to addrs
franbull Apr 20, 2026
12813de
tool/listpkgs: add --has-go-generate filter flag too
bradfitz Apr 22, 2026
36f094e
ipn/ipnlocal: deflake TestStateMachine{,Seamless} (#19475)
zofrex Apr 22, 2026
81fbcc1
cmd/tsnet-proxy: add tsnet-based port proxy tool (#19468)
fserb Apr 22, 2026
f289f7e
tstest/natlab/vmtest,cmd/tta: add TestSiteToSite
bradfitz Apr 22, 2026
311dd38
wgengine/magicsock: replace peers slice with peersByID map; add Upser…
bradfitz Apr 21, 2026
a7d8aeb
misc/genreadme,tempfork/pkgdoc,tsnet: generate README.md files from g…
bradfitz Apr 22, 2026
ee76a7d
wgengine/magicsock: do not send TSMP disco when connected (#19497)
cmol Apr 23, 2026
ad9e6c1
go.mod: bump github.com/google/go-containerregistry (#19500)
awly Apr 23, 2026
aa740cb
ipnlocal/drive: reduce noisey per-peer remote logs (#19493)
kari-ts Apr 24, 2026
306fab7
feature/conn25: add the ability to return addresses to the IP Pools
franbull Apr 21, 2026
006d7e1
version: use debug.ReadBuildInfo in CmdName on non-Windows
bradfitz Apr 22, 2026
1b40911
wgengine/netstack: absorb all quad-100 traffic locally, never leak to…
raggi Apr 24, 2026
323198b
envknob/logknob: remove unused package (#19515)
awly Apr 24, 2026
4195e34
util/cstruct: remove unused package (#19518)
awly Apr 24, 2026
d64ed4a
util/expvarx: remove unused package (#19519)
awly Apr 24, 2026
873b8b8
maths: remove unused package (#19516)
awly Apr 24, 2026
f3b2f9b
all: fix duplicate package docs and tighten TestPackageDocs
bradfitz Apr 25, 2026
3a05c45
posture: add HealthTracker for serial number retrieval (#19181)
Lykathia Apr 25, 2026
7477a6e
cmd/k8s-operator: use dynamic resource names in e2e ingress tests (#1…
BeckyPauley Apr 27, 2026
64bb40b
util/pool: remove unused package (#19522)
awly Apr 27, 2026
346d6bb
util/sysresources: remove unused package (#19523)
awly Apr 27, 2026
a70629e
util/topk: remove unsued package (#19524)
awly Apr 27, 2026
649781d
util/pidowner: remove unused package (#19521)
awly Apr 27, 2026
0e10a3f
net/tsdial, ipn/localapi, client/local: let clients dial non-Tailscal…
bradfitz Apr 6, 2026
33342ae
The connmark save/restore rules in mangle/PREROUTING restore the Tail…
mikeodr Apr 27, 2026
ad5436a
tstest/largetailnet, tstest/integration/testcontrol: add in-process l…
bradfitz Apr 26, 2026
10b63f2
tstest/clock: explain what happens if you don't set a Start time
alexwlchan Apr 27, 2026
5c1738f
tstest/natlab/{vmtest,vnet}, cmd/tta: add TestExitNode
bradfitz Apr 27, 2026
c0e6ffe
tstest/tailmac: add NIC hot-swap, disconnected NIC, and screenshot se…
bradfitz Apr 27, 2026
d0ae993
tstest/natlab/vmtest: add more subnet router tests
bradfitz Apr 27, 2026
325f52c
licenses: update license notices
Apr 27, 2026
2d85f37
client/systray: support several different color themes
willnorris Apr 16, 2026
384b7fb
release/dist/qnap: preserve .codesigning files as build artifacts
kradalby Apr 1, 2026
7735b15
cmd/k8s-operator: truncate long label values in metrics resources (#1…
dpaneda Apr 28, 2026
cb23980
tstest/natlab/vmtest: add --test-version flag
bradfitz Apr 28, 2026
0ac0972
tka: reduce boilerplate code in the tests
alexwlchan Apr 28, 2026
b9eac14
tstest/natlab/vmtest: add web UI for watching VM tests live
bradfitz Apr 11, 2026
3371421
net/dns: use os.Root to prevent path traversal in darwin resolver
andrew-d Apr 6, 2026
88cb6f5
tool/updateflakes, cmd/nardump: replace update-flake.sh with Go tool
bradfitz Apr 28, 2026
f7f8b0a
cmd/tailscale/cli: drive "file cp" progress and offline warning from …
bradfitz Apr 28, 2026
da0a277
client/web: fail /api/routes requests with empty flags (#19548)
awly Apr 28, 2026
4b8e0ed
tstest/natlab/{vmtest,vnet}, cmd/tta: add TestMullvadExitNode
bradfitz Apr 28, 2026
ec7b11d
tstest/natlab/vmtest, cmd/tta: add TestTaildrop
bradfitz Apr 28, 2026
b2d4ba0
tstest/natlab/vmtest: add macOS VM support using Tart base images
bradfitz Apr 28, 2026
4008860
cmd/hello: remove hello.ipn.dev (#19567)
noelob Apr 29, 2026
bb91bb8
all: remove everything related to non-seamless key renewal
alexwlchan Apr 14, 2026
1841a93
ssh/tailssh: mark TestSSHRecordingCancelsSessionsOnUploadFailure as f…
alexwlchan Apr 29, 2026
78627c1
wgengine/magicsock,ipn/ipnlocal: store and load homeDERP from cache (…
cmol Apr 29, 2026
4cec06b
tstest/natlab/vmtest: add macOS VM screenshot streaming to web UI
bradfitz Apr 28, 2026
a29e421
cmd/k8s-operator: add nodeSelector to `DNSConfig` resource (#19429)
davidsbond Apr 29, 2026
7b53550
control/controlclient: fix a nil-indirection bug in DERP key pruning …
creachadair Apr 29, 2026
02ffe5b
tstest/natlab/vmtest: add macOS VM snapshot caching for fast test starts
bradfitz Apr 28, 2026
fd6ae2f
tstest/natlab/vmtest: serialize per-platform setup with sync.Once
bradfitz Apr 29, 2026
be7cce7
wgengine/userspace: do not fall back to old key on tsmpLearned mismat…
cmol Apr 29, 2026
01d0bdd
cmd/derper,derp: add metrics for rate limit hits (#19560)
illotum Apr 29, 2026
70f0b26
go.mod, gokrazy: bump to fork of gokrazy/gokrazy init process for sys…
bradfitz Apr 29, 2026
1cd8bcc
tailcfg: extend services model for client application actions
adrianosela Apr 21, 2026
22ff402
wgengine/magicsock: restore SetDERPMap signature, add SetDERPMapWitho…
bradfitz Apr 29, 2026
15cba0a
tstest/natlab/vmtest: add TestDiscoKeyChange
bradfitz Apr 28, 2026
0e9f9e2
derp/derpserver: support global rate limiting independent of per-client
jwhited Apr 29, 2026
c0a9728
derp/derpserver: fix Server.UpdateRateLimits docs
jwhited Apr 29, 2026
978b6a8
ipn/ipnlocal: always ReSTUN when starting up without a cache (#19586)
cmol Apr 29, 2026
b313bff
control/tsp, tstest/integration/testcontrol: deflake TestMapAgainstTe…
bradfitz Apr 29, 2026
f343b49
wgengine, all: remove LazyWG, use wireguard-go callback API for on-de…
bradfitz Apr 15, 2026
815bb29
cmd/tailscale/cli: allow tag without "tag:" prefix in 'tailscale up'
bradfitz Apr 30, 2026
644c322
cmd/{containerboot,k8s-operator}: don't return pointers to maps (#19593)
davidsbond Apr 30, 2026
92179b1
cmd/hello: split server into helloserver package
bradfitz Apr 29, 2026
159cf87
ipn/ipnlocal, all: split LocalBackend.NetMap into NetMapNoPeers / Net…
bradfitz Apr 30, 2026
8222996
feature/conn25: centralize config on Conn25 with atomic access
mzbenami Apr 27, 2026
9f343fd
client/local, ipn/localapi, all: add CertDomains and DNSConfig accessors
bradfitz Apr 30, 2026
a6c5d23
ipn, ipn/ipnlocal: add Notify.SelfChange
bradfitz Apr 30, 2026
cac94f5
ipn/ipnlocal: don't compact TKA state on startup
alexwlchan Apr 30, 2026
89a78dc
client/local, ipn/localapi, ipn/ipnlocal: add PeerByID
bradfitz May 1, 2026
ff9c3f0
tstest/natlab/vmtest: add test loading netmap cache from disk (#19598)
cmol May 1, 2026
4c3ed5a
all: migrate code off Notify.NetMap to Notify.SelfChange
bradfitz May 1, 2026
bbcb865
cmd/tailscale/cli: fetch netmap via current-netmap debug action
bradfitz May 1, 2026
f15a4f4
client/web: move API permission checks into handlers (#19576)
awly May 1, 2026
3ced30b
tka: clarify that this limit is on disablement *values* not *secrets*
alexwlchan May 1, 2026
ee10f98
cmd/k8s-operator: add authkey reissuing to recorder reconciler (#19556)
ChaosInTheCRD May 1, 2026
78126c5
tailcfg: add node capability for services in desktop clients (#19605)
waltzofpearls May 1, 2026
bdf3419
net/dns: add custom scheme resolvers
franbull Apr 29, 2026
290a6cc
appc, feature/conn25: handle exact and wildcard domains correctly (#1…
george-tailscale May 1, 2026
2912250
misc/git_hook: propagate shared HOOK_VERSION (#19476)
fserb May 4, 2026
ce76f44
derp/derpserver: remove global rate limiter
jwhited May 1, 2026
ca23174
licenses: update license notices
May 4, 2026
0cf8996
util/linuxfw/linuxfwtest: remove unused package (#19520)
awly May 4, 2026
9bb7ca6
cmd/vet/lowerell, drive/driveimpl: forbid variables named "l" or "I"
bradfitz May 4, 2026
81569e8
tstest/iosdeps: update import list to mirror ipn-go-bridge
bradfitz May 4, 2026
883d4fd
wgengine/netstack, net/ping: stop using pro-bing and use our net/ping…
bradfitz May 4, 2026
eac531d
cmd/tailscale/cli: unhide `--report posture` flag in `up`
alexwlchan May 5, 2026
aa21b0c
client/systray: fix recommended exit node not showing as selected (#1…
Lykathia May 5, 2026
f2d5ef7
VERSION.txt: this is v1.98.0
barnstar May 5, 2026
06a48f5
tsnet: ban awsstore and kubestore as deps in TestDeps
bradfitz May 6, 2026
bdcb71a
tsnet: make workload identity federation opt-in
bradfitz May 6, 2026
87ab419
VERSION.txt: this is v1.98.1
barnstar May 7, 2026
f13500e
go.toolchain.rev: bump to Go 1.26.3
bradfitz May 7, 2026
b192880
cmd/cloner: preserve nil-valued entries when cloning map (#19749)
fserb May 14, 2026
34c5306
VERSION.txt: this is 1.98.2 (#19751)
barnstar May 14, 2026
666f0d2
wgengine/router/osrouter: skip netfilter add-ons when chain setup fai…
fserb May 15, 2026
8f2c8d6
VERSION.txt: this is 1.98.3
barnstar May 21, 2026
49d7ad3
cmd/k8s-operator: fix token exchange for identity federation (#19845)…
davidsbond May 28, 2026
5f390d4
cmd/containerboot: clamp MSS to PMTU for proxy group pods (#19686) (#…
davidsbond May 28, 2026
a85a4ac
control/controlclient: fix deadlock in map session change queue proce…
cmol May 28, 2026
01c6b96
VERSION.txt: this is v1.98.4
nickoneill May 28, 2026
295179b
VERSION.txt: this is 1.98.5
barnstar May 29, 2026
56145e7
Merge tag 'v1.98.5' into cpierre/coreweave-v1.98.5
ChandonPierre Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .github/workflows/cigocacher.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
./tool/go build -o "${OUT}" ./cmd/cigocacher/
tar -zcf cigocacher-${{ matrix.GOOS }}-${{ matrix.GOARCH }}.tar.gz "${OUT}"

- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: cigocacher-${{ matrix.GOOS }}-${{ matrix.GOARCH }}
path: cigocacher-${{ matrix.GOOS }}-${{ matrix.GOARCH }}.tar.gz
Expand All @@ -36,7 +36,7 @@ jobs:
contents: write
steps:
- name: Download all artifacts
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: 'cigocacher-*'
merge-multiple: true
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@c793b717bc78562f491db7b0e93a3a178b099162 # v4.32.5
uses: github/codeql-action/init@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
Expand All @@ -66,7 +66,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@c793b717bc78562f491db7b0e93a3a178b099162 # v4.32.5
uses: github/codeql-action/autobuild@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1

# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
Expand All @@ -80,4 +80,4 @@ jobs:
# make release

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@c793b717bc78562f491db7b0e93a3a178b099162 # v4.32.5
uses: github/codeql-action/analyze@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
11 changes: 11 additions & 0 deletions .github/workflows/natlab-integrationtest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,23 @@ jobs:
steps:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Install qemu
run: |
sudo rm -f /var/lib/man-db/auto-update
sudo apt-get -y update
sudo apt-get -y remove man-db
sudo apt-get install -y qemu-system-x86 qemu-utils
- name: Build VM image
# The test will build this if missing, but we do it explicitly
# to avoid cutting into the go test -timeout budget, and to
# fail earlier with a clearer error if the image build breaks.
run: |
make -C gokrazy natlab
- name: Run natlab integration tests
run: |
./tool/go test -v -run=^TestEasyEasy$ -timeout=3m -count=1 ./tstest/integration/nat --run-vm-tests
2 changes: 1 addition & 1 deletion .github/workflows/request-dataplane-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Get access token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
id: generate-token
with:
# Get token for app: https://github.com/apps/change-visibility-bot
Expand Down
24 changes: 20 additions & 4 deletions .github/workflows/ssh-integrationtest.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Run the ssh integration tests with `make sshintegrationtest`.
# These tests can also be running locally.
# Run the ssh integration tests in various Docker containers.
# These tests can also be run locally via `make sshintegrationtest`.
name: "ssh-integrationtest"

concurrency:
Expand All @@ -15,9 +15,25 @@ on:
jobs:
ssh-integrationtest:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- base: "ubuntu:focal"
tag: "ssh-ubuntu-focal"
- base: "ubuntu:jammy"
tag: "ssh-ubuntu-jammy"
- base: "ubuntu:noble"
tag: "ssh-ubuntu-noble"
- base: "alpine:latest"
tag: "ssh-alpine-latest"
steps:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run SSH integration tests
- name: Build test binaries
run: |
make sshintegrationtest
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./tool/go test -tags integrationtest -c ./ssh/tailssh -o ssh/tailssh/testcontainers/tailssh.test
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./tool/go build -o ssh/tailssh/testcontainers/tailscaled ./cmd/tailscaled
- name: Run SSH integration tests (${{ matrix.base }})
run: |
docker build --build-arg="BASE=${{ matrix.base }}" -t "${{ matrix.tag }}" ssh/tailssh/testcontainers
10 changes: 5 additions & 5 deletions .github/workflows/update-flake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ jobs:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Run update-flakes
run: ./update-flake.sh
- name: Run updateflakes
run: ./tool/go run ./tool/updateflakes

- name: Get access token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
id: generate-token
with:
# Get token for app: https://github.com/apps/tailscale-code-updater
Expand All @@ -41,8 +41,8 @@ jobs:
author: Flakes Updater <noreply+flakes-updater@tailscale.com>
committer: Flakes Updater <noreply+flakes-updater@tailscale.com>
branch: flakes
commit-message: "go.mod.sri: update SRI hash for go.mod changes"
title: "go.mod.sri: update SRI hash for go.mod changes"
commit-message: "flakehashes.json: update SRI hash for go.mod changes"
title: "flakehashes.json: update SRI hash for go.mod changes"
body: Triggered by ${{ github.repository }}@${{ github.sha }}
signoff: true
delete-branch: true
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/update-webclient-prebuilt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
./tool/go mod tidy

- name: Get access token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
id: generate-token
with:
# Get token for app: https://github.com/apps/tailscale-code-updater
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/vet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,10 @@ jobs:

- name: Run 'go vet'
working-directory: src
run: ./tool/go vet -vettool=/tmp/vettool tailscale.com/...
# Use listpkgs --ignore-3p to skip tempfork/ packages, which
# intentionally match upstream and may not follow our style rules.
# Must use ./... instead of tailscale.com/... because the latter will
# include the v2 go client (tailscale.com/client/tailscale/v2) if it's
# a dependency in our go.mod file. Possibly a go vet bug, but avoid
# cross-repo vetting for now so we can safely add the dependency.
run: ./tool/go vet -vettool=/tmp/vettool $(./tool/go run ./tool/listpkgs --ignore-3p ./...)
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
# Binaries for programs and plugins
*~
*.tmp
*.exe
*.dll
*.so
*.dylib
*.spk

*.exe
# tool/go.exe is built specially and committed.
!/tool/go.exe

cmd/tailscale/tailscale
cmd/tailscaled/tailscaled
ssh/tailssh/testcontainers/tailscaled
Expand Down
6 changes: 6 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,15 @@ linters:
enable:
- bidichk
- govet
- importas
- misspell
- revive
settings:
importas:
no-unaliased: true
alias:
- pkg: github.com/tailscale/gliderssh
alias: gliderssh
# Matches what we use in corp as of 2023-12-07
govet:
enable:
Expand Down
12 changes: 7 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ vet: ## Run go vet

tidy: ## Run go mod tidy and update nix flake hashes
./tool/go mod tidy
./update-flake.sh
./tool/go run ./tool/updateflakes

lint: ## Run golangci-lint
./tool/go run github.com/golangci/golangci-lint/cmd/golangci-lint run
Expand Down Expand Up @@ -137,10 +137,12 @@ publishdevproxy: check-image-repo ## Build and publish k8s-proxy image to locati
sshintegrationtest: ## Run the SSH integration tests in various Docker containers
@GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./tool/go test -tags integrationtest -c ./ssh/tailssh -o ssh/tailssh/testcontainers/tailssh.test && \
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ./tool/go build -o ssh/tailssh/testcontainers/tailscaled ./cmd/tailscaled && \
echo "Testing on ubuntu:focal" && docker build --build-arg="BASE=ubuntu:focal" -t ssh-ubuntu-focal ssh/tailssh/testcontainers && \
echo "Testing on ubuntu:jammy" && docker build --build-arg="BASE=ubuntu:jammy" -t ssh-ubuntu-jammy ssh/tailssh/testcontainers && \
echo "Testing on ubuntu:noble" && docker build --build-arg="BASE=ubuntu:noble" -t ssh-ubuntu-noble ssh/tailssh/testcontainers && \
echo "Testing on alpine:latest" && docker build --build-arg="BASE=alpine:latest" -t ssh-alpine-latest ssh/tailssh/testcontainers
echo "Testing on ubuntu:focal, ubuntu:jammy, ubuntu:noble, alpine:latest (in parallel)" && \
docker build --build-arg="BASE=ubuntu:focal" -t ssh-ubuntu-focal ssh/tailssh/testcontainers & \
docker build --build-arg="BASE=ubuntu:jammy" -t ssh-ubuntu-jammy ssh/tailssh/testcontainers & \
docker build --build-arg="BASE=ubuntu:noble" -t ssh-ubuntu-noble ssh/tailssh/testcontainers & \
docker build --build-arg="BASE=alpine:latest" -t ssh-alpine-latest ssh/tailssh/testcontainers & \
wait

.PHONY: generate
generate: ## Generate code
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ not open source.

## Building

We always require the latest Go release, currently Go 1.25. (While we build
We always require the latest Go release, currently Go 1.26. (While we build
releases with our [Go fork](https://github.com/tailscale/go/), its use is not
required.)

Expand Down
5 changes: 3 additions & 2 deletions appc/appconnector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,7 @@ func TestRateLogger(t *testing.T) {
wasCalled = true
})

for i := 0; i < 3; i++ {
for range 3 {
clock.Advance(1 * time.Millisecond)
rl.update(0)
if wasCalled {
Expand All @@ -720,7 +720,7 @@ func TestRateLogger(t *testing.T) {
wasCalled = true
})

for i := 0; i < 3; i++ {
for range 3 {
clock.Advance(1 * time.Minute)
rl.update(0)
if wasCalled {
Expand All @@ -736,6 +736,7 @@ func TestRateLogger(t *testing.T) {
}

func TestRouteStoreMetrics(t *testing.T) {
clientmetric.ResetForTest(t)
metricStoreRoutes(1, 1)
metricStoreRoutes(1, 1) // the 1 buckets value should be 2
metricStoreRoutes(5, 5) // the 5 buckets value should be 1
Expand Down
80 changes: 66 additions & 14 deletions appc/conn25.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ package appc
import (
"cmp"
"slices"
"strings"

"tailscale.com/ipn/ipnext"
"tailscale.com/tailcfg"
"tailscale.com/types/appctype"
"tailscale.com/util/mak"
Expand All @@ -15,9 +17,46 @@ import (

const AppConnectorsExperimentalAttrName = "tailscale.com/app-connectors-experimental"

func isPeerEligibleConnector(peer tailcfg.NodeView) bool {
if !peer.Valid() || !peer.Hostinfo().Valid() {
return false
}
isConn, _ := peer.Hostinfo().AppConnector().Get()
return isConn
}

func sortByPreference(ns []tailcfg.NodeView) {
// The ordering of the nodes is semantic (callers use the first node they can
// get a peer api url for). We don't (currently 2026-02-27) have any
// preference over which node is chosen as long as it's consistent. In the
// future we anticipate integrating with traffic steering.
slices.SortFunc(ns, func(a, b tailcfg.NodeView) int {
return cmp.Compare(a.ID(), b.ID())
})
}

// PickConnector returns peers the backend knows about that match the app, in order of preference to use as
// a connector.
func PickConnector(nb ipnext.NodeBackend, app appctype.Conn25Attr) []tailcfg.NodeView {
appTagsSet := set.SetOf(app.Connectors)
matches := nb.AppendMatchingPeers(nil, func(n tailcfg.NodeView) bool {
if !isPeerEligibleConnector(n) {
return false
}
for _, t := range n.Tags().All() {
if appTagsSet.Contains(t) {
return true
}
}
return false
})
sortByPreference(matches)
return matches
}

// PickSplitDNSPeers looks at the netmap peers capabilities and finds which peers
// want to be connectors for which domains.
func PickSplitDNSPeers(hasCap func(c tailcfg.NodeCapability) bool, self tailcfg.NodeView, peers map[tailcfg.NodeID]tailcfg.NodeView) map[string][]tailcfg.NodeView {
func PickSplitDNSPeers(hasCap func(c tailcfg.NodeCapability) bool, self tailcfg.NodeView, peers map[tailcfg.NodeID]tailcfg.NodeView, isSelfEligibleConnector bool) map[string][]tailcfg.NodeView {
var m map[string][]tailcfg.NodeView
if !hasCap(AppConnectorsExperimentalAttrName) {
return m
Expand All @@ -26,25 +65,43 @@ func PickSplitDNSPeers(hasCap func(c tailcfg.NodeCapability) bool, self tailcfg.
if err != nil {
return m
}
tagToDomain := make(map[string][]string)

// We strip the leading *. from any domains because the OS treats all domains
// that we pass to it as wildcard domains, and the OS would treat the * character
// as a literal domain component instead of treating it as a wildcard.
// We also use a Set to deduplicate the domains we pass to the OS in case removing
// the *. prefix resulted in duplicate entries.
tagToDomain := make(map[string]set.Set[string])
selfTags := set.SetOf(self.Tags().AsSlice())
selfRoutedDomains := set.Set[string]{}
for _, app := range apps {
domains := make(set.Set[string])
for _, domain := range app.Domains {
domains.Add(strings.ToLower(strings.TrimPrefix(domain, "*.")))
}
for _, tag := range app.Connectors {
tagToDomain[tag] = append(tagToDomain[tag], app.Domains...)
if tagToDomain[tag] == nil {
tagToDomain[tag] = set.Set[string]{}
}
tagToDomain[tag].AddSet(domains)
if isSelfEligibleConnector && selfTags.Contains(tag) {
selfRoutedDomains.AddSet(domains)
}
}
}
// NodeIDs are Comparable, and we have a map of NodeID to NodeView anyway, so
// use a Set of NodeIDs to deduplicate, and populate into a []NodeView later.
var work map[string]set.Set[tailcfg.NodeID]
for _, peer := range peers {
if !peer.Valid() || !peer.Hostinfo().Valid() {
continue
}
if isConn, _ := peer.Hostinfo().AppConnector().Get(); !isConn {
if !isPeerEligibleConnector(peer) {
continue
}
for _, t := range peer.Tags().All() {
domains := tagToDomain[t]
for _, domain := range domains {
for domain := range domains {
if selfRoutedDomains.Contains(domain) {
continue
}
if work[domain] == nil {
mak.Set(&work, domain, set.Set[tailcfg.NodeID]{})
}
Expand All @@ -60,12 +117,7 @@ func PickSplitDNSPeers(hasCap func(c tailcfg.NodeCapability) bool, self tailcfg.
for id := range ids {
nodes = append(nodes, peers[id])
}
// The ordering of the nodes in the map vals is semantic (dnsConfigForNetmap uses the first node it can
// get a peer api url for as its split dns target). We can think of it as a preference order, except that
// we don't (currently 2026-01-14) have any preference over which node is chosen.
slices.SortFunc(nodes, func(a, b tailcfg.NodeView) int {
return cmp.Compare(a.ID(), b.ID())
})
sortByPreference(nodes)
mak.Set(&m, domain, nodes)
}
return m
Expand Down
Loading
Loading