Switchfin: a native Jellyfin client that runs on PC and on consoles
Third-party native Jellyfin client for PC/PS4/PSVita/Nintendo Switch
At a glance
- What is it?
- Switchfin is a third-party Jellyfin client written in C++ that presents a native interface for browsing and playing a media server, and it is built for the Nintendo Switch, the PS4, the PS Vita and the desktop alike, with mpv doing the playback. It suits people who want a console-style interface to their own server.
- Who is it for?
- Switchfin is a good fit for someone who runs a Jellyfin server and plays on a console or on a handheld, and who wants a native interface with the controls they are used to rather than a browser in a full screen mode. It is the wrong choice for a phone or tablet, where the official clients exist and this project does not target them, and it is the wrong choice for a server-side or transcoding-heavy setup, since the client is a player and the transcoding happens on the server.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly C++, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
One client, four very different targets
The name suggests a console project and the build instructions confirm it, but the scope is wider than the name. Switchfin is described as a third-party PC player for Jellyfin that provides a native user interface to browse and play movies and series, and the badges show a build for the Nintendo Switch, the PS Vita and the PS4 alongside a Flathub entry for Linux. The architecture section of the repository layout is telling: there is an app directory for the interface, a library directory, a cmake directory, a debian directory for packaging, a resources directory and a scripts directory, with the build driven by a CMakeLists.txt at the root and a.gitmodules file, which is the sign of a project that pulls in several sub-projects as dependencies. The acknowledgements section names them, with libnx from switchbrew for the Nintendo Switch, borealis, nxmp, and the FFmpeg and mpv contributions for hardware acceleration and a deko3d backend. So the same interface and the same player code are compiled against four quite different platform toolchains, and the fork in the build system is the platform flag.
mpv does the decoding, and the format list is the real feature
Playback is built on MPV Player, and that decision explains the whole feature list. The container formats supported are MKV, MOV, MP4 and AVI. The video codecs are H.264, H.265, VP8, VP9 and AV1. The audio codecs include Opus, FLAC, MP3, AAC, AC-3, E-AC-3, TrueHD, DTS and DTS-HD. The subtitle codecs are SRT, VTT, SSA and ASS, and DVDSUB. On top of that there is hardware-accelerated decoding with a fallback to software decoding when needed, which is the part that matters on a console where the GPU path and the CPU path have very different characteristics. The player is also responsible for the parts a media interface needs but a codec does not: full audio track, subtitle track and chapter selection, and the on screen display. The key mapping table shows that being designed for a gamepad, with the A button mapping to play and pause, B to stop, Y to toggle the OSD, X to show the menu, the shoulder buttons to seek, and the plus button to show the video profile, with a keyboard equivalent for each. The keyboard bindings are customisable in Settings, and the configuration file is a JSON object of setting names to key names.
The server side of the feature list is mostly extras
Beyond browsing and playing, the client handles the things a Jellyfin server exposes. Live TV comes with a channel guide and program recommendations. Direct play and server-side transcoding are both supported, with auto-detection of which one applies. Downloading is supported, including batch download for a series, so content can be taken offline. MirrorPlay gives remote playback control over a WebSocket, so you browse on a phone and play on a large screen, and the dashboard lets you monitor server sessions, activities and device status, and trigger a restart or a library rescan. Search is full-text with suggestions across all media types, and there is an integration for danmaku, the bullet comment overlay used on Chinese video platforms, which works through a Jellyfin plugin rather than being built into the client. One item is genuinely console-specific, external drive support on the Nintendo Switch through libusbhsfs. The interface is translated into 14 languages, and the list is a mix of major and less common ones, from English, Simplified and Traditional Chinese, Japanese and Korean through to Ukrainian and Vietnamese.
A remote file browser that treats NAS protocols as a library
The remote file browser is a feature that blurs the line between a media client and a file manager, and it is where the configuration file earns its keep. You can browse and play media from external sources over WebDAV, HTTP or HTTPS, SFTP, FTP and the local filesystem, and you can manage multiple remote sources with add, edit and remove. The configuration is a JSON file with a remotes array, and each entry has a name, a url and optionally a user and a passwd, so a WebDAV source, an SFTP source with credentials in the url, a plain HTTP source and a local path can all coexist. The readme gives a worked example with a local entry pointing at a file url for the Switch card, a WebDAV entry with a user and password, an SFTP entry carrying the credentials in the url, and an HTTP entry. It also shows how to serve files over HTTP with rclone for the HTTP case. The reason this is worth the trouble on a console is that a media server on a home network is often not the only place your media lives, and a client that can reach a NAS directly removes a copy.
Building for the Switch and building for the desktop
The build is CMake with a platform flag, and the two paths are quite different. The desktop build needs mpv, libcurl and libwebp with their development headers installed, and then a configure and a build:
cmake -B build -DPLATFORM_DESKTOP=ON
cmake --build buildThe Nintendo Switch build needs the devkitPro environment set up first, and then a set of switch libraries installed through the devkitPro package manager, covering the development kit, glfw, libwebp, curl and libmpv. The configure uses a different directory and a different flag, the build target is an .nro file, and the debug step uses nxlink:
sudo dkp-pacman -S switch-dev switch-glfw switch-libwebp switch-curl switch-libmpv
cmake -B build_switch -DPLATFORM_SWITCH=ON
make -C build_switch Switchfin.nro -j$(nproc)There is also a MinGW64 path for Windows, which installs a compiler, ninja and cmake from the MinGW package manager, then configures with the Ninja generator. The clone command uses the recurse-submodules and shallow-submodules flags, which is not optional detail but a requirement, since the platform libraries are submodules. The system requirements table sets the floor per platform: Windows 7 or later with DirectX 11.1 support, macOS 10.15 or later on either Intel or Apple Silicon, and Linux on x86_64 or arm64v8 with OpenGL 3.0 or later, with Flatpak recommended.
The small print, and where to get the builds
Two details in the readme are worth reading before anything else. The first is a single line at the top: this project is in its early stages so expect bugs. The second is that the macOS build will not open on first launch unless the quarantine attribute is removed, and the given command for that is:
sudo xattr -rd com.apple.quarantine /Applications/Switchfin.appThe Switch has its own equivalent problem, since subtitles do not display until a font file is placed at the path /switch/Switchfin/subfont.ttf, which is the kind of platform detail that only appears when someone has deployed to the hardware. The distribution channels are broad, with a Flathub listing for Linux under the fun.dragonfly.switchfin identifier, a Homebrew-style package for the Vita, a package for the PS4, a Homebrew package for the Nintendo Switch, a GitHub releases page for downloads, and a nightly build linked from the dev branch workflow. The release history shows 0.9.4 from 2026-08-25, a vita-packages tag from 2026-08-18 and a switch-portlibs tag from 2026-01-28, which reflects the three platform artefacts being released independently rather than in lockstep. The default branch is dev and the licence field on the repository says Apache-2.0, with a LICENSE file at the root and a CHANGELOG.md alongside it.
Editorial conclusion
Switchfin is a good fit for someone who runs a Jellyfin server and plays on a console or on a handheld, and who wants a native interface with the controls they are used to rather than a browser in a full screen mode. It is the wrong choice for a phone or tablet, where the official clients exist and this project does not target them, and it is the wrong choice for a server-side or transcoding-heavy setup, since the client is a player and the transcoding happens on the server. It is also the wrong choice if you need a stable, feature-complete client today, because the readme opens by saying the project is in its early stages and to expect bugs. Before building it, decide which platform you are targeting, since the Nintendo Switch build needs the devkitPro toolchain and its own set of libraries while the desktop build needs mpv, libcurl and libwebp with development headers. The project is Apache-2.0 licensed, the last push was on 2026-10-22, and the current release is 0.9.4 from 2026-08-25.
Frequently asked questions
What is Switchfin and which platforms does it run on?
It is a third-party Jellyfin client providing a native user interface to browse and play movies and series, written in C++ with mpv for playback. It targets the Nintendo Switch, the PS4, the PS Vita and the desktop, with Flathub and release downloads for the desktop and separate package tags for each console.
How do I build Switchfin for the desktop?
Install mpv, libcurl, libwebp and their development headers, then run cmake -B build -DPLATFORM_DESKTOP=ON followed by cmake --build build. There is a separate MinGW64 path for Windows that installs a compiler, ninja and cmake from the MinGW package manager and configures with the Ninja generator.
How do I add a remote source such as WebDAV or SFTP to Switchfin?
Edit config.json and add entries under remotes, each with a name and a url and optionally a user and passwd. The readme shows examples for a local file url, a WebDAV url with separate credentials, an SFTP url carrying the credentials in the url itself, and a plain HTTP url, and there is a separate rclone command for serving files over HTTP.
Which formats can Switchfin play?
Container formats MKV, MOV, MP4 and AVI, video codecs H.264, H.265, VP8, VP9 and AV1, audio codecs Opus, FLAC, MP3, AAC, AC-3, E-AC-3, TrueHD, DTS and DTS-HD, and subtitle codecs SRT, VTT, SSA/ASS and DVDSUB, with hardware-accelerated decoding and a fallback to software decoding.
Why will the Switchfin macOS app not open?
The quarantine attribute has to be removed before the app will open. The readme gives the command to run in Terminal, which is sudo xattr -rd com.apple.quarantine /Applications/Switchfin.app, and on the Nintendo Switch subtitles do not display until a.ttf font file is placed at /switch/Switchfin/subfont.ttf.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/dragonflylee-switchfin)Was this useful?