JellyEmu: Play Retro Games Directly in Jellyfin - Complete Setup Guide (2026)

JellyEmu: Play Retro Games Directly in Jellyfin - Complete Setup Guide (2026)

JellyEmu: Play Retro Games Directly in Jellyfin (2026)

Jellyfin handles movies, TV shows, music, audiobooks, and photos. But what about your ROM collection? Those thousands of NES, SNES, PlayStation, and Game Boy Advance files sitting on your NAS - until now, they needed a separate frontend like EmulatorJS or RetroArch.

JellyEmu changes that. It is a Jellyfin plugin that turns your media server into a full retro gaming platform - complete with box art, game descriptions, and in-browser emulation. Your users browse games the same way they browse movies, click Play, and a fully functional emulator launches directly in the Jellyfin web interface.

No separate app. No client-side installation. Just Jellyfin.


What Is JellyEmu?

JellyEmu is a community-built Jellyfin plugin that:

  • Imports your ROM library into Jellyfin as a browsable collection
  • Fetches metadata (box art, descriptions, ratings, release dates) from IGDB and RAWG
  • Launches games in-browser using EmulatorJS - no downloads, no client software
  • Supports 30+ platforms from Atari 2600 to PlayStation and Nintendo DS
  • Includes Pico-8 support for indie retro games
  • Shares your collection with all Jellyfin users via the standard library system

Source: github.com/Jellyfin-PG/JellyEmu


Supported Platforms

JellyEmu supports an impressive range of retro consoles:

PlatformExtensions
Nintendo (NES).nes
Super Nintendo (SNES).sfc, .smc
Nintendo 64.n64, .z64
Game Boy / Color.gb, .gbc
Game Boy Advance.gba
Nintendo DS.nds
Virtual Boy.vb
PlayStation (PSX).iso, .bin, .cue, .chd
PlayStation Portable (PSP).iso, .cso
Sega Genesis / Mega Drive.md, .gen, .bin
Sega CD.iso, .bin, .cue, .chd
Sega Saturn.iso, .bin, .cue
Sega Game Gear.gg
Sega Master System.sms
Sega 32X.32x
Atari 2600.a26, .bin
Atari 5200.a52, .bin
Atari 7800.a78, .bin
Atari Jaguar.j64, .jag
Atari Lynx.lnx
MAME / Arcade / CPS.zip, .7z
3DO.iso, .bin, .cue
Commodore 64.d64, .g64, .t64
Amiga.adf, .ipf, .lha
ColecoVision.col, .rom
PC Engine / TurboGrafx-16.pce, .bin, .cue
Neo Geo Pocket.ngp, .ngc
WonderSwan.ws, .wsc
DOS.exe, .com, .conf, .zip
Pico-8.p8, .p8.png, .zip

That is over 30 platforms playable directly in your browser.


How It Works

The architecture is elegant:

Your ROM files on disk
  → JellyEmu scans and identifies them
  → Metadata fetched from IGDB + RAWG (box art, descriptions)
  → Games appear in Jellyfin library (browsable like movies)
  → User clicks Play
  → EmulatorJS launches in the browser
  → Game runs client-side (zero server CPU for emulation)

The emulation happens entirely in the browser via WebAssembly. Your Jellyfin server only serves the ROM file - the actual emulation runs on the client device. This means:

  • Zero server CPU usage during gameplay
  • Any device with a modern browser can play (PC, tablet, phone)
  • No client software to install
  • Multi-user - everyone on your server can play simultaneously

Prerequisites

  • Jellyfin 10.11+ (required)
  • An IGDB API key (free - register at api.igdb.com)
  • A RAWG API key (free - register at rawg.io/apidocs)
  • Your ROM collection organized on disk

Installation

JellyEmu depends on the File Transformation plugin to inject CSS and JavaScript into the Jellyfin web interface. Both plugins must be installed.

Step 1: Add the Plugin Repository

  1. Open Jellyfin Dashboard
  2. Go to Administration → Plugins → Repositories
  3. Click Add and enter:
    https://raw.githubusercontent.com/Jellyfin-PG/Repository/refs/heads/main/manifest.json
    
  4. Click Save

Step 2: Install File Transformation

  1. Go to Administration → Plugins → Catalogue
  2. Find File Transformation and click Install
  3. Confirm the installation

Step 3: Install JellyEmu

  1. Still in the Catalogue, find JellyEmu and click Install
  2. Confirm the installation

Step 4: Restart Jellyfin

Restart your Jellyfin server. Both plugins must be active simultaneously - File Transformation handles the page injection, JellyEmu manages your ROMs.


Configuration

Step 1: Configure API Keys

  1. Navigate to Dashboard → Plugins
  2. Open the Emulator Library configuration page
  3. Enter your IGDB API Key (Client ID and Client Secret)
  4. Enter your RAWG API Key
  5. Save

