Homebrew Homebrew app [Release] Switch Frame Tap - stream Switch games to your PC over USB at native 1080p 60fps (no capture card)

  • Thread starter Thread starter Papux200
  • Start date Start date
  • Views Views 5,859
  • Replies Replies 77
  • Likes Likes 21
@Papux200

Code:
if(APPLE)
    list(APPEND CMAKE_PROGRAM_PATH "/opt/homebrew/bin" "/usr/local/bin")
    list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew" "/usr/local")
endif()

viewer compiles and run on macOS with this added to cmakelists.txt

i will make further tests. now i am waiting for my switch to test it full
 
Last edited by proconsule54,
  • Like
Reactions: Papux200
@Papux200

Code:
if(APPLE)
    list(APPEND CMAKE_PROGRAM_PATH "/opt/homebrew/bin" "/usr/local/bin")
    list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew" "/usr/local")
endif()

viewer compiles and run on macOS with this added to cmakelists.txt

i will make further tests. now i am waiting for my switch to test it full
That's great! Please tell me how it goes. The only reason I haven't released a mac viewer yet is I don't really have access to a mac
 
  • Like
Reactions: proconsule54
@SooraMaru thanks, masagrator is right: the sysmodule keeps about 40 MB of the applet memory from the first game on, even with streaming off, and the web applet needs it. I'm working on a fix now: it will only take that memory while it's streaming and give it back when you stop, so the browser works whenever you're not streaming.
@DarkKRPG that could be the same thing, the profile picker is an applet too. Could you send config/switch-frame-tap/log.txt from a boot where it went black?
@kingboxnt could you send the log from a run where that happened? Was it the viewer's recording (R)?
This is the only log I found. Thanks for looking into this.
 

Attachments

@SooraMaru thanks, masagrator is right: the sysmodule keeps about 40 MB of the applet memory from the first game on, even with streaming off, and the web applet needs it. I'm working on a fix now: it will only take that memory while it's streaming and give it back when you stop, so the browser works whenever you're not streaming.
@DarkKRPG that could be the same thing, the profile picker is an applet too. Could you send config/switch-frame-tap/log.txt from a boot where it went black?
@kingboxnt could you send the log from a run where that happened? Was it the viewer's recording (R)?
Never mind—it's an MPC-HC playback issue. Switching to PotPlayer makes it playable, but why would the parameters of the recorded video be different? Recordings of other games play normally in MPC-HC.

It can be played in MPC-HC.
General
Complete name : C:\Users\p\Videos\Switch Frame Tap\switch_2026-10-07_10-03-37.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : iso5 (iso5/iso6/mp41)
File size : 6.30 MiB
Duration : 27 s 167 ms
Overall bit rate : 1 946 kb/s
Frame rate : 37.037 FPS
Writing application : Lavf62.12.100

Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings : CABAC / 1 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference fra : 1 frame
Format settings, GOP : M=1, N=60
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 27 s 27 ms
Bit rate : 1 840 kb/s
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Variable
Frame rate : 37.037 FPS
Minimum frame rate : 1.405 FPS
Maximum frame rate : 146.341 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.054
Stream size : 5.93 MiB (94%)
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
Codec configuration box : avcC

Audio
ID : 2
Format : AAC LC
Format/Info : Advanced Audio Codec Low Complexity
Format settings : PNS
Codec ID : mp4a-40-2
Duration : 27 s 167 ms
Bit rate mode : Constant
Bit rate : 110 kb/s
Nominal bit rate : 192 kb/s
Maximum bit rate : 192 kb/s
Channel(s) : 2 channels
Channel layout : L R
Sampling rate : 48.0 kHz
Frame rate : 46.875 FPS (1024 SPF)
Compression mode : Lossy
Stream size : 364 KiB (6%)
Default : Yes
Alternate group : 1


Xenoblade Chronicles 2
It cannot be played in MPC-HC.

General
Complete name : C:\Users\p\Videos\Switch Frame Tap\switch_2026-10-08_08-32-07.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : iso5 (iso5/iso6/mp41)
File size : 11.7 MiB
Duration : 7 s 46 ms
Overall bit rate : 14.0 Mb/s
Frame rate : 29.806 FPS
Writing application : Lavf62.12.100

Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings : CABAC / 1 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference fra : 1 frame
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 7 s 46 ms
Bit rate : 14.0 Mb/s
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate mode : Variable
Frame rate : 29.806 FPS
Minimum frame rate : 16.857 FPS
Maximum frame rate : 60.000 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.509
Stream size : 11.7 MiB (100%)
Color range : Limited
Color primaries : BT.709
Transfer characteristics : BT.709
Matrix coefficients : BT.709
Codec configuration box : avcC

