Real-time video capture for Linux, Windows, and macOS that applies
RetroArch GLSL shaders (CRT, NTSC, xBR, handheld, …) to live feeds from
capture cards. Includes HTTP MPEG-TS streaming, local recording, a virtual
camera output, and a full web portal for remote control.

⬇ Download 0.8.2-alpha ·
Documentation ·
Issues ·
Changelog
RetroCapture turns a generic capture card into a "retro-aware" capture rig:
PassFeedback and the OriginalHistory alias chain.directory.retrocapture.com with one click and let other RetroCapturestrycloudflare.com URL) or/raw traffic go through TLS byA maintenance release: a large internal refactor that decomposes the
"god-object" classes (app core, shader engine, UI manager, streaming/API) into
focused units for long-term maintainability — no new features — plus a few
correctness fixes and one breaking change for remote users.
/stream and/raw now share the host's canonical orientation.--stream-port is honored (#163) — it was being overwritten back to 8080./raw feed orientation wasA Windows-hardening release — every Windows bug reported against 0.8.0-alpha is
fixed, so capture, streaming, recording, audio and the virtual camera all work
on a fresh Windows install (no new features):
.app bundle).RetroCapture source/sink pair, no more module-null-sink loopback./meta, dual-encode gating).See CHANGELOG.md for the full list.
RetroCapture applies RetroArch presets in real time. Same capture, different
shader:
| Without shader | CRT Mattias |
|---|---|
![]() |
![]() |
| Without shader | NTSC |
|---|---|
![]() |
![]() |