Step 2: Create the Game Library

  1. Go to Dashboard → Libraries → Add Media Library
  2. Select Books as the Content Type

Important: You must select "Books" as the content type. This is required for JellyEmu to map game data correctly within the Jellyfin database structure.

  1. Name it something like "Video Games" or "Retro Games"
  2. Add the folder path where your ROMs are stored
  3. Under Metadata Downloaders, enable IGDB and RAWG
  4. Click OK

Step 3: Scan Your Library

  1. Go to Dashboard → Libraries
  2. Click the three dots on your game library → Scan Library Files
  3. Jellyfin matches your files against IGDB and RAWG
  4. Box art, descriptions, and metadata download automatically

Once the scan completes, your games appear on the home screen - ready to browse and play.


Organizing Your ROM Library

JellyEmu uses a smart 3-step detection system to identify which platform a ROM belongs to:

  1. Inline tokens - platform name in brackets or parentheses in the filename
  2. Folder names - parent and grandparent folder names
  3. File extensions - only for unambiguous extensions (like .nes or .z64)

Method 1: Organize by Folder (Recommended)

The easiest approach for large collections:

/ROMs/
  ├── /SNES/
  │    └── Super Mario World.sfc
  ├── /PlayStation/
  │    ├── /Final Fantasy VII/
  │    │    └── Disc 1.chd
  └── /Sega Genesis/
       └── Sonic The Hedgehog.md

JellyEmu checks up to two directories up, so subfolders for multi-disc games or series work perfectly.

Accepted folder names include official names and common abbreviations: SNES, Super Nintendo, Super Famicom all map to the same platform.

Method 2: Inline Naming Tokens

For flat directory structures, add the platform in brackets:

Sonic CD [Sega CD].chd       → UI Display: Sonic CD
Crash Bandicoot (PS1).chd    → UI Display: Crash Bandicoot
Super Mario 64 [Nintendo 64].z64  → UI Display: Super Mario 64

JellyEmu automatically hides platform tags in the user interface - game titles remain clean.

Handling Ambiguous Formats

Formats shared across multiple consoles (.iso, .chd, .cue, .bin) are ambiguous. For these files, you must use either an inline token or a properly named folder. Otherwise the platform is marked as "Unknown".

Forcing Specific Metadata

For ambiguous titles (like "Doom" matching the 2016 reboot instead of the 1993 original), force a specific database entry:

Doom [igdb-1039].iso          → Forces the 1993 IGDB entry
Aladdin (Sega) [rawg-871812].md  → Forces the exact RAWG entry

Supported provider tags:

ProviderTag format
IGDB[igdb-1039]
RAWG[rawg-19291]
Wikipedia[wiki-8482]
LexalOffle (Pico-8)[loid-819821]

You can combine provider IDs and platform tokens:

Sonic Adventure [igdb-3273][Sega CD].chd

This matches the exact IGDB entry, assigns the Sega CD platform, and displays cleanly as "Sonic Adventure".

JellyWatchTry JellyWatch — Your Jellyfin companion, everywhere.

The User Experience

Once configured, your users see games exactly like they see movies:

  • Home screen shows recently added games with box art
  • Library browsing displays a grid of game covers
  • Game detail page shows description, platform, release date, and rating
  • Click Play → EmulatorJS launches in a full-screen overlay
  • Controller support via the browser Gamepad API (USB and Bluetooth controllers work)
  • Save states handled by EmulatorJS locally in the browser
  • Region flags (like (USA)) are parsed and added to game details

The experience is seamless. Non-technical users do not need to know anything about emulation - they just browse and play.


Performance and Compatibility

Server-side

  • Zero CPU usage during gameplay - emulation runs client-side in WebAssembly
  • Minimal storage overhead - only metadata and artwork are stored alongside your ROMs
  • Standard Jellyfin library scan - no special background processes

Client-side

  • Any modern browser - Chrome, Firefox, Edge, Safari
  • Mobile browsers - works on Android and iOS (touch controls available)
  • Performance depends on the client device - a phone handles NES/SNES easily; PSX/N64 need a decent CPU
  • Controller support - USB and Bluetooth gamepads via the Gamepad API

Platform performance expectations

PlatformClient requirement
NES, SNES, Game BoyAny device (phone, tablet, PC)
Genesis, Game GearAny device
N64, PSXMid-range phone or any PC
PSP, DSModern phone or PC
Arcade (MAME)Depends on the game

JellyEmu vs Standalone EmulatorJS

The LinuxServer.io team maintains a standalone docker-emulatorjs container. How does JellyEmu compare?

