The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Rpf listing page.
A dependency-light Rust toolchain for reading, editing and rebuilding RPF7
archives — the dlc.rpf files RAGE Multiplayer and FiveM servers hand to their
clients, and the archives Grand Theft Auto V ships. One command-line binary with
no runtime prerequisite, and the same code behind a JSON-RPC daemon and a VS
Code extension.
| Version | Variant | Used by | Support |
|---|---|---|---|
| RPF7 | OPEN, unencrypted | RAGE MP and FiveM server packs | Read, write |
| RPF7 | AES-256, 0x0FFFFFF9 | GTA V, nested archives such as des_* and script_* | Read, write — key from the game executable |
| RPF7 | AES-256, 0x0FFFFFF7 | Rockstar Games Launcher | Read, write — key from Launcher.exe |
| RPF7 | NG, 0x0FEFFFFF | GTA V Legacy and Enhanced, every top-level archive | Read, write — both need a memory image |
| RPF8 | — | Red Dead Redemption 2 | Not supported |
| RPF6 | — | Red Dead Redemption, 2010 and 2023 | Not supported |
| RPF4 | — | Max Payne 3 | Not supported |
| RPF3 | — | GTA IV audio, Midnight Club: LA | Not supported |
| RPF2 | — | GTA IV, main archives | Not supported |
| RPF0 | — | Table Tennis | Not supported |
Pre-RPF7 attributions are read from other implementations, not measured here;
docs/rpf-format.md records them and where they disagree. Every non-RPF7
version is recognised by its magic word and refused by number.
Encryption is per entry as well as per archive: the tag covers the table of contents and the names blob, and each entry's row says whether its payload is under the transform.
INSTALL.md is the page for this, and it answers three separate questions: how
to install the editor extension from a .vsix, how to register the MCP server
with an editor or an agent, and where to put the binary if that is all you want.
Prebuilt binaries for macOS, Windows and Linux are attached to each release.
To build from source instead — the toolchain is pinned in rust-toolchain.toml:
Encrypted archives need key material, extracted from your own installation:
No key material is bundled here, and none ever will be. Each source is cached
under the hash of its own bytes in ./keys, which every command consults
without a flag; --cache-dir selects another cache, the one way to keep several
installations apart, and rpf keys invalidate empties one. No command prints a
key — only offsets, lengths, counts and paths. NG material stands in the clear
only in a memory image of a running game, so that is the sole route to an NG
archive; obtaining one is out of scope here. An archive whose material is absent
fails rather than guessing.
List an archive, descending into the archives inside it:
The second column says what an entry holds; pso, rbf and meta have an XML
view:
rpf put --as xml writes an edited document back in the entry's own encoding.
Ask what a write costs, then make it:
put --create, rm, mv and mkdir move every offset after the header, so
they always rebuild and say so first. A rebuild is atomic: a scratch file beside
the archive replaces the original in one step.
Take an archive apart, build it back, check the result:
Every reporting command takes --json; rpf --help lists the rest.
clients/agent/README.md is the page for driving the tool from a program: the
JSON shapes, the failure object, and cat --out for a payload nobody is going
to read.
rpf serve --stdio speaks JSON-RPC, one object per line. It answers everything
the binary does, holds edits until commit, and reports a long rebuild's
progress as cancellable notifications.
clients/vscode mounts an archive as a workspace folder: files open, edit and
save like any other, and a nested archive is a folder inside a folder. The
archive is written by one explicit act, previewed as patch or rebuild. See
clients/vscode/README.md.
Stable, so a caller can classify a failure without reading the message. The
daemon reports the same numbers as a JSON-RPC error.code, with a symbolic
error.data.reason.
| Code | Meaning |
|---|---|
| 0 | Everything worked |
| 1 | A failure with no better classification |
| 2 | The arguments were wrong |
| 3 | The path is not in the archive |
| 4 | The archive is malformed or does not decompress as it promises |
| 5 | The archive needs key material that is not available |
| 6 | The request or its input was wrong, and the tool declined to act |
| 7 | Reading or writing failed |
| 8 | The caller stopped the operation part-way |
| 9 | This build cannot do it |
The suite needs no game data and passes without it, skipping what it cannot
reach. Four variables point it at real data: RPF_CORPUS at a directory of
archives, RPF_GAME_EXE at game executables, RPF_GAME_IMAGE at one memory
image of a running game, and RPF_METADATA at metadata payloads already out of
their archives, as tools/metadata-dump writes them. Each has a companion —
RPF_REQUIRE_CORPUS and its three siblings — turning its own skips into
failures.
DR-N, cited throughout the source and the documents, names a decision record
under docs/decisions/, kept in the working tree and not distributed.
MIT OR Apache-2.0, at your option. See LICENSE-MIT and LICENSE-APACHE.