This was almost entirely generated by AI with guidance and oversight by someone extremely new to C# development. I welcome anyone with more experience and knowledge to correct whatever you find and improve it! It was created to fill my needs for a native Xbox client and my only hope for it is to be used (in any way, as a whole application or bits and pieces of code) by others :)
A native Jellyfin client for Xbox One and Xbox Series X|S consoles, built with UWP (Universal Windows Platform) and optimized for controller navigation and TV viewing.
| Gelatinarm | Gelatinarm 4K |
|---|---|
|
|
Note: This app requires a Jellyfin media server to connect to. Gelatinarm is the client application that provides an Xbox-optimized interface for your Jellyfin content.
- Full controller support - Navigate entirely with your Xbox controller
- TV-optimized UI - Large text and controls designed for 10-foot viewing
- Xbox accent colors - UI respects your system theme preferences
- Movies & TV Shows - Stream your entire video library
- Direct Play - Compatible files play as-is, straight from your server, with no transcoding
- Playback statistics (Y) - Shows whether you're direct playing, remuxing or transcoding, and the server's reasons
- Hardware acceleration - Optimized decoding for smooth playback
- HDR support - HDR10 (all Xbox models), HDR10+, HLG, and Dolby Vision profiles 8.1 and 8.4 (Xbox Series S/X only)
- Auto-Play Next Episode - Seamlessly continue to the next episode
- Episode Shuffle Mode - Random episode playback for your favorite shows
- Multiple Audio & Subtitle Tracks - Switch languages and subtitles during playback (a direct-played file switches audio inside the player; otherwise the stream restarts from the server at the same position)
- Server streaming fallback - Anything the Xbox can't play directly is remuxed or transcoded by your server over HLS
- Buffering optimization - Smart buffering for smooth playback
- Profile Switching - Switch between different users on the same server, keeping settings, playback history, etc. separate
- Background playback - Keep music playing while using other apps
- Mini player - Play/pause, previous/next, shuffle and repeat, from anywhere in the app
- Queue management - Play next, add to queue, shuffle, repeat
- Instant Mix - Create automatic playlists from any song
- Library browsing - Browse Movies, TV Shows, Music, and more
- Smart sorting & Filters - By name, date added, release date, rating; filter by several tags/metadata
- Search - Find content quickly across all libraries
- Collections - Browse curated collections
- Favorites - Quick access to your favorite content
- Unwatched indicators - See what's new at a glance
- Progress tracking - Visual progress bars for partially watched content
- Skip intro/outro/credits - Auto-skip or manual buttons (configurable) *Requires intro detection plugin on server
- Quick Connect - Easy pairing with your Jellyfin server using a simple code
- Memory optimization - Smart caching and resource management
- SSL certificate support - Optional self-signed certificate acceptance
✅ plays directly from the file. Anything else is remuxed or transcoded by your Jellyfin server: the cell says what the console does with the file as it is, or ❌. Press Y during playback to see which, and why. A direct play that fails to open is retried as a server stream. Test method: Docs/CODEC_TESTING.md.
| Codec | MP4, M4V, MOV, 3GP | MKV, WebM | TS, M2TS | MPG, VOB | AVI | WMV, ASF | Direct play requires |
|---|---|---|---|---|---|---|---|
| H.264 | ✅ | ✅ | ✅ | No picture | ✅ | ❌ | 8-bit 4:2:0 (10-bit, 4:2:2, 4:4:4: decoder error); Baseline, Main or High; level 5.2 or lower |
| HEVC | ✅ | ✅ | ✅ | No picture | ❌ | ❌ | 8- or 10-bit 4:2:0 (12-bit crashes the decoder; 4:2:2, 4:4:4: decoder error); level 6.1 or lower; Xbox One S or later |
| VP9 | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | 8- or 10-bit 4:2:0 (4:4:4: green picture) |
| VP8 | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | |
| MPEG-2 | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | |
| MPEG-1 | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | |
| MPEG-4 Part 2 (DivX, Xvid) | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | Simple Profile (B-frames stall or crash the video driver) |
| H.263 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | |
| MS-MPEG4 v2, v3 (DivX 3) | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | |
| WMV 7, WMV 8 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | |
| VC-1 (WMV 9) | ✅ | No picture | No picture | ❌ | ❌ | ✅ | |
| AV1 | No picture | No picture | ❌ | ❌ | ❌ | ❌ | |
| VVC, ProRes | No picture | ❌ | ❌ | ❌ | ❌ | ❌ | |
| DV | ❌ | ❌ | ❌ | ❌ | Jittery | ❌ | |
| Others | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
- All video: 60 fps or lower, within the picture size limit.
- FLV and OGV files (Sorenson, Theora): refused.
- Motion JPEG: Jellyfin serves the audio only.
- Transcoded video is HEVC when the server allows HEVC encoding and the console decodes it, otherwise H.264.
When only the audio is not ✅, the server converts the audio and copies the video.
| Codec | MP4, M4V, 3GP | MOV | MKV, WebM | TS, M2TS | MPG, VOB | AVI | WMV, ASF | Channels |
|---|---|---|---|---|---|---|---|---|
| AAC (LC, HE-AAC) | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | up to 5.1; 7.1 is silent |
| AC3 (Dolby Digital) | ✅ | Refused | ✅ | ✅ | ✅ | ✅ | Stutters | |
| E-AC3 (Dolby Digital Plus, Atmos) | ✅ | Refused | ✅ | ✅ | ❌ | ❌ | ❌ | up to 7.1 |
| MP3 | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | |
| MP2 | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | |
| FLAC | ✅ | – | ✅ | ❌ | ❌ | ❌ | ❌ | up to 7.1, 24-bit; 32-bit is silent |
| ALAC | Silent | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | |
| PCM | Silent | ✅ | Silent | ✅ Blu-ray LPCM in M2TS | Silent | ✅ | ❌ | up to 7.1 |
| Opus | Silent | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | stereo; 5.1 and 7.1 are silent |
| WMA | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | |
| AMR | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | |
| DTS, DTS-HD | ❌ | ❌ | Silent | Silent | ❌ | ❌ | ❌ | |
| TrueHD, Vorbis | ❌ | ❌ | Silent | ❌ | ❌ | ❌ | ❌ | |
| Others | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
- MOV: a file named
.movor.qt. - Settings → Playback → Audio Direct Stream lets a server stream pass AAC, AC3 and E-AC3 through unconverted.
| Codec | Direct play in | Limit |
|---|---|---|
| MP3 | .mp3, .m4a |
|
| MP2 | .mp2 |
|
| AAC (LC, HE-AAC) | .aac, .m4a, .m4b |
up to 5.1; 7.1 is refused |
| ALAC | .m4a |
up to 7.1 |
| FLAC | .flac, .m4a, .mka |
up to 7.1, 24-bit 192 kHz; refused with more than about 4 MB of embedded cover art |
| PCM (integer and float), A-law, µ-law, ADPCM, GSM | .wav |
up to 7.1 |
| WMA (Standard, Pro, Lossless) | .wma |
|
| AC3 | .ac3, .m4a |
|
| E-AC3 | .eac3 |
up to 5.1; 7.1 is refused |
| Opus | .mka |
|
| AMR | .amr, .3gp, .m4a |
|
| Ogg (Vorbis, Opus), AIFF, WavPack, APE | Refused | |
| DTS | A burst of noise, then stops | |
True Audio, audio in .webm |
Jellyfin does not import the file | |
| Others | ❌ |
A track the console refuses is streamed by the server: lossless sources as FLAC, others as MP3.
| Format | Direct play |
|---|---|
| HDR10, HDR10+ | ✅ |
| HLG | ✅ Xbox Series X|S |
| Dolby Vision over an HDR10 or HLG layer (profiles 8.1, 8.4), also with HDR10+ | ✅ Xbox Series X|S |
| Dolby Vision alone (profile 5) | Tried on Xbox Series X|S. Without a Dolby Vision display it fails to decode and the server converts it |
The standard edition has no HDR output: Xbox offers HDR display modes only to the 4K edition. In the standard edition the console shows HDR video converted to standard range.
The 4K edition has three settings for it under Settings → Playback:
- HDR Display Mode (on by default) switches the display to HDR when an HDR video starts and back when you leave the player. Turned off, the console converts HDR to standard range.
- HDR on Any Display (on by default) direct plays HDR even when the console offers no HDR mode for the display. Turned off, the server converts those files instead.
- Match Frame Rate (off by default) switches the display to the video's frame rate, 24 or 50 Hz, and back when you leave the player. Turned off, the display stays at 60 Hz and the console converts.
The Xbox player draws no subtitles. A selected subtitle (SRT, ASS/SSA, VTT, PGS, VobSub, DVB) is burned in by the server, which transcodes the video.
| Edition | Largest picture | HDR output, frame rate matching | Background music |
|---|---|---|---|
| Standard | 1920x1080 (portrait 1080x1920) | ❌ | ✅ |
4K ("Gelatinarm 4K", Release4K) |
No limit | ✅ | ❌ Xbox closes the app when a game starts |
The server scales larger video down. Xbox gives 4K video memory and HDR display modes
only to an app with the hevcPlayback capability, which rules out background playback
(Microsoft: 4K video playback on Xbox).
The two editions install side by side; see Docs/DEV_SETUP.md.
- Subtitles - Burned in by the server; choosing or changing one restarts the stream as a transcode.
- Audio track switching - A direct-played file switches audio track inside the player when the console can decode the new track. Otherwise, and on a server stream, playback restarts with the server supplying that track.
- Remote connections - If your server sees the Xbox as a remote client, its internet streaming bitrate limit applies and high-bitrate files are transcoded. Configure your server's LAN networks if the Xbox is on your home network.
| Button | Action |
|---|---|
| A | Select/Confirm |
| B | Back/Cancel |
| D-Pad/Left Stick | Navigate UI |
| Right Trigger (Hold 0.5s) | Jump to MiniPlayer |
Controls Hidden
| Button | Action | Parameter |
|---|---|---|
| A | Play/Pause | - |
| B | Exit playback | - |
| Y | Toggle statistics overlay | - |
| D-Pad Up | Show playback controls | - |
| D-Pad Down | Show playback controls | - |
| D-Pad Left | Rewind | 10 seconds |
| D-Pad Right | Fast forward | 30 seconds |
| Left Trigger | Rewind | 10 minutes (600 seconds) |
| Right Trigger | Fast forward | 10 minutes (600 seconds) |
| Button | Action | Notes |
|---|---|---|
| D-Pad | Navigate control buttons | Focus moves between buttons |
| A | Activate focused button | - |
| B | Exit playback | Always works |
| Y | Toggle statistics | Works even with controls visible |
| Up | Hide controls | Returns to full-screen video |
| Left Trigger | Rewind 10 minutes | Works even with controls visible |
| Right Trigger | Fast forward 10 minutes | Works even with controls visible |
The following buttons have no assigned functions during playback:
- X Button - Not used
- Left/Right Shoulder (LB/RB) - Not used during playback
- View Button - Not used
- Menu Button - Not used
- Left/Right Thumbstick Click - Not used
Music playback uses standard system media controls. Use the Xbox Guide button to access media controls while music plays in the background.
- Xbox One, Xbox One S, Xbox One X, Xbox Series S, or Xbox Series X
- Internet connection
- Jellyfin server (version 10.8.0 or later; 12.0 or later recommended)
- Developer Mode only for sideloading; not needed when installing from the Microsoft Store
Install directly from the Microsoft Store - search for "Gelatinarm" or use the link at the top of this page.
- Enable Developer Mode on your Xbox
- Download the latest release package
- Use the Xbox Device Portal to install the package
- Launch Gelatinarm from your Apps list
See Docs/DEV_SETUP.md for the full setup, command-line builds and testing.
- Windows 10/11
- Visual Studio with the UWP development workload (releases are built with Visual Studio 2026)
- Windows 11 SDK (10.0.22621.0)
- Clone the repository
- Open
Gelatinarm.slnin Visual Studio - Set configuration to Release and platform to x64
- Build the solution
- Deploy to your Xbox in Developer Mode
The Store signs the package at publication, so the upload package is built unsigned.
- Open
Package.appxmanifestin Visual Studio, Packaging tab - Increment the Version number (e.g., 1.0.1.0 → 1.0.2.0) and save
From the project root:
| Gelatinarm | Gelatinarm 4K |
|---|---|
cd C:\gelatinarm
& 'C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe' `
Gelatinarm.csproj `
/p:Configuration=Release `
/p:Platform=x64 `
/p:UapAppxPackageBuildMode=StoreUpload `
/p:AppxBundle=Always `
/p:AppxPackageSigningEnabled=false `
/p:AppxPackageDir=".\AppPackages\" |
cd C:\gelatinarm
& 'C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe' `
Gelatinarm.csproj `
/p:Configuration=Release4K `
/p:Platform=x64 `
/p:UapAppxPackageBuildMode=StoreUpload `
/p:AppxBundle=Always `
/p:AppxPackageSigningEnabled=false `
/p:AppxPackageDir=".\AppPackages\4K\" |
- The build creates an
.msixuploador.appxuploadfile in the package directory - Upload it to Microsoft Partner Center, each edition to its own app
Contributions are welcome! Please:
- Check existing issues before creating new ones
- Read Docs/ARCHITECTURE.md and follow Docs/CONVENTIONS.md
- Test on actual Xbox hardware when possible (see Docs/DEV_SETUP.md)
- Update documentation for new features
- The Jellyfin team for the excellent media server
- Microsoft for the UWP platform and Xbox development tools
- Claude (Anthropic) for extensive development assistance
- All contributors and testers who helped improve the app
This project is licensed under the MIT License - see the LICENSE file for details.
Gelatinarm is not affiliated with Jellyfin or Microsoft. Xbox is a trademark of Microsoft Corporation.