Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻譯準備中
將遊戲、應用程式與自製軟體傳送至已越獄的 PS5,並可從電腦、手機或瀏覽器管理主機。
AI 翻譯
Send games, apps and homebrew to a jailbroken PS5, and manage the console from your computer, phone or browser.
遊戲TypeScript · RustGitHub @phantomptr自行安裝營運者未確認
試用過了嗎? 點一下就好,不需要登入。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗.zip / .7z / .rar
archives (unpacked on the way, nothing extracted to your disk). Everything runs over
AVA1, one encrypted connection on port 9120. Every file is verified, and an upload
continues after a dropped connection, a helper restart or rest mode. A job that will not
fit is refused up front, counting what is already on the console. Queue, live speed and ETA..pkg and PS5 fake packages
(base, update, DLC) install from your computer (Stream & install or Upload & install),
a NAS/SMB share, a USB drive or a link. If the PS5 refuses one route, the app offers another.
PS5 fake packages install but do not start on firmware later than 11.60; PS4 fake packages
are fine..exfat, .ffpkg, .ffpfs, or the smaller
.ffpfsc) that ShadowMount+ mounts. A queue makes games one after another and hands each to
Upload & Install to install or upload.Pre-built downloads land on the Releases page:
| Platform | File | How to install |
|---|---|---|
| macOS (Apple Silicon / Intel) | PS5Upload-<ver>-mac-{arm64,x64}.dmg | Open the .dmg, drag PS5Upload into Applications. See First launch on macOS below — Gatekeeper blocks downloaded apps the first time. |
| Windows (x64 / ARM64) | PS5Upload-<ver>-win-{x64,arm64}-setup.exe or PS5Upload-<ver>-win-{x64,arm64}.zip | Run the -setup.exe installer (it updates itself later), or unzip the .zip and double-click PS5Upload.exe — portable, no installer. See First launch on Windows — SmartScreen warns on first run. |
| Linux — Debian / Ubuntu (x64 / ARM64) | PS5Upload-<ver>-linux-{x64,arm64}.deb | sudo apt install ./PS5Upload-<ver>-linux-<arch>.deb — installs a normal app with a menu entry; pulls in the WebKitGTK deps automatically. |
| Linux — Fedora / RHEL / Bazzite (x64 / ARM64) | PS5Upload-<ver>-linux-{x64,arm64}.rpm | sudo dnf install ./PS5Upload-<ver>-linux-<arch>.rpm (Bazzite/Silverblue: rpm-ostree install; to update, rpm-ostree uninstall ps5-upload --install ./<new>.rpm and reboot, which Settings → Updates shows ready to copy) — menu entry + auto deps. |
| Linux — any distro (x64 / ARM64) | PS5Upload-<ver>-linux-{x64,arm64}.zip | Universal fallback (no install). Unzip, then chmod +x PS5Upload.sh PS5Upload.AppImage and run ./PS5Upload.sh (the wrapper — handles the FUSE-less and WebKit white-screen cases for you). Running ./PS5Upload.AppImage directly also works if your system has libfuse2 and a happy WebKitGTK. |
| Linux — NixOS (x64 / ARM64) | no release artifact | Packaged in NUR as ps5upload — see NixOS below. |
| Android | PS5Upload-<ver>-android.apk (older 32-bit phones: -android-armv7.apk) | Enable "install unknown apps" for your browser/file manager, then open the .apk. Same interface, mobile-friendly; connects to and manages your PS5 over Wi-Fi. On Android 17, allow local network access ("nearby devices") when asked. |
No NixOS artifact is published on the Releases page, but ps5upload is
packaged in GriefNorth's NUR as
ps5upload (x64 and ARM64) — it wraps the same .AppImage and needs no
FUSE. With flakes:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nur.url = "github:GriefNorth/nur-packages";
};
outputs = { nixpkgs, nur, ... }: {
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
({ pkgs, ... }: {
environment.systemPackages = [
nur.packages.${pkgs.system}.ps5upload
];
})
];
};
};
}
Then nixos-rebuild switch --flake .#myhost and launch ps5upload from
your app menu. Without flakes, call the package straight out of the repo —
and note that ps5upload bundles UnRAR for .rar support, so nixpkgs needs
config.allowUnfree = true:
{ pkgs, ... }:
{
nixpkgs.config.allowUnfree = true;
environment.systemPackages = [
(pkgs.callPackage
((builtins.fetchTarball
"https://github.com/GriefNorth/nur-packages/archive/refs/heads/main.tar.gz")
+ "/pkgs/ps5upload")
{ })
];
}
Or try it without installing anything:
nix run github:GriefNorth/nur-packages#ps5upload
The Nix expression pins one release version, so bump it there when a new
ps5upload comes out. Prefer to run the AppImage yourself? Prefer the
./PS5Upload.sh wrapper from the zip above — on NixOS the bare
.AppImage usually renders an empty window, because its bundled
libwayland-client shadows the host one and WebKitGTK then fails to create
an EGL display. The Nix package works around that for you.
ps5upload is not code-signed with paid OS certificates — same as every other PS5 scene tool. The OS's verification layers (Gatekeeper on macOS, SmartScreen on Windows) treat unsigned downloads as suspicious until you allow them once. The one-time bypass:
macOS — "App is damaged" or "cannot be opened":
xattr -dr com.apple.quarantine /Applications/PS5Upload.app
That removes the quarantine attribute macOS slaps on every file downloaded from a browser. Alternatively, right-click PS5Upload in Applications → Open → click Open in the prompt. Either method only needs to be done once per install.
Windows — "Windows protected your PC" SmartScreen prompt:
PS5Upload.exe → Properties → check Unblock → OK.Linux — no equivalent warning. Just chmod +x and launch.
.deb and .rpm packages pull in their
dependencies automatically (WebKitGTK 4.1, gtk3, libsoup3, etc.) via
the package manager, so they're the easiest route on Debian/Ubuntu and
Fedora/RHEL/Bazzite. The universal .AppImage instead expects those
libraries already on the host (libfuse2, gtk3, webkit2gtk 4.1,
libsoup3, libappindicator, librsvg2); install commands for
Debian/Ubuntu/Fedora/RHEL/Arch are in
the FAQ.
Minimum distro version: all three Linux artifacts are built against
glibc 2.39, so they need a reasonably recent distro — Ubuntu
24.04+, Debian 13+ (trixie), Fedora 40+, or equivalent. (This is a
glibc floor, not a package dependency — the .deb/.rpm install fine
on older releases but the app won't launch, and the AppImage bundles
WebKitGTK yet still uses the host's glibc.) On an older distro, build
from source with make dist-linux on that machine.The app checks GitHub for updates once per launch (Settings → Updates) and downloads a fresh archive to your Downloads folder when you click Download. Replace the old app and relaunch; the app then offers to update the helper.
Building from source:
git clone --recurse-submodules https://github.com/phantomptr/ps5upload.git
cd ps5upload
make install # bootstrap dev env (auto-detects host OS)
make build # payload ELF + engine + client UI
make run-client # launch the Tauri dev app
make install auto-detects your OS and runs one of:
make install-ubuntu — Debian / Ubuntu / WSL2: apt deps for Tauri
(libwebkit2gtk-4.1-dev, libgtk-3-dev, librsvg2-dev,
libayatana-appindicator3-dev, libxdo-dev, libssl-dev,
build-essential), Node.js 22 LTS via NodeSource (only if missing),
Rust via rustup, and checksum-verified PS5 Payload SDK v0.45 →
~/ps5-payload-sdk.make install-macos — macOS: Xcode CLT, Homebrew, node, current
llvm (LLVM 23 at this release), Rust via rustup, and checksum-verified
PS5 Payload SDK v0.45.make install-windows — Windows 11: Node.js LTS, Rust, VS 2022 Build
Tools (C++ workload), WebView2 Runtime, 7-Zip, and PS5 Payload SDK
via winget. Run from an elevated PowerShell (or any shell with
pwsh / powershell.exe on PATH).All three install scripts are idempotent — re-running them after a partial
setup is safe. A stale or unmarked SDK is upgraded to the repository pin and
moved to a timestamped backup instead of being deleted. Local and GitHub
Actions builds read the same tag and official release checksum from
scripts/ps5-sdk.env.
For per-platform bundles only (no full dev env): make dist-mac,
make dist-mac-x64, make dist-linux, make dist-linux-arm,
make dist-win, and make dist-win-arm.
The helper stays until the PS5 reboots or enters rest mode. The app connects to ports 9120 (the helper) and 9021 (the loader); allow both in your firewall. For Stream & install the PS5 connects back to this computer on port 19113, so allow the app through the firewall too (on Windows, for Private and Public networks). 6.0 cannot talk to a v5.x helper: the banner's Send helper replaces it in one click.
client/ (Tauri 2 · React · TypeScript) Android app · Docker web UI
│
└── spawns ── ps5upload-engine (HTTP :19113)
│
▼ AVA1 (Noise-encrypted, port 9120)
payload/ps5upload.elf (PS5 C payload)
payload/: C payload on the PS5 (FreeBSD 11). Transfers, BLAKE3 verification, mounts,
file operations and every management call, over AVA1, the
transfer protocol (its own repository, checked out as third_party/ava1).engine/: Rust workspace with the AVA1 client, transfer logic, HTTP API and lab tools.client/: Tauri 2 desktop app (and the Android and web builds), talking to the engine.All workflows go through the root Makefile (make help).
| Command | What it does |
|---|---|
make build | Payload + engine + client |
make run-client | Tauri dev app |
make run-engine | Engine on port 19113 (binds all interfaces; answers loopback, PS5UPLOAD_ALLOW_IP and the PS5-facing /pkg-host/ only) |
make test-engine | Rust tests, no PS5 needed |
make test-payload | Console C code compiled and run on the host |
npm run validate | Full non-hardware gate |
make dist | Tauri bundle |
See TESTING.md for the full workflow, and CONTRIBUTING.md.
.apk from Releases..ipa from Releases, sideloaded with AltStore or Sideloadly (see the
FAQ). New and not yet widely tested.Fake package install needs live kernel patches (kstuff / fpkg-enable) on the console; where they are missing the app says so instead of reporting a false success.
Run the engine on a NAS or server and use it from a browser, or point the desktop app at it with Settings → Engine URL.
ghcr.io/phantomptr/ps5upload-engine-webui (full web UI) and
ghcr.io/phantomptr/ps5upload-engine (engine only). Every release tag pushes :<version>;
:latest and :<major.minor> move only when a pre-release is promoted to a release.engine/compose.yaml. It uses host networking (stream
installs need the PS5 to reach the engine). PS5_ADDR (the console) and PS5UPLOAD_ALLOW_IP
(who may use the page) are required for a web UI used from other devices on the LAN; without
the allowlist every browser but the host's own gets a 403.http://<host>:19113. The file picker browses the engine's disk; mount your games
folder into the container and set PS5UPLOAD_BROWSE_ROOTS./data to a host folder (on Unraid, /mnt/user/appdata/ps5upload): it holds the
container's key, so the PS5 knows it as the same device (and its Mesh Drive folders) after the
container is recreated.PS5UPLOAD_BASE_URL unset. It is a build-time
path prefix, not a full URL. See reverse-proxy setup for nginx,
proxy authentication, Docker bridge networking, and sub-path hosting.Common questions (connection problems, install errors, USB drives, firmware) are in
FAQ.md, also available inside the app.
CONTRIBUTING.md and run the checks in
TESTING.md before opening.ps5upload is a vibe-coded project. The code is written with AI coding tools, directed, tested on real consoles and released by one maintainer. That is what keeps the development cycle fast: bug reports, feature requests and enhancements are usually turned around in days, not months.
The trade-off is that the code has not had the slow, line-by-line human review a hand-written project of this size would get. Every release is tested on hardware, but you should expect rough edges, read the disclaimer, keep backups of anything you care about on the console, and use the tool at your own discretion.
ps5upload is provided for research, educational, interoperability, and homebrew development purposes only. It is not affiliated with, endorsed by, or connected to Sony Interactive Entertainment Inc. "PlayStation", "PS4" and "PS5" are trademarks of Sony Interactive Entertainment Inc., used here for identification only.
Use this software entirely at your own risk. It is provided "as is", without warranty of any kind, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement.
➡ Full terms: DISCLAIMER.md. By downloading, building, installing, or using this software you accept them in full. If you do not agree, do not use it.
You are solely responsible for how, where, and on what hardware you use this tool. By downloading, installing, or running it, you acknowledge and accept that:
If any of the above is not acceptable to you, do not use this software.
ps5upload builds on other people's work. Each entry says how: included (their source is in this repository), ported (their code rewritten in another language or adapted file by file), library (a dependency the build pulls in), fetched at runtime (downloaded from its own home when you use the feature; not shipped with ps5upload), or reference (read to learn how something works; no code taken).
Included code:
payload/third_party/sdk-crt with one fix so payloads start on firmware where two kernel lookups fail (FW 5.50)third_party/elfldr with a fix for a loader that hangs on a silent client; the app sends this build to the console.ffpkg) and PFS (.ffpfs) image writers and the streaming .ffpfsc container, in engine/crates/ps5-dump-forge-ufs2 and -pfs; quer3q also contributed reader and safety fixes to the package crates, and the ideas behind hash-checked images and spare space for read-write mountsthird_party/ava1/c/third_partypayload/third_party/sqlite3payload/third_party/tiny_aesPorted:
payload/src/app_dump_*.cpayload/src/app_dump_self.cpayload/src/cheats.c), the drive sensors (drive_sensors.c) and the Remote Play account-id lookup (remoteplay.c); the wake watchdog adapts its algorithm, and its launch and jailbreak code was a reference for oursampr_pack.py, and "Measure how it plays" of ampr_pack_profile.py; the index writer follows the format build_ampr_index.py writesengine/crates/ps5upload-core/src/rp_regist*.rs and rp_session.rsengine/crates/ps5upload-core/src/rp_stream/Libraries:
Cargo.lock files.rar extraction on desktop, compiled from the source the unrar_sys crate bundles into its own program, ps5upload-unrar, which holds only ps5upload's own code and UnRAR and which the engine runs over pipes (UnRAR is never linked into the engine); used to extract only, never to compress.Fetched at runtime:
References:
/dev/pfsmgr and the image mounted with sceFsMountSaveData from a copy under /data, which "Open save" follows/dev/mp1 read requests and table layout behind the Hardware screen's GPU and per-core CPU clocks (payload/src/mp1_clock.c); only its reads are used, written anew, and we never change clocksLicense texts and the notices these projects require are in LICENSES/.
ps5upload stands on the shoulders of the PS5 homebrew scene. Huge thanks to everyone who makes this ecosystem possible — the exploit and kernel researchers, the ELF/payload loader authors, the PS5 Payload SDK maintainers, the homebrew tool developers whose work this lives alongside, and everyone in the community who tests, reports bugs, and shares knowledge. None of this exists without your collective effort. 🙏
ps5upload is one tool among many. The scene is full of great work: loaders, kernel patches, mount tools, dumpers, cheat engines, file managers, save tools and more, most of it made by people in their spare time. If something here saves you time, the people behind the tools it lives alongside deserve the same thanks. Please support them too.
GNU General Public License v3.0 (GPLv3).
Free to use, free to modify. See LICENSE.
.rar support / UnRAR: the desktop and Docker builds ship the UnRAR source
compiled into a separate program, ps5upload-unrar, that contains only
ps5upload's own code and UnRAR (used only to extract RAR — never to compress or
build a RAR-compatible archiver). The engine starts it and talks to it over pipes;
it does not link UnRAR. A GPLv3 §7 exception covers combining ps5upload's code
with UnRAR in that program, and UnRAR's own license is reproduced as required. See
LICENSES/UnRAR-exception.md and
LICENSES/UnRAR-license.txt.
Remote Play streaming: the code ported from chiaki-ng
(engine/crates/ps5upload-core/src/rp_stream/) is under the GNU Affero General Public License
v3.0, which GPLv3 §13 allows combining with; see LICENSES/AGPL-3.0.txt.
Included third-party code keeps its own license, next to the code or in LICENSES/;
see Credits.
Created and maintained by PhantomPtr.
If you find this tool useful, consider buying me a coffee!
| iPhone | PS5Upload-<ver>-ios-unsigned.ipa | Sideload with AltStore or Sideloadly and an Apple ID (a free one works; it is re-signed every 7 days). AltStore, SideStore and Feather can also add the source https://github.com/phantomptr/ps5upload/releases/latest/download/altstore.json and update the app from there. Turn on Developer Mode and trust your Apple ID on the iPhone; see the FAQ. Copy games into the app's folder with the Files app. |
payload/third_party/libsmb2, built into a separate on-demand daemon (payload/smb/), never into the helperpayload/third_party/7zip (no RAR code), built into a separate on-demand payload (payload/extractor/)payload/third_party/libarchive.7z extraction, in third_party/sevenz-rust2 with a fix for archives over 4 GiB on 32-bit Android.rar extraction, in third_party/unrar with a fix for an out-of-bounds read on multi-volume archives (see the UnRAR library entry below)payload/src/app_dump_sha256.c, as ps5-app-dumper carries itnewfs — portions of its cylinder-group arithmetic, in engine/crates/ps5-dump-forge-ufs2/src/geom.rsclient/src/assets/fonts