NewFree, open source, no account

Watch together.
Peer to peer.

One person shares a movie, a game or a desktop, and the others watch it live while everyone talks. Make a room, send the link: the picture goes straight to each friend, encrypted end to end.

Windows 10/11 · Linux AppImage · MIT licensed

ratcast — rats://9f2c…e6ed1
LIVE
18 ms
Mia that jump scare 😱
Y
You
M
Mia
L
Leo
S
Sam
AV1HEVCH.264NVENCAMFQuick SyncSVT-AV1OpusWebRTC AudioProcessingNoise protocolSFrameDHTFECHole punchingDirect3D 11PipeWirelibratsAV1HEVCH.264NVENCAMFQuick SyncSVT-AV1OpusWebRTC AudioProcessingNoise protocolSFrameDHTFECHole punchingDirect3D 11PipeWirelibrats
~0 ms

from capture to a friend's screen on one host

0

accounts, sign-ups or servers you have to trust

0×

encrypted: Noise on the wire, SFrame on every frame

MIT

open source, no GPL anywhere in the stack

Features

Everything a movie night needs. Nothing in the middle.

A desktop app for calls and screen streams, built in C++ on its own peer-to-peer media transport.

Rooms by link

Make a room, copy its rats:// link and send it to whoever should join. Peers find each other through the DHT, so a server is optional.

Copy

A screen or a window, with its sound

Viewers hear what your applications play, but never the call's own voices. Games, movies, a whole desktop.

Voice that is easy to listen to

Echo cancellation, noise suppression and automatic gain from WebRTC AudioProcessing. Mute, deafen, see who speaks.

Hardware encoding

AV1, HEVC and H.264 on NVENC, AMF or Quick Sync. On Windows the screen reaches the encoder without leaving the GPU.

AV1NVENCHEVCNVENCH.264NVENCAV1AMFHEVCAMFH.264AMFAV1Quick SyncHEVCQuick SyncH.264Quick Sync

Encrypted end to end

Connections use the Noise protocol and every frame is sealed again with SFrame. A server that forwards it can't read it.

framemovie night, 9 pm741EB

Low latency on real networks

Rate control follows the path, and FEC and retransmission repair losses within each frame's deadline. A frame is in time or dropped: the stream never stalls behind an old one.

frame deadline

Gets through NATs

Port mapping and hole punching first, a relay through ratcast-server when nothing else works.

1Port mapping
2Hole punching
3Relay via server

Cameras

Show yourself next to the share, or meet in a grid where whoever speaks is ringed.

Text chat

Write to the room beside the call. Late joiners see the last hundred messages.

Mia who brought snacks
Leo github.com/librats 🔗
Sam joining in 2 min

Updates itself

New releases install from GitHub, checked by SHA-256 — but never while a call is on.

SHA-256 ✓never mid-call

How it works

From zero to watching in three steps

No sign-up, no server to set up, nothing to configure. Unzip, run, send a link.

1

Make a room

Press one button and the app gives you a link. Send it to your friends however you like.

rats://PEER-ID

2

Friends join

They paste the link and press Join, or open it from the command line: ratcast rats://…

no account, no install wizard

3

Share and watch

Press Share, pick a screen or a window and whether its sound goes too. The others press Watch.

F full screen · Ctrl+I stats

Network

A room that rearranges itself

Every room starts as a mesh. When the sharer's uplink can't carry a copy for everyone, the share is rearranged one viewer at a time: through a server, through another viewer with spare uplink, or still directly.

sharer uploads 6 copies
serverratcast-server · SFUSharerV1V2V3V4symmetric NATV5V6

Through a server

ratcast-server forwards the share like an SFU, so one upload serves every viewer it takes.

Through another viewer

A viewer with spare uplink passes the frames on as they came, without re-encoding.

Sealed on every hop

Frames stay SFrame-encrypted the whole way. A server is never given a key.

libratcast

The transport underneath, yours to build on

libratcast moves encoded frames between peers — a counterpart to SRT, librist and WebRTC's media, on top of librats. No codecs, no capture: just media over P2P.

receiver.c
1rats_config_t config = {.protocol = RATCAST_PROTOCOL};
2rats_t node = rats_create(&config);
3ratcast_t media;
4ratcast_handlers_t handlers = {.user = app,
5 .stream_announced = on_stream,
6 .frame_received = on_frame};
7ratcast_attach(node, &handlers, NULL, &media); /* before rats_start() */
8rats_start(node);
9rats_connect(node, "sender.example", 7700);
10
11/* on_stream: subscribe; a feed in order, 200 ms behind */
12ratcast_subscribe(media, peer_id, stream->id, 200000);
try it on one machine
1$ ratcast-send --source pattern --audio tone
2$ ratcast-recv rats://127.0.0.1:7700

Deadline-bound delivery

Each frame arrives in time or is dropped. FEC and retransmission repair what they can before it.

Rate control

Follows librats' path measurements; several streams to one peer share its path.

One to many

One sender feeds many viewers, directly or through a server.

SFrame on every frame

With a key for each sender, on top of the Noise-encrypted connection.

C and C++ APIs

Moves encoded frames only — bring your own codecs. Carries MPEG-TS feeds too.

Download

Get ratcast

The latest build, straight from GitHub Releases. Free and open source. It keeps itself up to date.

Windows

x64 · zip

Windows 10 1903+ or 11. Sharing the applications' sound needs 2004+.

Unzip and run ratcast.exe.

Download for Windows

Linux

x86_64 · AppImage

glibc 2.39+ and PipeWire 1.0+: Ubuntu 24.04, Debian 13, Fedora 40 or newer.

chmod +x and run it.

Download for Linux
macOS and Android are planned.All files, checksums and notes →

Optional

Run your own server

Calls usually connect directly. A ratcast-server on a public host helps the rest: rooms behind strict NATs meet there, it relays when no path can be punched, and it can forward a share so the sharer uploads one copy however many watch. It can't read anything it carries.

Needs only librats and libratcast: no media libraries, no Qt.

server
1$ git clone --recursive https://github.com/librats/ratcast.git && cd ratcast
2$ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DRATCAST_SERVER_ONLY=ON -DRATCAST_BUILD_TESTS=OFF
3$ cmake --build build --parallel 2
4$ sudo cmake --install build
5# port 7700, UDP and TCP
6$ sudo systemctl enable --now ratcast-server