Retro Porting Toolkit · Bring classic console games to modern hardware

Catalog schema

How the launcher catalog describes ports, required game files, releases, launch settings, and compatibility in a form tools can read.

The catalog is the list a launcher can read when it wants to know what ports exist.

It is not the port itself. It is not a game database for every retro game. It is a small set of JSON files that answer practical questions:

  • What is this port called?
  • What system is it for?
  • What game file does the user need to provide?
  • Does it need a BIOS or firmware file?
  • Where can the launcher get a release?
  • How should the launcher start it?

The catalog should be boring on purpose. If a launcher has to guess, the schema did not do its job.

The two file types

The catalog has one root file and one file per title.

FileWhat it does
index.jsonLists the catalog version, platform defaults, and every title id.
titles/<id>.jsonDescribes one port.

The title id should match in three places:

  • the entry in index.json
  • the filename under titles/
  • the id field inside that title file

That keeps launcher behavior simple. A tool should not need fuzzy matching to load a catalog entry.

index.json

index.json is the catalog table of contents.

FieldMeaning
schema_versionThe catalog format version.
nameA display name for the catalog.
catalog_dateWhen this catalog was published.
release_tagThe release tag that produced this catalog.
platform_defaultsDefaults shared by entries on the same platform.
titlesThe list of title ids. Each id should have a matching titles/<id>.json.

Platform defaults are useful when many ports on the same system need the same BIOS identity. A title can override that default, or opt out when it does not apply.

Title identity

Every title manifest needs enough identity to show a human what the port is.

FieldMeaning
idStable slug. Use lowercase letters, numbers, and hyphens.
nameHuman-readable title.
kindUsually recomp. Some entries may be decomp.
platformThe system family, such as psx, snes, nes, gba, nds, genesis, smsgg, vb, or cdi.
descriptionShort description for launchers and catalog views.
homepageProject or release page.
author_notesOptional note from the port author.
notesMaintainer notes for the catalog.

Keep descriptions short. The catalog is not where the project history belongs.

Game file identity

The catalog uses hashes, sizes, serials, and filename hints to recognize the game file the user provides.

It does not include that game file. The user supplies their own legally obtained dump. This site does not provide game files and does not tell users how to get them.

FieldMeaning
rom_identityThe checks used to recognize the correct game file.
rom_identity.crc32CRC32 hashes, if useful.
rom_identity.md5MD5 hashes, if useful.
rom_identity.sha1SHA-1 hashes, if useful.
rom_identity.sha256SHA-256 hashes, if useful.
rom_identity.disc_serialsDisc serials for systems where that is useful.
rom_identity.sizesExpected file sizes. Useful before hashing large files.
rom_identity.filenamesFilename hints. These help the user, but should not be the only match rule.
rom_identity.track_countsExpected track counts for disc images.
rom_identity.require_cueWhether the entry requires a cue sheet.
rom_extensionsFile extensions the launcher should scan for this entry.

A manifest should contain at least one real identity check. A filename alone is not enough.

BIOS identity

Some systems need a BIOS or firmware file.

Use a legally obtained BIOS if one is required. This site does not provide retail BIOS files. Some projects may provide open source BIOS alternatives where that makes sense.

FieldMeaning
bios_identityThe checks used to recognize the BIOS or firmware file.
bios_identity.requiredWhether the file is required.
bios_identity.crc32, md5, sha1, sha256Hashes for known good files.
bios_identity.sizesExpected file sizes.
bios_identity.filenamesFilename hints shown to the user.

A platform default can define common BIOS rules. A title manifest should only override it when that specific title needs something different.

Release information

Release fields tell a launcher where to find the build.

FieldMeaning
release.githubRepository that publishes the release.
release.tagRelease tag to use, when fixed.
release.asset_patternsAsset names the launcher should look for.
release.prereleaseWhether prereleases are allowed.
release.source_onlyWhether users must build it themselves.

Be careful with release wording. Some projects can ship a ready-to-run build. Some require the user to build locally after providing their own game file. The catalog should describe the distribution model without making legal claims beyond what the project actually does.

Build and launch information

Build fields are for source-only entries. Launch fields are for installed builds.

FieldMeaning
buildHow a launcher or tool should build the port.
build.systemThe build system, such as CMake.
build.commandsCommands to run.
launchHow to start the installed port.
launch.executableMain executable or relative executable path.
launch.argsArguments the launcher should pass.
launch.working_dirWorking directory to use.

Do not hide important setup inside prose. If a launcher needs it, make it structured.

Compatibility and extras

Optional sections describe features that a launcher may show or use.

FieldMeaning
statusShort status label for the port.
availabilityWhether a build is public, source-only, or unavailable.
savesSave file locations or save behavior.
enhancementsOptional features such as widescreen, renderer work, or quality settings.

These fields should stay factual. A launcher needs to know what exists, not why the project is exciting.

Safe schema rules

Use structured fields for anything a tool must act on.

Keep human notes short.

Do not use markdown files in random repositories as the authority for catalog behavior. They are useful clues, but the catalog should carry the actual data a launcher needs.

When in doubt, prefer a smaller manifest that is correct over a large manifest full of guesses.