The presets now include a frame rate cap alongside CRF and max bitrate, reflecting three lessons learned since the CRF fix: - Frame rate is the biggest bandwidth lever for desktop content: 15-25 fps is perfectly smooth for screencasting and cuts bandwidth 2-4x vs. uncapped monitor rate. - CRF values are now actually applied (the global_quality bug is fixed), so the ranges are meaningful. - The 'Low bandwidth' preset targets 15 fps + CRF 26 + 3000 kbps, which fits even the Pi's Wi-Fi hotspot; 'Maximum' uncaps the frame rate for the smoothest possible output on a good link. Low bandwidth CRF 26, 3000 kbps, 15 fps Balanced CRF 22, 5000 kbps, 20 fps Sharp CRF 18, 8000 kbps, 25 fps Very sharp CRF 16, 12000 kbps, 30 fps Maximum CRF 14, 20000 kbps, uncapped A frame rate spinner (5-60, 0 = uncapped) sits alongside the bitrate slider for independent fine-tuning.
screen_cast
A native Linux peer-to-peer screencast application.
- Send your desktop or a window to another Linux machine.
- Receive a stream and render it in a window.
- Discover receivers on the LAN via mDNS/Avahi; negotiate sessions with JSON signaling; stream H.264 over RTP/UDP.
Built with C++20, Meson, PipeWire, FFmpeg, and SDL3.
Quick start
Requirements:
- C++20 compiler with
<format>(GCC 13+, Clang 18+) - Meson >= 0.63, Ninja
- FFmpeg development packages (
libavcodec,libavutil,libswscale) - SDL3 development package (
sdl3) - nlohmann JSON (
nlohmann_json) and Avahi client (avahi-client) - For the sender only: PipeWire dev (
libpipewire-0.3) and libportal
Build and run tests:
meson setup build
meson compile -C build
meson test -C build --print-errorlogs
Stream between two machines:
screencast --receive # machine A: announces itself, opens a window
screencast --send # machine B: discovers A, negotiates, streams
See docs/RUNBOOK.md for all modes, flags, and validation procedures.
Receiver on a small ARM board (e.g. Raspberry Pi Zero 2 W)
The receiver does not need the sender's PipeWire/portal capture stack. On the board, run:
sudo ./scripts/install-receiver.sh
screencast --receive
The script installs the dependencies, builds a receiver-only binary
(-Dsender=false), runs the test suite, and installs to /usr/local/bin
(override with SC_RECEIVER_INSTALL_DIR). It needs Raspberry Pi OS Trixie
or newer (GCC 13+ for C++20 <format>), builds SDL3 from source when the
distribution does not package it, and enables avahi-daemon. It also
installs and enables a systemd service so the receiver starts at boot —
systemctl status screencast-receiver to check on it.
Performance note: decoding is software H.264; on very small boards expect smooth playback for modest resolutions and reduced frame rates at high resolutions. Hardware decode is planned for Phase 7. On a headless console the receiver runs fullscreen automatically with aspect-preserving letterboxing.
Architecture
See docs/ARCHITECTURE.md for module boundaries and design rules.
Roadmap
Development is split into phases in docs/PHASES.md.
Current phase: Phase 7 — Resilience and polish.
License
MIT — see LICENSE (to be added).