Playdex Windows, macOS & Linux · free · open source

A ROM library manager
and emulator launcher.

Point Playdex at the folders where you keep your ROMs. It identifies each file by its contents, downloads box art and details, and launches the game in RetroArch or a standalone emulator. Playtime is recorded per game.

Playdex in the Console layout: a row of large box art over blurred artwork, with the selected game named underneath.

Overview

Identification by contents

Playdex opens each file and reads it: headers, disc filesystems, and the entries inside an archive. Filenames and folder names are only consulted once the bytes have failed to settle it.

Artwork fetched automatically

Box art, description, developer, release year and player count. The fetch starts on its own when a scan finishes, and matches on the ROM's checksum rather than on its title.

Launches the emulators you have

A libretro core through RetroArch, or any standalone emulator, set per system. A single game can override its system's emulator when it needs a different one.

How it works

Detection works through evidence, in order.

.bin, .iso and .chd are shared across a dozen systems, so an extension rarely settles anything on its own. Playdex works down a list and stops at the first step that gives a definite answer.

  1. A platform assigned to the folder If you have set a library folder to Dreamcast, everything under it is Dreamcast.
  2. An extension used by one system .sfc, .gba and .nes each belong to a single system.
  3. The contents of an archive A .7z belongs to no system. The ROM inside it does, so that is what gets identified.
  4. The file's own bytes A Wii dump carries 5D1C9EA3 at offset 0x18; a GameCube disc carries C2339F3D at 0x1C. Saturn, Dreamcast and Mega CD each write their name into the first sector. Sony discs declare nothing in a header, so Playdex reads the disc's own filesystem and the boot file it names. Only the first kilobyte is read.
  5. Folder names, then the ROM's filename The last resorts. Filenames are matched whole-word, so a game called Legbreaker stays out of the Game Boy shelf.
// how a PlayStation 2 disc identifies itself
sector 16    CD001    // an ISO 9660 filesystem
root dir     SYSTEM.CNF
SYSTEM.CNF   BOOT2 = cdrom0:\SLUS_203.12

// BOOT2 identifies a PlayStation 2 disc.
// plain BOOT identifies the original PlayStation.

Every file is hashed on the way in — CRC32, MD5 and SHA-1 in a single pass. For an archived game it is the ROM inside that gets hashed, since that is what the metadata providers and the No-Intro and Redump catalogues index.

Layouts

Six layouts, one library.

A desk and a television call for different shapes, so each layout is built separately rather than restyled. Every feature is available in every one of them, and none is named after the hardware it nods at. Switch under Settings → Appearance.

The Playdex layout.

Playdex

The desktop layout. A sidebar of systems, a sortable grid, and a detail panel for the current selection.

The Console layout.

Console

A home screen. One row of large icons sized against the window, with round system buttons beneath it.

The Big Picture layout.

Big Picture

For the television. Hero artwork, a left rail and a shelf of capsules, navigable entirely from a controller.

The Arc layout.

Arc

One column of slabs down the middle of a dark screen, lit from one side.

The Browser layout.

Browser

A column of cards standing in a slow-drifting field. Unhurried.

The Channels layout.

Channels

The light one. A fixed page of framed channels you move between with arrows, and a silver tray along the bottom.

Features

What else Playdex does.

Artwork and metadata

libretro-thumbnails supplies box art with no account or API key. ScreenScraper and TheGamesDB add the written details when you supply credentials for them.

Multi-disc games

Several discs, one library entry. Playdex writes the playlist and the emulator handles the swap when the game asks for the next disc.

Cheats

Cheats are listed per game. Enable the ones you want and the codes are written where RetroArch reads them when you press Play, along with the setting that makes it apply them.

ROM hacks

IPS, UPS and BPS patches are applied to a copy of a ROM in your library. The result is added as its own game, with its own artwork, saves and playtime. The original file is untouched.

Dump verification

Import a No-Intro or Redump catalogue and every game's panel reports whether its checksums match a catalogued dump, using the hashes taken during the scan.

Saves and save states

Collected from the configured save directories, RetroArch's per-core subfolders and the ROM's own folder, then backed up into a dated folder on request.

Controller support

A connected pad drives the entire app, Settings included. Focus moves geometrically rather than by a fixed map, and buttons are remappable.

Drag and drop

Drop a ROM anywhere on the window and it is indexed where it already sits. Drop a folder and it becomes a library folder, then gets scanned.

Playtime

Every session is timed and recorded against the game. The library shows total time, session counts, longest session, and lists to pick up from.

Signed updates

New versions are announced in the app with their release notes, and verified against a public key compiled into the binary before any of the download runs.

A local library

Everything lives in a SQLite database in the app data directory, alongside the artwork cache. No account, and nothing about your library leaves the machine.

Your files stay put

ROMs are indexed where they already are, never copied or moved. Removing a game removes the library entry and leaves the file alone.

Download

Get Playdex.

One installer, and very little setup. Playdex locates RetroArch on its own if you have it, and the first scan reports what it identified and what it could not.

Windows 10 or 11  ·  macOS, Apple silicon and Intel in one download  ·  Linux as .deb, .rpm or AppImage
Free and open source (MIT)  ·  no account required

If Windows removes the installer, take the .msi rather than the .exe. The .exe is a compressed self-extractor and is unsigned, which is enough for Defender to call it a packer and delete it. Same application, and every build is made in public by GitHub Actions from the tagged commit, so you can check the file against the hash on the release.