
bitbang-cli v0.5.0
Establish secure remote access to a machine with interactive shell, file transfer, and web proxy over end-to-end encrypted peer-to-peer WebRTC, using a browser or CLI without port forwarding or accounts.
BitBang CLI
bitbang is a single static binary remote-access multitool. From any browser: an interactive shell and file browser access to the remote machine. You can also reach web apps on that machine's network. Beyond the browser, it does TCP port forwarding, file copy, and terminal sharing. It requires no account or configuration -- it just works.

On the machine you want to reach:
curl -sSfL bitba.ng/install | sh
bitbang serve
serve prints a URL. Open it in any browser and you get a terminal, a file browser, and a proxy to that machine's network -- or reach the same machine from another terminal with bitbang connect <url>, which adds port forwarding (-L) and file copy (bitbang cp). The connection is end-to-end encrypted and peer-to-peer; the bitba.ng server introduces the two ends, then steps aside.
bitbang is a single static Go binary. It's part of the BitBang project; this whitepaper covers the design in depth.
How it compares
| ngrok | Tailscale | bitbang | |
|---|---|---|---|
| Setup before first use | Account + authtoken | Account + login on each device | Run one command |
| To share something, you run | a web server, plus ngrok | their client on both machines | bitbang serve |
| What a browser on the far end gets | the web server you were already running | nothing -- it needs their client | a terminal, a file browser, and web apps on the remote network |
| Data path | their servers | P2P (relay fallback) | P2P (relay fallback) |
| End-to-end encrypted | Not by default | Yes | Yes |
Quickie recipes
Reach a service at home
- Mount your home NAS from anywhere (SMB)
- Watch your media library from anywhere (Jellyfin)
- Use your own LLM from anywhere (Ollama, Open WebUI)
- Check your security cameras (Frigate)
- Reach your home automation without exposing it (Home Assistant)
- Print to your home printer (IPP, CUPS)
Get on a machine
- Get a shell on a machine behind NAT
- Get a shell from your phone
- Remote desktop into a Windows machine (RDP)
- Reach a Linux or Mac desktop (VNC)
- SSH to a machine with no open port (OpenSSH)
- Set up a headless Raspberry Pi
Share with someone else
Sharing entails simply giving someone a unique URL or QR code that gives them access. Permissions can be tailored and set to expire in minutes, hours, etc.
- Share files without uploading them anywhere
- Show someone your project
- Give someone access that expires
- Check your agent session from your phone (Claude Code, tmux)
- Fix someone else's router
Development and devices
- Reach a database from your dev machine (Postgres, MySQL)
- Sync devices that cannot find each other (Syncthing)
- Watch a robot from a browser (ROS, Foxglove)
Techniques
Using bitbang
Every connection has two ends: a listener (bitbang serve, running on the machine being reached) and a connector (a browser, or the bitbang CLI, on the machine doing the reaching). One listener URL serves both kinds of connector.
The listener: bitbang serve
bitbang serve # everything: shell + proxy + files + forward
bitbang serve shell # just a terminal
bitbang serve files ~/share # just a directory (-files-upload to allow uploads)
bitbang serve proxy localhost:8080 # just one web app, straight at the URL
bitbang serve proxy a.lan:80,b.lan:80 # ...or several, chosen in the browser
bitbang serve forward 127.0.0.1:22 # just TCP, for `connect -L`
bitbang serve shell files ~/share proxy nas.lan:8096 # any combination
Each prints a QR code, URL and a pairing code. The mode picks what the
listener can do at all: serve shell has no forwarding to grant, and a
forward-only listener never starts a shell, so there is nothing to escalate
to.
One default worth knowing: forwarding and the proxy reach any host:port the
listener can reach, not only the one you had in mind, so a link handed out
for a database also reaches the rest of that network. Naming targets after the
word narrows it -- forward db.internal:5432 reaches that and nothing else.
Sharing a running session: bitbang share
serve shell starts a new shell. share publishes a tmux session that is
already running:
bitbang share # publish the current tmux session
bitbang share --read-only # publish without a control URL
bitbang share status|stop|rotate