Audio
ID : 2
Format : AAC LC
Format/Info : Advanced Audio Codec Low Complexity
Codec ID : mp4a-40-2
Bit rate mode : Constant
Nominal bit rate : 192 kb/s
Maximum bit rate : 192 kb/s
Channel(s) : 2 channels
Channel layout : L R
Sampling rate : 48.0 kHz
Frame rate : 46.875 FPS (1024 SPF)
Compression mode : Lossy
Default : Yes
Alternate group : 1

In MediaInfo, both the Video and Audio sections are missing a few parameters.
 

Attachments

Just want to follow up to say just how much I enjoy and appreciate this app, I'm astonished that I can stream directly to my PC without any capture hardware and with no latency it's a beautiful thing! Excited to see it continue to develop. Thank you very much @Papux200 for your hard work and persistence in solving this!
 
  • Like
Reactions: Papux200
@Papux200 I used the wrong receiver app, (polish the soruce repo I suggest) the raw_view is working with usb on macOS perfectly with a modified Makefile.
Post automatically merged:

Code:
# tools/raw-recv - PC side of the switch-frame-tap USB transport.
#   make            build raw-view (live viewer) and raw-recv (frame dumper)
#   make test       replay a stream built from real NVENC output through raw-view
# raw-view decodes H.264 (M83 nvstream) when libavcodec is found; without it it
# still shows the raw and packed-4:2:0 streams and says so for H.264 packets.
CC      ?= cc
CFLAGS  ?= -O2 -Wall -Wextra
BASE     = libusb-1.0 sdl2

UNAME_S := $(shell uname -s)

ifeq ($(UNAME_S),Darwin)
# ---- macOS + Homebrew: no pkg-config, explicit paths --------------------
# brew install libusb sdl2 ffmpeg
BREW_PREFIX := $(shell brew --prefix 2>/dev/null || echo /opt/homebrew)
H264 := $(shell test -f $(BREW_PREFIX)/include/libavcodec/avcodec.h && echo 1)
MP4  := $(shell test -f $(BREW_PREFIX)/include/libavformat/avformat.h && echo 1)
MAC_CFLAGS  = -I$(BREW_PREFIX)/include -D_THREAD_SAFE
MAC_LIBS    = -L$(BREW_PREFIX)/lib -lusb-1.0 -lSDL2
AV_LIBS     = -lavcodec -lavutil
ifeq ($(H264)$(MP4),11)
VIEW_CFLAGS = -DSFT_H264 -DSFT_MP4 $(MAC_CFLAGS)
VIEW_LIBS   = $(MAC_LIBS) $(AV_LIBS) -lavformat
else ifeq ($(H264),1)
VIEW_CFLAGS = -DSFT_H264 $(MAC_CFLAGS)
VIEW_LIBS   = $(MAC_LIBS) $(AV_LIBS)
else
VIEW_CFLAGS = $(MAC_CFLAGS)
VIEW_LIBS   = $(MAC_LIBS)
endif
RECV_CFLAGS = $(MAC_CFLAGS)
RECV_LIBS   = -L$(BREW_PREFIX)/lib -lusb-1.0
AVF_CFLAGS  = $(MAC_CFLAGS)
AVF_LIBS    = -L$(BREW_PREFIX)/lib -lavformat -lavcodec -lavutil

else
# ---- Linux (and anything with pkg-config) --------------------------------
H264    := $(shell pkg-config --exists libavcodec libavutil && echo 1)
MP4     := $(shell pkg-config --exists libavformat && echo 1)
ifeq ($(H264)$(MP4),11)
# v0.5: R records to MP4 (libavformat)
VIEW_CFLAGS = -DSFT_H264 -DSFT_MP4 $(shell pkg-config --cflags $(BASE) libavcodec libavutil libavformat)
VIEW_LIBS   = $(shell pkg-config --libs $(BASE) libavcodec libavutil libavformat)
else ifeq ($(H264),1)
VIEW_CFLAGS = -DSFT_H264 $(shell pkg-config --cflags $(BASE) libavcodec libavutil)
VIEW_LIBS   = $(shell pkg-config --libs $(BASE) libavcodec libavutil)
else
VIEW_CFLAGS = $(shell pkg-config --cflags $(BASE))
VIEW_LIBS   = $(shell pkg-config --libs $(BASE))
endif
RECV_CFLAGS = $(shell pkg-config --cflags libusb-1.0)
RECV_LIBS   = $(shell pkg-config --libs libusb-1.0)
AVF_CFLAGS  = $(shell pkg-config --cflags libavformat libavcodec libavutil)
AVF_LIBS    = $(shell pkg-config --libs libavformat libavcodec libavutil)
endif

