📈 GH Trending Explorer 🎲 Surprise me

← all repos

tailscale / tailcat

git clone https://github.com/tailscale/tailcat.git v0.7.0 · 1mo ago

like netcat, but over Tailscale's data plane, without Tailscale's control plane

+5
stars, 24h · #2,886
+~35
stars, 7 days · #3,514
+~150
stars, 30 days · #3,510
8.4k
★ total · +0% this week
381
forks · 29 open issues

Star history (as recorded here)

2026-10-20 · 8,432 ★ 2026-10-22 · 8,443 ★
LanguageGo
LicenseBSD-3-Clause
Created2024-10-29 (1y ago)
Last push14d ago
Watchers29
OwnerOrganization

Links

README excerpt
"Tailscale without Tailscale, by Tailscale" 
# Tailcat
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.
The `tailcat` CLI (in `cmd/tailcat`) is built on the `tailcat` Go library
(importable as `github.com/tailscale/tailcat`).
Whether you use `tailcat` as a CLI tool or library, one side runs a `tailcat`
server (listener) and gets back a short tailcat address. The other side passes
that tailcat address to `tailcat`'s client side to connect. All traffic between
the two is
encrypted end-to-end with WireGuard. The initial connection bootstraps through
a DERP server (see below), and then magicsock performs NAT traversal to
upgrade to a direct peer-to-peer UDP connection when possible (usually!).
You don't need a Tailscale account, root/admin access on the machine
(it doesn't alter your machine's routing tables, DNS, etc.). It's just
a userspace library and CLI tool.
And it's all open source.
You can use our free rate-limited DERP relays (the default DERP map is
https://tailcat.dev/derpmap.json) or you can run your own.
There's also an experimental in-browser web demo (tailcat compiled to
WebAssembly) at https://tailscale.github.io/tailcat/ that can send and
receive files or text, interoperating with the CLI. Browser traffic is
relayed over DERP only, with no direct connections until WebRTC
support (#4).
## Install
See INSTALL.md for details on each, including notes
for packagers building from source:
| Method | Linux | macOS | Windows | FreeBSD, OpenBSD | Browser (js/wasm) |
|--------|:-----:|:-----:|:-------:|:-------------------:|:--------------------:|
| Static binaries | ✅ | | ✅ | | |
| .deb packages | Debian, Ubuntu, ... | | | | |
| .rpm packages | Red Hat, Fedora, ... | | | | |
| Homebrew | | ✅ | | | |
| Scoop | | | ✅ | | |
| Snap | ✅ | | | | |
| Container image | ✅ | | | | |
| Nix | ✅ | ✅ | | | |
| AUR | Arch | | | | |
| conda-forge | ✅ | ✅ | ✅ | | |
| Build from source | ✅ | ✅ | ✅ | ✅ | ✅ |
## Usage
### Pipe stdin/stdout between two machines
Server starts, printing out its ephemeral address:
 [code] 
And then the client can:
 [code] 
Then the server unblocks:
 [code] 
### Expose local ports through the tunnel
Or you can serve a local TCP port, forwarded to localhost:
 [code] 
And then the client:
 [code] 
A port mapping proxies a port somewhere other than the same port on localhost: to a different local port, or to a host and port elsewhere on the server's network. This serves port 5555 by proxying it to an Android device's adb port on the LAN, without exposing the rest of the network the wa