Fast, reliable transfers from your computer to your PS5.
Transfer · Mount · Browse — designed to live alongside your PS5-side tools.
- Fast transfer — FTX2 binary protocol with BLAKE3 per-shard
verification, small-file packing, and resume on disconnect.
Uses your LAN flat-out. Pack worker absorbs transient
EIO/EMFILEhiccups so a 200k-file game upload doesn't get killed by one unlucky syscall. - Upload queue — line up multiple games or images, hit Start, walk away. Every running row shows live MiB/s and ETA; done rows show the wall-clock-average rate so you can spot a slow destination. Queue state survives app restarts.
- Native image mount — attach
.exfatand.ffpkgimages on the PS5 (MDIOCATTACH + nmount) with no third-party helper. Every mount survives payload restarts and auto-reconciles on startup. - Browse everything — list games anywhere on the PS5 (including inside mounted images), disk images, files, and volumes. Run FS ops (chmod, delete, move, copy, mkdir) with a real directory tree. Bulk delete of a 200k-file folder shows live progress with a working Stop button.
- Live hardware view — model, serial, uptime, CPU frequency,
RAM; plus a fan-threshold control that rings through to
/dev/icc_fanfor quieter operation. - Send any payload — push
.elf,.bin,.js, or.luafiles to the PS5's loader port (9021). Recent-sends history with click-to-replay and per-row success/fail badges. - Install fakepkgs — pick a
.pkg, click Install. Three-tier pipeline: bytes staged on PS5-local disk → install fires under ShellUI's authid via ptrace RPC → register / launch from the Library row. Verified end-to-end on FW 9.60. Game pkgs (CUSA / PPSA / PCSA / EP / UP) install cleanly; system pkgs (NPXS-prefix — Store updates, Settings) get registered fire-and-forget with on-PS5 verification (Sony's API isn't designed for system patches, use the on-PS5 Settings → Debug Settings → Game → Package Installer for those). - Register + launch — Library row's Play button always registers first (idempotent if already registered), retries with DRM-type patch on rejection, then launches. Unmount unregisters every title inside the image first so the dashboard stays clean — no ghost tiles after unmount.
- System pkg patches.
sceAppInstUtilInstallByPackageis built for game pkgs; NPXS-prefix system pkgs (Store updates, Settings app patches) register but the install path freezes Sony's mgmt service mid-flight on most firmwares. Use the on-PS5 Settings → Debug Settings → Game → Package Installer for those.
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 |
| Windows (x64 / ARM64) | PS5Upload-<ver>-win-{x64,arm64}.zip |
Unzip, double-click PS5Upload.exe — portable, no installer |
| Linux (x64 / ARM64) | PS5Upload-<ver>-linux-{x64,arm64}.zip |
Unzip, chmod +x PS5Upload.AppImage, then ./PS5Upload.AppImage |
- macOS 11 (Big Sur) or newer. No dependencies — ad-hoc signed, right-click → Open on first launch to bypass Gatekeeper.
- Windows 10 (build 19041+) or Windows 11. Ships with the Microsoft Edge WebView2 runtime by default; LTSC / stripped installs may need WebView2 installed once.
- Linux needs a few system libraries that the
.AppImageexpects on the host (libfuse2, gtk3, webkit2gtk 4.1, libsoup3, libappindicator, librsvg2). Install commands for Debian/Ubuntu/Fedora/RHEL/Arch are in the FAQ.
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 manually and relaunch.
Building from source:
git clone 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 appmake install auto-detects your OS and runs one of:
make install-ubuntu— Debian / Ubuntu / WSL2:aptdeps 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 PS5 Payload SDK v0.38 →~/ps5-payload-sdk.make install-macos— macOS: Xcode CLT, Homebrew,node,llvm@18(the only Homebrew llvm shipped withld.lld— required byprospero-clang), Rust via rustup, and PS5 Payload SDK.make install-windows— Windows 11: Node.js LTS, Rust, VS 2022 Build Tools (C++ workload), WebView2 Runtime, 7-Zip, and PS5 Payload SDK viawinget. Run from an elevated PowerShell (or any shell withpwsh/powershell.exeon PATH).
All three install scripts are idempotent — re-running them after a partial setup is safe; each step skips if already satisfied.
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.
- Launch ps5upload on your computer.
- Open the Connection tab and enter your PS5's IP address.
- Click Check, then Send payload.
- Once the third step turns green, go to any other tab — you're connected.
The payload stays loaded until the PS5 reboots or goes into rest mode.
client/ (Tauri 2 · React · TypeScript)
│
├── in-process ── engine crates (ps5upload-core, ftx2-proto)
│
└── OR spawns ── ps5upload-engine (HTTP :19113, optional)
│
▼ FTX2 binary framing
payload/ps5upload.elf (PS5 C payload, ports 9113 + 9114)
Three layers:
payload/— C payload that runs on the PS5 (FreeBSD 11). Ports 9113 (transfer) + 9114 (management). Handles FTX2 framing, BLAKE3 verification, mount pipelines, and FS ops.engine/— Rust workspace with the protocol types, transfer logic, HTTP service, lab CLI, mock server, and benchmarks.client/— Tauri 2 desktop app. Uses the engine crates in-process via Tauri IPC; the HTTP engine is available as a separate process for CLI / CI use.
All workflows go through the root Makefile (see make help).
| Target | What it does |
|---|---|
make build |
Payload + engine + client |
make payload |
PS5 ELF at payload/ps5upload.elf (requires PS5_PAYLOAD_SDK env var) |
make engine |
cargo build --workspace |
make client |
vite build in client/ |
make run-client |
Tauri dev (vite + Rust main process) |
make run-engine |
ps5upload-engine on localhost:19113 |
make send-payload |
Send the built ELF to PS5_HOST:PS5_LOADER_PORT |
npm run validate |
Full non-hardware quality gate |
make quality |
Same full non-hardware quality gate via Make |
npm run coverage |
Generate frontend + Rust coverage reports |
make coverage |
Same coverage reports via Make |
make test |
Script syntax + engine tests + payload validation + client build |
make test-engine |
cargo test --workspace (no hardware needed) |
make dist |
Tauri bundle under client/src-tauri/target/release/bundle/ |
Unit and integration tests run entirely against an in-process mock FTX2 server — no PS5 needed:
make test-engineFull local quality gate and coverage reports:
npm run validate
npm run coverageReal-hardware smoke test (requires payload already loaded):
npm run smoke:hardwareSee TESTING.md for the complete mock-test, coverage,
cross-platform, and live-PS5 validation workflow.
- Payload — C (FreeBSD 11), prospero-clang toolchain
- Engine — Rust (edition 2021), tokio + axum 0.8
- Desktop client — Tauri 2, React, TypeScript, Zustand, Tailwind CSS v4, Vite
- Protocol — FTX2 (custom binary framing, BLAKE3 shard verification)
Desktop client
| x64 | arm64 | |
|---|---|---|
| macOS | ✓ | ✓ |
| Linux | ✓ | ✓ |
| Windows | ✓ | ✓ |
PS5 payload — every firmware the PS5 Payload SDK supports,
currently 1.00 through 12.70 on every console model (original
CFI-1xxx, Slim CFI-2xxx, Pro CFI-7xxx, Digital). Built against SDK
v0.38, which ships per-firmware kernel offsets and resolves them at
payload startup via kernel_get_fw_version() — the same binary
runs on every supported firmware without per-release rebuilds.
| Range | Feature coverage |
|---|---|
| 9.00 – 11.60 | All features validated on hardware |
| 1.00 – 8.60 and 12.00 – 12.70 | All features run |
The process-list feature (Hardware tab's process snapshot) reads
kinfo_proc via sysctl(KERN_PROC_PROC) with field offsets that
have been stable across every SDK-supported firmware — pid at
byte 72, thread name at byte 447. No firmware-specific fallback
table required; real command names appear across the full 1.00 –
12.70 range. Transfer, mount, file browse, hardware monitor
(except CPU/SoC temps, which Sony gates on a different credential
check unrelated to firmware), and FS ops work identically across
all supported firmwares.
What actually gates users in practice is the ELF loader on port 9021 — a third-party component, not part of ps5upload. The ecosystem's real-world coverage is roughly 4.x through 12.x; below 4.x is obscure and above 12.70 is future work.
Q: "Connection Refused" or it won't connect?
- Did you load the payload first? The PS5 stops listening after a reboot or rest-mode cycle — send the payload again from the Connection tab.
- Is your computer's firewall blocking outbound connections to port 9113 / 9114 / 9021 on your PS5?
- Your computer and PS5 don't have to be on the same subnet, but there has to be a route to the IP.
Q: Resume gets stuck on "Checking what's already on your PS5…"?
- Reconcile scoped to the local tree's parent directories, so a
single-file upload into a folder that already holds other games
is now one
FS_LIST_DIRcall instead of a recursive walk of the whole destination. Update to the latest build. - Safe-mode reconcile still hashes every same-size remote file via BLAKE3 — that's ~2–3 s per GiB on PS5 UFS. Use Fast mode for single-file or large-file transfers.
Q: Do I need a LAN cable?
- Not strictly, but Wi-Fi caps throughput well below what the PS5 NIC can actually do. Plug in an Ethernet cable for the best experience.
Q: Can I use this over the Internet?
- Yes, technically. If you forward ports 9113 / 9114 to your PS5 it will work. However, the FTX2 protocol is optimised for speed, not for authentication — we don't recommend exposing an exploited PS5 to the open Internet.
Q: How do I install / launch a game from the Library tab?
- The 2.2.26 Library row exposes Mount for
.exfat/.ffpkg/.ffpfsimages plus Register / Register (patch DRM) / Launch / Unregister buttons on the games inside. - Mount is hardware-validated on FW 9.60 — a 76 GiB UFS
.ffpkgmounts on/dev/lvd1, appears in Volumes with the correctsource_image, and unmounts cleanly. The new round's payload uses compile-time-lSce*linkage so the rtld initialises the Sony sprx state viaDT_NEEDEDbefore main() runs. - Register is hardware-validated: pointing it at a folder
game with
eboot.bin+sce_sys/param.jsonsucceeds end to end —sceAppInstUtilAppInstallTitleDirreturns 0, the title appears inapp.dbwith the correct title name, and a nullfs bind is installed at/system_ex/app/<title_id>. Idempotent — re-registering the same path returns the same result. - Register (patch DRM) rewrites the source's
sce_sys/param.json'sapplicationDrmTypeto"standard"before staging — needed for PSN-extracted dumps that ship with"PSN"or"disc". Modifies the source file in place; only use when a normal Register fails with a DRM error. - Launch routes
sceLncUtilLaunchAppthrough a ptrace RPC intoSceShellUIso Sony'sgetpid() == SceShellUI.pidcaller-context check passes natively. Hardware-validated on FW 9.60: hitting Launch on a registered title actually starts the game (SoC power draw confirms the title comes up). Falls back to a direct call when ShellUI RPC isn't available. - Listing inside an active mount (
/mnt/ps5upload/<name>/...) is gated by the PS5 sandbox / LVD mount permission set rather than payload privilege. We re-check after every credential elevation; treat "ENOTDIR descending into a mount" as expected for now. Other PS5-side tools see the mount via/mnt/ps5upload/, and the source path is recorded in our tracker so reconcile-on-next-boot keeps state consistent. - CPU/SoC temperature and SoC power readings come back live on
FW 9.60 via the same ShellUI RPC path. The Hardware tab
refreshes every 5 s; a brief
—means the most recent RPC didn't complete in time and the next tick will refresh.
Q: "No writable storage found"?
- The tool blocks writes to read-only system partitions. If you want to write to a USB drive, make sure it's formatted (exFAT is best) and plugged in before you load the payload.
Q: macOS: "App is damaged" or "Unidentified Developer"?
- This is normal for unsigned apps. Right-click the app, select Open, then click Open in the dialog.
- If macOS still blocks it, System Settings → Privacy & Security → Open Anyway.
- Last resort — remove the quarantine flag:
xattr -dr com.apple.quarantine /Applications/ps5upload.app
- No Apple Developer account is required; the app is intentionally unsigned.
Q: Where are config and logs saved?
- The desktop client uses the OS app-data directory:
- Windows:
%APPDATA%\ps5upload - macOS:
~/Library/Application Support/ps5upload - Linux:
~/.local/share/ps5upload
- Windows:
Q: Does this work on PS4?
- No. The payload is compiled specifically for the PS5 (FreeBSD 11, Zen 2) and calls PS5-only kernel entry points.
Q: What about older firmware (≤ 9.00)?
- The FTX2 payload itself doesn't call firmware-gated APIs, but the ELF loader workflow on port 9021 depends on what your jailbreak exposes. Patches welcome.
Q: Can I run ps5upload headless / over SSH?
- Not the GUI. The
ps5upload-enginebinary speaks HTTP on:19113and exposes the full transfer / reconcile / FS API, so you can script transfers from a terminal or CI job without ever opening the desktop client.
- Report bugs: GitHub Issues
- Pull requests welcome — please read
.github/PULL_REQUEST_TEMPLATE.mdand runmake testlocally before opening.
This software is for educational purposes. It is intended for use with legally obtained software and homebrew applications on hardware you own.
Use at your own risk. The authors are not responsible for any data loss, bricked hardware, or other issues that arise from using this tool.
This software builds on the following open-source projects:
Desktop client (Tauri 2 + React):
- Tauri — Rust-backed cross-platform desktop runtime
- React — UI library
- Zustand — Client state management
- Tailwind CSS — Styling
- Vite — Build + dev server
- lucide-react — Icons
- react-router — Routing
Engine (Rust):
- tokio — Async runtime
- axum — HTTP service
- serde — Serialization
- anyhow — Error handling
- uuid — Job IDs
Payload (PS5):
- PS5 Payload SDK — Open-source SDK for PS5 payload development
- BLAKE3 — Fast cryptographic hashing (per-shard verification)
GNU General Public License v3.0 (GPLv3).
Free to use, free to modify. See LICENSE.
Created by PhantomPtr.
ps5upload builds on work and conventions from the PS5 homebrew ecosystem (ELF loader port 9021, FreeBSD 11 mount layout, Sony kernel API signatures). Specific attributions live in the commits that introduced each piece.
If you find this tool useful, consider buying me a coffee!
- Discord server: https://discord.gg/fzK3xddtrM
- Support me on Ko-fi: https://ko-fi.com/B0B81S0WUA