all: raw-view raw-recv

raw-view: raw-view.c record.h menu.h hud.h font_dejavu.h
    $(CC) $(CFLAGS) $(VIEW_CFLAGS) -o $@ $< $(VIEW_LIBS)
    @echo "raw-view built $(if $(filter 1,$(H264)),WITH,WITHOUT) H.264 (libavcodec)"

# v0.4: webcam-mode check (V4L2 + libavcodec) - Linux only
uvc-check: uvc-check.c
    $(CC) $(CFLAGS) $(shell pkg-config --cflags libavcodec libavutil) -o $@ $< $(shell pkg-config --libs libavcodec libavutil)

# v0.5: checks a recording (tools/raw-recv/mp4_record_test.sh)
mp4-check: mp4-check.c
    $(CC) $(CFLAGS) $(AVF_CFLAGS) -o $@ $< $(AVF_LIBS)

raw-recv: raw-recv.c
    $(CC) $(CFLAGS) $(RECV_CFLAGS) -o $@ $< $(RECV_LIBS)

test: raw-view
    python3 ../sft_stream_test.py

clean:
    rm -f raw-view raw-recv

.PHONY: all test clean

With this it compiles and work well on macOS
Post automatically merged:

Screenshot 2026-10-10 alle 10.19.37.png
 
Last edited by proconsule54,
  • Like
Reactions: Papux200
Tried it on 23.0 firmware and 1.12 atmosphere and it crashed and i had to remove it
any indication when will it be supported?
 
Tried it on 23.0 firmware and 1.12 atmosphere and it crashed and i had to remove it
any indication when will it be supported?
Without logs, you comment is just that and provides no help to solve the problem.

As much as possible, provide logs to the developer.
 
just wanna say thank you, it's a very awesome homebrew app for the switch. i streamed on twitch with it and it makes streaming safer from a modded switch because you wont get banned because you cant see the modified homescreen.

when i tried to use it with tmnt splintered fate the whole game stuttered extremely. just tried it one time, dont know if its there anymore but everything else worked perfectly..
 
Thanks everyone! Switch Frame Tap is now on the Homebrew App Store.

@Spawnn @creeper3010 I haven't updated to 23.0 yet. If it crashes for you, please send the newest file in atmosphere/crash_reports/ and config/switch-frame-tap/log.txt, that's what I need to fix it. If the crash says ovlloader/Tesla, update to Ultrahand Overlay.

@proconsule54 awesome, thanks! I'll add the macOS Makefile.

@kingboxnt thanks, I'll fix the recording timestamps so MPC-HC plays them too.

@BigBro030 thanks! I'll check TMNT.
 
For the past year of so for learning purposes I'd been docking my switch and playing it hooked up to an Elgato Pro capture card. When it went wonky after a power supply failure(that also took out a GPU) a while ago I was initially thinking of buying a new one, but this homebrew entirelly changed my work flow. Fantastic work and thank you. These days I just play in handheld mode and whenever i see a word I don't know I can lazily check the definition with something like Meikipop on my PC. Games like the Yokai Watch remake or Buddy Mission Bond are 100% more enjoyable like this. I know its a niche usecase but this is a hall of famer for me in terms of switch homebrew.
 
  • Like
Reactions: Papux200
Wow! Brililiant work. This is huge for the Switch Lite.
Post automatically merged:

@Papux200 I just downloaded it from Sphaira Hombrew App Store. So fast and easy to install. Letting the user to install missing dependencies from the app itself is so cool. But I cannot try it on any of my computers. Let me explain:

