Native Jellyfin media client for Nintendo 3DS. Stream music and video from your Jellyfin server directly to your 3DS.
The first native Jellyfin client for Nintendo 3DS.
- Music streaming — browse artists, albums, tracks. MP3/AAC with album art
- Video streaming — H.264 hardware decode at 24fps on New 3DS (400x224)
- Audio + video sync — 3-thread architecture with audio-master sync
- Library browsing — navigate all Jellyfin libraries with pagination
- Search — find content across all libraries (SELECT button)
- Seeking — skip forward/back 30 seconds (L/R shoulder buttons)
- Auto-play — next track/episode plays automatically
- Session persistence — login once, credentials saved to SD card
- Watch mode — hide bottom screen for distraction-free viewing (D-pad Down)
- Album art — displayed on now-playing screen for music
- Nintendo 3DS with Luma3DS CFW
- Homebrew Launcher
- Jellyfin server on the same network
- New 3DS required for video playback (Old 3DS: audio only)
- Download
jellyfin-3ds.3dsxfrom Releases - Copy to
sdmc:/3ds/jellyfin-3ds/jellyfin-3ds.3dsxon your SD card - Launch from Homebrew Launcher
| Screen | Button | Action |
|---|---|---|
| Browse | D-pad | Navigate list |
| Browse | A | Enter folder / Play |
| Browse | B | Go back |
| Browse | L/R | Next/previous page |
| Browse | SELECT | Search |
| Browse | Touch | Tap to select, drag to scroll |
| Now Playing | A | Pause / Resume |
| Now Playing | X | Stop |
| Now Playing | B | Back to browse |
| Now Playing | L/R | Seek ±30 seconds |
| Now Playing | D-pad Down | Watch mode (hide controls) |
| Now Playing | D-pad Up | Show controls |
| Any | START | Exit app |
- Enter your Jellyfin server URL (e.g.
http://192.168.1.100:8096) - Enter username and password
- Press R to connect
Credentials are saved automatically — next launch skips login.
- devkitPro with 3DS toolchain
- Docker (for reproducible builds)
# Install devkitPro packages (if building natively)
sudo dkp-pacman -S 3ds-dev 3ds-curl 3ds-mbedtls 3ds-zlib \
3ds-libmpg123 3ds-libopus 3ds-opusfile 3ds-libvorbisidec 3ds-libogg
# Build the app (first run cross-compiles FFmpeg, ~15 min; subsequent runs are fast)
./build.sh
# Deploy via FTP (3DS must be running ftpd)
./deploy-ftp.sh <3DS_IP> 5000./build.sh # uses devkitpro/devkitarm Docker imageNetwork thread → Ring buffer → Decode thread (FFmpeg demux + MVD H.264 + AAC)
→ Frame queue (6 slots) → Convert thread (Morton tile + A/V sync)
→ Double-buffered GPU textures → Main thread (citro2d render)
- FFmpeg 6.x — MPEG-TS demuxer, AAC decoder, H.264 parser
- MVD — Hardware H.264 decoder (New 3DS)
- NDSP — Hardware audio output
- citro2d/citro3d — GPU-accelerated 2D rendering
- libcurl + mbedTLS — HTTPS networking
- cJSON — JSON API parsing
- stb_image — Album art JPEG decoding
- Video playback requires New 3DS (Old 3DS: audio only)
- No subtitle support yet
- No offline/download mode
- CIA install not yet working (use .3dsx via Homebrew Launcher)
- Some library types may show unexpected content (server-dependent)
Built with reference to:
- ThirdTube — video architecture
- Switchfin — Jellyfin API patterns
- Video player for 3DS — MVD decoder usage