fegger 144aab6e5b feat(gui): recalibrate presets and add a frame rate spinner
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.
2026-09-09 21:45:25 +02:00

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).

S
Description
No description provided
Readme 1.2 MiB
Languages
C++ 60.6%
Swift 18%
Kotlin 15.2%
Shell 3.9%
Meson 2%
Other 0.2%