I do not have Windows machines, I do use macOS (sillicon) and Bazzite (Fedora Linux x64). I know there's already a Linux viewer client, but the instructions are written for Ubuntu/Debian only, so that leaves inmutable Arch and Fedora distros (like SteamOS or Bazzite) out of it. I please kindly ask for a Flatpack or AppImage version of the client for all Linux users, and if possible, a macOS version, but I do understand that if you don't have a Mac, it can be more difficult to deliver it.
 
Last edited by depende3000,
  • Like
Reactions: Papux200
Wow! Brililiant work. This is huge for the Switch Lite.
Post automatically merged:

@Papux200 I just downloaded it from Sphaira Hombrew App Store. So fast and easy to install. Letting the user to install missing dependencies from the app itself is so cool. But I cannot try it on any of my computers. Let me explain:

I do not have Windows machines, I do use macOS (sillicon) and Bazzite (Fedora Linux x64). I know there's already a Linux viewer client, but the instructions are written for Ubuntu/Debian only, so that leaves inmutable Arch and Fedora distros (like SteamOS or Bazzite) out of it. I please kindly ask for a Flatpack or AppImage version of the client for all Linux users, and if possible, a macOS version, but I do understand that if you don't have a Mac, it can be more difficult to deliver it.
I'm working on it for next release. It should theoretically work on mac but I would need you to test it out since I don't have a mac. Regarding linux support for Arch and Fedora that is doable, I'll get into it
Post automatically merged:

v0.7.10 is out: game manuals, news and the eShop work again with Switch Frame Tap installed. The sysmodule used to keep a few MB of the memory the browser needs; now a small helper borrows the streaming memory only while the viewer is connected. If a game opens its manual while you stream, the stream pauses and comes back when you close it. The viewer also tells you now why there's no picture (HOME menu, manual open, etc).

One limit left: opening a manual or the eShop from the HOME menu while streaming still crashes it, so disconnect the viewer first.

@SooraMaru @masagrator thanks for the reports!
https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.10
Post automatically merged:

Test build v0.7.11-test1 is up for anyone who wants to help:
- 23.0 / AMS 1.12 users: it should boot now. To try streaming set allow_untested_firmware = 1 in config.ini, and please send me the log.
- Mac (Apple Silicon and Intel) and Linux users on Fedora/Arch/Bazzite/SteamOS: new viewers, no building needed.
https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11-test1
Post automatically merged:

Test build v0.7.11-test2 is up:
- HOME menu: the stream stops and frees its memory, so a manual or the eShop opened from HOME no longer crashes (thanks @bshurikan for the PR)
- USB is released while streaming is off (@masagrator)
- recordings always have a complete audio track now, MPC-HC should play them (@kingboxnt)
- the viewer has one frame less latency, and V turns vsync off
Plus everything from test1 (23.0, Mac and Linux viewers).
https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11-test2
Post automatically merged:

