.recomp.json
A small file at the root of a recomp, source port or decomp repository that says what the project is: which game, from which release, how far along, who to talk to. The project writes it once. Any site, launcher or list can read it, and nobody has to guess from a README.
Version 1, draft. Read today by recomp.board. JSON Schema: recomp.fyi/schema/v1.json. Comments and proposals: open an issue.
Why a file in the repository
Lists of recomps, source ports and decomps are built by reading repositories from the outside, and they get titles, platforms and statuses wrong. Whoever can commit to a repository wrote this file, so it outranks any listing made about the project by someone else. There is nothing to register and no account to create: the file is read from wherever the code lives (GitHub, GitLab, Codeberg, Gitea, Forgejo, a server of your own).
The file
Named .recomp.json, at the root of the repository’s default branch,
UTF-8 JSON, one object. Every field is optional: a field left out means the project has not
said, never “none”. A list needs game, system and
type to add a project it doesn’t know yet. A repository that holds
several games describes the first in .recomp.json and each other one in its own
file, .recomp-2.json up to .recomp-9.json, with the same fields.
The file follows the project. When the status changes (playable, released, paused), or a maintainer joins or leaves, edit the file: every list that reads it updates. A stale file is worse than none, since it says something with the project’s own authority.
{
"$schema": "https://recomp.fyi/schema/v1.json",
"game": "Wave Race 64",
"wikidata": "Q3142278",
"system": "N64",
"type": "recomp",
"original": { "region": "USA", "revision": "1.0" },
"project": "Wave Race 64 Recompiled",
"status": "playable",
"targets": ["Windows", "Linux", "Steam Deck"],
"toolchain": "N64recomp",
"approach": "Static recompilation, RT64 renderer",
"maintainers": [{ "name": "yourhandle", "link": "https://your-profile" }],
"links": [{ "label": "Discord", "url": "https://discord.gg/..." }],
"help": ["Audio timing", "Controller mapping on Linux"],
"notes": "What works, what's next, what hurts."
}
With the $schema line, editors such as VS Code check the file and complete
the field names as you type.
Fields
game | The game’s title as it shipped. |
|---|---|
wikidata | The game’s Wikidata item, Q followed by digits, from the address of its page on wikidata.org. Two lists can then agree on the game without comparing titles. |
system | The platform of the original binary the project works from (recompiled, decompiled, or ported from its decompiled source), not where the result runs: a PS3 re-release of a Neo Geo game is PS3. One name, or a list when the project works from several. For a port of source code its authors released, the platform that source was written for. Written as under Names. |
type | "recomp": static recompilation of the original binary; for a console whose processor a PC already has (PS4), the original code run as it is on a runtime written for the game (bbport and the ports built on it). "port": a source port, the game built natively from decompiled, disassembled or rewritten source code. An engine rewritten from the game’s file formats, with no decompiled code, is a "port" too. "decomp": source code rebuilt from the binary. A list, ["decomp", "recomp"] or ["decomp", "port"], when one repository delivers two of them. "port" was added on 2026-10-01; before that a native port built on a decompilation was written "recomp", and a reader may still meet such files. |
original | The release the project works from, the one a user must own: region, revision, serial (the product code on the disc, cartridge or box; for a release that has none, such as a download-only title, the platform’s title ID) and sha1 (of the file the project expects, so users can check their copy; for a disc with several tracks, the track the project identifies the disc by). All four optional. A list when several releases are supported. |
project | The project’s own name. |
status |
|
targets | Where the project’s build runs, a list: a computer, a browser, a console. Written as under Names. |
toolchain | The recompiler or decomp toolkit the project is built on; for a source port, the engine or layer it is built on. The decompilation a source port starts from is not a toolchain: type already says the port is built from one, and its address belongs in links. One name, or a list when the project is built on several. The list was added on 2026-10-02; before that the field held one name. |
approach | The method in one line. |
started | Optional. When the work began, "YYYY-MM-DD". Only needed when the repository is younger than the project, for example a fresh public history cut from a private one: the board then shows this date as Started instead of the date the repository was created. Added on 2026-10-29. |
maintainers | A list of { "name": "…", "link": "https://…" }, the link optional. |
links | A list of { "label": "…", "url": "https://…" }: devlog, Discord, forum thread. |
help | Short phrases, one per thing the project would welcome a hand with. |
tags | Short words. |
notes | Free text: what works, what is next. |
x-… | Any field starting with x- is an extension for one reader or tool. Others ignore it. |
Release tags, commit dates and download counts are not in the file: the repository host already says them, and a copy would go stale.
Names
system and targets are free text, so a platform nobody listed
can still be named. For the platforms below, use these spellings: two files that mean
the same machine then say it the same way. A console in targets takes its
system name. A reader should still expect other spellings
("PlayStation", "Nintendo 64") and read them as the same platform.
system | "Xbox Series" "Xbox 360" "Xbox One" "Xbox" "PS5" "PS4" "PS3" "PS2" "PSP" "PS Vita" "PS1" "Wii U" "Wii" "GameCube" "N64" "Switch 2" "Switch" "SNES" "GBA" "GBC" "GB" "NDS" "3DS" "Virtual Boy" "NES" "Master System" "Game Gear" "Sega CD" "3DO" "Atari Lynx" "Atari Jaguar" "N-Gage" "CD-i" "32X" "Saturn" "Dreamcast" "Genesis" "Neo Geo Pocket Color" "Neo Geo" "Arcade" "PC (DOS)" "PC (Windows)" "Mac" "Amiga" "Atari ST" "Commodore 64" "ZX Spectrum" "Amstrad CPC" "MSX" "MSX2" "PC-98" |
|---|---|
targets | "Windows" "Linux" "macOS" "Steam Deck" "Android" "iOS" "Switch" "Browser", or a console under its system name. |
Never in the file
A game file, a ROM or disc image, or where to get one. The sha1 of
original lets a user check a copy they own; it is not a way to find one.
A reader may refuse a file that breaks this.
For sites and tools that read it
- Read
.recomp.jsonat the root of the default branch..recomp-board.json, the file’s first name, holds the same fields: read it when the new name is absent. Next to it,.recomp-2.jsonup to.recomp-9.jsoneach describe one more game in the same repository. - Treat the file as the project’s own word on every field it sets. Never fill a field it leaves out with a guess and present it as the project’s.
- Ignore fields you don’t know. A reader may shorten or drop values under its own rules, and should say which.
- The content comes from someone else’s repository: cap what you read, and make links only from
httpsaddresses. - Never write to the repository.
Versions
The $schema address names the version. Within version 1, changes only add
optional fields or widen what a field accepts ("port" as a type, a list in
toolchain), each dated in the table above. A change that would break a reader
becomes version 2 at a new address, and schema/v1.json stays where it is.
Licence
This specification and schema/v1.json are under
CC BY 4.0: use them, implement
them, adapt them, and credit recomp.board. The board’s data keeps its own
terms.