{"id":14470087,"url":"https://github.com/coder/wush","last_synced_at":"2025-05-14T19:03:58.212Z","repository":{"id":255246927,"uuid":"820652738","full_name":"coder/wush","owner":"coder","description":"simplest \u0026 fastest way to transfer files between computers via WireGuard","archived":false,"fork":false,"pushed_at":"2025-03-17T13:43:53.000Z","size":753,"stargazers_count":1187,"open_issues_count":16,"forks_count":34,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-10T07:07:28.793Z","etag":null,"topics":["file-transfer","go","peer-to-peer","wireguard"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-26T22:57:06.000Z","updated_at":"2025-04-09T22:24:36.000Z","dependencies_parsed_at":"2025-02-14T11:03:03.510Z","dependency_job_id":"82b71ded-6058-4be0-bbeb-03f439115b71","html_url":"https://github.com/coder/wush","commit_stats":{"total_commits":116,"total_committers":8,"mean_commits":14.5,"dds":0.3362068965517241,"last_synced_commit":"ca4d666d41f63e470ef4327c19b4feb762a814b6"},"previous_names":["coder/wush"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fwush","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fwush/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fwush/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coder%2Fwush/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coder","download_url":"https://codeload.github.com/coder/wush/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248589744,"owners_count":21129678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["file-transfer","go","peer-to-peer","wireguard"],"created_at":"2024-09-02T04:01:08.429Z","updated_at":"2025-04-12T15:32:17.462Z","avatar_url":"https://github.com/coder.png","language":"Go","readme":"# wush\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/coder/wush.svg)](https://pkg.go.dev/github.com/coder/wush)\n\n`wush` is a command line tool that lets you easily transfer files and open\nshells over a peer-to-peer WireGuard connection. It's similar to\n[magic-wormhole](https://github.com/magic-wormhole/magic-wormhole) but:\n\n1. No requirement to set up or trust a relay server for authentication.\n1. Powered by WireGuard for secure, fast, and reliable connections.\n1. Automatic peer-to-peer connections over UDP.\n1. Endless possibilities; rsync, ssh, etc.\n\n## Basic Usage\n\nOn the host machine:\n\n```bash\n$ wush serve\nPicked DERP region Toronto as overlay home\nYour auth key is:\n    \u003e  112v1RyL5KPzsbMbhT7fkEGrcfpygxtnvwjR5kMLGxDHGeLTK1BvoPqsUcjo7xyMkFn46KLTdedKuPCG5trP84mz9kx\nUse this key to authenticate other wush commands to this instance.\n```\n\nOn the client machine:\n\n```bash\n# Copy a file to the host\n$ wush cp 1gb.txt\nUploading \"1gb.txt\" 100% |██████████████████████████████████████████████| (2.1/2.1 GB, 376 MB/s)\n\n# Open a shell to the host\n$ wush ssh\n┃ Enter the Auth key:\n┃ \u003e 112v1RyL5KPzsbMbhT7fkEGrcfpygxtnvwjR5kMLGxDHGeLTK1BvoPqsUcjo7xyMkFn46KLTdedKuPCG5trP84mz9kx\ncoder@colin:~$\n```\n\n[![asciicast](https://asciinema.org/a/ZrCNiRRkeHUi5Lj3fqC3ovLqi.svg)](https://asciinema.org/a/ZrCNiRRkeHUi5Lj3fqC3ovLqi)\n\n\u003e [!NOTE]  \n\u003e `wush` uses Tailscale's [tsnet](https://tailscale.com/kb/1244/tsnet) package\n\u003e under the hood, managed by an in-memory control server on each CLI. We utilize\n\u003e Tailscale's public [DERP relays](https://tailscale.com/kb/1232/derp-servers),\n\u003e but no Tailscale account is required.\n\n## Install\n\nUsing install script\n\n```bash\ncurl -fsSL https://wush.dev/install.sh | sh\n```\n\nUsing Homebrew\n\n```bash\nbrew install wush\n```\n\nFor a manual installation, see the [latest release](https://github.com/coder/wush/releases/latest).\n\n\u003e [!TIP]\n\u003e To increase transfer speeds, `wush` attempts to increase the buffer size of\n\u003e its UDP sockets. For best performance, ensure `wush` has `CAP_NET_ADMIN`. When\n\u003e using the installer script, this is done automatically for you.\n\u003e\n\u003e ```bash\n\u003e # Linux only\n\u003e sudo setcap cap_net_admin=eip $(which wush)\n\u003e ```\n\n## Technical Details\n\n`wush` doesn't require you to trust any 3rd party authentication or relay\nservers, instead using x25519 keys to authenticate incoming connections. Auth\nkeys generated by `wush serve` are separated into a couple parts:\n\n```text\n112v1RyL5KPzsbMbhT7fkEGrcfpygxtnvwjR5kMLGxDHGeLTK1BvoPqsUcjo7xyMkFn46KLTdedKuPCG5trP84mz9kx\n\n+---------------------+------------------+---------------------------+----------------------------+\n| UDP Address (1-19B) | DERP Region (2B) |  Server Public Key (32B)  |  Sender Private Key (32B)  |\n+---------------------+------------------+---------------------------+----------------------------+\n| 203.128.89.74:57321 |               21 | QPGoX1GY......488YNqsyWM= | o/FXVnOn.....llrKg5bqxlgY= |\n+---------------------+------------------+---------------------------+----------------------------+\n```\n\nSenders and receivers communicate over what we call an \"overlay\". An overlay\nruns over one of two currently implemented mediums; UDP or DERP. Each message\nover the relay is encrypted with the sender's private key.\n\n**UDP**: The receiver creates a NAT holepunch to allow senders to connect\ndirectly. WireGuard nodes are exchanged peer-to-peer. This mode will only work\nif the receiver doesn't have hard NAT.\n\n**DERP**: The receiver connects to the closet DERP relay server. WireGuard nodes\nare exchanged through the relay.\n\nIn both cases auth is handled the same way. The receiver will only accept\nmessages encrypted from the sender's private key, to the server's public key.\n\n## Why create another file transfer tool?\n\nLots of great file tranfer tools exist, but they all have some limitations:\n\n1. Slow speeds due to relay servers.\n1. Trusting a 3rd party server for authentication.\n1. Limited to only file transfers.\n\nWe sought to utilize advancements in userspace networking brought about by\nTailscale to create a tool that could solve all of these problems, and provide\nway more functionality.\n\n## Acknowledgements\n\n1. [Tailscale](https://tailscale.com)\n1. [Headscale](https://github.com/juanfont/headscale)\n1. [WireGuard-go](https://github.com/WireGuard/wireguard-go)\n","funding_links":[],"categories":["Go","go","Projects"],"sub_categories":["Tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoder%2Fwush","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoder%2Fwush","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoder%2Fwush/lists"}