Test build v0.7.11-test3 adds two screenshot options in the Switch Frame Tap app:
- save them in the same Album folder as the system's screenshots, so they're all in one place on the SD card
- your own button combo, including the Capture button (e.g. ZL + Capture saves the system's JPEG and the native PNG at the same time)
@depende3000 the Mac and Linux viewers are in there too, no building needed.
https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11-test3
Post automatically merged:

v0.7.11-test4 is up (pre-release): https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11-test4

New in the PC viewer: optional GPU upscaling, press U to cycle. FSR 1 and NIS work on any GPU (Windows/Linux), and Windows also gets NVIDIA RTX Video Super Resolution (turn on Super resolution in the NVIDIA app). It's off by default and only does something when the window is bigger than the stream, e.g. handheld mode in fullscreen or docked on a 1440p/4K screen. If anyone has an RTX card on Windows, please try RTX VSR and tell me if it works!
 
Last edited by Papux200,
  • Like
Reactions: Zumoly
Just tested the mac version and it works great.
My experience in general and some suggestions:
First it crash on startup while having nextendo enabled (I had to turn that off)
Some games not working (fast rmx) viewer not picking anything while in game.
Games with variable fps (menu / in game) occasionally slow downs (Kirby Star Allies)
I wish there would be a way to turn off the switch screen when it's connected via USB
The viewer could use some options ( saturation - gamma - brightness- sharpness ) etc.
 
v0.7.11-test5 is up: https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11-test5 — fixes RTX Video Super Resolution on Windows (it didn't start in test4), and U now switches between FSR 1, NIS and RTX VSR instantly, no restart needed. RTX VSR adds a few ms of latency, so it stays off by default.
Post automatically merged:

@reirahul thanks for testing the Mac version! For the crash with Nextendo and Fast RMX not streaming, can you send the newest file in atmosphere/crash_reports/ and config/switch-frame-tap/log.txt? Turning off the Switch screen while streaming and picture options in the viewer are good ideas, I'll look into them.
Post automatically merged:

v0.7.11 is out (full release): https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11
- Firmware 23.0 / Atmosphère 1.12 support (confirmed working on 23.0.0)
- macOS app, and one Linux viewer for every distro (Fedora, Arch, Bazzite, SteamOS...)
- Pressing HOME while streaming no longer crashes manuals or the eShop
- Screenshots can go to the system Album, and you can set your own combo with the Capture button
- Lower latency in the viewer, V toggles vsync, and optional GPU upscaling (U): FSR 1, NIS, RTX VSR on Windows

Thanks to everyone who tested!
Post automatically merged:

v0.7.12-test1 is up (pre-release): https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.12-test1
- The viewer decodes on your graphics card now (lower latency), with a new design: one Settings panel (Esc or the gear icon)
- Picture controls: brightness, contrast, saturation, gamma, sharpness
- Screen off while streaming, in the overlay and the app

@reirahul the screen-off and picture options you asked for are in. Mac and Windows testers, please tell me if the stats overlay (F3) says GPU next to "decoder"!
Post automatically merged:

v0.7.12 is out: https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.12
- New viewer design: one Settings panel (Esc or the gear) for everything
- Picture controls: brightness, contrast, saturation, gamma, sharpness
- Screen off while streaming (overlay and app), back on the moment the stream stops
- Recording timer, and a few ms less latency at 1080p

Windows and Mac users: try "Hardware decoding (beta)" in Settings and tell me if the stats overlay (F3) says GPU next to "decoder"!
 
Last edited by Papux200,
  • Like
Reactions: proconsule54
v0.7.11-test5 is up: https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11-test5 — fixes RTX Video Super Resolution on Windows (it didn't start in test4), and U now switches between FSR 1, NIS and RTX VSR instantly, no restart needed. RTX VSR adds a few ms of latency, so it stays off by default.
Post automatically merged:

@reirahul thanks for testing the Mac version! For the crash with Nextendo and Fast RMX not streaming, can you send the newest file in atmosphere/crash_reports/ and config/switch-frame-tap/log.txt? Turning off the Switch screen while streaming and picture options in the viewer are good ideas, I'll look into them.
Post automatically merged:

v0.7.11 is out (full release): https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.11
- Firmware 23.0 / Atmosphère 1.12 support (confirmed working on 23.0.0)
- macOS app, and one Linux viewer for every distro (Fedora, Arch, Bazzite, SteamOS...)
- Pressing HOME while streaming no longer crashes manuals or the eShop
- Screenshots can go to the system Album, and you can set your own combo with the Capture button
- Lower latency in the viewer, V toggles vsync, and optional GPU upscaling (U): FSR 1, NIS, RTX VSR on Windows

Thanks to everyone who tested!
Post automatically merged:

v0.7.12-test1 is up (pre-release): https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.12-test1
- The viewer decodes on your graphics card now (lower latency), with a new design: one Settings panel (Esc or the gear icon)
- Picture controls: brightness, contrast, saturation, gamma, sharpness
- Screen off while streaming, in the overlay and the app

@reirahul the screen-off and picture options you asked for are in. Mac and Windows testers, please tell me if the stats overlay (F3) says GPU next to "decoder"!
Post automatically merged:

v0.7.12 is out: https://github.com/TomasUribe/switch-frame-tap/releases/tag/v0.7.12
- New viewer design: one Settings panel (Esc or the gear) for everything
- Picture controls: brightness, contrast, saturation, gamma, sharpness
- Screen off while streaming (overlay and app), back on the moment the stream stops
- Recording timer, and a few ms less latency at 1080p

Windows and Mac users: try "Hardware decoding (beta)" in Settings and tell me if the stats overlay (F3) says GPU next to "decoder"!
MPC-HC can now play the Xenoblade Chronicles 2 recording from v0.7.12 normally, but the recorded audio bitrate is basically 0, so the MP4 has no sound. Also, I didn't get log.txt.

2026-10-14_145645.png
 
Audio is not recorded if game doesn't support builtin video recording. That is explained in readme. XC2 doesn't support it.
 

Site & Scene News

New Hot Discussed User Submitted