Skip to content

Repository files navigation

OpenRAC: community decompilation projects of the Ratchet & Clank series

OpenRAC website

The website of OpenRAC, an unofficial hub for community decompilation projects of the Ratchet & Clank series. It shows, for every title, how far its decompilation has come.

Next.js (App Router) · TypeScript · Tailwind CSS 4 · everything is rendered on the server.

How it works

The page is a server component. On the server it reads the state of each project from GitHub, renders plain HTML and caches it; the browser gets finished HTML plus a few small scripts for the menu and animations. No visitor ever calls GitHub. The page is rebuilt in the background at most every 5 minutes, the numbers are cached for 10 minutes.

How progress is counted

Every project is measured the same way, so the bars can be compared:

Number Meaning
Functions matched functions whose code is verified identical to the retail build, out of all functions
Code matched the same, weighted by size in bytes. The honest figure, because small functions are matched first

Sources (see src/lib/progress.ts):

  • Ratchet & Clank: progress/report.json (objdiff report) of Lynder063/rac1-decomp.
  • Going Commando: progress/report.json and config/progress-scope.json of llesieur99/rac2-decomp, branch RAC2. The percentage uses integrated C bytes over all executable bytes in the boot and 27 level overlays. The detail line separates boot functions from level placements and shows the report's verification date when available. Placements are occurrences across programs, not unique algorithms. The scope lists ELF sections, so it cannot supply a total function count; that denominator stays unknown. Exported objdiff unit counts remain report units, not source-file or function totals.
  • Up Your Arsenal: progress_report.json (objdiff report) of vetusmagnus/ratchet-uya-decomp.

If GitHub cannot be reached, the last known snapshot (in progress.ts) is shown and labelled as such.

Blog

The blog lives at /blog. Posts are Markdown files in content/blog/, added through pull requests:

---
title: A short title
date: 2026-09-30            # YYYY-MM-DD
summary: One or two sentences for the list page and link previews.
tags: [news]                # optional
author: Name                # optional
draft: true                 # optional, hides the post from the published site
---

The file name is the address (my-post.md becomes /blog/my-post). A bad header fails the build and names the file. Raw HTML in posts is ignored and images must be files in public/blog/ (remote images are dropped), so a post cannot load anything from another server. There is an RSS feed at /blog/rss.xml, plus sitemap.xml and robots.txt.

Credits

src/lib/credits.ts lists the people credited on the front page and their YouTube videos (links or video ids). The section stays hidden until a video is listed. Titles and thumbnails are fetched by the server, and a video loads from YouTube (privacy-enhanced youtube-nocookie.com) only when a visitor presses play, so nothing reaches Google before that.

Develop

npm install
npm run dev        # http://localhost:3000
npm test           # unit tests of the progress parser
npm run lint
npm run build

Copy .env.example to .env.local to change settings. GITHUB_TOKEN is optional and only raises the GitHub API rate limit for the activity feed; it stays on the server.

Card backdrops

The title cards can show a backdrop image named rac1-bg.webp, gc-bg.webp, uya-bg.webp, deadlocked-bg.webp and going-mobile-bg.webp (WebP, about 1600 px wide). Those would be screenshots from the games, which are copyrighted, so they are not part of this repository. Without them the cards use a colour gradient.

The images are read from a folder, set by IMAGE_DIR (default public/img, which is git-ignored), on every request. Drop a file in and it is used at once, with no rebuild or restart. Only those five names are ever served. Resized copies are cached for a day, so a replaced image can take up to a day to show (or restart the service after clearing the cache volume).

Adding a title

Add an entry to PROJECTS in src/lib/projects.ts. If the project publishes progress, add a loader to src/lib/progress.ts; a title without one is shown as "Not started".

Deploy with Podman and Quadlet

# 1. put this repository on the server and build the image
podman build -t localhost/openrac:latest .

# 2. install the unit (rootless shown; rootful: /etc/containers/systemd/)
mkdir -p ~/.config/containers/systemd
cp deploy/openrac.container ~/.config/containers/systemd/

# 3. start it
systemctl --user daemon-reload
systemctl --user start openrac.service
loginctl enable-linger "$USER"      # once, so it starts at boot without a login

# 4. card backdrops: copy your images into the folder the unit mounts (no restart needed)
cp rac1-bg.webp gc-bg.webp uya-bg.webp deadlocked-bg.webp going-mobile-bg.webp ~/openrac-img/

The container listens on 127.0.0.1:3000; put your reverse proxy in front of it. It runs as a non-root user with a read-only filesystem and all capabilities dropped; only the page cache (/app/.next/cache) is a writable volume. The backdrop folder ~/openrac-img (created by the unit) is mounted read-only at /data/img; change the host path in the Volume= line if you keep the images elsewhere. A health check polls /healthz. Edit SITE_URL in the unit to match your domain.

To update: git pull && podman build -t localhost/openrac:latest . && systemctl --user restart openrac.service.

Legal

OpenRAC is an independent fan project, not affiliated with or endorsed by Sony Interactive Entertainment or Insomniac Games. "Ratchet & Clank" and related names are trademarks of their owners and are used only to identify the games the linked projects study. This repository contains no game assets, code or binaries.

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages