A vibed iroh based version of renasync
  • Rust 96.4%
  • Shell 2.6%
  • Dockerfile 1%
Find a file
Tommy Stigen Olsen 3ea9391008
Some checks failed
ci / check (push) Has been cancelled
release / create (push) Has been cancelled
release / build (aarch64-apple-darwin) (push) Has been cancelled
release / build (aarch64-pc-windows-gnullvm) (push) Has been cancelled
release / build (aarch64-unknown-linux-musl) (push) Has been cancelled
release / build (powerpc64le-unknown-linux-musl) (push) Has been cancelled
release / build (riscv64gc-unknown-linux-musl) (push) Has been cancelled
release / build (x86_64-apple-darwin) (push) Has been cancelled
release / build (x86_64-pc-windows-gnu) (push) Has been cancelled
release / build (x86_64-unknown-linux-musl) (push) Has been cancelled
release / publish (push) Has been cancelled
release / docker (push) Has been cancelled
Rewrite renasync in Rust on top of iroh
Separate server and client binaries with iroh networking. Files local
to a client are streamed to the room over iroh-blobs and swarmed between
peers, with subtitles. Shared playlists with background preloading,
buffered catch-up for lagging clients, session takeover and automatic
reconnects. Forgejo CI and release workflows and a multi-arch server
image.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 10:22:10 +02:00
.forgejo Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
crates Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
.dockerignore Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
.gitignore Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
Cargo.lock Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
Cargo.toml Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
Dockerfile Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
LICENSE Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
PROTOCOL.md Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00
README.md Rewrite renasync in Rust on top of iroh 2026-10-16 10:22:10 +02:00

Renasync

Watch videos together, wherever you are. Renasync keeps everyone's mpv player in sync: when one person pauses, seeks or opens something, everyone else follows. There's a chat on top of the video too.

You don't all need a copy of the file. Open a video from your own computer and everyone else streams it directly from you, and can start watching and seeking right away.

What you need

  • mpv installed and on your PATH
    • macOS: brew install mpv
    • Windows: mpv.io/installation, or scoop install mpv
    • Linux: your package manager, e.g. apt install mpv
  • The renasync download for your system from the releases page
  • The server id of the server you're joining (ask whoever runs it)
System Download
Windows (most PCs) x86_64-pc-windows-gnu.zip
Windows on ARM aarch64-pc-windows-gnullvm.zip
macOS, Apple Silicon (M1 and up) aarch64-apple-darwin.tar.gz
macOS, Intel x86_64-apple-darwin.tar.gz
Linux, x86-64 x86_64-unknown-linux-musl.tar.gz
Linux, ARM64 (Raspberry Pi 4/5) aarch64-unknown-linux-musl.tar.gz
Linux, RISC-V 64 riscv64gc-unknown-linux-musl.tar.gz
Linux, POWER8 and newer (ppc64le) powerpc64le-unknown-linux-musl.tar.gz

macOS: the binaries are not notarized by Apple. If macOS refuses to open them, run xattr -d com.apple.quarantine renasync-client once.

Watching together

Start the client and answer its questions:

renasync-client
Choose server id: aff5d2d2...
Choose room name: movie-night
Choose user name: alice

Or pass everything at once:

renasync-client --server aff5d2d2... --room movie-night --name alice

An mpv window opens. Everyone who joins the same room on the same server watches together.

  • Open a video: press ' and type loadfile followed by a path or URL, or just drag a file onto the mpv window. Everyone in the room loads it too.
  • Pause, seek, skip: use mpv as usual; everyone follows you.
  • Joining late: the client automatically loads what the others are watching and jumps to the right spot.

Keys

Key Action
ENTER Chat
TAB Show who is online
' Open a file or URL
: Ignore links opened by other people

Chat commands

Command What it does
/queue FILE-OR-URL ... Add one or more things to the room's playlist
/playlist Show the playlist
/next Skip to the next item in the playlist
/unqueue NUMBER Remove an item from the playlist
/privmsg USER MESSAGE Send a private message
/loadto USER FILE-OR-URL Make one person load something (local files are shared)
/loadfrom USER Load whatever that person is watching

Sharing your own files

When you open a file from your computer, Renasync prepares it for sharing (this takes a moment for big files, it's read but never copied) and tells the room. The others stream it from you, verified piece by piece so a broken connection can never corrupt it.

  • Subtitles come along. Subtitle files next to the video (Movie.srt, Movie.en.srt, ...) are shared too, with their language, so everyone gets the same subtitle choices you have. Dropped a subtitle onto mpv halfway through? Everyone else gets it as well.
  • Everyone helps: people who already have (parts of) a file pass them on, and your client fetches from whoever is fastest for you.
  • Keep your client running while others watch something you shared.
  • If someone already has a file with the same name and size in the folder they started Renasync from, they play their own copy instead.

Playlists and preloading

Queue up the next episodes with /queue:

/queue "Show S01E02.mkv" "Show S01E03.mkv"

While you watch, everyone's client quietly downloads the current video completely and then the next ones in the playlist, so the next episode starts instantly, even for friends on the other side of the world. Press TAB to see how far everyone has come. When a video ends, the next one starts for the whole room.

Bad connections

Renasync is built to cope with flaky networks:

  • If your video stalls or you fall behind, you don't hold up the room. Your player jumps a little ahead, buffers there, and rejoins at exactly the right moment. On a slow line it gives itself more headroom next time.
  • If your connection drops, the client reconnects on its own and catches up with the room. mpv keeps playing in the meantime.
  • If your old connection is still "hanging" on the server when you come back, your new one simply takes over: your name is tied to your computer, so you never get locked out of it.
  • If someone else already uses your name, you join as name2.
  • Connections go directly between computers when possible, and through a relay when firewalls are in the way.

Extra mpv options

Anything after -- goes to mpv:

renasync-client --server ... --room ... --name ... -- --fullscreen --volume=50

Your normal mpv config (mpv.conf, input.conf, scripts) is used as usual.

Running a server

The server is tiny: it only relays chat and playback commands, video never passes through it. It doesn't need an open port, a domain name or a certificate, so it runs fine behind home routers and NAT.

renasync-server

It prints the server id to share with your friends:

Server running. Clients can join with:

    renasync-client --server aff5d2d20a38e9917cf50d6470e9d9c045a170fa9cc1a7e6142fc713d3db2699

The id is derived from renasync-server.key, created on first start. Keep that file and the id stays the same; delete it and you get a new one.

Docker

docker run -d --name renasync --restart unless-stopped \
  -v renasync:/data \
  code.lowsec.club/okawari/renasync-server:latest
docker logs renasync   # shows the server id

Images are available for amd64, arm64, riscv64 and ppc64le. The key is stored in the /data volume.

Building from source

Requires Rust 1.91 or newer:

cargo build --release

The binaries end up in target/release/. See PROTOCOL.md for how it works on the wire.

License

0BSD