Set up your Plex arcade library
StreamPocket plays retro games hosted on your own Plex server. No ROMs, BIOS files or emulator binaries are bundled with the app. You provide everything from your personal library. This guide walks through the one-time setup so the app can discover and load your content.
The directory structure described here matches the one used by ES-DE (EmulationStation Desktop Edition). If you already manage your collection with ES-DE, you're 90% of the way done: scrape your ROMs from ES-DE (covers, screenshots, descriptions, videos), then run a small batch rename to .mp4 and drop the tree into Plex. Same for the cores folder once the download script is available.
1 What you need
- A running Plex Media Server on any machine reachable from your TV (Windows, macOS, Linux, NAS).
- A free folder somewhere on disk to host your arcade collection. Anywhere is fine, you'll add it to Plex as a new library.
- Your own ROMs (you legally own them) and any BIOS files the emulator cores you choose require.
- A few minutes. Once set up, you don't have to touch this again: adding new games is just dropping files into the folder.
2 Create the Plex library
Open Plex Web, go to Settings → Libraries → Add Library:
- Library type: Other Videos. This is critical: do not use Movies or Shows, or Plex will try to match titles against TheMovieDB and pollute your collection with fake metadata.
- Name: Arcade (case-insensitive, but exactly that word). The app discovers your arcade content by looking for a library named "Arcade".
- Add Folders: point it at the directory that will hold your arcade content (e.g.
D:\Plex\Arcade,/mnt/storage/arcade, etc.). - Advanced → Scanner: leave the default Plex Video Files Scanner.
- Advanced → uncheck "Use local assets" and disable extra agent fetching if available. There's nothing for Plex to look up online and you'll save scan time.
The app scans the active server for a library whose name matches "Arcade" (case-insensitive). Any other name and the arcade rail entry will stay hidden.
3 Folder structure overview
Inside your Arcade root, the layout is:
Arcade/
├── cores/ # libretro emulator binaries
│ ├── nes/
│ │ ├── fceumm-arm64-v8a.mp4
│ │ ├── fceumm-armeabi-v7a.mp4
│ │ └── fceumm-x86_64.mp4
│ ├── snes/
│ │ └── snes9x-arm64-v8a.mp4
│ └── psx/
│ └── pcsx_rearmed-arm64-v8a.mp4
│
├── bios/ # optional, shared BIOS files
│ ├── SCPH5501.mp4 # PSX (US)
│ └── SCPH5502.mp4 # PSX (EU)
│
├── nes/ # one folder per platform, lowercase
│ ├── Super Mario Bros.mp4
│ ├── Metroid.mp4
│ ├── covers/ # optional
│ │ └── Super Mario Bros.mp4
│ ├── screenshots/ # optional
│ │ └── Super Mario Bros.mp4
│ └── gamelists/ # optional (ES-DE metadata)
│ └── gamelist.mp4
│
├── snes/
│ └── ...
│
└── psx/
├── Tomb Raider.mp4 # renamed .chd
├── covers/
└── screenshots/
Three levels matter:
cores/<platform>/: the emulator binaries. One file per ABI (CPU architecture). Most users only needarm64-v8a.bios/: shared BIOS files used across cores. PSX needs them; NES, SNES, Game Boy and most others don't.<platform>/(e.g.nes,snes,psx): your ROMs, one folder per system.
4 Why everything ends in .mp4
Plex was built to scan video, music and photos and ignores files it doesn't
recognise. Renaming every file to .mp4 tricks Plex's scanner into
indexing them, so the app can list and download them from your server through
the normal Plex API. Plex never tries to play the file (the app does that),
so the rename is purely cosmetic on disk.
What to rename:
- Emulator cores:
fceumm_libretro_android.so→fceumm-arm64-v8a.mp4 - ROMs:
Super Mario Bros.nes→Super Mario Bros.mp4 - PSX CHD:
Tomb Raider.chd→Tomb Raider.mp4 - BIOS:
scph5501.bin→SCPH5501.mp4
5 Get the libretro cores
Emulator cores are the libretro .so binaries published nightly
for Android. Drop them under cores/<platform>/ renamed to
<core>-<abi>.mp4. Each core is downloaded from:
https://buildbot.libretro.com/nightly/android/latest/<abi>/<core>_libretro_android.so.zip
Unzip, rename the .so to <core>-<abi>.mp4, drop it under cores/<platform>/.
A small script that automates downloading, unzipping and renaming all cores into the right folder structure will be released soon. In the meantime the manual route above works fine.
6 Add BIOS files (PSX, NeoGeo...)
A few systems require original BIOS files the emulator cannot supply.
Drop them into arcade/bios/ renamed to .mp4 (the
base name, no inner extension needed). The app reads them from there and
copies them to the system folder the core expects.
Common ones:
- PlayStation (PSX): at minimum one of
SCPH5501.bin(US),SCPH5502.bin(EU) orSCPH5500.bin(JP). Drop them asSCPH5501.mp4,SCPH5502.mp4, etc. PCSX-ReARMed picks the region matching the game automatically. - SNK NeoGeo: rename
neogeo.ziptoneogeo.mp4. - Sega CD / Saturn: region-specific BIOS files. Check the core's documentation.
- NES / SNES / Game Boy / Mega Drive: no BIOS needed.
BIOS files are copyrighted by their respective platform holders and we cannot redistribute them. You need to dump them from your own hardware or source them legally.
7 Add your ROMs
Drop one ROM per file directly under the platform folder, renamed to .mp4:
arcade/
└── nes/
├── Super Mario Bros.mp4 # was .nes
├── The Legend of Zelda.mp4 # was .nes
└── Metroid.mp4 # was .nes
Some platforms expect a specific archive format:
- PSX: convert disc images to
.chd(smaller, indexed) withchdman, then rename to.mp4. - PSP:
.isoor.cso, renamed to.mp4. - MAME / NeoGeo: rename the
.zipromset to.mp4. The romset version must match the core (e.g.mame2003_plususes 0.78 romsets,mame2010uses 0.139).
Only host ROMs you legally own. We cannot link to ROM sources and the app ships with none.
8 Optional: covers, screenshots, gamelists
The browser screen can show a cover, an in-game screenshot, a focus-dwell video preview and rich metadata (year, players, description...) for each ROM. All optional: without them the app just shows the filename.
If you have a large collection, the painless way is to scrape it
inside ES-DE
first. ES-DE downloads covers, screenshots, gameplay videos and
descriptions, and writes a gamelist.xml per platform
matching what this app reads. After scraping, all you need is a small
rename pass (covers, screenshots, videos, gamelist.xml and ROMs to
.mp4) and drop the tree into your Plex Arcade library.
Covers, screenshots, videos
Drop them in the matching sub-folder, named exactly like the ROM:
arcade/nes/
├── Super Mario Bros.mp4 # the ROM
├── covers/
│ └── Super Mario Bros.mp4 # JPEG / PNG renamed
├── screenshots/
│ └── Super Mario Bros.mp4
└── videos/
└── Super Mario Bros.mp4 # short gameplay loop
Gamelist metadata (ES-DE format)
Drop the gamelist.xml that ES-DE produced into a
gamelists/ folder under each platform, renamed to
gamelist.mp4:
arcade/nes/gamelists/gamelist.mp4 # the ES-DE gamelist.xml
The app parses it and uses the entries to enrich the right-hand detail panel: localised title, year, developer, number of players, description.
9 Troubleshooting
The Arcade icon doesn't show up in the rail
- Check that the Plex library is named exactly
Arcade(case-insensitive). - Check that Plex has scanned the library after you added files. Go to Plex Web → Arcade → Scan library files. The app uses Plex's index; if Plex doesn't see your files, the app can't either.
- Force-stop the app once after adding new platforms. The catalogue snapshot is cached in memory.
"Could not download the libretro core"
The app couldn't find a core for that platform matching your device's CPU. Check that cores/<platform>/<core>-arm64-v8a.mp4 exists in your library (or armeabi-v7a for older devices).
"No BIOS files found" in the logs (PSX, etc.)
- Make sure the BIOS file is in
arcade/bios/, not in the platform folder. - Filename must match the canonical core name (e.g.
SCPH5501.mp4,SCPH5502.mp4). - Force-stop the app so the catalogue snapshot is rebuilt.
The game starts but I don't see covers, screenshots or descriptions
- The game's metadata comes from the
gamelist.mp4(renamedgamelist.xmlfrom ES-DE) underarcade/<platform>/gamelists/. Make sure the file is exactly there. - Covers and screenshots must live in
arcade/<platform>/covers/andarcade/<platform>/screenshots/, named identically to the ROM file (just.mp4renamed image / video). - If only some games miss assets, the gamelist
<path>entries must match the ROM filename without extension. ES-DE writes those correctly; if you renamed ROMs after scraping, re-scrape. - Force-stop the app after dropping new metadata. The gamelist is cached locally on first read.
MAME says "ROM not found" or "imperfect video"
MAME romsets are version-specific. mame2003_plus expects MAME
0.78 romsets; mame2010 expects MAME 0.139; modern mame
expects the matching current set. Mixing versions is the most common cause
of "ROM not found" errors.
Game audio works but video stutters
Many classic games are natively 30 fps (most PSX 3D titles, Crash Bandicoot, Final Fantasy VII...) or 25 fps in PAL. That's the original hardware behaviour, not the emulator. Try a PSX title that was 60 fps natively (Tekken 3, Ridge Racer NTSC, Tony Hawk Pro Skater) to confirm.
10 A note on performance
Emulation runs entirely on your TV device, not on the Plex server. The server only stores and serves the files; the CPU and GPU doing the work are whatever silicon your TV has. So the experience varies a lot between devices.
Rule of thumb with the cores listed here:
- Nvidia Shield TV (2017+) and Chromecast with Google TV 4K: full speed on everything up to and including PSX, PSP and N64. Most games hit their native target frame rate.
- Fire TV Stick 4K Max, Fire TV Cube: 8/16-bit consoles, GBA, Mega Drive, SNES and NES all run at full speed. PSX is fine for 2D games and most 3D titles. PSP is hit-or-miss depending on the title.
- Older Fire TV Stick (2nd / 3rd gen), low-end Android TV boxes: 8-bit and 16-bit consoles work well. PSX, PSP and N64 may stutter or run below full speed.
If a specific game stutters on your hardware, that's the limit of the CPU/GPU emulating the original console, not something the app or your Plex server can fix.
Once your Plex library is laid out like this, the app handles the rest: discovery, download, caching, save states, controller mapping, in-game pause menu, multi-player. Open the rail, go to Arcade, pick a platform, pick a game. Have fun.