Project Braid

urboirad / project-braid

Netplay injector tool for retro emulators.

Engagement


Activity


Project Contributors

View Repository

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.git
cd project-braid/braid-rs
cargo 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

CommandWhat it does
hostCreates a session and prints a shareable link
joinJoins a session from a braid:// link
serveStarts the signaling server
state pushUpload a save state blob to the server
state pullDownload a save state blob from the server
--launch-emulatorActually opens RetroArch after setup
--emulator-binUse a different binary if retroarch isn’t on your PATH
--dry-runPrint 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 retroarch as 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