Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
498 commits
Select commit Hold shift + click to select a range
b7422fa
.gitattributes: explicitly mark text files as such with eol
raggi Jun 22, 2026
badd0c4
wgengine/magicsock: consider VNI as part of peer relay handshake supp…
jwhited Jun 23, 2026
e9ae398
wgengine: drop userspaceEngine.peerSequence
bradfitz Jun 23, 2026
d4f2917
wgengine, ipn/ipnlocal: route PeerForIP through LocalBackend's live data
bradfitz Jun 23, 2026
c33a557
ipn/ipnlocal: reduce excessive logging of exit node suggestions (#20237)
amalscale Jun 24, 2026
281404e
cmd/tailscale/cli: fix capitalisation of flags
alexwlchan Jun 24, 2026
0bc0cb8
tstest/natlab/vmtest: retry SSHExec on transient SSH failures
bradfitz Jun 24, 2026
8dde9b7
tstest/natlab/vmtest: serialize ensureDebugSSHKey across parallel boots
bradfitz Jun 24, 2026
aefb153
net/tsdial, ipn/ipnlocal: stop using netmap.NetworkMap in Dialer
bradfitz Jun 24, 2026
453c078
.github: add zizmor GitHub Actions linting (#20243)
patrickod Jun 24, 2026
77d2c87
wgengine/router/osrouter,util/linuxfw: remove orphaned tailnet addrs …
bcreane Jun 24, 2026
1b2062f
net/tstun: invoke conn25 app connector hook on injected reads
mzbenami Jun 23, 2026
87cb2a8
wgengine: replace Engine.SetNetworkMap with SetSelfNode
bradfitz Jun 24, 2026
dd1df38
ipn/ipnlocal: pass capability set, not netmap, to two helpers
bradfitz Jun 24, 2026
9f92a47
util/cmpver: add a test for comparing three-digit versions
alexwlchan Jun 24, 2026
6e1de5b
cmd/containerboot: refresh DNS config on SelfChange (#20236)
ChaosInTheCRD Jun 25, 2026
9169b20
Revert "control/controlclient: continue map poll during key expiry to…
alexwlchan Jun 25, 2026
2fbd308
tailcfg,net/routecheck: add NodeAttrClientSideReachabilityRouteCheck …
sfllaw Jun 26, 2026
6fc5290
tool/gocross: retry downloading Go three times
alexwlchan Jun 26, 2026
af999f0
k8s-operator/dnsrecords: fix dnsRR dropping reconcile events on lock …
Briansbum Jun 26, 2026
e21fd6b
ipn/ipnlocal: add webclient support for tvOS (#20256)
barnstar Jun 26, 2026
8379d59
ipn: remove the last traces of Prefs.AllowSingleHosts
alexwlchan Jun 26, 2026
f5eac39
feature/acme, ipn/ipnlocal: start moving ACME/cert state into an exte…
bradfitz Jun 25, 2026
a95119a
CODEOWNERS,.policy.yml: replace CODEOWNERS with a policy-bot policy
bradfitz Jun 25, 2026
79e3bbb
.policy.yml: tweak policy after testing
bradfitz Jun 26, 2026
b64209b
ipn/config: add RelayServerPort and RelayServerStaticEndpoints to con…
Jun 26, 2026
97e7ea8
go.mod,tsnet,tstest/natlab/vmtest: bump prometheus/common to v0.69.0
bradfitz Jun 26, 2026
5bd5266
.github,.policy-tests.yml: test .policy.yml in CI
bradfitz Jun 26, 2026
1c0e833
ipn/ipnlocal: normalize IPv6-mapped IPv4 addrs in WhoIs
bouk Jun 24, 2026
4bb6f35
ipn/ipnlocal: consolidate test-only LocalBackend methods behind ForTest
bradfitz Jun 27, 2026
5ebc749
tsnet: link in feature/acme by default
bradfitz Jun 29, 2026
28e1320
wgengine/magicsock: fix warnings about nil health.Tracker (#20264)
sfllaw Jun 29, 2026
825b7c4
wgengine/magicsock: fix data race in TestNetworkSendErrors (#20261)
sfllaw Jun 29, 2026
1c77079
ipn/ipnlocal, feature/acme: move most remaining cert code into featur…
bradfitz Jun 27, 2026
477d5a4
ipn/ipnlocal, feature/conn25: add hook for accepting PeerAPI DNS
sailorfrag Jun 29, 2026
ec6e598
kube/certs: widen runCertLoop per-call timeout to 30m (#20289)
ChaosInTheCRD Jun 30, 2026
8b5060f
ipn/ipnlocal: sort profiles by date created when possible (#20223)
willh-ts Jun 30, 2026
66af257
tstest/natlab/vmtest, client/web: add web client integration tests
bradfitz Jun 29, 2026
fad8b9b
clientupdate, cmd/tailscale: verify signed GAFs, wire up tailscale up…
bradfitz Jun 29, 2026
07cefc0
ipn/{ipn,ipnlocal}: add per-user policy snapshots to IPN bus (#20135)
kari-ts Jun 30, 2026
b6e17df
cmd/tailscaled, util/syspolicy: add JSON syspolicy file support
bradfitz Jun 30, 2026
b228748
feature/conn25: return expired addrs from index lookups
franbull Jun 29, 2026
85d8644
feature/conn25: keep mappings with active flows
franbull Jun 29, 2026
64422f2
kube/certs: use Let's Encrypt's recommended retry schedule (#20292)
ChaosInTheCRD Jul 1, 2026
d0fcb66
cmd/tailscale/cli: add 'tailscale configure flash-appliance'
bradfitz Jun 30, 2026
a8f3c86
util/progresstracking: add Ticker, NewWriter, and CountingWriter
bradfitz Jul 1, 2026
df40abc
ipn/ipnlocal: fix reporting of active ipnext extensions
nickkhyl Jul 1, 2026
f96db5e
go.mod: update ts-gokrazy for local dev workflow
bradfitz Jul 1, 2026
c57b917
gokrazy/gafpush, Makefile: add OTA push tool for appliance development
bradfitz Jul 1, 2026
6ab63e9
cmd/tailscale/cli: add service list command
adrianosela Jun 17, 2026
4c22d22
cmd/fbstatus: add framebuffer status display for the Tailscale appliance
bradfitz Jul 1, 2026
76eece2
gokrazy, Makefile: improve appliance build tooling
bradfitz Jul 1, 2026
b727675
feature/conn25: allow ICMP packets
franbull Jul 2, 2026
10672a6
net/dns: support global resolvers in macOS tailscaled
maisem Jun 29, 2026
9013b6e
net/dns: simplify split DNS compile path
maisem Jun 29, 2026
74235b4
licenses: update license notices
Jun 29, 2026
52fdadb
wgengine/netstack: accept IPv4 fragments before reassembly
bradfitz Jul 2, 2026
7b2432a
net/routecheck: tweak routecheck documentation and coding style
sfllaw Jun 24, 2026
8d83059
ipn/ipnstate,tailcfg: define IsRouter for PeerStatus and Node
sfllaw Jun 13, 2026
d8ee47d
ipn/ipnext, feature/routecheck: subscribe routecheck to the IPN bus
sfllaw Jun 10, 2026
cb7e536
feature/routecheck,ipn/routecheck: probe reachability in the background
sfllaw Apr 24, 2026
9322605
ipn/ipnlocal: use routecheck reports to make exit node suggestions
sfllaw Apr 24, 2026
ca91eaf
cmd/tailscale/cli: add `tailscale exit-node suggest --force-probe`
sfllaw May 6, 2026
5cbe32e
cmd/tailscale/cli/jsonoutput: add support for --format=json
sfllaw Jun 29, 2026
be16cc0
cmd/tailscale/cli/jsonoutput: extract routecheck’s output format
sfllaw Jun 1, 2026
72c2266
util/winutil: fix a typo where we repeat we repeat ourselves
alexwlchan Jul 3, 2026
b838d5c
all: fix typos where we repeat repeat ourselves
alexwlchan Jul 3, 2026
943b97e
wgengine/magicsock: skip sendDiscoPingsLocked when TS_DEBUG_NEVER_DIR…
illotum Jul 3, 2026
3d52c3f
all: fix more typos caused by unnecessary repetition
alexwlchan Jul 6, 2026
2051c5f
wgengine,util/execqueue: wait for in-flight linkChange before closing
Adel-Ayoub Jul 6, 2026
c1ae2bb
cmd/tailscale, ipn, feature/remoteconfig: add remote-config support
bradfitz Jul 6, 2026
887005d
cmd/tailscale: add 'configure pve-appliance' to make Proxmox VM of ap…
bradfitz Jul 6, 2026
9106b23
cmd/tailscale/cli: fix nil dereference in configure kubeconfig (#20324)
larrasket Jul 8, 2026
87b3d7b
ipn/localapi,client/local: honour Retry-After on cert rate-limit (#20…
ChaosInTheCRD Jul 8, 2026
384e776
cmd/k8s-operator: ensure EndpointSlices exist on every egress reconci…
BeckyPauley Jul 8, 2026
63efd06
licenses: update license notices
Jul 6, 2026
70244f4
go.mod: bump Go to 1.26.5
patrickod Jul 8, 2026
69ee776
feature/acme: lock ACME per-domain instead of globally (#20303)
ChaosInTheCRD Jul 9, 2026
b7de175
wgengine/wgcfg: remove unused Config DNS and MTU fields
bradfitz Jul 9, 2026
692f84d
wgengine,wgcfg,feature/netlog: move network flow logging behind a fea…
bradfitz Jul 9, 2026
7965d49
feature: add README explaining the modular feature system
bradfitz Jul 9, 2026
ca9f697
go.mod: Update vulnerable dependencies (#20388)
jentfoo Jul 9, 2026
ac84eb4
ipn/ipnlocal: pass self node view to reconfigAppConnectorLocked
bradfitz Jul 8, 2026
b3d0ebc
ipn/ipnlocal: only send AllowsUpdate if clientupdate feature is linke…
bradfitz Jul 10, 2026
6fdffd9
go.mod: bump github.com/studio-b12/gowebdav
bradfitz Jul 10, 2026
16f600d
ipn/conf: add ConfigVAlpha.AdvertiseExitNode
scientificworld Jun 2, 2026
0e79b32
tsweb/varz: add node_boot_time_seconds expvar
bradfitz Jul 10, 2026
3872880
cmd/cloner: handle named slices as map values (#20387)
awly Jul 10, 2026
7771ce4
wgengine/magicsock: delete Conn.UpdatePeers, derive peer state intern…
bradfitz Jul 9, 2026
a68be19
wgengine/netstack: reject unserved ports on Service (VIP) IPs (#20363)
KevinLiang10 Jul 10, 2026
2b62cb5
net/dns, util/winutil: improve detection of group policy affecting NRPT
dblohm7 Jul 9, 2026
66a51c4
cmd: apply go fix
adrianosela Jul 10, 2026
045c979
docs: add CLI evolution guidelines
raggi Jun 8, 2026
a5102d3
net/routemanager: add incremental route manager
bradfitz Jul 9, 2026
d69bf26
all: apply go fix
adrianosela Jul 10, 2026
296f6c1
ipn/ipnlocal: index peers by stable node ID
bradfitz Jul 11, 2026
125fd88
tstest/natlab: fix vnet TCP throughput collapse to slow guests
bradfitz Jul 13, 2026
505330d
Revert "go.mod: Update vulnerable dependencies (#20388)" (#20420)
fserb Jul 13, 2026
18a9539
ipn/ipnlocal: shut down old control client before starting new one
bradfitz Jul 12, 2026
ce050f1
ipn/ipnlocal: test the unresolved-exit-node blackhole routes
bradfitz Jul 13, 2026
ff1c7ef
ipn/ipnlocal,net/routemanager: keep a routemanager.RouteManager updat…
bradfitz Jul 8, 2026
f831469
wgengine,ipn/ipnlocal: sync wireguard-go peers incrementally on netma…
bradfitz Jul 8, 2026
3c800dc
.github/workflows: fix natlab test discovery with fully-excluded files
bradfitz Jul 13, 2026
2506ede
wgengine,ipn/ipnlocal: remove Engine.PeerKeyForIP and the engine's pe…
bradfitz Jul 9, 2026
c436dec
tstest, cmd/tta: add Tailscale SSH end-to-end VM test
bradfitz Jul 13, 2026
9cb1147
wgengine,ipn/ipnlocal,tsnet,cmd/tailscaled: remove PeerForIP from the…
bradfitz Jul 9, 2026
b803ba0
ipn/ipnlocal: update getServeHandler path handling on malformed url (…
KevinLiang10 Jul 13, 2026
55b1a4d
net/netcheck: don't mutate Client.TimeNow in AddReportHistoryForTest
bradfitz Jul 13, 2026
8eb18d9
net/dns/publicdns: use Control D anycast IPs for premium DoH (#20434)
bcreane Jul 13, 2026
318807b
ipn/ipnlocal: derive the OS routes from the route manager
bradfitz Jul 9, 2026
d9aeaa5
ipn/conffile: add ErrNoConfig for absent config sources
kradalby Jul 3, 2026
758c28f
cmd/tailscaled: allow "optional:" prefix on -config
kradalby Jul 3, 2026
5e09723
gokrazy: read config from EC2 user-data on the appliance
kradalby Jul 3, 2026
e212b07
gokrazy: register appliance AMIs as HVM
kradalby Jul 3, 2026
f9cd687
flake.nix: add awscli2 for building the appliance AMI
kradalby Jul 3, 2026
58fcaaf
ipn/conf: support RemoteConfig in the config file
kradalby Jul 9, 2026
236564a
cmd/k8s-operator: reorder Ingress cleanup so cert loop stops before V…
ChaosInTheCRD Jul 14, 2026
9711883
kube/certs: honour Retry-After and skip escalation on transient error…
ChaosInTheCRD Jul 14, 2026
6ee7bcb
cmd/{k8s-operator,containerboot,kube}: support IPv6 in egress Proxy…
BeckyPauley Jul 14, 2026
7e62ead
cmd/testwrapper: add a max retry time across all failures (#20453)
tomhjp Jul 14, 2026
911c5e5
gokrazy: add --json output, --region pinning, git-derived AMI names
kradalby Jul 13, 2026
aff605d
ipn/ipnlocal,wgengine: move disco-key change detection to nodeBackend
bradfitz Jul 9, 2026
6a635c4
ipn/ipnlocal: route extra WireGuard AllowedIPs through the route manager
bradfitz Jul 9, 2026
7e609b2
ipn/ipnlocal,net/dns/resolver: serve MagicDNS names from live indexes
bradfitz Jul 11, 2026
8bc4c09
tstest/natlab: add FreeBSD test case for SSH test
mpminardi Jul 14, 2026
468a7f4
go.mod: update vulnerable dependencies (#20435)
jentfoo Jul 14, 2026
c9b5a91
feature/conn25: add client metrics for dns response rewrite errors an…
mzbenami Jul 7, 2026
9bd6268
go.mod: revert update vulnerable dependencies (#20435) (#20456)
jentfoo Jul 14, 2026
3d07b5d
wgengine,cmd/tailscaled,feature/bird: move BIRD integration to ./feature
bradfitz Jul 10, 2026
0c4dcbd
ipn/ipnlocal: replace magicDNSAddrs bool params with a flags type
bradfitz Jul 14, 2026
9d01b03
tstest/natlab/vmtest: test jailed and masqueraded peers end-to-end
bradfitz Jul 14, 2026
e414423
util/osuser: reject leading dashes in usernames
mpminardi Jul 13, 2026
f0ce89b
net/tstun,wgengine,ipn/ipnlocal: make tstun's peerConfigTable use Rou…
bradfitz Jul 9, 2026
87c0d36
net/routemanager,ipn/ipnlocal: name the changed-allowed-IPs map type
bradfitz Jul 14, 2026
72ca0ca
wgengine/wgcfg,wgengine,ipn/ipnlocal: remove Peers from wgcfg.Config
bradfitz Jul 9, 2026
bb4f458
feature/captiveportal: move captive portal code out of ipnlocal, netc…
bradfitz Jul 10, 2026
7653a1e
gokrazy: split build.go into thin main + reusable build package
kradalby Jul 14, 2026
b049ce7
gokrazy/build: show import-snapshot progress, quiet in CI
kradalby Jul 15, 2026
a7f3e08
gokrazy/build: use AWS SDK instead of shelling out to aws CLI
kradalby Jul 15, 2026
720cd0a
all: regenerate dep manifests for aws-sdk-go-v2/service/ec2
kradalby Jul 15, 2026
a534ad5
gokrazy/build: expose AMI pipeline as composable steps
kradalby Jul 15, 2026
f68e4d9
cmd/tailscale/cli: fix plain TCP serve status
coyaSONG Jul 14, 2026
3515b00
ipn/ipnext, ipn/ipnlocal, feature/conn25: pass peer seq to AllowedIPs…
bradfitz Jul 15, 2026
4660a96
ipn/ipnlocal, wgengine/wgcfg/nmcfg: stop building peer lists on delta…
bradfitz Jul 15, 2026
0fb8226
gokrazy, tstest, cmd/vnet: switch amd64 kernel to gokrazy/kernel.amd64
bradfitz Jul 15, 2026
0bae201
tstest/natlab: split SSH test into separate tests
mpminardi Jul 14, 2026
65fd320
ipn/ipnlocal: use the live peer map, not the netmap's stale Peers slice
bradfitz Jul 15, 2026
168b20d
ipn/ipnlocal: remove android from goosGetsLegacyNetmapNotify
bradfitz Jul 15, 2026
6bf05cb
ipn, ipn/ipnlocal: remove darwin & ios from goosGetsLegacyNetmapNotify
bradfitz Jul 15, 2026
bef2cd8
.github, tstest/natlab/vmtest: replace old VM runner job with natlab …
bradfitz Jul 15, 2026
bf7d815
derp/derpserver,cmd/derper: don't mutate cert provider's shared tls.C…
mikeodr Jul 15, 2026
71b90de
derp/derpserver,cmd/derper: use slices.Clip for cert chain copies (#2…
mikeodr Jul 16, 2026
38345dc
.github: double the timeout for `go vet` in CI
alexwlchan Jul 16, 2026
50f1c28
ipn/ipnlocal,cmd/tailscale/cli: support unix socket targets for TCP s…
ayanamist May 10, 2026
6a2aa68
go.mod: bump wireguard-go for priority msg callback
jwhited Jul 15, 2026
71e5a98
Update tailscale/gliderssh to pull in tailscale/gliderssh#12 (#20485)
jentfoo Jul 16, 2026
b2de420
feature/conn25,types/appctype: serve active Conn25 state over localapi
mzbenami Jul 13, 2026
cfd101f
configure DNS even when router.Set fails (#20488)
bcreane Jul 16, 2026
7ec9b7f
feature/conn25: preserve TTL on DNS rewrites
mzbenami Jul 16, 2026
94381a1
disco: fix UDPRelayEndpoint.AddrPorts slice cap math
jwhited Jul 16, 2026
3076698
net/packet: fix TSMPType docs
jwhited Jul 17, 2026
cc0b3dd
net/packet: add TSMPType docs
jwhited Jul 17, 2026
c1edf7f
wgengine/router/osrouter: sanitize interfaceV6UsableForTun path with …
bcreane Jul 17, 2026
82a381e
control/controlclient,net/tstun,wgengine/magicsock: fix handling of z…
cmol Jul 17, 2026
9175fe2
net/tstun: drop TSMP messages injected into TUN (#20511)
cmol Jul 17, 2026
11a6255
scripts/installer.sh: remove an unused PACKAGE_NAME variable
alexwlchan Jul 17, 2026
def2650
tstest/integration: run a smoke test against a Windows tailscaled ser…
yaruk-byte Jul 17, 2026
0433cc6
feature/syslog, cmd/tailscaled, logpolicy: add optional --syslog flag
bradfitz Jul 17, 2026
bab3f5f
wgengine/router/osrouter: remove orphaned tailnet addrs on cleanup (#…
bcreane Jul 17, 2026
689c6c2
ipn/ipnlocal: reject SrcCaps-based packet filter rules for unsigned p…
jentfoo Jul 17, 2026
d2af6a4
net/dns/publicdns: don't upgrade Control D port-53-only addresses to …
bcreane Jul 17, 2026
b91e844
util/def,cmd/containerboot: add LookupEnv, simplify env parsing (#20277)
nicholasrossi0530 Jul 18, 2026
7be0054
words: redress historical wrongs against the tuatara
bradfitz Jul 18, 2026
ece1b12
cmd/tsconnect/wasm: don't return non-nil net.Conn interface on dial e…
bradfitz Jul 19, 2026
82cfea9
all: fix JSON serialization under Go 1.27's finalized encoding/json/v2
bradfitz Jul 19, 2026
f65372c
net/bakedroots: add LetsEncrypt Generation Y roots (YE, YR)
bradfitz Jul 20, 2026
8df4816
net/packet: generate ICMP destination unreachable packets
franbull Jul 17, 2026
37e175a
feature/conn25: send ICMP errors back to sources
franbull Jul 17, 2026
246c82a
derp, wgengine: let clients advertise an opaque app name to DERP servers
bradfitz Jul 19, 2026
2dd5d82
tsnet: fix data race in chanTUN test device
bradfitz Jul 20, 2026
be0e460
cmd/k8s-operator,k8s-operator: Kubernetes Peer Relays (#20495)
davidsbond Jul 20, 2026
b14f7b7
wgengine/magicsock: properly clean up peer disco maps (#20543)
cmol Jul 20, 2026
172124d
client/local, ipn, tailcfg: document which LocalAPI client APIs are s…
bradfitz Jul 11, 2026
de0553b
util/httpm: exempt tempfork from TestUsedConsistently
bradfitz Jul 20, 2026
a84a264
tempfork/acme: sync with tailscale/golang-x-crypto, add profiles support
bradfitz Jul 20, 2026
c130a9b
licenses: update license notices
Jul 20, 2026
a7cb574
tstest/natlab/vmtest: add Fedora + DNS-backend coverage, harden non-K…
bcreane Jul 20, 2026
4ad1243
util/testenv: add ArtifactDir, Attr, Output methods to TB
bradfitz Jul 21, 2026
425a916
ipn/ipnlocal: check WIP env var before doing conn25
franbull Jul 21, 2026
d117578
cmd/tailscale/cli: remove wip-code gate for service list cmd
adrianosela Jul 21, 2026
3ccc772
tstest, util/testenv: drop tstest's dependency on the testing package
bradfitz Jul 21, 2026
c8ae72b
various: change OAuth and WIF auth key resolvers to take struct args
mpminardi Jul 21, 2026
745bb85
go.mod: require tailscale/breakglass fork for tsapp
kradalby Jul 22, 2026
1d82c1b
gokrazy/tsapp: lock down breakglass access
kradalby Jul 22, 2026
0eb38dc
ipn,magicsock: deny peer capabilities to unsigned peers (#20561)
jentfoo Jul 22, 2026
a19f8f2
gokrazy/tsapp: revert breakglass access lockdown
kradalby Jul 22, 2026
c802c3f
go.mod: revert tailscale/breakglass fork require
kradalby Jul 22, 2026
2820b5e
feature/conn25: rename localapi.go to api.go
mzbenami Jul 21, 2026
8f89d4f
feature/conn25: rename LocalAPI endpoint to conn25/state
mzbenami Jul 21, 2026
4d846b5
feature/conn25: add and register c2n handler for /conn25/state
mzbenami Jul 21, 2026
1a14668
feature/acme: trim trailing dot from domain before cert lookup
larrasket Jul 22, 2026
fdd81c6
go.mod: bump some deps to match corp
bradfitz Jul 22, 2026
5384d23
cmd/derper: add opt-in support for LetsEncrypt IP address certificates
bradfitz Jul 20, 2026
840c6e3
net/netutil: confine ipForwardingEnabledLinux read with os.OpenInRoot
basavaraj-sm05 Jul 22, 2026
b3c259b
net/netutil: add test coverage for ipForwardingEnabledLinux per-inter…
bradfitz Jul 22, 2026
66bb4ac
go.mod,cmd/cigocacher: make PUTs async (#20578)
tomhjp Jul 22, 2026
f4978b4
feature,client: add serviceclientprefs for desktop client service lau…
waltzofpearls Jul 23, 2026
35283c9
VERSION.txt: this is v1.102.0
nickoneill Jul 23, 2026
beac1b0
cmd/k8s-operator: include peer relay CRD in generation (#20593) (#20595)
davidsbond Jul 24, 2026
4176f4b
ipn/ipnlocal: evict stale node indexes when a delta upsert replaces a…
bradfitz Jul 28, 2026
e74b77f
drive/driveimpl: handle Unicode normalization mismatches in filenames
bradfitz Jul 17, 2026
27b2410
k8s-operator/sessionrecording/ws: handle frame headers split across r…
bradfitz Jul 28, 2026
b49f9b7
cmd/containerboot: return context error when canceled during tailscal…
bradfitz Jul 25, 2026
74d526a
util/syspolicy/source: fix data race between Reader.Close and reload
bradfitz Jul 27, 2026
d9946f5
ssh/tailssh: check if user matching autogroup:nonroot is root
mpminardi Jul 24, 2026
d718795
net/netmon: report disappeared interface IPs (#20621)
cyphercodes Jul 28, 2026
4f06120
net/dns/resolver: bound negative caching with SOA records, lower posi…
bradfitz Jul 28, 2026
7436983
client/systray: fix crash when suggested exit node has no location
bradfitz Jul 30, 2026
fc983df
ssh/tailssh: keep acceptEnv values and names out of the incubator cmd…
jentfoo Jul 30, 2026
e82916d
.github/workflows: enforce cherry-pick -x markers on release branch PRs
bradfitz Jul 30, 2026
3fb8eda
VERSION.txt: this is v1.102.1
nickoneill Jul 31, 2026
3dc29a5
ipn/ipnlocal: allow the ingress peer capability for unsigned peers (#…
bcreane Aug 4, 2026
eb67e5d
VERISON.txt: this is v1.102.2
nickoneill Aug 4, 2026
7dc695f
ipn/ipnlocal,net/dns/resolver: prevent bare name resolution when Magi…
nickkhyl Aug 10, 2026
56ed894
feature/conn25: don't pre-size flow table maps
raggi Aug 11, 2026
55243e0
k8s-operator: make PeerRelay endpoints reachable on EKS by default (#…
davidsbond Aug 13, 2026
1775f5d
tka/sync: add regression test for compacted nodes on forked chains
alexwlchan Jul 24, 2026
a74839f
tka/sync: improve the signature of SeedAUMs
alexwlchan Jul 24, 2026
0a57957
tka: avoid quadratic filesystem scans
terrorobe Aug 12, 2026
9450a18
tka: remove test cases for sync from far behind
alexwlchan Aug 13, 2026
a91c7f7
net/dns: only attempt registry changes on address families that are a…
dblohm7 Aug 13, 2026
73516b2
go.mod: update to Go 1.26.6 (#20863)
patrickod Aug 14, 2026
a7dd85c
feature/acme: only allow one async renewal at a time
alexwlchan Aug 12, 2026
926f3e2
cmd/containerboot: make the boot map-response timeout configurable (#…
ChaosInTheCRD Aug 19, 2026
88aa2c6
wgengine/netstack: block 4via6 forwards to host-scoped targets (#2086…
jentfoo Aug 19, 2026
53a0d65
VERSION.txt: this is v1.102.3
nickoneill Aug 19, 2026
80f188f
envknob: add SetenvForTest helper for safe environment variable handling
alexwlchan Aug 19, 2026
14449d9
[release-branch] fix various netmap delta bugs (#21121)
bradfitz Sep 8, 2026
5fa17eb
cmd/k8s-operator: watch ProxyGroups for HA Services with a Service ha…
ChaosInTheCRD Aug 21, 2026
bbcd7d1
VERSION.txt: this is v1.102.4
nickoneill Sep 10, 2026
e494389
cmd/k8s-operator: recover missing egress EndpointSlices (#21174) (#21…
BeckyPauley Sep 21, 2026
8ed909c
cmd/containerboot: recover from IPN watch closure (#21374) (#21431)
davidsbond Sep 23, 2026
93eeec1
fuzz: wire fuzzing to a standalone oss-fuzz script (#20862) (#21458)
cmol Sep 24, 2026
8810957
wgengine/netstack: avoid returning from sender goroutines on error (#…
cmol Sep 24, 2026
d93ea83
Revert "wgengine/netstack: avoid returning from sender goroutines on …
nickoneill Sep 24, 2026
8e2c58d
Revert "fuzz: wire fuzzing to a standalone oss-fuzz script (#20862) (…
nickoneill Sep 24, 2026
4c853e6
Revert "cmd/k8s-operator: recover missing egress EndpointSlices (#211…
nickoneill Sep 24, 2026
f6d1f5e
VERSION.txt: this is 1.102.5
nickoneill Sep 24, 2026
5fb2a81
Merge pull request #21469 from tailscale/nick/1.102.5-prep
nickoneill Sep 24, 2026
8838e0c
Merge tag 'v1.102.5' into cpierre/coreweave-v1.102.5
ChandonPierre Sep 26, 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
  •  
  •  
  •  
62 changes: 60 additions & 2 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,60 @@
go.mod filter=go-mod
*.go diff=golang
go.mod filter=go-mod eol=lf text
*.go diff=golang eol=lf text
*.adml eol=lf text
*.admx eol=lf text
*.bash eol=lf text
*.c eol=lf text
*.cgi eol=lf text
*.conf eol=lf text
*.css eol=lf text
*.csv eol=lf text
*.desktop eol=lf text
*.fish eol=lf text
*.gitattributes eol=lf text
*.gitignore eol=lf text
*.gitkeep eol=lf text
*.go eol=lf text
*.h eol=lf text
*.helmignore eol=lf text
*.htaccess eol=lf text
*.html eol=lf text
*.hujson eol=lf text
*.in eol=lf text
*.init eol=lf text
*.js eol=lf text
*.json eol=lf text
*.lock eol=lf text
*.lua eol=lf text
*.md eol=lf text
*.mod eol=lf text
*.nix eol=lf text
*.openrc eol=lf text
*.pbxproj eol=lf text
*.pem eol=lf text
*.plg eol=lf text
*.plist eol=lf text
*.rc eol=lf text
*.resolved eol=lf text
*.rev eol=lf text
*.rs eol=lf text
*.sc eol=lf text
*.service eol=lf text
*.sh eol=lf text
*.socket eol=lf text
*.stignore eol=lf text
*.sum eol=lf text
*.svg eol=lf text
*.swift eol=lf text
*.tmpl eol=lf text
*.toml eol=lf text
*.ts eol=lf text
*.tsx eol=lf text
*.txt eol=lf text
*.version eol=lf text
*.xcscheme eol=lf text
*.xcsettings eol=lf text
*.xib eol=lf text
*.xml eol=lf text
*.yaml eol=lf text
*.yml eol=lf text
*.zsh eol=lf text
61 changes: 61 additions & 0 deletions .github/workflows/check-cherry-picks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: check-cherry-picks

on:
pull_request:
branches:
- "release-branch/*"
types:
- opened
- synchronize
- reopened
- labeled
- unlabeled

permissions:
contents: read

jobs:
check:
runs-on: ubuntu-24.04
timeout-minutes: 5
# Company policy requires that all cherry-picks onto release
# branches be made with "git cherry-pick -x" so the commit message
# records the original commit. Commits that are intentionally not
# cherry-picks (version bumps, release-only fixes) can be exempted
# by adding the "not-a-cherry-pick" label to the PR.
if: ${{ !contains(github.event.pull_request.labels.*.name, 'not-a-cherry-pick') }}

steps:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
# Full history so that both the PR commits and origin/main
# are available for the ancestry check below.
fetch-depth: 0
persist-credentials: false

- name: Check commits for cherry-pick markers
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
set -euo pipefail
failed=0
for commit in $(git rev-list --no-merges "$BASE_SHA".."$HEAD_SHA"); do
subject=$(git log -1 --format=%s "$commit")
orig=$(git log -1 --format=%B "$commit" |
sed -ne 's/^(cherry picked from commit \([0-9a-f]\{40\}\))$/\1/p' |
tail -n1)
if [ -z "$orig" ]; then
echo "::error::Commit $commit (\"$subject\") is missing a \"(cherry picked from commit ...)\" line."
failed=1
elif ! git merge-base --is-ancestor "$orig" origin/main 2>/dev/null; then
echo "::error::Commit $commit (\"$subject\") says it was cherry-picked from $orig, but that commit is not on main."
failed=1
fi
done
if [ "$failed" -ne 0 ]; then
echo "Cherry-picks onto release branches must be made with \"git cherry-pick -x\"."
echo "If this PR is intentionally not a cherry-pick, add the \"not-a-cherry-pick\" label."
exit 1
fi
2 changes: 1 addition & 1 deletion .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:

# Install a more recent Go that understands modern go.mod content.
- name: Install Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # zizmor: ignore[cache-poisoning] v6.3.0
with:
go-version-file: go.mod

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/govulncheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Install govulncheck
run: ./tool/go install golang.org/x/vuln/cmd/govulncheck@latest
run: ./tool/go install golang.org/x/vuln/cmd/govulncheck@0782b76014f15f24e22a438f30f308df42899ba1 # 1.3.0

- name: Scan source code for known vulnerabilities
run: PATH=$PWD/tool/:$PATH "$(./tool/go env GOPATH)/bin/govulncheck" -test ./...
Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/installer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ jobs:
- "elementary/docker:stable"
- "elementary/docker:unstable"
- "parrotsec/core:latest"
- "kalilinux/kali-rolling"
- "kalilinux/kali-dev"
- "oraclelinux:9"
- "oraclelinux:8"
- "fedora:latest"
Expand All @@ -61,14 +59,17 @@ jobs:
- { image: "debian:stable-slim", deps: "curl" }
- { image: "ubuntu:24.04", deps: "curl" }
- { image: "fedora:latest", deps: "curl" }
# Kali doesn't have ca-certificates installed by default anymore
- { image: "kalilinux/kali-dev", "deps": "curl ca-certificates"}
- { image: "kalilinux/kali-rolling", "deps": "curl ca-certificates"}
# Test TAILSCALE_VERSION pinning on a subset of distros.
# Skip Alpine as community repos don't reliably keep old versions.
- { image: "debian:stable-slim", deps: "curl", version: "1.80.0" }
- { image: "ubuntu:24.04", deps: "curl", version: "1.80.0" }
- { image: "fedora:latest", deps: "curl", version: "1.80.0" }
runs-on: ubuntu-latest
container:
image: ${{ matrix.image }}
image: ${{ matrix.image }} # zizmor: ignore[unpinned-images]
options: --user root
steps:
- name: install dependencies (pacman)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Run some natlab integration tests.
# Run a single natlab smoke test on every PR. The full natlab suite
# is opt-in and lives in .github/workflows/natlab-test.yml.
# See https://github.com/tailscale/tailscale/issues/13038
name: "natlab-integrationtest"
name: "natlab-basic"

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
Expand All @@ -17,7 +18,7 @@ on:
branches:
- "main"
jobs:
natlab-integrationtest:
EasyEasy:
runs-on: ubuntu-latest
steps:
- name: Check out code
Expand All @@ -41,4 +42,4 @@ jobs:
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
./tool/go test -v -run=^TestEasyEasy$ -timeout=3m -count=1 ./tstest/natlab/vmtest --run-vm-tests
182 changes: 182 additions & 0 deletions .github/workflows/natlab-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# Run the full natlab/vmtest opt-in test suite. These tests boot QEMU VMs
# (gokrazy, Ubuntu, FreeBSD) and exercise vnet-driven networking scenarios.
# They are gated behind --run-vm-tests because they need KVM and are slow.
#
# This workflow runs:
# - on demand (workflow_dispatch)
# - on PRs that carry the "run-natlab-tests" label
# - on main, every 12 hours, via cron
#
# Layout:
# - "prepare" builds the gokrazy VM image, downloads the cloud images
# (Ubuntu, FreeBSD), and discovers every Test* function in the two
# opt-in packages.
# - "test" is a per-TestFoo matrix that depends on prepare. Each matrix
# job restores the shared caches and runs a single test. Adding a new
# TestFoo automatically gets its own job — no workflow edits needed.
#
# A separate workflow (.github/workflows/natlab-basic.yml) runs a single
# canary natlab test on every PR; this one runs the full suite.
name: "natlab-test"

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

on:
workflow_dispatch:
pull_request:
types: [labeled, synchronize, reopened]
schedule:
# Every 12 hours, off-the-hour to avoid GitHub's :00 cron-stampede window.
- cron: "23 3,15 * * *"

jobs:
# prepare warms the per-workflow-run caches (gokrazy image, cloud VM
# images) and emits the dynamic matrix of test names. By doing the work
# once here, the matrix test jobs never race to rebuild or re-download
# the same artifacts on a cold cache.
prepare:
if: |
github.event_name == 'workflow_dispatch' ||
github.event_name == 'schedule' ||
(github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'run-natlab-tests'))
runs-on: ubuntu-latest
timeout-minutes: 30
outputs:
matrix: ${{ steps.list.outputs.matrix }}
steps:
- name: Check out code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

# The cloud VM image cache is keyed only on images.go (image URLs and
# SHAs), so it survives across workflow runs and is invalidated only
# when a new image source is added.
- name: Cache cloud VM images
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.cache/tailscale/vmtest/images
key: natlab-vmimages-${{ hashFiles('tstest/natlab/vmtest/images.go') }}

# The gokrazy VM image is keyed by github.sha. That means we rebuild
# it once per commit but matrix test jobs in the same run all share
# the result. Per-PR re-runs of the same sha (e.g. a rerun-failed)
# also get the cache.
- name: Cache gokrazy VM image
id: gokrazy-cache
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: gokrazy/natlabapp.qcow2
key: natlab-gokrazy-${{ github.sha }}

# qemu-utils provides qemu-img, which the gokrazy Makefile uses to
# convert natlabapp.img to qcow2. Only install if we need it (cache
# miss); the test matrix jobs install qemu separately for the runtime.
- name: Install qemu-utils
if: steps.gokrazy-cache.outputs.cache-hit != 'true'
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-utils

- name: Download cloud VM images
# natlabprep is idempotent: it checks the cache before downloading.
run: |
./tool/go run ./tstest/natlab/vmtest/cmd/natlabprep

- name: Build gokrazy VM image
if: steps.gokrazy-cache.outputs.cache-hit != 'true'
run: |
make -C gokrazy natlab

- name: Discover tests
id: list
# Grep the test files directly rather than invoking `go test -list`
# so we don't pay the cost of compiling the test binaries here. The
# only test functions in these packages use the canonical
# `func TestFoo(t *testing.T)` signature.
#
# exclude is the set of tests that need special invocation
# (extra flags, a specific environment) and don't fit the
# single-test-per-matrix-job model. They stay runnable locally.
run: |
set -euo pipefail
exclude='^(TestGrid|TestVnetPerf.*)$'
tmp=$(mktemp)
for pkg_dir in tstest/natlab/vmtest tstest/integration/nat; do
pkg="./${pkg_dir}/"
for f in "${pkg_dir}"/*_test.go; do
[ -e "$f" ] || continue
{ grep -hE '^func Test[A-Z][A-Za-z0-9_]*\(t \*testing\.T\)' "$f" || true; } \
| sed -E 's/^func (Test[A-Za-z0-9_]+).*/\1/' \
| { grep -vE "$exclude" || true; } \
| while read -r t; do
jq -nc --arg pkg "$pkg" --arg test "$t" \
'{pkg: $pkg, test: $test}' >> "$tmp"
done
done
done
matrix=$(jq -s -c . "$tmp")
echo "matrix=${matrix}" >> "$GITHUB_OUTPUT"
echo "Discovered tests:"
jq . "$tmp"

test:
needs: prepare
runs-on: ubuntu-latest
timeout-minutes: 20
name: "${{ matrix.test }}"
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(needs.prepare.outputs.matrix) }}
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

# restore-only: prepare is the single writer of these caches, so
# matrix jobs don't write back. fail-on-cache-miss would be too
# strict for the gokrazy cache (e.g. a non-fatal cache eviction
# between prepare and us); we just rebuild on miss instead.
- name: Restore cloud VM images
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.cache/tailscale/vmtest/images
key: natlab-vmimages-${{ hashFiles('tstest/natlab/vmtest/images.go') }}

- name: Restore gokrazy VM image
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: gokrazy/natlabapp.qcow2
key: natlab-gokrazy-${{ github.sha }}

# The gokrazy-based tests boot the kernel directly from
# vmlinuz that ships in the gokrazy/kernel.amd64 module.
# Tests look it up under GOMODCACHE via findKernelPath, so the
# module has to be present even though no Go source imports it
# in the test package itself.
- name: Download kernel.amd64 module
run: |
./tool/go mod download github.com/gokrazy/kernel.amd64

- name: Run ${{ matrix.test }}
# Per-test timeout is well above the few-minute typical runtime
# but small enough that a stuck test fails fast instead of holding
# the runner for the job's 20-minute budget.
run: |
./tool/go test -v -timeout=15m -count=1 ${{ matrix.pkg }} \
-run='^${{ matrix.test }}$' --run-vm-tests
Loading
Loading