FeatureJellyEmu (Jellyfin plugin)Standalone EmulatorJS
IntegrationNative Jellyfin librarySeparate web app
User managementJellyfin users (multi-user)Separate auth or none
MetadataIGDB + RAWG (automatic)Manual or basic
UIJellyfin interface (familiar)Custom web frontend
SharingVia Jellyfin (Watch Pass, etc.)Direct URL sharing
SetupPlugin installDocker container
Emulation engineEmulatorJS (same)EmulatorJS (same)

JellyEmu wins on integration. If you already run Jellyfin, your games live alongside your movies and shows in one unified interface. Standalone EmulatorJS is better if you want a dedicated gaming-only frontend.


Tips for the Best Experience

Use CHD format for disc-based games

CHD (Compressed Hunks of Data) is the recommended format for PlayStation, Sega CD, and Saturn games:

  • Significantly smaller than raw BIN/CUE
  • Single file per disc (no multi-file headaches)
  • Fully supported by EmulatorJS

Convert with chdman:

chdman createcd -i game.cue -o game.chd

Organize multi-disc games in subfolders

/PlayStation/
  /Final Fantasy VII/
    Final Fantasy VII - Disc 1.chd
    Final Fantasy VII - Disc 2.chd
    Final Fantasy VII - Disc 3.chd

JellyEmu detects the platform from the parent folder.

Use IGDB IDs for accurate metadata

For games with common names (Doom, Pac-Man, Tetris), add the IGDB ID to ensure the correct version is matched:

Tetris [igdb-2918][Game Boy].gb

Pair with JellyWatch for monitoring

JellyEmu sessions appear as regular Jellyfin activity. JellyWatch shows you who is playing what game, on which device, in real time.


Limitations

  • No save sync across devices - EmulatorJS saves are stored in the browser localStorage
  • No multiplayer - single-player only (local multiplayer works with multiple controllers on one device)
  • No achievements - no RetroAchievements integration
  • Browser-dependent performance - older phones may struggle with N64/PSX
  • No native client support - only works in the Jellyfin web interface (not Findroid, Swiftfin, etc.)
  • Requires "Books" library type - a workaround that may confuse users initially

FAQ

Does JellyEmu work on mobile? Yes. EmulatorJS provides touch controls for mobile browsers. Performance depends on the device and the emulated platform.

Can I use a controller? Yes. Any USB or Bluetooth controller recognized by the browser Gamepad API works. Xbox, PlayStation, and 8BitDo controllers are all compatible.

Does this use server CPU for emulation? No. The server only serves the ROM file. All emulation runs client-side in WebAssembly.

Why does it require the "Books" content type? This is a technical requirement for how JellyEmu maps game metadata into the Jellyfin database structure. It does not affect functionality.

Can multiple users play simultaneously? Yes. Each user runs their own emulator instance in their browser. The server just serves files.

Are save states preserved? Yes, in the browser localStorage. They do not sync across devices or browsers.

Does JellyEmu work with Jellyfin 10.10? No. Jellyfin 10.11+ is required.

Is this legal? JellyEmu is a legal plugin. Emulation itself is legal. The legality of ROMs depends on your jurisdiction and whether you own the original games. This guide does not provide legal advice.

Does it work on Android TV or Fire TV? Only if the device has a web browser that supports WebAssembly. The native Jellyfin Android TV app does not support JellyEmu - it requires the web interface.

Can I restrict game access to certain users? Yes. Standard Jellyfin library permissions apply. Restrict the game library to specific users from Dashboard → Users → Library Access.


Conclusion

JellyEmu is one of the most creative Jellyfin plugins to emerge in 2026. It takes something that previously required a separate Docker container, a separate frontend, and separate user management - and collapses it into a single Jellyfin library.

Your ROM collection gets the same treatment as your movie collection: beautiful metadata, organized browsing, and instant playback. The fact that "playback" means launching a full retro emulator in the browser is almost magical.

For homelab enthusiasts who already run Jellyfin and have a ROM collection gathering dust, JellyEmu is a no-brainer addition.


Your Jellyfin server now handles movies, music, AND retro games. Monitor it all from one app. Download JellyWatch on Google Play - session monitoring, server health, and your complete homelab in your pocket.

On Emby? Download EmbyWatch on Google Play - the same monitoring experience for Emby servers.

Comments 2

RetroGamer·

This is the most creative Jellyfin plugin I have ever seen. My kids browse games the same way they browse movies. Click play and a full SNES emulator launches in the browser. They have no idea it is emulation. Magic.

ROMCollector·

The CHD format tip is essential for PlayStation games. Converted my entire PSX collection from BIN/CUE to CHD. Saved 40% storage and everything is a single file per game now. Much cleaner.

Leave a comment

Never displayed publicly.
0 / 2000 · Supports limited Markdown: **bold**, *italic*, `code`, [link](url), lists, > quote.