Add a project.
Yours or someone else’s, a new row, a correction or a claim. Both routes end in the
same place: a validated row on the board, written by a bot within a few minutes. No human
queue, nothing waiting on anyone’s attention.
Route A · Your own repository, no account needed
Commit a file
Put .recomp-board.json at the root of your repository. Your row says what
the file says, and editing the file edits the row. Whoever can commit there decides,
which is proof enough, and it is the way for a repository owned by an organisation.
Any coding assistant can write the file for you.
How to write the file
Route B · Anyone with a GitHub account
Fill in a form
For your project or someone else’s, a correction, or claiming your row. Guided
fields, no JSON. The bot checks the repository, writes the row and answers in the issue.
For someone else’s repository only the facts are kept; its owner writes the rest.
Open the forms
Claiming a row someone else added
Commit a .recomp-board.json to your repository, or send the form from the
GitHub account that owns it. The row loses its unclaimed mark, only you can edit it from
then on, and the periodic scan stops touching it. The claim is for the repository: if it
has a decomp row and a recomp row, one form claims both, and choosing “both”
as the kind of work adds the one that is missing. Deleting the file, or ticking
“Release my claim” in the form, hands them back whenever you want.
If you don’t use GitHub
The repo can live on GitLab, Codeberg, sourcehut or your own server. Any public
HTTPS repository is accepted, and for the hosts with a public API the commit date and
release tag are pulled from there too. Self-hosted repos keep the same row; the daily check
confirms the URL still answers, and the commit date is whatever your repo feed reports.
Route A needs no account anywhere: the file is read from your own host. Only the first
listing of a repository outside GitHub goes through the one-field
manifest form,
which needs a free GitHub account, or through the periodic sweep. What’s not accepted
is a row with no public code behind it anywhere; that’s rule 01, and it’s the
only thing keeping the table honest.
Route A in detail
.recomp-board.json, the file that owns your row
Commit it at the root of your repository. On GitHub the daily job finds it on its own, even
for a repository that isn’t listed yet; to be listed right away, or on another host,
give its address with the
manifest form.
Every field is optional on a row that exists; a new row needs game,
system and type. Leave a field out and the row stays empty there.
Remove the file and the row goes back to unclaimed.
{
"game": "Wave Race 64",
"system": "N64",
"type": "recomp",
"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."
}
Works on GitHub, GitLab, Codeberg and any Gitea or Forgejo instance. The board never
writes to your repository, it only reads that one file. A repository that is both a
decomp and a recomp writes "type": ["decomp", "recomp"] and gets one row
of each.
Every field and the values it takes
Built from the code that reads the file, so it is always the list the board applies.
Anything longer than the limit is cut, and a value the board can’t use is dropped.
type | "recomp" or "decomp". A repository that does both writes ["decomp", "recomp"] and gets one row of each. |
|---|
status | "unknown" Not declared: Nobody has said. The maintainer sets it when they claim the row."exploring" Exploring: Feasibility, tooling, no promises yet."in-progress" In progress: Actively being worked on."playable" Playable: Runs start to finish, rough edges remain."released" Released: Public build, still maintained."complete" Complete: Decomp only: the source is fully reconstructed and builds the original."paused" Paused: On hold. Say so rather than going quiet.
|
|---|
system | The platform of the binary you recompile or decompile. One name, or a list of up to 8: "Xbox 360" "Xbox" "PS3" "PS2" "PSP" "PS Vita" "PS1" "Wii U" "Wii" "GameCube" "N64" "Switch" "SNES" "GBA" "GBC" "GB" "NDS" "3DS" "Virtual Boy" "NES" "Sega CD" "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" "PC-98". Another name is kept as written; reusing one of these keeps the filter tidy. |
|---|
targets | Where your build runs, a list of up to 8: "Windows" "Linux" "macOS" "Steam Deck" "Android" "iOS" "Switch" "Browser". Others are kept as written. |
|---|
toolchain | "N64recomp" "Xenonrecomp" "Rexglue" "Xboxrecomp" "Ps3recomp" "Ps2recomp" "Psxrecomp" "Psxport" "Recompone" "Snesrecomp" "Nesrecomp" "Gbarecomp" "Gb-recompiled" "Segagenesisrecomp" "Wiicompiled" "Decomp-toolkit" "Splat". Another name is kept, capital first letter, up to 32 characters. |
|---|
game | The title as it shipped, up to 120 characters. |
|---|
project | Your project's name, up to 120 characters. |
|---|
approach | The method in one line, up to 200 characters. |
|---|
notes | Up to 600 characters. |
|---|
help | What you'd take a hand with: up to 8 short phrases of 60 characters. |
|---|
tags | Up to 8 words of 24 characters. |
|---|
maintainers | Up to 6: { "name": "…", "link": "https://…" }, name up to 60 characters, link optional and https only. |
|---|
links | Up to 6: { "label": "…", "url": "https://…" }, label up to 24 characters. Never a game file. |
|---|
The whole file stays under 8 KB and never mentions a ROM, an ISO or where to get one: a file that does is refused whole. version, builds and lastCommit are read from the repository every day, so leave them out.