docs: refresh README, site and listing metadata for 1.12 (#83)

This commit is contained in:
Roel authored and GitHub committed 2026-11-02 14:25:56 +01:00
1 parent afd70e8a86
commit aaf81c650e
21 files changed
+526 -93

No files matched your search

+12 -1
View File
@@ -8,7 +8,18 @@
{
"name": "reverseport",
"source": "./",
"description": "Reverse engineer anything. Port it anywhere. Recon, decompile and trace apps, games, binaries and websites; rebuild and port them between Godot, Unity, Unreal, three.js and languages."
"description": "Reverse engineer anything. Port it anywhere. Recon, decompile and trace apps, games, binaries and websites; read Godot packs and Unity IL2CPP; compare builds; keep proof cases; and port between Godot, Unity, Unreal, three.js and languages.",
"homepage": "https://laaielichter.github.io/Reverseport/",
"license": "MIT",
"keywords": [
"reverse-engineering",
"porting",
"godot",
"unity",
"il2cpp",
"ghidra",
"mcp"
]
},
{
"name": "stashpad",
+9 -1
View File
@@ -1,7 +1,7 @@
{
"name": "reverseport",
"version": "1.12.0",
"description": "Reverse engineer anything. Port it anywhere. One MCP server for agents: recon any project, exported game, binary or website (even without files), decompile and trace native, .NET, Android, Electron and web targets with evidence, write clean-room rebuild specs, and port games and code between Godot, Unity, Unreal, three.js and languages with verified parity.",
"description": "Reverse engineer anything. Port it anywhere. One MCP server for agents: recon any project, exported game, binary or website (even without files), read Godot packs and Unity IL2CPP, decompile and trace native, .NET, Android, Electron and web targets with evidence, compare builds, keep proof cases with guard hooks, write clean-room rebuild specs, and port games and code between Godot, Unity, Unreal, three.js and languages with verified parity.",
"author": {
"name": "ReversePort contributors"
},
@@ -11,14 +11,22 @@
"reverse-engineering",
"porting",
"decompiler",
"binary-analysis",
"mcp",
"godot",
"gdscript",
"unity",
"il2cpp",
"unreal",
"threejs",
"ghidra",
"ida-pro",
"android",
"electron",
"game-dev",
"game-porting",
"build-diff",
"proof-case",
"clean-room"
],
"license": "MIT",
+4 -4
View File
@@ -1,5 +1,5 @@
name: Bug report
description: Report a reproducible problem in REA
description: Report a reproducible problem in ReversePort
title: "[Bug] "
labels:
- bug
@@ -77,9 +77,9 @@ body:
- type: input
id: rea-version
attributes:
label: REA version
description: Use `rea --version` or provide the source revision.
placeholder: 3.1.0 or git revision
label: ReversePort version
description: Use `reverseport --version` or provide the source revision.
placeholder: 1.12.0 or git revision
validations:
required: true
+2 -2
View File
@@ -1,5 +1,5 @@
name: Design discussion
description: Resolve an REA architecture, provider, or contract question before implementation
description: Resolve a ReversePort architecture, provider, or contract question before implementation
title: "[Design] "
labels:
- enhancement
@@ -26,7 +26,7 @@ body:
attributes:
label: Decision needed
description: State the exact question maintainers need to resolve.
placeholder: Should REA ... or ...?
placeholder: Should ReversePort ... or ...?
validations:
required: true
+1 -1
View File
@@ -1,5 +1,5 @@
name: Documentation
description: Report unclear, missing, or incorrect REA documentation
description: Report unclear, missing, or incorrect ReversePort documentation
title: "[Docs] "
labels:
- documentation
+2 -2
View File
@@ -1,5 +1,5 @@
name: Feature request
description: Propose a focused improvement to REA
description: Propose a focused improvement to ReversePort
title: "[Feature] "
labels:
- enhancement
@@ -73,7 +73,7 @@ body:
id: alternatives
attributes:
label: Alternatives considered
description: Describe existing REA operations, upstream tools, or workarounds considered and why they do not meet the need.
description: Describe existing ReversePort tools, upstream tools, or workarounds considered and why they do not meet the need.
- type: textarea
id: possible-direction
@@ -0,0 +1,67 @@
name: New format, engine or game library
description: Ask ReversePort to recognise or read a file format, game engine or library it does not know yet
title: "[Format] "
labels:
- enhancement
- format
- triage
body:
- type: markdown
attributes:
value: |
New formats, engines and game libraries are the easiest pull requests to make yourself:
a detector, a fixture and a test. Say if you would like to try, and we will point you to the files.
- type: checkboxes
id: allowed
attributes:
label: Before submitting
options:
- label: I own the files I describe here, or I am allowed to analyse them.
required: true
- label: This is not about decrypting, cracking or bypassing DRM, anti-cheat or licence checks.
required: true
- label: I searched the open and closed issues for the same format or engine.
required: true
- type: input
id: name
attributes:
label: Format, engine or library
description: Its name, and the version if it matters.
placeholder: "FMOD sound bank (.fsb), Defold 1.9 build, Bevy 0.15 game, ..."
validations:
required: true
- type: textarea
id: how-to-recognise
attributes:
label: How to recognise it
description: File names or extensions, magic bytes, a package name in package.json, Cargo.toml or similar, a public spec.
placeholder: |
Starts with the bytes "FSB5". Files end in .fsb. Spec: https://...
validations:
required: true
- type: textarea
id: example
attributes:
label: An example you may share
description: A link to a small public sample, an open-source game that uses it, or how to make one yourself. Do not attach files you may not share.
- type: textarea
id: expected
attributes:
label: What ReversePort should report
description: For example the engine and its version in re_scan, or the file list in re_archive.
- type: dropdown
id: contribute
attributes:
label: Would you like to build it?
options:
- Yes, I would like to make the pull request
- Maybe, with some help
- No, I am only asking
validations:
required: true
@@ -0,0 +1,75 @@
name: Porting problem
description: A port between engines or languages that behaves differently, misses something or will not finish
title: "[Port] "
labels:
- porting
- triage
body:
- type: markdown
attributes:
value: |
Ports go wrong in small, specific ways: a jump that is lower, a signal that never fires, a scene that loads empty.
The more exact the difference, the faster it can be fixed. Remove private paths and data you may not share.
- type: checkboxes
id: allowed
attributes:
label: Before submitting
options:
- label: I am porting a project I own or am allowed to port.
required: true
- label: I ran `reverseport doctor` and checked the version with `reverseport --version`.
required: true
- type: dropdown
id: route
attributes:
label: Route
options:
- Godot → Unity
- Godot → Unreal
- Godot → three.js
- GDScript → Godot C#
- Godot 3 → Godot 4
- Unity → Godot
- Unity → Unreal
- RPG Maker → Godot
- Language to language
- Other
validations:
required: true
- type: textarea
id: difference
attributes:
label: What is different
description: What the original does, and what the port does instead.
placeholder: |
Original: the player jumps 3 tiles high. Port: about 2 tiles.
validations:
required: true
- type: textarea
id: commands
attributes:
label: Commands and output
description: The ReversePort commands or tool calls you ran, with the JSON they returned. Include the `next` line or the error's next step.
render: shell
validations:
required: true
- type: textarea
id: verify
attributes:
label: port_verify or port_trace result
description: The result of `reverseport verify <planId>`, or of port_trace when the port runs but behaves differently.
render: json
- type: input
id: versions
attributes:
label: Versions
description: ReversePort, Node.js, both engines, and the agent and model that wrote the code.
placeholder: "ReversePort 1.12.0, Node 24.22.1, Godot 4.4 → Unity 6000.0, Claude Code"
validations:
required: true
+3
View File
@@ -77,3 +77,6 @@ limits, security/privacy/containment implications, and meaningful proof gaps. --
- [ ] Owning docs, contracts, and generated metadata are updated where needed.
- [ ] User-visible CLI/MCP changes include representative output.
- [ ] I checked the final diff for secrets, unrelated cleanup, and unsupported claims.
- [ ] Commits, this description and the changed files contain no chat or session links.
- [ ] Gift or donation details stay in the READMEs only (not in skills, `llms.txt`, `AGENTS.md`, tool output or the website).
- [ ] The change only helps analyse or port software the user owns or may analyse; nothing decrypts, cracks or bypasses DRM, anti-cheat or licensing.
+23
View File
@@ -0,0 +1,23 @@
cff-version: 1.2.0
message: "If you use ReversePort in research or teaching, please cite it like this."
type: software
title: "ReversePort"
abstract: >-
Reverse engineering and porting toolkit for AI coding agents: an MCP server, CLI, skills and Claude Code plugin
that read Godot packs, Unity IL2CPP, .NET and native binaries, compare builds, keep proof cases, and port games
between Godot, Unity, Unreal, three.js and languages with parity checks.
authors:
- name: "ReversePort contributors"
version: 1.12.0 # x-release-please-version
license: MIT
repository-code: "https://github.com/laaielichter/reverseport"
url: "https://laaielichter.github.io/Reverseport/"
keywords:
- reverse engineering
- porting
- model context protocol
- AI agents
- Godot
- Unity
- IL2CPP
- decompiler
+140 -64
View File
@@ -4,14 +4,17 @@
### Reverse engineer anything. Port it anywhere.
**One CLI and one MCP server that let your coding agent take apart apps, games, binaries and websites — and rebuild them.**
**The reverse-engineering and porting toolkit for AI coding agents.**<br>
Read Godot packs, Unity IL2CPP, .NET and native binaries, compare builds, keep proof for every claim — and port games
between Godot, Unity, Unreal and three.js with parity checks.
[![npm](https://img.shields.io/npm/v/reverseport?style=flat-square&color=1e4f91)](https://www.npmjs.com/package/reverseport)
[![npm downloads](https://img.shields.io/npm/dm/reverseport?style=flat-square&color=1e4f91)](https://www.npmjs.com/package/reverseport)
[![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.laaielichter%2Freverseport-5c4ee5?style=flat-square)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.laaielichter/reverseport)
[![Claude Code plugin](https://img.shields.io/badge/Claude_Code-plugin-d97757?style=flat-square)](#claude-code-plugin)
[![MCP tool catalog](https://img.shields.io/badge/MCP-tool_catalog-5c4ee5?style=flat-square)](docs/mcp-contracts.md#generated-catalog)
[![License: MIT](https://img.shields.io/badge/license-MIT-22c55e?style=flat-square)](LICENSE)
[![Node.js](https://img.shields.io/badge/Node.js-22.23.4%2B-339933?style=flat-square&logo=nodedotjs&logoColor=white)](docs/installation.md)
[![License: MIT](https://img.shields.io/badge/license-MIT-22c55e?style=flat-square)](LICENSE)
```bash
npx reverseport setup
@@ -19,9 +22,11 @@ npx reverseport setup
<img src="docs/assets/demo.gif" alt="Terminal: ReversePort scans Godot's 2D platformer demo, plans a port to Unity with 68 units, copies 38 assets, converts a scene and verifies progress" width="640">
<sub>A real run on <a href="https://github.com/godotengine/godot-demo-projects/tree/master/2d/platformer">Godot's 2D platformer demo</a>, JSON trimmed to the key fields.</sub>
<sub>A real run on <a href="https://github.com/godotengine/godot-demo-projects/tree/master/2d/platformer">Godot's 2D platformer demo</a>, JSON trimmed to the key fields. <a href="docs/assets/demo.mp4">Watch the MP4</a>.</sub>
[Website](https://laaielichter.github.io/Reverseport/) · [Quick start](#quick-start) · [Every agent](#works-with-every-agent) · [Skills](#skills) · [What it does](#what-it-does) · [How it compares](#how-it-compares) · [FAQ](#faq) · [Changelog](CHANGELOG.md) · [Docs](#documentation)
[Website](https://laaielichter.github.io/Reverseport/) · [Quick start](#quick-start) · [What's new](#whats-new) · [Every agent](#works-with-every-agent) · [Prompts](#prompts-to-try) · [How it compares](#how-it-compares) · [FAQ](#faq) · [Contributing](#contributing) · [Docs](#documentation)
**English** · [Nederlands](docs/README.nl.md)
</div>
@@ -33,21 +38,26 @@ unit, verified. No files at all? Give it a name or a store page.
ReversePort gives agents one consistent way to do all of that:
- 🔍 **Understand anything** — engine and version of any project or exported game, dependency graphs, scenes,
symbols in 30+ languages, executables, packs and unknown data. JS/TS monorepos (pnpm, Turborepo, Nx, Lerna, Rush,
tsconfig paths, `#imports`, Deno import maps) and Rust workspaces resolve too. No build step, no dependencies.
- 🎮 **Game formats built in** — Godot `.pck` (also inside the `.exe`) and `.gdc`/`.scn`/`.res` back to an editable
project, Unity IL2CPP `global-metadata.dat`, `.unitypackage`, GameMaker, Ren'Py, RPG Maker, Unreal `.pak`, FMOD and
Wwise banks; it also recognises Quake PAK, Doom WAD, XNB and VPK. No engine install needed.
- 🔍 **Understand anything** — engine and version of any project or exported game, dependency graphs, scenes, symbols
in 30+ languages, executables, packs and unknown data. JS/TS monorepos (pnpm, Turborepo, Nx, Lerna, Rush, tsconfig
paths, `#imports`, Deno import maps) and Rust workspaces resolve too. No build step, no dependencies.
- 🧠 **Go deep** — decompile, cross-reference and trace native, managed (.NET), Android, Electron/JavaScript,
WebAssembly, firmware and browser targets through Ghidra, Hopper, IDA, JADX and more. ReversePort connects to the
tools you have installed, drives them and shows the evidence behind every conclusion.
- 🌐 **No files? Still recon** — a name, a store page, a website or a public repo is enough to learn the engine,
stack, file layout and open-source remakes from public sources.
- 🧩 **Rebuild precisely** — turn what you learned into a clean-room rebuild spec: every system, the parameters to
measure on the original, a parity table and a project skeleton with every value as a tunable.
- 🚚 **Port for real** — Godot ⇄ Unity, Godot → Unreal, Godot → three.js, GDScript → C#, or language to language.
Scenes and transforms convert automatically; code is ported by your agent with API maps; `port_verify` proves
nothing was left behind.
- 🔀 **Compare builds** — what changed between build 43 and 44: files, packs and .NET types and methods, biggest
changes first.
- 🧾 **Proof, not guesses** — a proof case ties every claim to saved evidence and keeps unknowns visible. In Claude
Code, guard hooks stop a "done" while a proof case fails its check.
- 🧩 **Rebuild precisely** — no files? A name, a store page or a website is enough for a clean-room rebuild spec:
every system, the parameters to measure, a parity table and a project skeleton.
- 🚚 **Port for real** — Godot ⇄ Unity, Godot → Unreal, Godot → three.js, GDScript → C#, Godot 3 → 4, RPG Maker →
Godot, or language to language. Scenes and transforms convert automatically; code is ported by your agent with API
maps; `port_verify` and `port_trace` prove nothing was left behind and behaviour matches.
- 🔒 **Local** — runs on your machine. Targets are only read; output goes to new folders. Nothing is uploaded to an
analysis service and there is no extra API bill.
analysis service, there is no telemetry and no extra API bill.
## Quick start
@@ -64,18 +74,21 @@ with backups of existing configuration. Restart your agent afterwards. Setup sup
Gemini CLI, GitHub Copilot, OpenCode and [more agents](docs/installation.md#supported-agents); other clients can use
[manual MCP registration](docs/installation.md#mcp-registry).
**Claude Code plugin** (instead of setup for Claude Code — includes the server, the porting skills and the
`port-architect` agent; do not use both):
### Claude Code plugin
Instead of setup for Claude Code — includes the server, the porting skills, the `port-architect` agent and the guard
hooks; do not use both:
```text
/plugin marketplace add laaielichter/reverseport
/plugin install reverseport@reverseport
```
The same marketplace also offers the [sister plugins](#sister-tools) `stashpad@reverseport` and
The plugin asks for its settings once (deep-analysis engine on or off, tool list size, workspace folder, your Ghidra
folder). The same marketplace also offers the [sister plugins](#sister-tools) `stashpad@reverseport` and
`agentdisk@reverseport`.
**From source:**
### From source
```bash
git clone https://github.com/laaielichter/reverseport && cd reverseport
@@ -89,21 +102,46 @@ install at all: `node bin/reverseport.mjs scan ./MyGame`.
### 2. Ask your agent
```text
Understand how search works in the Notes app, show me the evidence, and build a similar feature for my project.
What is ./MyGame made with? Show me the evidence, then plan a port to Unity.
```
That's it. The agent picks the tools; you get answers with the evidence behind them.
## What's new
**1.12** — more formats and game libraries, sturdier big results:
- More formats recognised: Doom WAD, Quake and Half-Life WAD2/WAD3, XNB (XNA/MonoGame) and Valve VPK, next to Quake
PAK from 1.10.
- `re_scan` recognises melonJS, Kontra, Matter.js, Rapier, cannon-es, Planck.js, Howler.js, Tone.js and React Three
Fiber.
- Monorepos: `pnpm-workspace.yaml` globs, `package.json` `#imports` and Deno import maps.
- Big results always fit the output budget now, also with emoji, file-name keys and very deep results.
- A [Godot → three.js walkthrough](docs/walkthrough-godot-to-threejs.md) where every command was run and the result
builds.
**1.11** — a new engine and a new protocol:
- The deep-analysis engine is now [REA](https://github.com/morluto/rea) 6.8.
- MCP 2026-07-28 next to the classic handshake: long calls (a cold Ghidra import, a big port plan) come back as a task
with progress instead of timing out.
- `run_batch` runs up to 20 calls in one, and big results are saved to disk with a resource link.
- `re_compare` shows which .NET types and methods changed between two builds, and the next step.
- The Claude Code plugin has settings instead of environment variables, and an icon.
Every release is in the [changelog](CHANGELOG.md).
## Works with every agent
Any vendor, any framework, any model size — the same tools through the door that fits:
- **MCP**: `npx -y reverseport@latest setup` configures installed agents; `reverseport connect <client>` prints the
snippet for any other MCP client (Windsurf, Cline, Continue, Zed, Goose, LM Studio, VS Code…).
- **MCP over HTTP**: `reverseport serve` → `http://127.0.0.1:32147/mcp`.
- **Function calling**: `/api/agent/tools?format=openai-strict|responses|anthropic|gemini`, plus OpenAPI 3.1 at
`/api/openapi.json` for GPT Actions, LangChain, LlamaIndex, Semantic Kernel, CrewAI, AutoGen and n8n.
- **Shell-only agents**: JSON on stdout, errors as JSON on stderr, `reverseport describe <tool>`.
| Door | How |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| MCP, set up for you | `npx -y reverseport@latest setup` for Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and more |
| MCP, any other client | `reverseport connect <client>` prints the snippet (Windsurf, Cline, Continue, Zed, Goose, LM Studio, VS Code…) |
| MCP over HTTP | `reverseport serve` → `http://127.0.0.1:32147/mcp` |
| Function calling | `/api/agent/tools?format=openai-strict\|responses\|anthropic\|gemini`, plus OpenAPI 3.1 at `/api/openapi.json` for GPT Actions, LangChain, LlamaIndex, Semantic Kernel, CrewAI, AutoGen, n8n |
| Shell only | JSON on stdout, errors as JSON on stderr, `reverseport describe <tool>` |
Built for the agent's circumstances too:
@@ -112,14 +150,16 @@ Built for the agent's circumstances too:
- **The list fits the agent.** Small or older models use `compact`, large-context agents use `full`, and an agent
can switch itself with `set_tool_profile`.
- **One error shape everywhere**, with a code, whether retrying helps, and the exact next step.
- **A `next` field wherever there is an obvious next step** (graphs, truncated results, every porting step), with the exact call.
- **A `next` field wherever there is an obvious next step** (graphs, truncated results, every porting step), with the
exact call.
- **Big results do not flood the context.** Lists are short by default. Answers over 256 KB are saved to
`~/.reverseport/tool-output/`; the agent gets a short version with the path and an MCP resource link. Slightly wrong input from smaller models is repaired where it is safe.
`~/.reverseport/tool-output/`; the agent gets a short version with the path and an MCP resource link. Slightly
wrong input from smaller models is repaired where it is safe.
- **Several steps, one call.** `run_batch` runs up to 20 calls and `select` keeps only the fields the agent needs.
The same failing call twice gets a plain "do not repeat it" instead of the same error again.
- **Long work does not time out.** On MCP 2026-07-28 a call still running after a few seconds (a cold Ghidra
import, a big port plan) comes back as a task the client polls, with progress in its status; quick calls answer
directly. Older clients keep the classic handshake on the same server.
- **Long work does not time out.** On MCP 2026-07-28 a call still running after a few seconds comes back as a task
the client polls, with progress in its status; quick calls answer directly. Older clients keep the classic
handshake on the same server.
- **Agents are heard.** `share_feedback` leaves a note for the maintainers; it stays on the user's machine until
they share it.
@@ -154,19 +194,20 @@ the version you have and `reverseport skills get <name>` prints the matching gui
| You ask | ReversePort does |
| ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| _What is this game made with, and how is it built?_ | `re_scan` → engine + version, languages, entry points, how it starts |
| _I only have the exported Godot game, not the project._ | `re_archive` extracts the .pck, `re_decode` turns .gdc/.scn/.res/project.binary back into an editable project |
| _A Unity IL2CPP game without its C# source._ | `re_il2cpp`: classes, methods and literals from global-metadata.dat, plus a C# skeleton |
| _What changed between build 43 and 44?_ | `re_compare` folder-to-folder, pack-to-pack and .NET types and methods, biggest changes first |
| _Keep this investigation honest — I need to show why._ | `re_case`: evidence → claims that cite it → unknowns → decision → tests → report |
| _Map this codebase and write ARCHITECTURE.md._ | `re_graph`, `re_symbols`, `re_report` |
| _How do the packages in this Turborepo/pnpm monorepo depend on each other?_ | `re_scan` finds the workspace and its packages; `re_graph` resolves workspace names and tsconfig paths and shows who uses whom |
| _Show me how this button on the website is built._ | `capture_web_screenshot` with a `selector`: a cropped image of the element, its HTML and its computed CSS |
| _All I have is data.win / an .rpa / a .pak / a .swf / a sound bank / a web build._ | `re_archive`: names, assets and facts out of GameMaker, Ren'Py, Unreal, Flash, FMOD, Wwise, Unity WebGL and Emscripten containers |
| _I only have the exported Godot game, not the project._ | `re_archive` extracts the .pck, `re_decode` turns .gdc/.scn/.res/project.binary back into an editable project |
| _A Unity IL2CPP game without its C# source._ | `re_il2cpp`: classes, methods and literals from global-metadata.dat, plus a C# skeleton |
| _What changed between build 43 and 44?_ | `re_compare` folder-to-folder and pack-to-pack, biggest changes first |
| _Why are my Unity materials pink and scripts "missing" after a move?_ | `re_refs`: dangling, duplicate and missing GUIDs, with remap suggestions |
| _Get every player-facing string out of this game so we can translate it._ | `re_strings`: .pot/.csv with ids and placeholders; `apply` writes a translated copy |
| _Is this GDScript valid for Godot 4.3, or did the model mix in Godot 3?_ | `re_apicheck`: renamed names with replacements, invented members, too-new classes |
| _What is in this save file, is it checksummed, and which field is the gold?_ | `re_save`: layers, fields with roles, verified checksums, diff of two saves, schema + SaveData classes |
| _Upgrade my Godot 3 game to Godot 4._ | `port_upgrade`: converted copy (renames, @annotations, await, signals, scenes, project.godot) + what needs a human |
| _Decompile the function that saves settings in this app and explain it._ | opens the binary, finds it, decompiles it, shows the evidence |
| _Decompile the function that saves settings in this app and explain it._ | opens the binary in your Ghidra, Hopper or IDA, finds it, decompiles it, shows the evidence |
| _How does this Electron app talk to its native side?_ | maps modules, IPC and Electron boundaries |
| _What is `<some game>` made with? I don't have the files._ | `re_lookup` from public sources: engine with confidence, stack, layout, remakes |
| _Rebuild the movement of `<game>` as precisely as possible in Godot._ | `re_blueprint`: systems, parameters to measure, parity table, skeleton |
@@ -193,9 +234,10 @@ Agent: re_scan → Godot 4.3, 6 scripts, 5 scenes, main scene main.tscn, autolo
| Target | What you get | Needs |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Source projects and exported games | Engine + version (Godot, Unity, Unreal, GameMaker, RPG Maker, Ren'Py, LÖVE, Defold, Bevy, MonoGame, web, Electron, Flutter, .NET, Go, Rust…), dependencies, cycles, scenes, symbols | Nothing |
| Packs and archives | Godot `.pck` (also embedded in the `.exe`), zip/apk/jar, `.unitypackage`, tar.gz, asar — list and extract | Nothing |
| Packs and archives | Godot `.pck` (also embedded in the `.exe`), zip/apk/jar, `.unitypackage`, tar.gz, asar — list and extract; Quake PAK, Doom WAD, XNB, VPK and more recognised | Nothing |
| Unity IL2CPP | Classes, methods and literals from `global-metadata.dat`, plus a C# skeleton | Nothing |
| Native binaries | Mach-O, ELF, PE, wasm: functions, pseudocode, strings, xrefs, call paths, layout | Ghidra, Hopper or IDA for decompilation ([setup](docs/installation.md#hopper)) |
| .NET assemblies | Metadata, CIL, native boundaries, build comparisons | Nothing |
| .NET assemblies | Metadata, CIL, native boundaries, type- and method-level build comparisons | Nothing |
| Android | Manifest, classes, decompiled methods, references, resources, devices | JADX / Apktool / adb ([guide](docs/android-analysis.md)) |
| JavaScript and Electron | Modules, imports, source maps, Electron boundaries, runtime observation | Nothing; a browser for runtime |
| Websites | Page, network and runtime evidence; one element by CSS selector (cropped image, HTML, computed CSS); stack fingerprint without files | A browser for runtime |
@@ -203,15 +245,17 @@ Agent: re_scan → Godot 4.3, 6 scripts, 5 scenes, main scene main.tscn, autolo
### Rebuild and port
| From → to | Code | Scenes / prefabs | Transforms | Project skeleton |
| -------------------- | -------------------------------- | -------------------------------------------- | ----------- | --------------------------- |
| Godot → **Unity** | agent, with API map | automatic → specs + one-click editor builder | Z-mirror | scene builder script |
| Godot → **Unreal** | agent (.h/.cpp), with API map | automatic → specs (cm, Z-up) | axes + ×100 | .uproject, module, targets |
| Godot → **three.js** | agent (TypeScript), with API map | automatic → TypeScript builder modules | unchanged | Vite + TS + fixed-step loop |
| Godot → **Godot C#** | agent, with API map | automatic (script paths swapped) | unchanged | .csproj, project.godot |
| Unity → **Godot** | agent (GDScript), with API map | automatic → `.tscn` | Z-mirror | project.godot |
| Unity → **Unreal** | agent, with API map | — | axes + ×100 | .uproject, module |
| any → **language** | agent | — | — | — |
| From → to | Code | Scenes / prefabs | Transforms | Project skeleton |
| --------------------- | -------------------------------- | -------------------------------------------- | ----------- | ---------------------------------- |
| Godot → **Unity** | agent, with API map | automatic → specs + one-click editor builder | Z-mirror | scene builder script |
| Godot → **Unreal** | agent (.h/.cpp), with API map | automatic → specs (cm, Z-up) | axes + ×100 | .uproject, module, targets |
| Godot → **three.js** | agent (TypeScript), with API map | automatic → TypeScript builder modules | unchanged | Vite + TS + fixed-step loop |
| Godot → **Godot C#** | agent, with API map | automatic (script paths swapped) | unchanged | .csproj, project.godot |
| Godot 3 → **4** | converted copy | converted | unchanged | project.godot |
| Unity → **Godot** | agent (GDScript), with API map | automatic → `.tscn` | Z-mirror | project.godot |
| Unity → **Unreal** | agent, with API map | — | axes + ×100 | .uproject, module |
| RPG Maker → **Godot** | events run by an interpreter | maps drawn from the tilesets | — | Godot 4 project, database autoload |
| any → **language** | agent | — | — | — |
## CLI
@@ -249,22 +293,29 @@ One MCP server (`reverseport mcp`) serves every tool:
| `port_upgrade` `port_shader` `port_trace` `port_rpgmaker` | Godot 3 → 4 as a converted copy plus the manual list; shader first drafts; per-tick behaviour traces compared |
| `re_case` | proof case: evidence, claims, unknowns, decisions, tests |
Next to these come the deep-analysis tools — `open_binary`, `procedure_pseudo_code`, `xrefs`, `search_strings`, `analyze_javascript_application`,
`inspect_android_package`, `inspect_managed_artifact`, `observe_web_session` and many more. `engine_tools` lists them from the running server, and
`npm run docs:generate` writes the [generated tool catalog](docs/mcp-contracts.md#generated-catalog) with every
contract. The HTTP API
Next to these come the deep-analysis tools — `open_binary`, `procedure_pseudo_code`, `xrefs`, `search_strings`,
`analyze_javascript_application`, `inspect_android_package`, `inspect_managed_artifact`, `observe_web_session` and
many more. `engine_tools` lists them from the running server, and `npm run docs:generate` writes the
[generated tool catalog](docs/mcp-contracts.md#generated-catalog) with every contract. The HTTP API
(`reverseport serve`) exposes the same tools in every vendor's format; see [Connect any agent](docs/connect-any-agent.md).
## How it compares
| | ReversePort | A single decompiler MCP server | By hand |
| -------------------------- | ---------------------------------------------------------------- | ------------------------------ | --------------------------- |
| Setup | `npx reverseport setup` for all your agents | One server per tool, per agent | Install and learn each tool |
| Source projects and builds | Engine, version, scenes, packs, diffs, no build needed | Binaries only | Read files yourself |
| Native binaries | Through Ghidra, Hopper or IDA that you have installed | One backend | The tool's own UI |
| Porting | Plan, API maps, scene and asset conversion, `port_verify` | Not part of the job | Rewrite and check by hand |
| Runs | Locally, target read-only | Usually locally | Locally |
| Does not | Crack DRM or anti-cheat, or write ported code without your agent | Port or compare builds | Scale |
| | ReversePort | Disassembler MCP servers (IDA, Ghidra, …) | By hand |
| -------------------------- | ----------------------------------------------------------------- | ----------------------------------------- | --------------------------- |
| Focus | Games, builds and porting, with evidence | One disassembler for one model | Whatever you know |
| Setup | `npx reverseport setup` for all your agents | One server per tool, per agent | Install and learn each tool |
| Source projects and builds | Engine, version, scenes, packs, diffs, no build needed | Binaries only | Read files yourself |
| Game formats | Godot packs, Unity IL2CPP, GameMaker, Ren'Py, Unreal, sound banks | Not part of the job | One tool per format |
| Native binaries | Through the Ghidra, Hopper or IDA that you have installed | Deepest inside their own tool | The tool's own UI |
| Porting | Plan, API maps, scene and asset conversion, `port_verify` | Not part of the job | Rewrite and check by hand |
| Proof | Proof cases and guard hooks | Up to the agent | Your notes |
| Runs | Locally, target read-only | Usually locally | Locally |
| Does not | Crack DRM or anti-cheat, or write ported code without your agent | Port or compare builds | Scale |
If you live inside IDA or Ghidra all day, a dedicated server for that tool goes deepest there. ReversePort's
deep-analysis engine is [REA](https://github.com/morluto/rea); if you want broad reverse engineering without the game
formats, porting and proof cases, REA itself is a good choice too.
## FAQ
@@ -282,14 +333,31 @@ agent, one unit at a time, with an API map for the engine pair; `port_verify` th
functions and dormant logic (stub bodies, functions nothing calls, silenced warnings), so a port that "compiles" but
does nothing is not reported as done.
**Do I need Ghidra?** Only for decompiling native binaries. Scanning, packs, lookup, blueprints and porting need
nothing extra.
**Do I need Ghidra?** Only for decompiling native binaries. ReversePort finds Ghidra, Hopper or IDA but never installs
them. Scanning, packs, IL2CPP metadata, build diffs, lookup, blueprints and porting need nothing extra.
**How is this different from REA?** REA is the deep-analysis engine inside ReversePort. ReversePort adds its own
tools on top: game engines and formats, build diffs, proof cases, clean-room blueprints and verified ports between
engines, plus setup for every agent and a Claude Code plugin.
**How do I update or remove it?** `reverseport update` updates a global install, and `reverseport uninstall` removes
the agent registrations and skill files it added. See [Diagnose, update, and remove](docs/installation.md#diagnose-update-and-remove).
**Something broke or is missing.** Open an [issue](https://github.com/laaielichter/reverseport/issues) with the
command and its JSON error. Every error names the next step, so include that line too.
command and its JSON error. Every error names the next step, so include that line too. Questions are welcome in
[Discussions](https://github.com/laaielichter/reverseport/discussions).
## Contributing
New formats, engines and game libraries are the easiest first pull requests: a detector, a fixture and a test. Pick a
[good first issue](https://github.com/laaielichter/reverseport/labels/good%20first%20issue) — each one names the
files to touch and says when it is done. Ideas and questions go to
[Discussions](https://github.com/laaielichter/reverseport/discussions).
Read [CONTRIBUTING.md](CONTRIBUTING.md) and [AGENTS.md](AGENTS.md) for the layout and the checks
(`npm run test:port` for ReversePort's own tools), and the [Code of Conduct](CODE_OF_CONDUCT.md).
<a href="https://github.com/laaielichter/reverseport/graphs/contributors"><img src="https://contrib.rocks/image?repo=laaielichter/Reverseport" alt="Contributors to ReversePort"></a>
## Sister tools
@@ -306,8 +374,10 @@ README.
## Responsible use
Only analyse or port software you own or are allowed to analyse. ReversePort does not decrypt, crack or bypass DRM,
anti-cheat or licensing. Read [RESPONSIBLE-USE.md](RESPONSIBLE-USE.md) and the [disclaimer](DISCLAIMER.md).
Only analyse or port software you own or are allowed to analyse. ReversePort is for interoperability, preservation,
learning and moving your own work between engines. It does not decrypt, crack or bypass DRM, anti-cheat or licensing,
and it never sends your targets anywhere. Commercial tools such as IDA and Hopper need your own valid licence. Read
[RESPONSIBLE-USE.md](RESPONSIBLE-USE.md) and the [disclaimer](DISCLAIMER.md).
## Documentation
@@ -316,18 +386,24 @@ anti-cheat or licensing. Read [RESPONSIBLE-USE.md](RESPONSIBLE-USE.md) and the [
- [CLI and Evidence](docs/cli.md): commands, provider selection, snapshots, import/export.
- [MCP contracts](docs/mcp-contracts.md) and [agent prompts](docs/mcp-prompts.md): tool results, sessions, guided investigations.
- [Porting and rebuilds](.agents/skills/reverse-engineer-anything/references/porting-and-rebuilds.md): the recon, rebuild and port workflows.
- [Walkthrough: Godot → three.js](docs/walkthrough-godot-to-threejs.md): a small port, every command run and its output pasted.
- [Proof cases, guard hooks and memory](docs/proof-and-memory.md): `re_case`, the Claude Code hooks, the optional Stashpad link and context cost.
- [Challenge self-check](bench/README.md): programs with known answers (from rea-lab) and what `re_binary` reveals.
- [Rated by agents](AGENT-RATINGS.md): independent agent reviews, round by round, and what is still open.
- [Nederlands](docs/README.nl.md) · [AGENTS.md](AGENTS.md) for contributors · [CONTRIBUTING.md](CONTRIBUTING.md)
## Star history
<a href="https://www.star-history.com/#laaielichter/Reverseport&Date"><img src="https://api.star-history.com/svg?repos=laaielichter/Reverseport&type=Date" alt="Star history of ReversePort" width="560"></a>
## Credits
The deep-analysis engine is based on [REA: Reverse Engineer Anything](https://github.com/morluto/rea) 6.8.0 (MIT).
Proof cases are ported from [Digfox](https://github.com/Devaretanmay/digfox) (MIT) and the guard hooks follow
[rea-jev](https://github.com/juan-viox/rea-jev) (MIT); the challenge self-check uses
[rea-lab](https://github.com/pablodiazjorge/rea-lab)'s generator and oracle (MIT). Third-party components are listed in
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). Thanks to everyone who sent a pull request, such as
[@chinmayee5599](https://github.com/chinmayee5599) for Quake PAK support.
## Support
+20
View File
@@ -46,6 +46,19 @@ Haal het alleen van npm (`reverseport`), uit de MCP Registry (`io.github.laaieli
kopieën onder andere namen zijn niet van ons. Er is geen telemetrie: [PRIVACY.md](https://github.com/laaielichter/reverseport/blob/main/PRIVACY.md) noemt de paar keer
dat het het netwerk gebruikt.
## Nieuw
**1.12** — meer formaten en sterkere resultaten: Doom WAD, Quake- en Half-Life-WAD2/WAD3, XNB (XNA/MonoGame) en Valve
VPK worden herkend, naast Quake PAK. `re_scan` kent nu ook melonJS, Kontra, Matter.js, Rapier, cannon-es, Planck.js,
Howler.js, Tone.js en React Three Fiber. Grote resultaten passen altijd binnen het budget. Nieuw is een
[walkthrough van Godot naar three.js](walkthrough-godot-to-threejs.md) waarin elk commando echt is uitgevoerd.
**1.11** — een nieuwe motor en een nieuw protocol: de diepe analyse draait op REA 6.8. Op MCP 2026-07-28 worden lange
klussen (een koude Ghidra-import, een groot port-plan) een taak met voortgang in plaats van een time-out. `run_batch`
doet tot 20 aanroepen in één keer, en `re_compare` laat zien welke .NET-typen en -methodes veranderd zijn.
Alles staat in de [changelog](https://github.com/laaielichter/reverseport/blob/main/CHANGELOG.md).
## Wat het kan
- **Verkennen** — `re_scan` herkent engine en versie (Godot, Unity, Unreal, GameMaker, RPG Maker, Ren'Py, LÖVE,
@@ -88,6 +101,13 @@ functie die de instellingen opslaat en leg uit wat ze doet.", "Port mijn Godot-g
Werkmap: `~/.reverseport` (verplaatsen met `REVERSEPORT_HOME`). Alleen voor eigen software of software die je mag
analyseren; ReversePort kraakt, ontsleutelt of omzeilt niets. Licentie: MIT.
## Meehelpen
Nieuwe formaten, engines en game-bibliotheken zijn de makkelijkste eerste pull request: een detector, een voorbeeld en
een test. Kies een [good first issue](https://github.com/laaielichter/reverseport/labels/good%20first%20issue); elk
issue noemt de bestanden en zegt wanneer het klaar is. Vragen en ideeën kunnen in
[Discussions](https://github.com/laaielichter/reverseport/discussions).
## Steunen
ReversePort is gratis en open source. Bespaart het jou of je agent tijd, dan is een gift welkom, maar nooit verplicht.
+20 -1
View File
@@ -2,7 +2,7 @@
"name": "reverseport",
"mcpName": "io.github.laaielichter/reverseport",
"version": "1.12.0",
"description": "Reverse engineer anything. Port it anywhere. One CLI and MCP server that lets coding agents take apart apps, games, binaries and websites — decompile, trace, compare builds, recon without files — and rebuild or port them to Godot, Unity, Unreal, three.js or any language.",
"description": "Reverse engineer anything. Port it anywhere. MCP server, CLI and skills for AI coding agents: read Godot .pck, Unity IL2CPP, .NET and native binaries (through your own Ghidra, IDA or Hopper), compare builds, keep proof for every claim, and port games between Godot, Unity, Unreal, three.js and languages with parity checks.",
"license": "MIT",
"repository": {
"type": "git",
@@ -19,10 +19,14 @@
"mcp-server",
"model-context-protocol",
"agents",
"ai-agents",
"agent-skills",
"claude-code",
"claude-code-plugin",
"codex",
"cursor",
"gemini-cli",
"github-copilot",
"decompiler",
"disassembler",
"binary-analysis",
@@ -30,15 +34,30 @@
"ghidra",
"hopper",
"ida",
"ida-pro",
"jadx",
"android",
"electron",
"dotnet",
"webassembly",
"godot",
"godot-engine",
"gdscript",
"godot-pck",
"unity",
"unity3d",
"il2cpp",
"unreal",
"unreal-engine",
"threejs",
"game-dev",
"game-development",
"game-engine",
"game-porting",
"migration",
"build-diff",
"clean-room",
"proof-case",
"cli"
],
"publishConfig": {
+21
View File
@@ -42,6 +42,27 @@ test('Claude Code plugin and marketplace manifests', async () => {
}
});
test('listing metadata: registry limits, tags, and gift details only in the READMEs', async () => {
// The MCP Registry rejects a whole publish when the description is over 100 characters; catch it before a release.
const server = JSON.parse(await read('server.json'));
assert.ok(server.description.length > 0 && server.description.length <= 100, `server.json description is ${server.description.length} characters`);
const pkg = JSON.parse(await read('package.json'));
const plugin = JSON.parse(await read('.claude-plugin/plugin.json'));
for (const [where, list] of [['package.json', pkg.keywords], ['plugin.json', plugin.keywords]]) {
assert.equal(new Set(list).size, list.length, `${where}: duplicate keywords`);
for (const k of list) assert.match(k, /^[a-z0-9][a-z0-9-]{0,49}$/, `${where}: keyword ${k}`);
}
// Gifts are mentioned in the READMEs only: never in agent-facing files, tool output, skills or the website.
const address = 'BDRA7dHGBYtPsZPNzVQccDYZ8BqstJGCsWx3kopPSCDK';
const agentFacing = ['llms.txt', 'llms-install.md', 'AGENTS.md', 'site/index.html', '.claude-plugin/plugin.json', '.claude-plugin/marketplace.json', 'server.json', 'CITATION.cff'];
for (const dir of await fs.readdir(path.join(REPO, 'skills'))) agentFacing.push(`skills/${dir}/SKILL.md`);
for (const f of agentFacing) {
const text = await read(f).catch(() => '');
assert.ok(!text.includes(address) && !/\b(?:donat(?:e|ion)|solana)\b/i.test(text), `${f}: gift details belong in the READMEs only`);
}
for (const f of ['README.md', 'docs/README.nl.md']) assert.ok((await read(f)).includes(address), `${f}: support section`);
});
test('plugin settings: empty or unsubstituted values are unset; the engine setting fetches the engine', async () => {
const { applyPluginSettings } = await import('../plugin/mcp-launch.mjs');
const env = applyPluginSettings({ REVERSEPORT_PLUGIN_ENGINE: 'true', REVERSEPORT_PROFILE: 'compact', REVERSEPORT_HOME: '', GHIDRA_INSTALL_DIR: '${user_config.ghidra_install_dir}' });
+4
View File
@@ -75,6 +75,10 @@
"type": "json",
"path": ".claude-plugin/plugin.json",
"jsonpath": "$.version"
},
{
"type": "generic",
"path": "CITATION.cff"
}
]
}
+9
View File
@@ -22,6 +22,15 @@ if (packageJson.mcpName !== "io.github.laaielichter/reverseport")
);
if (serverJson.name !== packageJson.mcpName)
fail("server.json name does not match package.json mcpName");
// The registry schema (2025-12-11) caps the description at 100 characters and rejects the whole publish above it.
if (
typeof serverJson.description !== "string" ||
serverJson.description.length === 0 ||
serverJson.description.length > 100
)
fail(
`server.json description must be 1 to 100 characters (is ${serverJson.description?.length ?? 0})`,
);
if (serverJson.version !== packageJson.version)
fail("server.json version does not match package.json version");
if (!Array.isArray(serverJson.packages) || serverJson.packages.length !== 1)
+2 -2
View File
@@ -2,8 +2,8 @@
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"name": "io.github.laaielichter/reverseport",
"title": "ReversePort",
"description": "Reverse engineer anything. Port it anywhere. One MCP server for coding agents.",
"websiteUrl": "https://github.com/laaielichter/reverseport",
"description": "Reverse engineer and port apps and games: Godot, Unity IL2CPP, .NET, binaries, with parity checks.",
"websiteUrl": "https://laaielichter.github.io/Reverseport/",
"repository": {
"url": "https://github.com/laaielichter/reverseport",
"source": "github"
+7
View File
@@ -32,3 +32,10 @@ convert it with ffmpeg.
- `og.png` (1280×640) is the sharing image. The same file is `docs/assets/social-preview.png`, for
Settings > General > Social preview on GitHub.
- `favicon.svg` is the logo mark.
## Search engines
`sitemap.xml` lists the page for Google Search Console and Bing Webmaster Tools. The title, description, Open Graph and
Twitter tags and the JSON-LD block in `index.html` are what search results and link previews show; keep them in step
with the README when a release changes what ReversePort does. Gift details stay out of the site (see the README).
+85 -15
View File
@@ -3,18 +3,30 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ReversePort: reverse engineer anything, port it anywhere</title>
<meta name="description" content="Open-source MCP server and CLI that lets your coding agent take apart apps, games, binaries and websites, and port them between Godot, Unity, Unreal, three.js and languages. Runs locally.">
<title>ReversePort: reverse engineer and port games and apps with your AI agent</title>
<meta name="description" content="Open-source MCP server, CLI and Claude Code plugin. Your coding agent reads Godot packs, Unity IL2CPP, .NET and native binaries, compares builds, keeps proof, and ports games between Godot, Unity, Unreal and three.js with parity checks. Runs locally.">
<meta name="keywords" content="reverse engineering, game porting, MCP server, Claude Code plugin, Godot pck, Unity IL2CPP, Ghidra, IDA Pro, decompiler, build diff, Godot to Unity, Godot 3 to 4, three.js, Unreal, AI agents">
<meta name="theme-color" content="#1e4f91">
<link rel="canonical" href="https://laaielichter.github.io/Reverseport/">
<meta property="og:type" content="website">
<meta property="og:title" content="ReversePort">
<meta property="og:description" content="Reverse engineer anything. Port it anywhere. An MCP server and CLI for coding agents. Local, MIT.">
<meta property="og:site_name" content="ReversePort">
<meta property="og:locale" content="en_US">
<meta property="og:title" content="ReversePort: reverse engineer anything, port it anywhere">
<meta property="og:description" content="Godot packs, Unity IL2CPP, build diffs, proof cases and verified engine ports for any coding agent. Local and MIT.">
<meta property="og:url" content="https://laaielichter.github.io/Reverseport/">
<meta property="og:image" content="https://laaielichter.github.io/Reverseport/og.png">
<meta property="og:image:type" content="image/png">
<meta property="og:image:width" content="1280">
<meta property="og:image:height" content="640">
<meta property="og:image:alt" content="ReversePort: reverse engineer anything, port it anywhere">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="ReversePort: reverse engineer anything, port it anywhere">
<meta name="twitter:description" content="Godot packs, Unity IL2CPP, build diffs, proof cases and verified engine ports for any coding agent. Local and MIT.">
<meta name="twitter:image" content="https://laaielichter.github.io/Reverseport/og.png">
<meta name="twitter:image:alt" content="ReversePort: reverse engineer anything, port it anywhere">
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"ReversePort","applicationCategory":"DeveloperApplication","operatingSystem":"macOS, Linux, Windows","description":"Open-source MCP server and CLI that lets coding agents reverse engineer apps, games, binaries and websites and port them between Godot, Unity, Unreal, three.js and languages.","url":"https://laaielichter.github.io/Reverseport/","downloadUrl":"https://www.npmjs.com/package/reverseport","codeRepository":"https://github.com/laaielichter/reverseport","license":"https://opensource.org/licenses/MIT","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"}}
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"ReversePort","alternateName":"reverseport","applicationCategory":"DeveloperApplication","applicationSubCategory":"Reverse engineering and game porting","operatingSystem":"macOS, Linux, Windows","description":"Open-source MCP server, CLI and Claude Code plugin that lets coding agents reverse engineer apps, games, binaries and websites — Godot packs, Unity IL2CPP, .NET and native code — compare builds, keep proof for every claim, and port games between Godot, Unity, Unreal, three.js and languages with parity checks.","keywords":"reverse engineering, game porting, MCP server, Claude Code plugin, Godot, Unity IL2CPP, Ghidra, IDA Pro, decompiler, build diff","featureList":["Engine and version detection for projects and exported games","Godot .pck extraction and decoding back to an editable project","Unity IL2CPP metadata to a C# skeleton","Build comparison down to .NET types and methods","Proof cases with evidence, claims, unknowns and tests","Clean-room rebuild specs from public sources","Verified ports between Godot, Unity, Unreal and three.js","Native decompilation through your own Ghidra, Hopper or IDA"],"softwareRequirements":"Node.js 22.23.4 or newer","isAccessibleForFree":true,"url":"https://laaielichter.github.io/Reverseport/","downloadUrl":"https://www.npmjs.com/package/reverseport","installUrl":"https://www.npmjs.com/package/reverseport","codeRepository":"https://github.com/laaielichter/reverseport","sameAs":["https://github.com/laaielichter/reverseport","https://www.npmjs.com/package/reverseport"],"author":{"@type":"Person","name":"laaielichter","url":"https://github.com/laaielichter"},"license":"https://opensource.org/licenses/MIT","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"}}
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@ -94,7 +106,7 @@ h1 .second { color: var(--cyan); }
}
.install button:hover { background: var(--cyan); }
.after-install { font-size: 0.95rem; color: var(--muted); margin: 14px 0 0; max-width: 30em; }
.links { display: flex; gap: 22px; margin-top: 28px; font-weight: 600; }
.links { display: flex; flex-wrap: wrap; gap: 10px 22px; margin-top: 28px; font-weight: 600; }
/* Terminal (the one loud element) */
.term {
@@ -186,6 +198,14 @@ h2 { font-size: clamp(1.8rem, 3.2vw, 2.5rem); line-height: 1.08; letter-spacing:
.cards p q { color: var(--ink); quotes: "“" "”"; }
.note { color: var(--muted); font-size: 0.97rem; max-width: 44rem; margin: 28px 0 0; }
.note code { color: var(--ink); }
/* What's new: two releases side by side */
.news { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 48px; }
.news h3 { font-size: 1.15rem; margin: 0 0 4px; }
.news .tag { font: 500 0.85rem var(--mono); color: var(--muted); margin: 0 0 14px; }
.news ul { margin: 0; padding-left: 1.1em; }
.news li { margin: 0 0 10px; color: var(--muted); }
.news li strong { color: var(--ink); font-weight: 600; }
.news code { color: var(--ink); }
/* Start */
.start ol { margin: 0; padding: 0; list-style: none; counter-reset: s; max-width: 44rem; }
.start li { counter-increment: s; display: grid; grid-template-columns: 2.2rem minmax(0, 1fr); gap: 10px; padding: 0 0 26px; }
@@ -206,7 +226,7 @@ body.demo-only .demo-stage .term { border-radius: 0; box-shadow: none; font-size
body.demo-only .demo-stage .term-body { min-height: 0; height: 676px; }
@media (max-width: 900px) {
.hero, .split, .honest, .bytes-grid { grid-template-columns: minmax(0, 1fr); gap: 36px; }
.hero, .split, .honest, .news, .bytes-grid { grid-template-columns: minmax(0, 1fr); gap: 36px; }
.hx { grid-template-columns: 3.4em repeat(8, minmax(0, 1fr)); font-size: 12px; }
.hx .hx-mid { display: block; }
.hero { padding-top: 28px; padding-bottom: 64px; }
@@ -234,6 +254,7 @@ body.demo-only .demo-stage .term-body { min-height: 0; height: 676px; }
ReversePort
</a>
<nav aria-label="Main">
<a class="hide-sm" href="#new">What's new</a>
<a class="hide-sm" href="#ask">What it does</a>
<a class="hide-sm" href="#routes">Ports</a>
<a class="hide-sm" href="#skills">Skills</a>
@@ -246,15 +267,17 @@ body.demo-only .demo-stage .term-body { min-height: 0; height: 676px; }
<div class="wrap hero">
<div>
<h1><span>Reverse engineer anything.</span> <span class="second">Port it anywhere.</span></h1>
<p class="lede">An MCP server and CLI that lets your coding agent take apart apps, games, binaries and websites, then rebuild them or port them to Godot, Unity, Unreal, three.js or another language. It runs on your machine and only reads the target.</p>
<p class="lede">An MCP server, CLI and Claude Code plugin that lets your coding agent take apart apps, games, binaries and websites — Godot packs, Unity IL2CPP, .NET and native code — then rebuild them or port them to Godot, Unity, Unreal, three.js or another language. It runs on your machine and only reads the target.</p>
<div class="install">
<code id="cmd">npx reverseport setup</code>
<button type="button" id="copy" aria-live="polite">Copy</button>
</div>
<p class="after-install">Needs Node.js 22.19 or newer. Setup connects Claude Code, Codex, Cursor, Gemini CLI, Copilot, OpenCode and more, and backs up your config first.</p>
<p class="after-install">Needs Node.js 22.23.4 or newer (24.22.1+ on Node 24). Setup connects Claude Code, Codex, Cursor, Gemini CLI, Copilot, OpenCode and more, and backs up your config first.</p>
<div class="links">
<a href="https://github.com/laaielichter/reverseport">Source on GitHub</a>
<a href="https://www.npmjs.com/package/reverseport">npm package</a>
<a href="https://registry.modelcontextprotocol.io/v0/servers?search=io.github.laaielichter/reverseport">MCP Registry</a>
<a href="https://github.com/laaielichter/reverseport/discussions">Discussions</a>
</div>
</div>
<figure style="margin:0">
@@ -266,6 +289,37 @@ body.demo-only .demo-stage .term-body { min-height: 0; height: 676px; }
</figure>
</div>
<section id="new">
<div class="wrap">
<h2>What's new</h2>
<p class="intro">ReversePort ships often. These are the last two releases; every change is in the <a href="https://github.com/laaielichter/reverseport/blob/main/CHANGELOG.md">changelog</a>.</p>
<div class="news">
<div>
<h3>1.12</h3>
<p class="tag">more formats, sturdier results</p>
<ul>
<li><strong>More formats recognised:</strong> Doom WAD, Quake and Half-Life WAD2/WAD3, XNB (XNA/MonoGame) and Valve VPK, next to Quake PAK.</li>
<li><strong>More game libraries:</strong> melonJS, Kontra, Matter.js, Rapier, cannon-es, Planck.js, Howler.js, Tone.js and React Three Fiber.</li>
<li><strong>Monorepos:</strong> <code>pnpm-workspace.yaml</code> globs, <code>#imports</code> and Deno import maps.</li>
<li><strong>Big results always fit</strong> the output budget, also with emoji, file-name keys and very deep results.</li>
<li><strong>A <a href="https://github.com/laaielichter/reverseport/blob/main/docs/walkthrough-godot-to-threejs.md">Godot to three.js walkthrough</a></strong> where every command was run and the result builds.</li>
</ul>
</div>
<div>
<h3>1.11</h3>
<p class="tag">a new engine and a new protocol</p>
<ul>
<li><strong>Deep analysis on REA 6.8,</strong> the newest version of the engine inside ReversePort.</li>
<li><strong>No more timeouts.</strong> On MCP 2026-07-28, long calls (a cold Ghidra import, a big port plan) run as tasks with progress. Older clients keep working.</li>
<li><strong>Fewer calls, fewer tokens:</strong> <code>run_batch</code> runs up to 20 calls at once, and big results are saved to disk with a link.</li>
<li><strong>Build diffs for .NET:</strong> <code>re_compare</code> shows which types and methods changed, and the next step.</li>
<li><strong>Plugin settings</strong> in Claude Code instead of environment variables.</li>
</ul>
</div>
</div>
</div>
</section>
<section id="ask">
<div class="wrap split">
<div>
@@ -274,8 +328,9 @@ body.demo-only .demo-stage .term-body { min-height: 0; height: 676px; }
</div>
<ul class="asks">
<li><q>What is this game made with, and how is it built?</q><div><code>re_scan</code> finds the engine and version, languages, entry points and how it starts, also for exported builds.</div></li>
<li><q>What changed between build 43 and 44?</q><div><code>re_compare</code> diffs folders, packs and binaries, biggest changes first.</div></li>
<li><q>Decompile the function that saves settings and explain it.</q><div>Opens the binary through Ghidra, Hopper or IDA, finds the function and shows pseudocode with references.</div></li>
<li><q>What changed between build 43 and 44?</q><div><code>re_compare</code> diffs folders, packs and .NET assemblies down to types and methods, biggest changes first.</div></li>
<li><q>A Unity IL2CPP game without its C# source.</q><div><code>re_il2cpp</code> reads <code>global-metadata.dat</code>: classes, methods and strings, plus a C# skeleton.</div></li>
<li><q>Decompile the function that saves settings and explain it.</q><div>Opens the binary through the Ghidra, Hopper or IDA you have installed, finds the function and shows pseudocode with references.</div></li>
<li><q>What is this game made with? I don't have the files.</q><div><code>re_lookup</code> checks public sources: engine with a confidence level, stack, file layout and open-source remakes.</div></li>
<li><q>Rebuild the movement of this game in Godot.</q><div><code>re_blueprint</code> writes a clean-room spec: systems, values to measure on the original, a parity table and a project skeleton.</div></li>
<li><q>How do the packages in this monorepo depend on each other?</q><div><code>re_graph</code> resolves pnpm, Turborepo and Nx workspace names and tsconfig paths, and shows which package uses which.</div></li>
@@ -371,7 +426,7 @@ reverseport case check &lt;caseId&gt;</code></pre>
<div class="wrap split">
<div>
<h2>Works with the agent you already use</h2>
<p class="intro">Any vendor and any model size. About 45 tools are listed by default instead of almost 200, so small models stay focused. The rest are one call away, and results over 256 KB are saved to a file instead of flooding the context.</p>
<p class="intro">Any vendor and any model size. About 57 tools are listed by default instead of more than 200, so small models stay focused. The rest are one call away, <code>run_batch</code> does several steps in one call, long work runs as a task instead of timing out, and results over 256 KB are saved to a file instead of flooding the context.</p>
</div>
<div>
<ul class="agents" aria-label="Agents it works with">
@@ -416,8 +471,8 @@ reverseport case check &lt;caseId&gt;</code></pre>
<ul>
<li><strong>Run locally.</strong> Nothing is uploaded to an analysis service and there is no extra API bill.</li>
<li><strong>Only read the target.</strong> Output always goes to a new folder.</li>
<li><strong>Work right after cloning</strong> for scanning, packs, lookup, blueprints and porting. No build step.</li>
<li><strong>Drive Ghidra, Hopper, IDA and JADX</strong> when you have them installed, and show the evidence behind each conclusion.</li>
<li><strong>Work right after cloning</strong> for scanning, packs, IL2CPP metadata, build diffs, lookup, blueprints and porting. No build step.</li>
<li><strong>Drive Ghidra, Hopper, IDA and JADX</strong> when you have them installed, and show the evidence behind each conclusion. It finds them but never installs them.</li>
</ul>
</div>
<div>
@@ -445,15 +500,30 @@ reverseport case check &lt;caseId&gt;</code></pre>
<p>Using Claude Code? You can install the plugin instead, which adds the porting skills and the <code>port-architect</code> agent:</p>
<pre style="max-width:44rem"><code>/plugin marketplace add laaielichter/reverseport
/plugin install reverseport@reverseport</code></pre>
<p>The plugin asks for its settings once: the deep-analysis engine on or off, the tool list size, a workspace folder and your Ghidra folder.</p>
<p>The same marketplace has two sister plugins: <a href="https://github.com/laaielichter/stashpad">Stashpad</a>, memory for agents that you can read and review (<code>/plugin install stashpad@reverseport</code>), and <a href="https://github.com/laaielichter/agentdisk">agentdisk</a>, a report of what agents left on your disk with a cleanup you can undo (<code>/plugin install agentdisk@reverseport</code>, needs the <code>agentdisk</code> binary).</p>
</div>
</section>
<section id="contribute">
<div class="wrap split">
<div>
<h2>Help build it</h2>
<p class="intro">ReversePort is open source. Its own tools live in <code>port/</code>, plain Node with no dependencies. New formats, engines and game libraries are the easiest first pull request: a detector, a fixture and a test.</p>
</div>
<ul class="asks">
<li><q>I want to add a format or an engine.</q><div>Pick a <a href="https://github.com/laaielichter/reverseport/labels/good%20first%20issue">good first issue</a>. Each one names the files to touch and says when it is done.</div></li>
<li><q>I have a question or an idea.</q><div>Ask in <a href="https://github.com/laaielichter/reverseport/discussions">Discussions</a>.</div></li>
<li><q>A port went wrong.</q><div>Open an <a href="https://github.com/laaielichter/reverseport/issues/new/choose">issue</a> with the command and its JSON error; every error names the next step.</div></li>
<li><q>How do I run the tests?</q><div><code>npm run test:port</code> needs no install. The rest is in <a href="https://github.com/laaielichter/reverseport/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a>.</div></li>
</ul>
</div>
</section>
</main>
<footer>
<div class="wrap">
<p>ReversePort is free and open source under the MIT license. The deep-analysis engine is based on <a href="https://github.com/morluto/rea">REA: Reverse Engineer Anything</a>. Proof cases come from <a href="https://github.com/Devaretanmay/digfox">Digfox</a>, the hooks follow <a href="https://github.com/juan-viox/rea-jev">rea-jev</a> and the challenge self-check uses <a href="https://github.com/pablodiazjorge/rea-lab">rea-lab</a>, all MIT.</p>
<p><a href="https://github.com/laaielichter/reverseport">GitHub</a>&nbsp;&nbsp; <a href="https://www.npmjs.com/package/reverseport">npm</a>&nbsp;&nbsp; <a href="https://github.com/laaielichter/reverseport/blob/main/CHANGELOG.md">Changelog</a>&nbsp;&nbsp; <a href="https://github.com/laaielichter/reverseport/blob/main/docs/README.nl.md">Nederlands</a></p>
<p><a href="https://github.com/laaielichter/reverseport">GitHub</a>&nbsp;&nbsp; <a href="https://www.npmjs.com/package/reverseport">npm</a>&nbsp;&nbsp; <a href="https://registry.modelcontextprotocol.io/v0/servers?search=io.github.laaielichter/reverseport">MCP Registry</a>&nbsp;&nbsp; <a href="https://github.com/laaielichter/reverseport/discussions">Discussions</a>&nbsp;&nbsp; <a href="https://github.com/laaielichter/reverseport/blob/main/CHANGELOG.md">Changelog</a>&nbsp;&nbsp; <a href="https://github.com/laaielichter/reverseport/blob/main/RESPONSIBLE-USE.md">Responsible use</a>&nbsp;&nbsp; <a href="https://github.com/laaielichter/reverseport/blob/main/docs/README.nl.md">Nederlands</a></p>
</div>
</footer>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://laaielichter.github.io/Reverseport/</loc>
</url>
</urlset>
@@ -50,6 +50,10 @@ describe("release configuration", () => {
path: ".claude-plugin/plugin.json",
jsonpath: "$.version",
},
{
type: "generic",
path: "CITATION.cff",
},
],
},
},
@@ -87,6 +91,16 @@ describe("release configuration", () => {
expect(/^## \[([^\]]+)\]/mu.exec(changelog)?.[1]).toBe(packageJson.version);
});
it("keeps the citation version aligned with the package version", async () => {
const packageJson = (await readJson("package.json")) as {
version: string;
};
const citation = await readFile("CITATION.cff", "utf8");
expect(
/^version: (\S+) # x-release-please-version$/mu.exec(citation)?.[1],
).toBe(packageJson.version);
});
it("keeps the npm package and MCP Registry metadata aligned", async () => {
const packageJson = (await readJson("package.json")) as {
name: string;