Free and open-source software — GNU GPL version 2.
SwitchCast sends the Nintendo Switch's captured H.264 gameplay video directly to either a Chromecast/Google Cast TV over Wi-Fi or a SwitchCast Dock over USB.
Cast mode uses the receiver's built-in Cast Streaming application (0F5096E8),
negotiates over Cast V2 TLS, and sends encrypted Cast RTP/RTCP over UDP. There
is no PC, phone, relay, hosted page, HLS server, custom Web Receiver, or Cast
Developer Console registration in the path.
USB Dock mode sends the same native capture through the SysDVR-compatible protocol-03 bulk format to a Raspberry Pi Zero 2 W receiver. It bypasses Wi-Fi, Cast negotiation, and receiver buffering for the lowest-latency path.
SysDVR by Exelix11 and its contributors is the main foundation of SwitchCast. SwitchCast began as a direct modification of the SysDVR source tree and inherits or adapts its Switch capture implementation, memory-conscious sysmodule architecture, build and process-management foundations, Settings UI, and dvr-patches integration.
SwitchCast adds the Google Cast transport, the dedicated Dock receiver, and a standalone identity. “Standalone” means SysDVR does not have to be installed at runtime; it does not diminish the project's lineage or the importance of the upstream work.
Read SYSDVR-ATTRIBUTION.md for the detailed credit and visit the original
project at https://github.com/exelix11/SysDVR.
This repository is maintained as a fork of SysDVR so GitHub also preserves
the upstream commit history and displays the relationship on every repository
page. The SwitchCast work is based on SysDVR snapshot
804fd36.
- Extended the validated low-delay SPS signaling to USB Dock mode.
- Rewrites the exact initial GRC Annex-B SPS before USB transmission and emits
all periodically injected recovery SPS units with
max_num_reorder_frames = 0andmax_dec_frame_buffering = 1. - Shared one exact-match SPS implementation between Cast and USB, with dedicated raw-NAL, Annex-B expansion, capacity, fMP4, and protocol tests.
- Unknown encoder configurations remain unchanged.
- Added a Chromecast-only low-delay SPS substitution in the fMP4
avcCconfiguration. - The known GRC 720p30 SPS now explicitly signals
max_num_reorder_frames = 0andmax_dec_frame_buffering = 1, matching its no-B-frame, one-reference-picture stream. - Unknown SPS variants pass through unchanged instead of being rewritten.
- USB Dock H.264 and PCM packets are untouched.
- Replaced libnx's indefinite synchronous USB transfers with a SysDVR-derived timeout-and-cancel transport. A cable loss can no longer carry an old gameplay, audio, or keepalive packet into the next connection.
- Added a hard one-second host-loss boundary. The old endpoint request is cancelled, the console screen is restored, and the next plug begins with a fresh protocol greeting and session generation.
- Kept the validated video, PCM audio, screen-blanking, and Dock decoding paths unchanged.
- Compatible with the existing SwitchCast Dock 0.1.16 image.
- Added an independent USB liveness supervisor. A matched Dock requests tiny protocol keepalives, so cable loss is detected even while gameplay capture is blocked waiting for a title.
- Added a 1.5-second gameplay freshness watchdog. The Switch panel is restored when video stops without waiting for the capture call or USB session to unwind.
- Added SysDVR-compatible 48 kHz, 16-bit stereo PCM to USB Dock mode. Audio uses its own capture thread and serialized USB writes; Cast over Wi-Fi remains deliberately video-only.
- Preserved the screen-blank safety rules: never blank SwitchCast Settings, blank only after a delivered gameplay frame, and restore on pause, disconnect, backend change, or shutdown.
- Paired this release with SwitchCast Dock 0.1.16, which adds low-buffer HDMI audio, a professional Ready/status display, video-idle teardown and resume, endpoint cleanup, and more reliable reconnects.
- Added a native, video-only USB Dock transport to the standalone SwitchCast sysmodule.
- Added a mutually exclusive Cast over Wi-Fi / USB Dock selector to the SwitchCast Settings dashboard.
- Retained SysDVR protocol-03 packet compatibility and prominent upstream attribution.
- Put the Cast working buffers and two USB endpoint pages in a union so the inactive transport consumes no parallel buffer allocation.
- Kept the socket subsystem offline in USB mode.
- Preserved screen blanking's safety rules in both transports: Settings stays visible, blanking begins only after gameplay video, and the panel restores on stop or disconnect.
- Added live USB initialization, dock-waiting, game-waiting, streaming, I/O, and capture status through IPC.
- Paired this release with SwitchCast Dock 0.1.15, whose HDMI link is 1080p60 while the Switch's native continuous capture remains 1280x720 at about 30 fps.
- The same temporary 2 MiB media heap now uses variable-size frame allocations and can retain up to 24 encoded frames instead of three fixed partitions.
- Late packet-loss feedback has a much deeper retransmission window without increasing the sysmodule memory budget or receiver delay.
- Unrecoverable NACKs and stalled receiver checkpoints refresh the native Cast media session automatically while the gameplay capture remains active.
/config/switchcast/last-failure.jsonpreserves the final recovery snapshot even after a successful automatic reconnection.- Diagnostics now include retained history, arena high-water marks, evictions, feedback age, checkpoint age, recovery count, and the recovery reason.
- An optional Blank Switch screen while streaming setting turns off only the console backlight after the first gameplay frame is transmitted.
- The option applies live and restores the backlight when gameplay frames stop, a title exits, the receiver disconnects, or SwitchCast is stopped.
- Opening SwitchCast Settings always restores and keeps the console display on, even when the Settings screen itself is being captured.
- Screen blanking is off by default and never turns on a display that was already off before SwitchCast changed it.
- An original SwitchCast logo and indigo/cyan/coral interface.
- A dedicated dashboard with live enabled state, receiver, transport status, requested video delay, and receiver-reported playout delay.
- Ultra-low video mode requests a 90 ms receiver playout delay, uses tighter packet pacing, and polls the capture queue more frequently.
- Stable mode retains the proven 0.2.1 settings: a 150 ms delay request and more conservative packet pacing.
- Changing latency profiles while enabled automatically restarts the video session so the next Cast negotiation uses the new setting.
- Cast audio remains disabled. USB Dock audio is enabled in 0.4.1 and later; game sound can still be played locally when using Cast over Wi-Fi.
SwitchCast has its own:
- Atmosphère content ID:
00FF000053434153 - IPC service:
swcast - configuration directory:
/config/switchcast - mutually exclusive Cast and USB Dock runtime and Settings UI
The installed binaries do not require, launch, replace, or communicate with a separate SysDVR installation. The sysmodule compiles Switch capture, Cast and USB Dock transports, and its small IPC controller; TCP, RTSP, and the legacy mode manager are not linked. The second grc:d audio session is opened only while USB Dock mode is active.
SwitchCast.nro: transport selector, receiver picker, enable/disable control, live status, boot preference, and dvr-patches manager.- A dedicated Atmosphère sysmodule that remains alive while a game runs.
- Native OFFER/ANSWER negotiation for 1280x720 H.264 video.
- Direct SysDVR-compatible USB protocol-03 H.264 output for SwitchCast Dock.
- AES-128-CTR frame encryption using the Switch's hardware AES implementation.
- Cast RTP packetization, RTCP feedback, retransmission, and keyframe recovery.
- A variable-size, up-to-24-frame history in a 2 MiB game-only arena with no permanent media heap.
- Selectable 90 ms ultra-low and 150 ms stable video timing profiles.
- Automatic capture start when a compatible game launches.
- Clean session teardown and automatic rearming when a game or homebrew title exits, including receiver CLOSE messages during that transition.
- Cast mode remains video-only to protect its memory and latency budget. USB Dock mode adds native stereo PCM without coupling audio timing to the video decoder queue.
The foreground NRO is only the controller. The dedicated sysmodule is required because an ordinary homebrew app cannot stay active beside a retail game.
- Extract
SwitchCast-Standalone-v0.4.4.zipto the SD-card root. - Reboot the console.
- Open
/switch/SwitchCast.nrofrom the Homebrew Menu. - Choose Cast over Wi-Fi and a receiver, or choose USB Dock and start the USB transport.
- Optionally choose Set current mode as default on boot.
- Exit the Settings app and launch a capture-compatible game.
The receiver list uses _googlecast._tcp.local multicast DNS. Automatic
selection and manual IPv4 entry are also available.
No cast_app_id file is used. There is no Cast Developer Console step.
See building.md for the devkitPro package versions and reproducible release
command. Contributions are welcome under the requirements in
CONTRIBUTING.md.
Version 0.4.4 can be copied directly over 0.4.3, 0.4.2, 0.4.1, 0.4.0, 0.3.2, 0.3.1, 0.3.0, or 0.2.1. The sysmodule and Settings application must both come from the same release because the transport selector extends the SwitchCast IPC protocol.
The prototype occupied the SysDVR content directory
/atmosphere/contents/00FF0000A53BB665. Version 0.4.4 does not overwrite or
remove that directory.
Before testing 0.4.4, make sure the old prototype or SysDVR is not also
streaming or enabled at boot. Two capture sysmodules can compete for memory and
the capture service. If 00FF0000A53BB665 contains the old SwitchCast
prototype, restore your SysDVR backup or remove that old prototype directory.
/atmosphere/contents/00FF000053434153/exefs.nsp
/atmosphere/contents/00FF000053434153/flags/boot2.flag
/atmosphere/contents/00FF000053434153/toolbox.json
/switch/SwitchCast.nro
/config/switchcast/enabled start SwitchCast automatically after boot
/config/switchcast/receiver_ip selected receiver IPv4 address
/config/switchcast/latency_profile `ultra` (90 ms) or `stable` (150 ms)
/config/switchcast/blank_screen blank the console backlight during video
/config/switchcast/transport `cast` or `usb`
/config/switchcast/debug.json live transport and recovery statistics
/config/switchcast/last-failure.json preserved final stream failure/recovery
/config/switchcast/error.json rejected Cast response, when available
Armed; waiting for a capture-compatible game
-> Discovering receiver
-> Opening the Cast control channel
-> Negotiating native Cast Streaming
-> UDP video session ready; waiting for a keyframe
-> Native low-latency gameplay video is streaming
When a game exits, the receiver, TLS/UDP sockets, queue, and temporary heap are released. SwitchCast returns to Armed; waiting for a capture-compatible game, ready for the next title without a reboot.
USB Dock mode follows the shorter path:
USB device ready; waiting for SwitchCast Dock
-> Dock connected; waiting for a capture-compatible game
-> Native H.264 gameplay packets over USB 2.0
-> Dock decoder and 1080p HDMI output
The video source in that path remains the Switch capture service's fixed 720p bitstream. Dock 0.1.16 scales it on the KMS display plane to a 1080p60 HDMI mode without software resizing or re-encoding, while stereo PCM travels in separate protocol packets.
- Horizon's capture service supplies fixed 1280x720, approximately 30 fps H.264 and captures games, not the HOME menu.
- The Dock's 1080p HDMI mode improves output compatibility and chooses the Pi's display-plane scaler; it cannot restore detail absent from the 720p source.
- Games that opt out of capture require compatible dvr-patches. Those patches can introduce title-specific problems.
- Receiver firmware and TV processing differ. Some models may reject the built-in Cast Streaming application or choose a larger playout delay.
- The displayed target is SwitchCast's request. The receiver-reported delay and the TV's decode/display pipeline determine the actual glass-to-glass latency.
- Guest Wi-Fi, client isolation, VLAN filtering, or blocked multicast can prevent discovery or streaming.
See CASTING.md for the wire protocol and recovery design.
SwitchCast is a derivative of SysDVR by Exelix11 and contributors and is distributed under the GNU General Public License version 2. Anyone may use, study, copy, modify, and redistribute it without paying a SwitchCast licensing fee. If you distribute SwitchCast or a modified version, you must preserve the GPL terms and make the corresponding source available as the license requires. The GPL protects software freedom rather than imposing a noncommercial restriction, so people may charge for copies or related services while every recipient retains the same rights.
See LICENSE, SYSDVR-ATTRIBUTION.md,
NOTICE.md, and
THIRD-PARTY-NOTICES.md.
The source and binary release both carry the complete attribution bundle. Vendored libraries, fonts, statically linked build dependencies, and reference-only projects are inventoried separately so the SysDVR credit is prominent without obscuring the other authors whose work is present.
