recomp.board

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.
systemThe 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.
targetsWhere 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.
gameThe title as it shipped, up to 120 characters.
projectYour project's name, up to 120 characters.
approachThe method in one line, up to 200 characters.
notesUp to 600 characters.
helpWhat you'd take a hand with: up to 8 short phrases of 60 characters.
tagsUp to 8 words of 24 characters.
maintainersUp to 6: { "name": "…", "link": "https://…" }, name up to 60 characters, link optional and https only.
linksUp 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.