Tailcat is a remix of Tailscale open source pieces to act like netcat, but over Tailscale's data plane, without Tailscale's control plane. Tailscale's data plane (magicsock, internally) gives you point-to-point WireGuard®-encrypted tunnels between two machines with DERP as the NAT-hole-punching communication side channel and the ultimate relay-of-last-resort if NAT traversal fails. Instead of using the Tailscale control plane, all tailcat connection metadata is exchanged out of band, however you want.
What's new in 0.7.0
tailcat changelog
v0.7.0 (2026-09-19) - --serve=exit-node servers now forward UDP flows; previously only TCP was forwarded, so DNS, QUIC, and other UDP traffic through an exit node went nowhere. - Serving local ports works from Windows: the server resolves localhost itself instead of using the hosts file, which Windows ships without localhost entries, so the name no longer escapes to real DNS servers. It also dials both 127.0.0.1 and ::1, reaching services bound to only one loopback address. Official binaries also no longer build with the netgo tag that forced Go's pure resolver on Windows and macOS; they now use the operating system's resolver there, like a default go build does. (#108, reported by @Sammy-T) - tailcat cp now works with OpenSSH 8.7 through 8.9 clients, such as Ubuntu 22.04's. Those versions still speak the legacy SCP protocol unless scp -s asks for SFTP, which is all tailcat file services accept, so copies failed. tailcat now checks whether the installed scp understands -s and passes it when it does; older clients without the flag are unchanged. (#114, fixed in #123 by @BreezeDelegate) - Go library: Server.Status() now includes a Peer entry per connected client, with CurAddr and Relay to tell a direct path from a DERP-relayed one. (#116, reported by @Mo3he) - Go library: the new Server.Listen(ctx, network, address) serves TCP and UDP ports in the standard net.Listener shape, as an alternative to the OnTCP and OnUDP hooks; for UDP, each Accept returns one client flow as a net.Conn. Listeners claim their specific ports ahead of the wildcard hooks, and Listen starts the server if it isn't running yet. - tailcat forward takes an --open-browser flag that opens a web browser to the forwarded local port; tailcat browse <tc-addr> is an alias for tailcat forward --open-browser <tc-addr> 0:80. - exec service: tailcat serve exec -- <command> runs the command for each incoming connection with the connection as its stdin and stdout, like inetd. With the ssh or no-auth-ssh service, the command after -- instead replaces the shell for every session, like OpenSSH's ForceCommand, with no shell, client-chosen command, or SFTP offered. - tailcat ssh to a DNS-named destination first probes the server the way a stranger would, with no credentials, and refuses to connect if the server hands out a shell to anyone, since an address published …
ce6fedc README: document Homebrew install for macOS
79da910 tailcat: reject meows with a zero disco key
deece63 flake.nix, tool/updateflakes: keep the nix vendor hash fresh automatically
2a48b15 tailcat: reject null regions and nodes in a ConnBlob
4d50a34 cmd/tailcat: keep --version working as an unadvertised alias
3748bfd cmd/tailcat: add an ls subcommand
c6dfb6b README: document receiving, sending, and serving files
1730246 cmd/tailcat: add a recv subcommand
0e377d7 cmd/tailcat: add a cp subcommand
6e15eac tailcat: send the SSH exit-status before closing the sftp channel
1bf70fa cmd/tailcat: add the files service and --files flag
2bd0b26 tailcat: serve the SFTP subsystem, optionally rooted and access-limited
0bf8f4e cmd/tailcat: omit an empty --key from the ssh ProxyCommand
696590d cmd/tailcat: fix accidental revert of pipe_test.go "none" DERP URL
3132331 cmd/tailcat: add a serve subcommand
1fba818 tailcat: add tests for meow packet encoding and parsing
4b057c4 cmd/tailcat: reject genkey --client --key=default as a likely mix-up
9db9c6a cmd/tailcat: print requested help to stdout, not stderr
0c2e011 cmd/tailcat: add examples and long help to the subcommands
0d18092 cmd/tailcat: port the CLI to ff/v4 declarative commands
7be233f tailcat, cmd/tailcat: support SSH on Windows
16efa8c build-tags.txt: pin LF line endings, tolerate CRLF in the sync test
1d77269 cmd/tailcat: don't leak test binaries to the system temp dir …
Frequently asked questions
Is tailcat free?
Yes. tailcat is free and open-source software released under the BSD-3-Clause license.
What is the latest version of tailcat?
The latest version is 0.7.0, released on Sep 19, 2026.
Is it safe to download tailcat?
The download button links to the official installer published on github.com, the same file Windows Package Manager installs. You can verify the downloaded file by comparing its SHA-256 checksum with f04cac07e3bf6c700b0b543df0d3315a3b312cd5a05ee76714e1cc848e9b2dff.
Which Windows versions does tailcat support?
tailcat runs on Windows and is available for 64-bit (x64), ARM64 systems.
How do I uninstall tailcat?
Open Settings › Apps › Installed apps, find tailcat and select Uninstall. From the command line, run winget uninstall --id=Tailscale.tailcat -e.
Is there a portable version of tailcat?
Yes. tailcat is available as a portable ZIP archive (tailcat_0.7.0_windows_amd64.zip, 64-bit (x64)) that runs without installation. Copy it to any folder or USB drive and run it from there.
Alternatives to tailcat
Other Command Line Tools programs for Windows from different developers.
The Azure command-line interface (Azure CLI) is a set of commands used to create and manage Azure resources. The Azure CLI is available across Azure services and is designed to get you working quickly