
Braid is a netplay launcher for retro emulators. The idea is pretty simple — instead of both players manually digging through emulator settings, exchanging IP addresses, and hoping they have the same ROM version, Braid handles all of that upfront and gives you a single link to share.
What it does
- Hashes your ROM so both players can confirm they have the exact same version before connecting
- Spins up a session and pushes the info to a signaling server
- Generates a braid:// link you can send to a friend
- Launches RetroArch with the right netplay flags once both sides are ready
The CLI and signaling server are working now. The GUI is built and functional but still early. Real netcode, NAT traversal, and save state sync are not implemented yet — that’s all handled by RetroArch for now.
Prerequisites
- Rust 1.75+ with Cargo
- Python 3
- RetroArch
On Windows, build from a Visual Studio Developer Command Prompt. If you have devkitPro or MSYS2 installed their link.exe will get in the way.
Installation
git clone https://github.com/urboirad/project-braid.gitcd project-braid/braid-rscargo build
Copy
Binaries end up in
braid-rs/target/debug/
. There’s no release build set up yet so just use debug for now.
Running a session
Step 1 — Start the signaling server
Both players need to be able to reach this. Run it on a machine with a reachable IP or just use localhost if you’re testing on the same network.
python signaling_server.py
Copy
Listens on http://0.0.0.0:8080 by default.
Step 2 — Host a game
./braid-rs host /path/to/game.sfc --signal-url http://localhost:8080
Copy
Braid hashes the ROM, uploads the session info, and prints a braid:// link. Send that link to your friend.
Add
--launch-emulator
if you want RetroArch to open automatically once the session is created.
Step 3 — Join a game
./braid-rs join "braid://<session_id>?signal=http://<host_ip>:8080" --rom /path/to/game.sfc
Copy
Braid pulls the session manifest, checks your ROM hash against the host’s, and tells you if they match. If they don’t it’ll warn you before anything launches.
Add
--launch-emulator
and
--connect-address <host_ip>
to have RetroArch connect automatically.
CLI reference
| Command | What it does |
|---|---|
host | Creates a session and prints a shareable link |
join | Joins a session from a braid:// link |
serve | Starts the signaling server |
state push | Upload a save state blob to the server |
state pull | Download a save state blob from the server |
--launch-emulator | Actually opens RetroArch after setup |
--emulator-bin | Use a different binary if retroarch isn’t on your PATH |
--dry-run | Print the emulator command without running it |
Troubleshooting
- If the peer can’t reach the signaling server, make sure port 8080 is open and you’re using the host machine’s actual IP in the link, not localhost
- If you get linker errors on Windows, open a Visual Studio Developer Command Prompt before running cargo build
- Braid defaults to
retroarchas the binary name — if yours is named differently use--emulator-bin - The GUI is at
braid-rs/target/debug/braid-rs-gui— it does the same things as the CLI just with a UI