Pre-built binaries for 0.8.2-alpha are attached to the
latest GitHub release:
| Platform | Artifact |
|---|---|
| Linux x86_64 | RetroCapture-0.8.2-alpha-linux-x86_64.AppImage |
| Linux ARM64 (Raspberry Pi 4 / 5) | RetroCapture-0.8.2-alpha-linux-arm64v8.tar.gz |
| Linux ARM32v7 (Raspberry Pi 2 / 3 / Zero 2) | RetroCapture-0.8.2-alpha-linux-arm32v7.tar.gz |
| Windows x86_64 | RetroCapture-0.8.2-alpha-windows-x86_64-Setup.exe |
| macOS x86_64 | RetroCapture-0.8.2-alpha-macos-x86_64.tar.gz |
A SHA256SUMS file is published alongside the binaries.
The Linux x86_64 build targets a portable instruction-set baseline
(no AVX/AVX2) so it runs on a wide range of CPUs including older
Sandy/Ivy Bridge, low-power and virtualized systems.
To build from source instead, see Building below.
RetroCapture is alpha and actively developed. Most things work; some
edges are still being polished.
| Area | State |
|---|---|
| Live capture (V4L2 / DirectShow) | ✅ Stable |
| Shader pipeline (single-pass, multi-pass, PassFeedback, OriginalHistory) | ✅ Stable |
| H.264 streaming | ✅ Stable |
| H.265 streaming | ✅ Stable |
| VP8 / VP9 streaming | ⚠️ Functional but may show as "Data: bin_data" in some players |
| Local recording (MP4 / MKV / AVI) | ✅ Stable as of 0.6.0 (PTS fix landed) |
| Web portal | ✅ Stable (full overhaul in 0.6.0) |
| Profiles (streaming + recording) | ✅ Stable since 0.6.0 |
| Raspberry Pi (ARM64 / ARM32) | ✅ Headless via SDL2 + DirectFB |
Remote source mode (/raw + /meta) |
✅ New in 0.7.0-alpha |
| Public stream directory + Cloudflare tunnels | ✅ New in 0.7.0-alpha |
HTTPS / TLS for directory and /raw |
✅ New in 0.7.0-alpha |
| Bilingual UI (EN / PT-BR) | ✅ New in 0.7.0-alpha |
| Quick Actions OSD + Shortcuts helper | ✅ New in 0.7.0-alpha |
| macOS x86_64 (host + client) | ✅ New in 0.8.0-alpha |
| System tray + minimize-to-tray | ✅ New in 0.8.0-alpha |
| Virtual camera output | ✅ New in 0.8.0-alpha |
| Screen capture source (monitor / window / region) | ✅ New in 0.8.0-alpha |
| System-audio capture source | ✅ New in 0.8.0-alpha |
| Real-time chat (per-stream rooms) | ✅ New in 0.8.0-alpha |
Shader compatibility note: most CRT, NTSC, upscale (xBR, Super-xBR) and
handheld presets work cleanly. A handful of complex multi-pass presets are
still being shaken out — bug reports very welcome.
For the full per-version history see CHANGELOG.md.
# Download from Releases, then:
chmod +x RetroCapture-0.8.2-alpha-linux-x86_64.AppImage
./RetroCapture-0.8.2-alpha-linux-x86_64.AppImage --source v4l2 --v4l2-device /dev/video0
Run the installer (RetroCapture-0.8.2-alpha-windows-x86_64-Setup.exe),
then launch RetroCapture from the Start menu. DirectShow is the default
capture source on Windows.
tar -xzf RetroCapture-0.8.2-alpha-linux-arm64v8.tar.gz
cd RetroCapture-0.8.2-alpha-linux-arm64v8
./retrocapture --source v4l2 --v4l2-device /dev/video0
For Pi 2 / 3 / Zero 2, use the arm32v7 tarball instead.
# Apply a shader preset
./retrocapture --preset shaders/shaders_glsl/crt/crt-guest-dr-venom.glslp
# Custom resolution and framerate
./retrocapture --width 1920 --height 1080 --fps 60
# Fullscreen on monitor 1
./retrocapture --fullscreen --monitor 1 --maintain-aspect
# No capture device (dummy mode for testing)
./retrocapture --source none
# Custom web portal port + HTTPS
./retrocapture --web-portal-port 9000 \
--web-portal-https \
--web-portal-ssl-cert ssl/server.crt \
--web-portal-ssl-key ssl/server.key
Press F12 to toggle the native UI. Run ./retrocapture --help for the
full list of command-line flags (source selection, hardware controls,
streaming, web portal, …).
Once streaming is enabled (UI Stream tab, web portal, or --stream-enable),
the MPEG-TS stream is served at http://<host>:8080/stream:
# ffplay
ffplay http://localhost:8080/stream
# VLC
vlc http://localhost:8080/stream
# mpv
mpv http://localhost:8080/stream
Multiple clients can connect simultaneously. Bitrate, codec, resolution and
audio are configured from the UI or via the REST API.
The web portal runs on the same port as the stream (default 8080) and
gives you full remote control of the application from any browser on
your network:
mpegts.js with native fallback)For PWA installation over a local-network IP, HTTPS is required.
See ssl/README.md for certificate generation.
RetroCapture can run in the background with its window hidden — handy
when you've armed the virtual camera and just want it feeding OBS /
Zoom / Discord all day, or you're hosting a stream and want the screen
back.
Platform notes:
Shell_NotifyIcon /NSStatusItem).Production builds use the Docker scripts, which default to a portable
instruction-set baseline. Native CMake builds default to-march=native.
./tools/package-release.sh
This runs every platform build in sequence (AppImage x86_64, Linux ARM64,
Linux ARM32v7, Windows installer) and emits artifacts under dist/ plus a
SHA256SUMS file. Use --only-x86, --only-arm, --only-win etc. to
build a subset.
# Linux x86_64 AppImage (Docker — portable baseline)
./tools/build-linux-appimage-x86_64.sh
# Linux ARM64 / ARM32 cross-compile (Docker + qemu)
./tools/build-linux-arm64v8-docker.sh
./tools/build-linux-arm32v7-docker.sh
# Windows installer (NSIS via MXE Docker)
./tools/build-windows-installer.sh
# Native Linux build (uses your local toolchain)
./build.sh
All Docker scripts auto-build their image on first run.
./tools/install-deps-raspberry-pi.sh
./tools/build-on-raspberry-pi.sh
Linux: V4L2, OpenGL 3.3+, GLFW 3.x, libv4l2, libpng, X11, CMake 3.10+,
C++17 compiler.
Windows: DirectShow-capable device, OpenGL 3.3+, CMake 3.10+, MinGW-w64
or MSVC.
Both: FFmpeg 6.x (libavcodec / libavformat / libavutil / libswscale /
libswresample) with libx264 (mandatory) and libx265 / libvpx (optional);
nlohmann/json (auto-fetched by CMake); OpenSSL (optional, for HTTPS).
CHANGELOG.md — full version history.docs/ARCHITECTURE.md — system architecture,docs/CONTRIBUTING.md — commit conventionsBug reports, shader-compatibility reports and PRs are very welcome.
Before opening a PR, please read docs/CONTRIBUTING.md
for commit conventions and docs/ARCHITECTURE.md
for an orientation tour of the codebase.
When reporting a shader that misrenders, please include:
shaders/shaders_glsl/crt/<name>.glslp)MIT — see LICENSE.
Note: RetroCapture is an independent project and is not affiliated with
RetroArch, Libretro, Sega, Nintendo, or any other trademark referenced.