mirror of
https://github.com/phantomptr/ps5upload.git
synced 2026-10-19 02:20:02 -05:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
7382 lines
374 KiB
Markdown
7382 lines
374 KiB
Markdown
# Changelog
|
||
|
||
What's new in ps5upload, written for humans.
|
||
|
||
---
|
||
|
||
## 7.1.3
|
||
|
||
- **Payloads: one place for what's on your PS5.** The Payloads screen now has three tabs:
|
||
Catalog, Send and **On your PS5**. On your PS5 shows a card for each payload that is running
|
||
or installed on the console, with its status, Open (for payloads with a web page), Update when a
|
||
newer release is out, and Stop. **Manage** opens that payload's tools in the card:
|
||
ShadowMount+ mounts, the nanoDNS editor, Payload Manager and HearBridge. Old links to the
|
||
separate tabs still work.
|
||
- **HearBridge in the catalog and on your PS5.** HearBridge plays the PS5's audio on ordinary
|
||
Bluetooth headphones or speakers. Its card shows the connected headset, battery, link quality,
|
||
latency, volume and the game's profile; Manage sets volume and mute, reconnects, switches
|
||
between saved headsets, scans for new ones, turns night mode on or off, sets latency, and stops
|
||
it. Pairing, EQ and everything else open in HearBridge's own page.
|
||
- **Processes & ports.** The Processes screen now has a Ports tab next to it, showing which ports
|
||
are open on the console and what usually listens there (HearBridge and PS5Upload Files
|
||
included).
|
||
- **PS5Upload Files: permissions, new files and text editing.** Info → Permissions sets read,
|
||
write and execute for owner, group and others (or the number, like 755), for a folder's
|
||
contents too; drives that don't keep permissions (exFAT, FAT) say so. Create a new file, and
|
||
edit text files up to 1 MiB with the on-screen keyboard. Saving never leaves a half-written
|
||
file, keeps the file's permissions and line endings, and warns when the file changed since
|
||
you opened it.
|
||
- **PS5Upload Files: upload and download from your phone or computer.** When you open the page
|
||
from another device (Settings → Allow other devices), Files has **Upload here** to send files
|
||
and folders to the console and **Download** for a file, or a whole folder as one .tar file.
|
||
The usual Skip / Replace / Keep both choices apply, a cancelled upload leaves nothing behind,
|
||
and a stalled connection is let go so the page stays responsive. On a home network this
|
||
moved about 75 MB/s up and 110 MB/s down.
|
||
|
||
---
|
||
|
||
## 7.1.2
|
||
|
||
- **Save data on a shared PS5 shows whose save is whose.** Each save is labelled with its
|
||
owner's name instead of a number, and the screen starts on the user who is signed in at the
|
||
console; "Whose saves" switches to another user or to everyone. Back up all and Restore all
|
||
act on the saves shown. A backup saved on your computer is named after the game and the user
|
||
(`PPSA01234-Alice.zip`).
|
||
- **USB backups are kept per user.** Backups to a USB drive on the console now go into a folder
|
||
per user (`<game>/<name>-<user id>/<date>/`). Before, every user's backups of a game shared one
|
||
folder, so on a shared console "Restore all from USB" could put one user's latest backup into
|
||
another user's save. Backups made before this update are still used when only one user on the
|
||
console has a save of that game.
|
||
|
||
---
|
||
|
||
## 7.1.1
|
||
|
||
- **The app scrolls again on macOS Big Sur.** On Big Sur's older built-in web engine the app
|
||
window lost its fixed height, so no screen could scroll, and the side bar's rows lost their
|
||
left padding. The app's styles now carry the older forms that engine understands.
|
||
|
||
---
|
||
|
||
## 7.1.0
|
||
|
||
- **PS5Upload Files: manage your files from the couch.** A new PS5Upload Files tile on the
|
||
PS5 home screen opens a page in the PS5 browser that fills the TV. It has four sections:
|
||
**Home** (the running game with Close game, the tasks that are running with Cancel, and your
|
||
drives), **Files**, **Cheats** (switch the running game's cheats on and off) and **Settings**.
|
||
The PS5Upload helper must be loaded. If it isn't, the page tries to show a note that says so
|
||
(from a copy the PS5 browser keeps) and opens by itself once the helper answers. After an
|
||
update, a banner offers to reload.
|
||
- **Made for the controller.** ✕ selects, ○ steps back, △ opens an item's actions, and the PS5's
|
||
own pointer works too. Every action also has a button on screen. Three short tips show the
|
||
first time, Help lists the buttons that work on the current screen, and Controls shows which
|
||
buttons your PS5 passes on to the page. Dark, Light, OLED and Peach themes, high contrast,
|
||
the language and full screen are in Settings.
|
||
- **Browse and organise.** A path bar with Go to path, pinned and recent folders, and your
|
||
drives, with Eject for USB drives and Unmount for game images (refused while a game is
|
||
running). Sort, filter, show hidden files and select all. Copy, cut and paste, with Replace,
|
||
Keep both or Skip when a name is taken (and Apply to all); rename one item or many at once
|
||
with a pattern (a change of letter case alone works too); new folder; delete; Fix permissions.
|
||
- **Look inside files.** Info with folder size; Verify (BLAKE3 and CRC32); Decompress a
|
||
`.ffpfsc` back to its image, with progress. The viewer shows text (with find), JSON, a
|
||
summary of a game's `param.json`, hex, and pictures (step through a folder's images); a game
|
||
folder shows its banner. Search finds files by name in this folder or on all drives (the first
|
||
search builds an index), and Disk usage shows what takes the space.
|
||
- **Works with the app on your PC.** File System shows the folders pinned on the console
|
||
("Pinned on console"), and **Show on console** opens a folder on the TV; **Show on PC** on the
|
||
console opens it in the PC app. Files being uploaded from your PC show an Uploading badge.
|
||
These need the 7.1.0 helper; with an older one the app simply doesn't show them.
|
||
- **Only the console can open it by default.** Settings → Allow other devices lets a phone or
|
||
computer on your network open the page too. There is no password, so anyone on your network
|
||
can then manage your files; turn it off when you're done. While it's on, text boxes on the
|
||
console show a "Continue on your phone" code to type there instead.
|
||
- **The tile is yours to remove.** Settings → Show PS5Upload Files on the home screen removes or
|
||
restores it. The tile is left out of the app's game list (an older engine or Docker image may
|
||
still list PSUP00001).
|
||
- **Big app databases no longer hide installed games.** The console's app database was read
|
||
only up to its first 256 entries, and a long list could be cut shorter still, with nothing
|
||
saying so. On a console with many entries, a game installed by a homebrew installer (no
|
||
home-screen metadata folder) that sorted past that point was missing from Games. The app now
|
||
reads the whole database page by page. If the database still can't be read in full, games
|
||
whose folder and registration are on the console are listed anyway, and the app logs a warning
|
||
that the list may be incomplete (#473).
|
||
|
||
---
|
||
|
||
## 7.0.34
|
||
|
||
- **Unity games no longer crash when they run as a folder.** Some game dumps name a file
|
||
`Il2cppUserAssemblies.prx` while the game loads `Il2CppUserAssemblies.prx`. An exFAT image
|
||
ignores the difference, so the game played from its `.exfat`. The console's internal storage
|
||
does not: the same game uploaded as a folder, or converted to one, crashed a second after it
|
||
started. Uploading a game folder, and Convert's game-folder and `.ffpkg` outputs, now give each
|
||
such file the spelling the game loads. Your copy on the computer is left as it is, and
|
||
Convert's checks list what was renamed. Four affected games (PPSA22999, PPSA30883, PPSA31909,
|
||
PPSA33090) launched and stayed running on a PS5 Pro (FW 13.60) once renamed.
|
||
|
||
## 7.0.33
|
||
|
||
- **A PS5 update package installs even when its base game isn't there.** The app refused any
|
||
update whose base game wasn't installed ("Install the base game first"), but some PS5 updates
|
||
carry the whole app: a YouTube update package installed fine through the PS5's own debug
|
||
Package Installer while ps5upload refused it. For PS5 packages the app now warns ("the PS5 may
|
||
still accept it") and lets the PS5 decide; if it can't, the PS5's own error still shows. PS4
|
||
updates are still refused, since there Sony accepts the request and installs nothing.
|
||
Stream-installed on both consoles (FW 13.60) with YouTube removed first.
|
||
- **An install counts as done when its exact bytes are on the console.** Such a package lands as
|
||
the app, not in the updates folder, so the app looked in the wrong place: it called an
|
||
installed copy "not installed" and could not confirm a finished install.
|
||
- **About links to the website.** About now has a Website link to ps5upload.phantomptr.com, and
|
||
the author's name opens phantomptr.com.
|
||
|
||
## 7.0.32
|
||
|
||
- **Rest mode is found on a computer with Wi-Fi and a cable at once.** A Mac on both, sending
|
||
through Wi-Fi, got "Host is down" from a sleeping PS5 and showed it as not answering, though
|
||
the same console answered "standby" over the cable. The app now asks every network connection
|
||
on the computer that shares the console's network, and treats "Host is down" as a reason to ask.
|
||
Wake goes out the same way, so it now reaches a sleeping console from such a computer too
|
||
(Mac, Linux and Android; Windows still uses its default connection).
|
||
- **Wake is offered whenever the console isn't awake.** The PS5 power card showed Wake only when
|
||
it had confirmed rest mode; it now shows whenever wake is set up and the console isn't known
|
||
to be awake. The card says "In rest mode" or "Not answering", and greys out Rest mode, Reboot
|
||
and Shut down while the console sleeps, since those need the helper.
|
||
|
||
## 7.0.31
|
||
|
||
- **Rest mode is shown as rest mode, not as a problem.** A PS5 in rest mode used to look the
|
||
same as one that was off or broken: a red "Not connected", "Helper isn't running" on every
|
||
console screen, and Connection's Check blaming the jailbreak or a VPN. The app now asks the
|
||
console the way Remote Play does (it answers "standby" while it sleeps), and shows a calm,
|
||
blue "In rest mode" in the status bar, the console tabs, Home and the game page. Console screens
|
||
say "Your PS5 is in rest mode" with a Wake button when wake is set up. A console that answers
|
||
nothing at all reads "Not answering", with the setting it needs to stay reachable in rest mode
|
||
(Settings › System › Power Saving › Features Available in Rest Mode).
|
||
- **Nothing fights a sleeping console.** The automatic reconnect no longer pokes a console in rest
|
||
mode every 30 seconds all night; it waits, and sends the helper again once the console is
|
||
awake. Uploads that meet rest mode wait ("Waiting for the PS5 to wake") and carry on after the
|
||
wake, without using up their retries; in the browser version they used to fail. Keep-awake skips
|
||
a sleeping console. Measured on both consoles on FW 13.60, including a full rest → wake →
|
||
helper back → rest cycle on the Pro.
|
||
|
||
## 7.0.30
|
||
|
||
- **Files fits on a phone (#470).** On a narrow screen every file and folder row carried up to
|
||
nine action buttons, which pushed the name out entirely, even at the smallest text size. Each
|
||
row now shows its name and size with one ⋮ button that opens the same actions as a menu. The
|
||
selection bar stays on one line, with its actions in a strip you can scroll sideways. The
|
||
Recent paths list is solid instead of see-through (on every screen size). The toolbar, drive
|
||
chips and path bar are tighter, so the list starts higher up. The desktop layout is unchanged.
|
||
- **Stop helper (#471).** Connection has a "Stop helper" button next to Send helper. It turns
|
||
the helper off on that console and keeps it off: the automatic reconnect leaves the console
|
||
alone until you send the helper again or start something that needs it. The loader stays up,
|
||
so sending payloads still works. It is refused while an upload, download or install is
|
||
running on that console. Measured on a PS5 Pro: the helper exits in under a second.
|
||
|
||
## 7.0.29
|
||
|
||
- **Turn a game image or package back into a folder (#469).** Convert → What to make has a third
|
||
choice, "A game folder". It takes any image Convert reads (`.exfat`, `.ffpkg`, `.ffpfs`,
|
||
`.ffpfsc`) or a `.pkg` made with the default debug passcode (Convert's own packages, and fake
|
||
packages from other tools when they used that passcode), wherever it is: this computer, a saved server or the PS5. It writes the game's
|
||
files as a plain folder on this computer, empty folders and the package's icons included,
|
||
checks them against the source, and only then gives the folder its name, so a stopped or failed
|
||
run never leaves a folder that looks finished. A 125 GB exFAT image unpacked in 81 s, and a
|
||
Minecraft package came back file-for-file equal however it was compressed. A retail package, or
|
||
a fake one made with another passcode, can't be opened and is refused with that reason.
|
||
|
||
## 7.0.28
|
||
|
||
- **Android: transfers keep going when you leave the app, and you get told when they finish
|
||
(#457).** Android pauses an app soon after it leaves the screen, and the notices that a job
|
||
finished lived in the app's page, which pauses with it. Now, while anything is uploading,
|
||
downloading or installing, ps5upload runs as a foreground service with a progress
|
||
notification ("Uploading … 42% · 1.2 of 2.9 GB · 38 MB/s"), and posts "Upload complete" or
|
||
"Upload failed" when it ends. A queue moves on to the next item in the background too.
|
||
Measured on Android 16: a 1.8 GB upload with the screen off for 12 minutes finished, with one
|
||
"complete" notification. On a computer, a finished job is announced right away while the
|
||
window is minimised or hidden, and the queue no longer waits for the window to come back.
|
||
- **Decompress a .ffpfsc on the console (#453).** Files → right-click a `.ffpfsc` →
|
||
"Decompress to .exfat…" writes the game image it holds next to it, on the console, with
|
||
progress and Stop: no download and re-upload through a computer. The console's own kernel
|
||
does the decoding (the way ShadowMount+ reads these files), so nothing extra runs in the
|
||
helper; a first version that decoded in the helper made it crash and was pulled from 7.0.23.
|
||
Measured on both consoles: a 4.5 GB image in 40-65 s, byte-identical to the source. Needs the
|
||
7.0.28 helper.
|
||
- **Console to console: pick up a send from another device, and test the connection first
|
||
(#444).** Tasks lists sends between your consoles that another phone or computer started,
|
||
with Watch (follow a direct send), Take over, and Resume here for one that was paused or
|
||
whose device went away. Pausing now stops both consoles' halves, so any device can resume it
|
||
straight away. "Test connection" in Send to another console checks that the sending console
|
||
can reach the other one on the route and address you chose (handy for a ps5-tailscale
|
||
forward), optionally with a small real send. Watching or taking over a send that is still
|
||
running needs the 7.0.28 helper on both consoles.
|
||
- **A large .7z upload is no longer called "damaged" when the phone just failed to read it
|
||
(#446).** The 7z decoder turns any failed read of the archive file into "dist overflow", the
|
||
same error a broken archive gives, and since 7.0.22 a broken archive is never retried. So one
|
||
read that failed on a busy phone ended a 70 GB upload as corrupt. A failed read is now reported
|
||
as itself, and the upload retries it. An 84 GiB single-block archive made with 7-Zip's
|
||
defaults decoded cleanly well past 40 GB in testing.
|
||
- **"Helper not running" says what to do next everywhere.** Status checks used the old "not
|
||
running or an old version" text; they now say, like a job does, whether the app can send the
|
||
helper (the loader is up) or the jailbreak's loader needs starting first.
|
||
|
||
## 7.0.27
|
||
|
||
- **A stream install no longer fails on the PS5 after ps5upload says it's done.** The PS5
|
||
downloads a package in pieces and re-reads some of them; ps5upload added up every byte it
|
||
sent, repeats included, and took that total as "the console has it all". On a small package
|
||
the repeats made up the size of a part never sent, so ps5upload closed the download link
|
||
first: the app's tile appeared and could even open, but the PS5's Downloads showed it failed,
|
||
Retry failed too and Cancel removed it. ps5upload now keeps the link open until every byte has
|
||
been sent at least once. Seen with a 37 MB package on FW 13.60; any size could hit it.
|
||
- **"Nothing answered on the ELF loader port :9021" when starting a stream install, then fine
|
||
on a retry, is fixed.** When an install starts, the app also replaces the console's stock
|
||
elfldr with its own fixed build, and the loader port is closed for about a second during that
|
||
swap. An install that started in that second failed. It now waits for the swap to finish, and
|
||
a loader port that is closed for a moment is tried again for a few seconds before the install
|
||
gives up.
|
||
|
||
## 7.0.26
|
||
|
||
- **Uploaded game and homebrew folders show up with ShadowMount+ again.** ShadowMount+
|
||
registers a folder as soon as its `sce_sys` has been still for 10 seconds; an upload sends
|
||
those small files first, so it tried while `eboot.bin` was still on its way, failed twice and
|
||
gave up on the title for good (measured on a 13.60 console). A game's `param.json` (and a PS4
|
||
game's `param.sfo`) is now put in place only when everything else has arrived, so the folder
|
||
becomes a game exactly when it is complete. Needs the 7.0.26 helper.
|
||
- **A stalled or stopped upload can be continued.** A row that has moved no data for 90 seconds
|
||
says so and offers **Restart transfer**; a row that was stopped, or interrupted by closing the
|
||
app, says so and offers **Resume**. Both pick up from what the PS5 already has. **Retry
|
||
failed uploads** now runs them (it only put them back in the list), and its label no longer
|
||
reads "the retry failed" in most languages.
|
||
- **Large solid .rar uploads no longer fail over and over on a retry.** Resuming one reads
|
||
through everything the PS5 already has before sending anything new; the console took that
|
||
silence for a stalled sender and ended the job after 15 minutes, every time. The app now
|
||
tells the console it is still working. Needs the 7.0.26 helper.
|
||
- **A .rar's unpacked size is right** when it holds entries of unknown size (RAR5), which made
|
||
the free-space check before an upload add up to nonsense.
|
||
- **Payload Manager: update what you stored.** Payloads stored from the Catalog are remembered,
|
||
and the Payload Manager tab offers **Update** when the catalogue has a newer release: it
|
||
stores the new one in its place and keeps its spot in the boot list. Payloads Payload Manager
|
||
installed from its own repository are left to it. (Desktop and Android, where the catalogue
|
||
is.)
|
||
- **Files: drag to move.** Drag a folder onto another folder, or onto the path above the list,
|
||
to move it there (across drives it copies, then removes). Files move the same way in the web
|
||
UI and on Android; on the desktop a dragged file still goes out to your computer. Not in the
|
||
Windows app, where the window takes every drag for its own file drop; use Move to… there.
|
||
- **A deleted Collection folder no longer breaks the Collection (#461).** Saving the folder
|
||
list checked that every folder still existed, so once one was gone nothing could be saved,
|
||
removing that folder included. Only a folder being added is checked now. A scan skips a
|
||
folder it can't open instead of failing, and Collection names it, marked "Not found" in
|
||
Folders, so you can remove it or plug the drive back in.
|
||
|
||
## 7.0.25
|
||
|
||
- **Profile no longer offers "Create User" (#460).** The PS5 has no create-user call a payload
|
||
can use, and the old button only ever tried to rename the console's first user, which fails
|
||
on a jailbroken console with "sceUserServiceGetInitialUser failed". Profile now says to add
|
||
users on the PS5 (Switch User, then Add User). Renaming and deleting users are unchanged.
|
||
|
||
## 7.0.24
|
||
|
||
- **Payloads → Ports: see what is listening on the PS5.** Every port in use, TCP and UDP, with
|
||
what usually listens there (elfldr, ftpsrv, Payload Manager, nanodns, the ps5upload helper,
|
||
Remote Play) and whether a PC can reach it or only the console itself. Ports with a web page
|
||
open in your browser from there. The helper finds them by binding each port and letting go
|
||
at once, so no payload ever sees a connection; a full pass takes about a second. Needs the
|
||
7.0.24 helper.
|
||
- **Folder games on a USB drive are no longer described as /data/homebrew folders (#452).**
|
||
|
||
## 7.0.23
|
||
|
||
- **Payload Manager 0.6 works again (#458).** 0.6 refuses changes without its request marker
|
||
and wants POST for launch and delete, and keeps payloads in slots. The fallback launch,
|
||
storing, deleting and "Load at boot" now work with 0.6.1 as well as 0.5.2.
|
||
- **Games is smooth with a big library (#450).** Covers come as small cached thumbnails
|
||
(about 20 KB instead of 300-700 KB), and screenshot thumbnails load two at a time and stop
|
||
when you leave the screen instead of filling every connection to the console.
|
||
- **Hidden home-screen icons stay hidden (#450).** The console shows an app's icon again every
|
||
time it starts; the helper now hides it again a couple of seconds later. Icons hidden with
|
||
earlier versions are picked up.
|
||
- **The game page shows where the game runs from (#452):** the image on your external drive,
|
||
not a leftover folder in /data/homebrew.
|
||
- **Sending the helper no longer hangs for 15 s** when an old copy is stuck and serving nothing.
|
||
- **Android save backups are no longer 0 bytes (#451).** They go to Downloads as
|
||
`<title>-<date>.zip`, and the message says where.
|
||
- **Tasks shows speed and ETA (#444)** for transfers, like the Files queue.
|
||
- **Convert:** "backported" only for real backports (an older SDK than declared is no longer
|
||
called one), the game's ampr_emu 0.3.x version is read (#449), and when LZ4 needs the newer
|
||
runtime it points at the checkbox that adds it.
|
||
- **Fast verification by default (#459, thanks quer3q).** Convert checks structure, sizes and
|
||
small files in full and a seeded sample of the rest; "Full verification" re-reads every byte.
|
||
- **"Last seen" is translated (#454, thanks EnriqueWood).**
|
||
- **Payloads: export and import playlists**, with the auto-loader choice and your custom repos,
|
||
to share a working setup.
|
||
- **Linux packages: the update command to copy (#456).** On Bazzite and other rpm-ostree
|
||
systems, Settings → Updates shows `rpm-ostree uninstall ps5-upload --install <rpm>`; dnf and
|
||
apt installs get theirs.
|
||
- **Helper crash reports say where.** A fault now logs the address and instruction.
|
||
|
||
## 7.0.22
|
||
|
||
- **HDR PNG carries the capture's ICC profile (#448).** 7.0.15 wrote the cICP tag only;
|
||
viewers that go by the ICC profile (and the reporter's) showed the image as SDR. Sony's
|
||
"ScreenCapturePQ" profile is now read out of the .jxr and embedded as iCCP in both HDR
|
||
variants, with cICP beside it in the tagged one.
|
||
|
||
## 7.0.21
|
||
|
||
- **Fix: the image format could not be changed.** Picking .exfat or .ffpfs snapped back to
|
||
.ffpkg (7.0.20 wrote the old format back a moment after the new one).
|
||
- **An image can become another image.** An .exfat, .ffpkg or .ffpfs on this computer, a
|
||
saved server or the PS5 can be rewritten in another format (an .exfat into a .ffpkg, say);
|
||
the output is named after the source without its old extension, and never overwrites it.
|
||
|
||
## 7.0.20
|
||
|
||
- **Convert remembers what it is making.** Leaving the screen during an image build and
|
||
coming back showed "A package" selected and package stage names while the image kept
|
||
building. What to make and the image choice are now remembered, follow the build that is
|
||
running, and an image build's stages read "Plan image", "Write image", "Read the image
|
||
back".
|
||
- **Fix: the game page could crash on "Measure how it plays".** When the engine's reply had
|
||
no state (an engine without the route, or a test stand-in), the card threw and the whole
|
||
game page fell back to the error screen. It now treats that as nothing recorded.
|
||
|
||
## 7.0.18
|
||
|
||
- **LZ4 packs for games whose ampr_emu is missing or too old.** When the check finds a game
|
||
that reads through AMPR but ships no `fakelib/libSceAmpr.sprx`, or one that predates asset
|
||
packs, the LZ4 option now offers "Put ampr_emu 0.4.2.1 into the image": the engine fetches
|
||
drakmor's release once (checked against a known digest, never bundled) and writes it into
|
||
the image, keeping the game's own copy beside it as `libSceAmpr.sprx.orig`. This is the
|
||
runtime gap behind #449.
|
||
- **A game that does not use AMPR is told so.** The LZ4 option explains that nothing in such a
|
||
game could serve asset packs, and points at .ffpfsc, which ShadowMount+ decompresses for any
|
||
game, instead of just refusing.
|
||
|
||
## 7.0.17
|
||
|
||
- **Open a save and edit its files.** Save data has an Open save button per save: the helper
|
||
copies the save image under `/data`, unseals its key through the console's own pfsmgr and
|
||
mounts the image decrypted, and Files opens on it. Read, replace or add files; Close &
|
||
write back unmounts it and copies the image back into the real save only if something
|
||
changed, so a look leaves the save untouched. One save open at a time. PS5 saves verified
|
||
on FW 13.60 (an untouched open keeps the image's timestamp); PS4 saves (`sdimg_*` with the
|
||
key in `<name>.bin`) follow the same path but have not been tried. The recipe is
|
||
earthonion's garlic-savemgr, credited in the README. Needs the 7.0.17 helper.
|
||
|
||
## 7.0.16
|
||
|
||
- **Measure how a game plays, then pack it that way.** A game's page has a new card for a
|
||
folder game on the connected console: Start measuring puts drakmor's measuring build of
|
||
ampr_emu into the game's `fakelib2` (ShadowMount+ loads it over `fakelib`, nothing the
|
||
game ships is touched), you play, and each session is recorded when the game closes (or
|
||
with Record session). Build profile turns the sessions into a per-game LZ4 profile: block
|
||
size, layout and hot flag per file from how it was actually read, and the decoded cache,
|
||
physical cache and worker counts from an LRU simulation of those reads. Convert's LZ4
|
||
option picks the profile up for that title ("measured from N play sessions"). Stop
|
||
measuring removes the measuring build again. The generator is a port of drakmor's
|
||
`ampr_pack_profile.py` and matches its output byte for byte on a reference trace.
|
||
|
||
## 7.0.15
|
||
|
||
- **Game images of a libSceAmpr game get a fresh ampr_emu.index (#449).** A dump's index is
|
||
often stale (files added, trimmed or resized since it was written), and a plain .exfat,
|
||
.ffpkg or .ffpfs image carried it as it was, which crashes the game the moment it touches a
|
||
file the index has wrong. The image now carries one generated from its files, as a package
|
||
and an LZ4 image already did.
|
||
- **Connection says which of three things is wrong (#447).** "The helper is not running or is
|
||
an old version" sent people in circles. The app now tells them apart: the helper is down
|
||
but the console's payload loader answers (so Update helper will work); nothing answers at
|
||
all (run your jailbreak's loader first); or an older helper is running (Update helper).
|
||
- **HDR screenshots as HDR PNG (#448).** Screenshots has a "Convert as" choice: SDR PNG as
|
||
before (tone-mapped, opens everywhere), HDR PNG (16-bit BT.2020 PQ with a cICP tag, which
|
||
HDR-aware viewers and browsers show as captured) or HDR PNG without the tag, for apps that
|
||
refuse it. Desktop app only, like the converter itself.
|
||
|
||
## 7.0.14
|
||
|
||
- **A game on the PS5 or a saved server can become a game image.** Convert refused to write
|
||
an image unless the game folder was on this computer, while a package build happily read a
|
||
`ps5://` or `remote://` folder in place. Images now take the same sources: the game is read
|
||
through the helper (or from the server) as it is written, nothing is copied first.
|
||
- **Convert walks you through it.** Four steps that read in order: ① the game, ② what to
|
||
make, ③ its options, ④ build & install. "What to make" explains a package and a game image
|
||
side by side and marks the one that suits the game on your PS5 (a PS5 game on firmware
|
||
above 11.60 installs as a package but will not play, so the image is marked there; a PS4
|
||
game or an older firmware marks the package). Options show only what applies: Kraken
|
||
compression and game language for a package; filesystem, .ffpfsc compression, LZ4 packs
|
||
and the read-back check for an image. Build & install says in one line what it will make,
|
||
of which game, where. The queue has the whole width below.
|
||
|
||
## 7.0.13
|
||
|
||
- **Game image builds: the read-back check is no longer the slow part.** After writing an
|
||
.exfat image the engine reads it back and hash-checks every file. The exFAT reader fetched
|
||
one 64 KiB cluster per read and, for a big file, walked its chain from the start on every
|
||
read, so the check crawled on fast drives. It now keeps the FAT in memory, continues where
|
||
the last read stopped and reads whole runs of clusters in one call, and hashing uses every
|
||
core. Measured on a 10 GB image in cache: 169 MiB/s before, 3.7 GiB/s after. Convert has a
|
||
new **read-back check, per read** choice (1 to 32 MiB) for anyone whose disk prefers a
|
||
different size; 8 MiB measured fastest and is the default. The check itself is unchanged.
|
||
- **The game page is lighter.** The Overview card that repeated the hero (title id, name,
|
||
size, path) is gone: the path, last played and Screenshots & clips now sit in the hero. Each
|
||
copy on your drives is one compact row: its facts on one line, the path under it, the one
|
||
action most people want (Send to PS5 or Install) as a button and the rest (copy path, copy
|
||
install link, Convert, show in file manager, move to Trash) behind a ⋯ menu.
|
||
- **7z uploads: a damaged archive stops instead of retrying (#446).** When the LZMA decoder
|
||
gives up on a cut-short or corrupt stream ("dist overflow"), the job used to fail as if the
|
||
connection had dropped, so the queue retried it again and again, decoding the same bytes to
|
||
the same end. It is now a corrupt-archive failure that names the entry and how far into it
|
||
the decoder got, and asks you to test the archive with 7-Zip before trying again. The
|
||
archive in the report was not available to us; if yours passes 7-Zip's test and still fails,
|
||
say so on the issue.
|
||
- **Console to console: choose the route and the address (#444).** Send to another console…
|
||
has a **Change…** link under the route note: **Auto** (as before), **Direct only** (never
|
||
through this device, for a phone on mobile data; if the consoles cannot connect the send
|
||
fails and says why) or **Through this device**. With Auto or Direct only you can also give
|
||
the address the sending console dials to reach the other one, for setups where the address
|
||
this device uses is not the one the consoles use between themselves: with ps5-tailscale, a
|
||
local forward on the sending console (127.0.0.1:19120 → the other console:9120). The choice
|
||
is remembered per pair of consoles. The consoles' keys and the one-time ticket still decide
|
||
who may send, not the address. Taking over a running send from another device, and a
|
||
"test direct connection" button, are not in this release.
|
||
|
||
## 7.0.12
|
||
|
||
- **Convert: a "Stored" package option (no compression).** Reports of packages that install but
|
||
will not start on FW 8.60 and 10.40 arrived while compressed packages have only been proven
|
||
to play on FW 5.10. Stored writes the same block layout with every block uncompressed, the
|
||
one form that has played on hardware; the package is the game's size. Pick it under
|
||
Compression if a compressed package installs but will not launch, and please say so on
|
||
GitHub, with your firmware, so the default can be set right.
|
||
- **Helper mismatch notice** now says there is nothing to do on the PS5 itself: Reload helper
|
||
sends the matching helper from the app.
|
||
- **RAR errors keep the library's reason** after the advice, so a report can be diagnosed.
|
||
|
||
---
|
||
|
||
## 7.0.11
|
||
|
||
- **Game page: Install on a package card.** "On your drives" showed a package with only Copy
|
||
path and Copy install link; packages now have Install, which queues them streamed from the
|
||
drive (or server) they sit on, like the console row's offers.
|
||
- **Settings → Accessibility → Reduce transparency (#443).** Turns off the frosted-glass blur
|
||
behind panels, the one thing that keeps the graphics card busy while an upload redraws its
|
||
progress on Windows. It follows the OS "transparency effects" setting until you change it.
|
||
(Motion → Reduced already did this as a side effect and still does.)
|
||
|
||
---
|
||
|
||
## 7.0.10
|
||
|
||
7.0.9 was tagged but never published: its Android build failed on a desktop-only permission
|
||
(the file drag-out plugin), caught before the release existed. Everything below ships here.
|
||
|
||
- **The app no longer sends the helper into a console that is still booting.** With the app
|
||
open while the PS5 started, the automatic helper restore fired the moment the loader port
|
||
answered, which on a cold boot is before kstuff and the rest of the jailbreak chain are
|
||
loaded; an FW 11.40 console crashed three times out of three. The automatic restore now
|
||
waits 90 seconds after the loader first appears. Your own sends from the Connection screen
|
||
are not held.
|
||
- **Payloads → Payload Manager.** A new tab for itsPLK's Payload Manager on the console: what
|
||
it stores, Launch and Delete, and its boot list (load at boot, order). On the Catalog tab,
|
||
**Store in Payload Manager** keeps a downloaded payload on the PS5 under its own name; an
|
||
existing folder is confirmed first, because Payload Manager replaces that folder's other
|
||
files. Payload Manager itself and LZ4 Compression (on-console game compression by
|
||
theghostonline) are in the catalogue, and the Connection screen's scene tools open their
|
||
web pages.
|
||
- **Files: drag a file out of the window** onto your desktop or file manager (desktop app).
|
||
The first drag fetches the file into a staging folder; keep holding the mouse button, or
|
||
drag it again once it says it is ready. Files over 4 GB keep using right-click → Download.
|
||
- **Volumes: Eject a USB drive.** Unmounts `/mnt/usbN` so it can be unplugged safely. The
|
||
PS5's own services usually hold the drive open, so the app offers "Eject anyway", which
|
||
flushes the drive first; just make sure no game or app is reading from it.
|
||
- **Stopped uploads resume for 7 days, and Stop says so (#440).** Stop has kept what already
|
||
reached the PS5 and Start continued from there since 6.0; the app forgot a one-shot
|
||
upload's resume id after 24 hours though, while the console keeps the data for 7 days.
|
||
Both now agree on 7 days, and the Stop buttons explain what is kept.
|
||
- **Home at a large Text size.** The action tiles squeezed their labels to one letter per line
|
||
("U p l o a d") once the text was big enough. Home's grids now answer to their own width,
|
||
so they drop to fewer columns, and a tile too narrow for icon and label side by side
|
||
stacks them.
|
||
- **"Coffee or tokens"** replaces "Buy me a coffee" on Home, About and the site.
|
||
- README and DISCLAIMER say how the project is built (with AI coding tools, directed and
|
||
tested by the maintainer) and what that means for you.
|
||
|
||
---
|
||
|
||
## 7.0.8
|
||
|
||
- **Hide an icon from the PS5 home screen.** For shortcuts and loaders you set up once and never
|
||
open again: Games → ⋯ → **Hide from home screen**. It stays installed and playable, a
|
||
"Hidden" badge marks it, "N hidden from the home screen" at the top finds them, and ⋯ →
|
||
**Show on home screen** brings it back. Only the icon's visibility changes (the same flag the
|
||
PS5 uses for its own hidden apps); system apps can't be hidden, and the console's app list is
|
||
backed up before the first change. The home screen updates the next time you open and close
|
||
any app.
|
||
- **Upload: "Limited by" names the right cause.** When the console was idle waiting for data, the
|
||
upload said "console memory"; it now says "network" (for example a PC sharing its connection
|
||
with the PS5 while it is busy converting).
|
||
|
||
---
|
||
|
||
## 7.0.6
|
||
|
||
- **Your PS5 got a new address? The app finds it.** When the router gives the console a new IP,
|
||
the saved address stops answering. While it does, the desktop and Android apps look for the
|
||
same paired console on your network and, once it proves who it is, show "Your PS5 now answers
|
||
at …" with **Switch**. A different PS5 is never offered. (It needs the helper running at the
|
||
new address; after a reboot, use Find PS5s on Connection.)
|
||
|
||
---
|
||
|
||
## 7.0.5
|
||
|
||
- **OLED theme is back, and there's a new Peach theme.** OLED is dark on pure black, so an OLED
|
||
screen's pixels stay off; Peach is a warmer light theme with a cream window and a burnt-peach
|
||
accent. Pick from four in Settings → Appearance. The sun/moon button flips between the light
|
||
and dark you last picked, so OLED goes to Light and back to OLED. If you used OLED before 7.0,
|
||
pick it once more.
|
||
- **Remote Play: the pxplay number is right.** It was worked out with the account ID's bytes in
|
||
the wrong order, so pxplay refused it. The account ID field now takes the hex ID (with or
|
||
without 0x), the base64 ID or the pxplay number. The PIN itself was always correct.
|
||
- **7z uploads on 32-bit Android:** archives with more than 4 GiB in one block (most game
|
||
backups) failed with "dist overflow", and files over 4 GiB inside an archive were cut short.
|
||
They upload in full now.
|
||
- **Upload's buttons say what they do.** The next step is the one blue button: "Start upload"
|
||
in the confirm is blue again, Retry is blue after a failure, and Add to queue is blue while
|
||
the queue runs (Upload waits then). "Cancel" before an upload has started is now "Change
|
||
source", and "Build the image, then upload it" is no longer a second blue button competing
|
||
with Upload.
|
||
- Remote Play names the signed-in account by its slot ("Slot 7"), the same as Profile.
|
||
- **Upload: the "exfat" destination is a folder, not a conversion.** Its hint is now shown as
|
||
text (phones have no hover) and says so, and sending a game folder there warns that it will
|
||
arrive as a folder and points to "Or send it as one game image", which builds the .exfat.
|
||
|
||
---
|
||
|
||
## 7.0.1
|
||
|
||
- **Collection scans show their progress:** what the scan is doing (finding games, reading
|
||
each item, finding names and covers, saving), how far it is, the item it is reading and how
|
||
long it has taken; afterwards, when the last scan finished and how long it took.
|
||
- **One scan at a time, shared:** pressing Scan while one is already running (the automatic
|
||
refresh, or another window) follows that scan instead of saying the collection could not be
|
||
read.
|
||
- "Import from PS Game Library" is gone.
|
||
|
||
---
|
||
|
||
## 7.0.0
|
||
|
||
A new look for the whole app, a better Android app, and a long list of fixes.
|
||
|
||
- **New look, modelled on macOS 27.** Light and dark themes with a calm neutral window, a sidebar
|
||
that runs to the window edge, rounded cards, one blue accent and your system's own typeface.
|
||
Home has simple action tiles and a console panel that stays beside the page; every screen,
|
||
desktop and phone, was brought into the new style. Your old theme choice carries over.
|
||
- **Android catches up.** Install or download from a link, install straight from a saved server,
|
||
community cheat search and online covers now work on Android too, and the app icon is the
|
||
PS5Upload logo. Layout fixes for phones throughout.
|
||
- **Convert:** AMPR LZ4 asset packs for exFAT game images (for games that use ampr_emu 0.4 or
|
||
newer), one place to choose what to make and what happens after, and a queue that only adds
|
||
real games and takes several game folders at once.
|
||
- **Captures:** view the app's own screenshots large, page through and delete them; delete PS5
|
||
screenshots and clips too.
|
||
- **Game page:** install updates and DLC right where they are listed.
|
||
- **Sturdier:** uploads, installs, builds, link downloads and PS5 to PS5 copies recover from
|
||
missed checks, crashes and interruptions instead of failing or hanging; status checks no
|
||
longer slow transfers down.
|
||
- **Easier to use:** keyboard focus stays inside dialogs, right-to-left languages are mirrored,
|
||
narrow windows no longer clip, error cards have Retry, and every string is translated into
|
||
all 21 languages.
|
||
- **Under the hood:** the payload is built with PS5 Payload SDK v0.44 (`make update-sdk` moves
|
||
to the latest), and the engine refuses console actions that don't name a console.
|
||
|
||
---
|
||
|
||
## 6.8.2
|
||
|
||
A clean-up release: every screen was gone through for things that no longer make sense, and
|
||
the code nothing used was removed.
|
||
|
||
### Fixed
|
||
|
||
- **The upload speed limit was up to 8× too high.** It held each of a transfer's connections to
|
||
the limit instead of the whole transfer, so 10 MB/s could run at 80. It now limits the whole
|
||
upload, and also applies to uploads from Files and to single files, which ignored it before.
|
||
- **Stop on Upload and on Files downloads now really cancels.** It only stopped watching
|
||
before; the transfer kept running.
|
||
- **First-time setup and "Bring up PS5" now pair with a new console** instead of timing out:
|
||
they send the helper the same way the rest of the app does.
|
||
- **Home's Servers card** could show twice or vanish once you had activity; it shows once.
|
||
- **Kill on Running apps** now uses the same close as Close game, which works on firmware where
|
||
the plain close fails. The game page can close a running game too.
|
||
- **Fan presets were labelled backwards** (the quiet one said it was louder). Fixed, and fan
|
||
changes ask first.
|
||
- **Profile, Shell and Payloads in the web UI**: Profile's confirms work there, Shell is hidden
|
||
there (it can't run), and Payloads offers the ShadowMount+ and nanoDNS tabs that do work.
|
||
- **Send payload** no longer says an unreadable or empty file "looks OK".
|
||
- **Cheats**: Refresh only re-reads the list; re-applying to the running game is its own button.
|
||
- **Reset all settings & data** now names everything it deletes (pairings, the Collection,
|
||
saved servers and passwords, backport libraries and more).
|
||
- Search results open the folder in Files.
|
||
|
||
### Changed
|
||
|
||
- **Bug report** sits right under Home in the sidebar and can't be hidden.
|
||
- **Removed screens that only repeated others:** Dashboard (Home has it all), Fan Curve (the
|
||
console only takes one target temperature; the Console screen sets it), the speed test
|
||
(Health has it), and the typed "From another PS5" card on Upload (Files → Send to another
|
||
console does it better). Stats is a tab of Tasks.
|
||
- **Game page:** fewer tabs (Media, Storage and Play Time repeated the overview); play time
|
||
everywhere comes from the console's helper.
|
||
- **Settings:** grouped by what they affect (Console, Installs, Files & saves, Backporting);
|
||
options that did nothing (Color blind palette, Screen reader hints, Density, the PS5 power
|
||
tick) are gone; desktop-only options are hidden in the web UI.
|
||
- "Connections" is now **Servers**; "Backup" is **Console snapshots**, and says the snapshots stay
|
||
on the PS5.
|
||
- Many texts were corrected to say what the app does today (no FTP, current screen names).
|
||
- **Removed dead code** across the app, engine and console helper, including the old FTP server
|
||
and the FTX2 upgrade shims, and 415 unused translations.
|
||
|
||
---
|
||
|
||
## 6.8.1
|
||
|
||
### Fixed
|
||
|
||
- **Convert's queue always made a package.** Picking a game image (.ffpkg, .exfat or .ffpfs, or
|
||
compressed into a .ffpfsc) and then queueing the game still built a .pkg: the queue only ever
|
||
made packages. The queue now has a **Make** choice, a package or a game image, and choosing
|
||
image options under ③ switches it to the image you picked. Each queued game shows the file it
|
||
becomes (.pkg, .ffpfsc, ...) and is built as exactly that. A queued image can be kept or sent
|
||
to the PS5 through the Upload queue. Only game folders on this computer can become images;
|
||
others are skipped with a note.
|
||
|
||
---
|
||
|
||
## 6.8.0
|
||
|
||
### New
|
||
|
||
- **Send files from one console to another (#433).** In Files, select files or folders and choose
|
||
**Send to another console…** (in the toolbar or a row's menu). Pick the console and the folder
|
||
on it; before anything runs you see whether it fits and which names already there get replaced.
|
||
Each item is queued on that console as a copy, and the originals stay where they are. The queue
|
||
row says where it came from.
|
||
- **Straight between the consoles (Beta).** When the two consoles can reach each other, the copy
|
||
now goes directly from one to the other instead of through this computer, so the computer's
|
||
network and disk no longer slow it down. When they can't (different networks, an older helper,
|
||
a firewall), it goes through this computer as before, and the queue row says which way it went
|
||
and why. Both routes pick up where the other left off. Both consoles need the 6.8.0 helper for
|
||
the direct route.
|
||
|
||
---
|
||
|
||
## 6.7.4
|
||
|
||
### Fixed
|
||
|
||
- **Send helper took 20 to 40 seconds.** The console showed the helper arriving at once, but the
|
||
app kept waiting. When you pressed Send helper while the app was also re-sending the helper on
|
||
its own (after a reconnect, or to update it), two helpers started together and spent that time
|
||
fighting over which one stays. The app now sends one helper per console at a time: a press
|
||
during an automatic send waits for that helper instead of starting a second.
|
||
|
||
---
|
||
|
||
## 6.7.3
|
||
|
||
### Fixed
|
||
|
||
- **A failed or interrupted conversion no longer leaves files behind (#432).** Making a game image
|
||
wrote a temporary `.partial` file the size of the image into the output folder. If the build
|
||
failed (on Windows the cleanup often lost to an antivirus still reading the file) or was cut
|
||
short, it stayed there, taking up the drive with nothing showing where. Each conversion now
|
||
clears those leftovers and unpacked archives that no running job is using, before it starts and
|
||
after it fails. Only the app's own temporary files are touched.
|
||
|
||
---
|
||
|
||
## 6.7.2
|
||
|
||
### Fixed
|
||
|
||
- **Collection covers, for real this time.** 6.7.1 let the covers through the engine's guard only
|
||
in a form the desktop app's window never uses, so they stayed blank there. The app now fetches
|
||
them the same way it already fetches console icons when the window can't load them directly,
|
||
so every game read from your drives shows its cover in the Collection and on its page.
|
||
|
||
---
|
||
|
||
## 6.7.1
|
||
|
||
**Fixes: Collection covers, multi-part RAR uploads, and a full drive's leftover file.**
|
||
|
||
### Fixed
|
||
|
||
- **Collection covers.** The engine refused the app's requests for the covers it had read out of
|
||
your games, so a game with no online cover showed its initials and the game's page showed a
|
||
broken image. They show now.
|
||
- **Cheats on a game's page** no longer shows "no cheat files found" as an error when a game simply
|
||
has none.
|
||
- **Multi-part RAR uploads (#429).** Resuming an upload from a `.part1.rar`/`.r00` set failed with
|
||
"the archive lists its entries in a different order than it extracts them" whenever a file
|
||
already sent was split across two parts. Resuming works now.
|
||
- **When the PS5's drive fills up during an upload,** what was sent is kept so Retry continues it,
|
||
but nothing said so and it holds its whole size. The failed upload now names that partial file
|
||
and offers to delete it.
|
||
- **Stopping a stream install right after it started** removed it from the list but left it
|
||
running; it is stopped now.
|
||
- **0x80B21104** explains that this console will not take this package, and links to the FAQ.
|
||
- **Can't reach the PS5?** The Connection screen now suggests turning a VPN off.
|
||
- **Sending a new helper** now also ends any stray copy of the old one still running on the PS5,
|
||
once the old one has had time to finish exiting.
|
||
|
||
---
|
||
|
||
## 6.7.0
|
||
|
||
**One page per game: every console and every copy, wherever you open it from.**
|
||
|
||
### New
|
||
|
||
- **A page for every game.** Open a game from Ready to play, Game files, the Collection,
|
||
Upload, Install Package's package menu, or the command palette, and you get one page that shows:
|
||
- **Each of your consoles:** installed or not, which version, and how old that is ("now" for
|
||
the one you're connected to, "as of 2 h ago" for the others). A refresh button checks a
|
||
console again.
|
||
- **Every copy on your drives,** with Send, Convert, Copy install link and Move to Trash.
|
||
- **What each console could take from your drives:** the game with its update and DLC, a
|
||
newer update, or missing DLC. Install it on any console, not only the connected one. The
|
||
console's row shows how it's going, and Open goes to that console's activity.
|
||
- **The app remembers what each console has,** so the page works while a console is asleep. It
|
||
forgets a console you remove or move to a new address.
|
||
- **Updates and Add-ons** on a game's page now also list newer packages from your drives.
|
||
- **The command palette** finds games in your Collection by name or title ID.
|
||
|
||
### Changed
|
||
|
||
- Clicking a game in the Collection opens its page instead of a pop-up.
|
||
- "Open library" now says "Open Games". Install Package says "screen" (not "tab") for the
|
||
Connection and File System screens.
|
||
- On a phone, the Games tab stays highlighted while you're in the Collection, and screen readers
|
||
are told which section is open.
|
||
|
||
### Fixed
|
||
|
||
- The Collection's "Progress shows in Install Package" link went to Home.
|
||
|
||
---
|
||
|
||
## 6.6.3
|
||
|
||
**Housekeeping.** No changes to the app. The engine's own tests now clean up their temporary
|
||
files when they finish.
|
||
|
||
---
|
||
|
||
## 6.6.2
|
||
|
||
**Fixes: the Windows app connects again, one game goes to two consoles, and bug reports work on
|
||
desktop.**
|
||
|
||
### Fixed
|
||
|
||
- **Windows: "engine failed to start" and no connection (#427).** An older engine still running
|
||
in the background, or an antivirus scan, kept the app from writing its new engine, so it never
|
||
connected. The app now starts its engine anyway, and the error says why if it still fails. An
|
||
engine that crashes while starting is reported straight away instead of after 30 seconds, and
|
||
a leftover engine from an older version is shut down more reliably.
|
||
- **The same game to two consoles.** A game being sent or installed on one PS5 showed as busy on
|
||
every PS5, so it could not go to a second one; the engine also refused to stream a package that
|
||
another console was still installing, and Convert refused the same game for a second console.
|
||
Each console is now separate.
|
||
- **Bug reports on desktop.** Creating a report failed every time with "Duplicate filename:
|
||
README.txt". Two screenshots with the same name no longer fail it either. Switching consoles
|
||
keeps each console's draft, and a failed Download zip now says so.
|
||
- **Leftover files.** A browser upload that stops halfway no longer leaves the partial package on
|
||
this computer for a week, and a link download that fails can be retried.
|
||
|
||
---
|
||
|
||
## 6.6.1
|
||
|
||
**A new Bug report page that gathers everything we need, and two or more consoles no longer
|
||
step on each other.**
|
||
|
||
### New
|
||
|
||
- **Bug report.** Open it from the command palette, or from the link on any error. One page:
|
||
say what went wrong, add screenshots, check your setup (filled in for you), and pick how far
|
||
back the logs go (the last 15 minutes up to the last 7 days, or a time you choose). Everything
|
||
the app, the engine and the PS5 recorded in that time goes in. Then post it as a GitHub issue,
|
||
copy it for the Discord #bugs-report channel, or download the zip. IP addresses, serials, MAC
|
||
addresses, home folders and keys are removed before anything leaves your computer.
|
||
- **Screenshots for reports.** The Capture button at the bottom right of the desktop app takes a
|
||
picture of any screen. The Bug report lists your captures to pick from and adds one you take
|
||
while writing it. You can also add, drop or paste any image.
|
||
- **The app now keeps a timeline.** Connection drops, reconnects, helper crashes, failed installs
|
||
and engine restarts are noted as they happen, along with the helper's own log from each PS5,
|
||
so a report shows what happened even when the console has since restarted. It also notes when
|
||
the web UI reloads itself and why (#418).
|
||
- **Buy me a coffee** is now on Home too, under the connection badge.
|
||
|
||
### Fixed
|
||
|
||
- **Switching consoles mid-task.** A check, a payload send, a bring-up or a folder pick that
|
||
finishes after you switched to another PS5 now lands on the console it started on, not the
|
||
one on screen.
|
||
|
||
## 6.5.2
|
||
|
||
**The helper no longer crashes on the Hardware screen, and a crash no longer locks it out until
|
||
you restart the PS5.**
|
||
|
||
### Fixed
|
||
|
||
- **Helper crash on FW 13.60 (#417).** Opening Hardware could crash the helper ("signal 11 while
|
||
serving frame 88"). The console health readout now reads its values safely, and a reading the
|
||
firmware doesn't support shows as unavailable instead of taking the helper down.
|
||
- **After a crash the helper can be sent again right away.** A crashed helper used to keep its
|
||
port, so the next one failed with "ports still held" until the PS5 was restarted. It now exits
|
||
cleanly and frees the port.
|
||
|
||
### New
|
||
|
||
- **Files: New folder in the right-click menu.** Right-click a file or folder, or the empty space
|
||
in the list, to create a folder there. The empty-space menu also has Paste here and Refresh.
|
||
- **Payloads: "Send file" is now "Send payload".**
|
||
|
||
## 6.5.1
|
||
|
||
**Send games from the Collection in one click, and stop an install you no longer want.**
|
||
|
||
### New
|
||
|
||
- **Collection: Send to PS5.** A game kept as a folder, image or archive goes to the PS5 from its
|
||
details: pick the copy, send a game folder as it is or as one compressed image, choose the
|
||
drive and folder (it tells you if it won't fit), and it starts right away. The details and the
|
||
game's card show how it is going.
|
||
- **Bring this PS5 up to date** is now a bar on the Collection whenever updates or DLC are
|
||
waiting, not hidden in a menu.
|
||
|
||
### Fixed
|
||
|
||
- **Stop an install that is running.** A running install now has Stop, and the queue lets it go
|
||
within seconds. Use it after cancelling the download on the PS5, which the app can't see: it
|
||
no longer stays stuck until you restart the app. After a minute with no data asked for, the
|
||
install says so and points to Stop.
|
||
- **Starting one thing doesn't start everything.** Installing, sending from the Collection,
|
||
Upload's "add and start", retrying a task and uploading a built image start only what you
|
||
just added; other uploads waiting for Start keep waiting.
|
||
- **Covers** show after a scan even when the first try came too early.
|
||
- **Screens no longer freeze (can't scroll)** after a dialog closes on one console while you look
|
||
at another, for example with an upload running on one PS5 and the other PS5's Upload open.
|
||
- **Pair another device from a paired one:** **Connection → Let another device pair** opens the
|
||
PS5 to a new device for five minutes, the way out when a web UI (or a new phone) is refused
|
||
with "not accepting new pairings". When the PS5's loader isn't running, Send helper now says
|
||
so instead of "Connection refused". For Docker: map `/data` to a host folder so the pairing
|
||
key survives a container update (FAQ).
|
||
|
||
## 6.5.0
|
||
|
||
**The Collection, Move to…, and a big round of fixes: Android connects again, the helper starts
|
||
on FW 5.50, and the web UI can pair.** Update the app; it updates the helper by itself.
|
||
|
||
### New
|
||
|
||
- **Collection:** every game in the folders you add (packages, game folders, game images,
|
||
archives, PS3 packages), grouped by game with its updates and DLC, duplicates and their size.
|
||
Search, filters, grid or table, covers, exports, automatic rescan. Folders on a NAS (SMB, FTP,
|
||
FTPS, SFTP) are scanned in place without mounting. **Import from PS Game Library** brings its
|
||
index over; PS Game Library is now part of ps5upload.
|
||
- **What this PS5 has:** each game shows whether the selected console has it and at which
|
||
version. Install a game with its update and DLC, just the update or the missing DLC, or
|
||
**Bring this PS5 up to date** in one go.
|
||
- **Copy install link:** host a package for a console (or any device you allow) to fetch itself;
|
||
**Serving** lists the links and stops them.
|
||
- **Organize packages** renames and files packages the way PS Game Library does, with a preview
|
||
and undo. **Move to Trash**, **Keep the largest copy** and **Clean up junk files** (`._`,
|
||
`.DS_Store` and friends) tidy the drives.
|
||
- **Send a game folder as one image:** Upload builds a compressed `.ffpfsc` (or `.ffpkg` /
|
||
`.exfat`) and uploads it by itself. Convert writes `.ffpkg`, `.ffpfs` and `.exfat`, compresses
|
||
while writing and checks every image afterwards (writers from PS5 Dump Forge, thanks quer3q).
|
||
- **Files: Move to…** picks a drive's homebrew folder, a recent folder or any folder and tells
|
||
you first whether it moves instantly or copies to another drive, and whether it fits.
|
||
- **Files: Set permissions (777)** for any file or folder.
|
||
- **Sign in to PlayStation Network (offline)** in Profile, for Remote Play.
|
||
|
||
### Fixed
|
||
|
||
- **Android:** 6.x could not connect on Android 17 ("Port 9021 is not open"). The app now asks
|
||
for local network access and shows a red bar until you allow it.
|
||
- **Helper on FW 5.50:** every 6.x helper stopped before it started on some firmware (5.36
|
||
worked). Fixed for the helper, the installer and the patched elfldr.
|
||
- **Web UI pairing:** the self-hosted web UI can now send the helper (which pairs it), and no
|
||
longer says "ready" while it isn't paired.
|
||
- **Screenshots crash loop on Linux:** a damaged capture can no longer close the app; each one
|
||
is decoded on its own.
|
||
- **Installs started your queued uploads:** an install now runs by itself; uploads you queued
|
||
wait for **Start**.
|
||
- **Moves to another drive** check each copied file before removing the original (Cut and
|
||
Paste too), so a short copy never costs the original.
|
||
- **An install that finished while the app was closed** shows as done instead of "interrupted".
|
||
- **The app can't reach its engine:** every screen now says why and offers **Restart engine**.
|
||
- **Health check** starts the package installer if it isn't running yet.
|
||
|
||
### Better
|
||
|
||
- **"The PS5 declined the install"** now shows Sony's error code with what it means, and how far
|
||
the console got (refused at once, part-way, or after downloading everything).
|
||
- **`0x80B21104`** explains what to try. **Free space a big upload seems to lose** is explained
|
||
in the FAQ (it's the PS5's own reserve).
|
||
- **Connection screen:** a failed step shows its full message, and **Load elfldr first** is hard
|
||
to miss.
|
||
- **Keep awake** covers every upload and install, Stream installs included.
|
||
- **Games cards** are larger, with Play and Close up front and the rest in one menu.
|
||
|
||
---
|
||
|
||
## 6.4.0
|
||
|
||
**Install is two tabs, links say what they ask of you, and Home tells you when something is
|
||
wrong.** Update the app; the helper only gets a small timing fix.
|
||
|
||
- **Install: Stream & install and Upload & install are separate tabs**, each saying when to
|
||
use it. Progress stays in the queue and in Tasks when you open another screen.
|
||
- **Install from a link** shows the three ways side by side with what each one needs (this
|
||
computer awake or not, disk space or not, where progress shows). The warning now matches
|
||
the way you picked, and **Skip the certificate check** appears only where this computer
|
||
makes the connection, and now really takes effect there. Picking a way also works again
|
||
while a second console is open (the choices used to fight each other across consoles).
|
||
- **Name your links** (optional). The name shows in the queue, in Tasks and in recent links,
|
||
so you can find and retry the right one.
|
||
- **"Stream through this computer" really streams through this computer**, so it works for
|
||
links only this computer can reach. PS5 packages from a link are recognised as packages.
|
||
- **Archives:** install packages from a **.zip, .7z or .rar**, including multi-part RARs with
|
||
a password. The archive can also come from download links, one per part.
|
||
- **Convert Games** (was Convert to FPKG) can also write a game folder as a **game image**
|
||
(`.exfat`, or the smaller `.ffpfsc`) that ShadowMount+ mounts.
|
||
- **Health check on Home:** Home shows anything unhealthy for the selected console. The check
|
||
now covers ports, the connection in both directions, the installer and the web/Docker
|
||
setup. A **speed test** measures the real transfer speed to and from the PS5, and
|
||
**Clean up** removes leftovers ps5upload made and no longer needs.
|
||
- **FAQ:** section tabs, topics, ranked search with excerpts, and a link to any answer.
|
||
- **Captures:** screenshots and video clips are one screen with two tabs. **Payloads** moved
|
||
under Setup. The Saves automatic-backups card fits the page.
|
||
- **Plainer words:** Volumes says what the package-copy drive is for, and every screen's
|
||
description says what it is and how to use it.
|
||
|
||
---
|
||
|
||
## 6.3.1
|
||
|
||
**"The PS5 declined the install" (`0x80B2116F`) is fixed.** Update the app; it sends its new
|
||
installer to the console by itself on the next install.
|
||
|
||
- **`0x80B2116F` was our bug.** The install request ps5upload handed the PS5 was a few bytes
|
||
short, so the PS5 read leftover memory and sometimes took a full package for a patch. That
|
||
refused every **Upload & install**, and made **Stream** installs fail at random after a few
|
||
attempts. Measured on two consoles on FW 13.60: refused every time before, accepted every
|
||
time after, including a 3.6 GB game installed over itself and its patch. FW 9.60, 11.20 and
|
||
5.10 showed the same refusal and should be fixed by the same change; we could not test them.
|
||
- **Console tabs keep their screens:** switching to another console and back keeps what you
|
||
typed, opened and loaded for each one (the last three consoles).
|
||
- **Volumes: "Kept by ps5upload"** lists the folders the app itself writes on each drive and
|
||
how much they hold, with **Clean up** for temp and test files. Your package library and
|
||
save backups are only opened from there, never deleted.
|
||
- **Play closes a running game first** from every Play button (Game hub, Game files,
|
||
Backport, Convert), not only in Games.
|
||
- **Games:** a failed Download can be **resumed**, and a stopped or failed Move offers
|
||
**Try the move again**.
|
||
- **Pairing (Android and desktop):** after **Resend helper** in the pairing dialog, the app
|
||
waits for the PS5 to accept instead of asking once and leaving "not accepting new pairings"
|
||
on screen. An app upgraded from 5.x is a new device to the PS5; this is the one-tap way in.
|
||
- **Remote Play:** how to unlock the PS5's own Remote Play setting with np-fake-signin v1.4.
|
||
- The on-console package server keeps its connections open and logs what the PS5 asked for,
|
||
so a refused install can be read from a bug report.
|
||
|
||
---
|
||
|
||
## 6.3.0
|
||
|
||
**Switching screens no longer loses what you were doing.** Update the app; the helper is
|
||
unchanged apart from its version.
|
||
|
||
- **Screens keep their state:** going to another screen and back keeps what you typed, what
|
||
you selected, open panels and where you had scrolled.
|
||
- **Operations keep running and stay visible** when you switch screens or console tabs:
|
||
copying files into **Files** (drag-in, Add files, Add folder), downloading a link to the
|
||
PS5, a game's Download and Move in **Games**, and **Send helper**. They also show in Tasks.
|
||
- **Resume a copy into Files** after you stop it, after it fails, or after the app closes or
|
||
crashes part-way. What already reached the PS5 is kept, so Resume sends only the rest. A
|
||
dropped connection is retried by itself, and the copy carries on when the PS5 comes back
|
||
from rest mode.
|
||
- **Storage that adds up:** the PS5's internal drive holds back about a fifth more than you
|
||
write (measured on two consoles). **Volumes** and the Upload screen now show what is likely
|
||
to fit, and an upload over that says it **may not fit** but lets you go ahead. Only a real
|
||
shortfall still refuses an upload. The FAQ explains it, and what fills "Other" on the PS5.
|
||
- **Play while another game is running** asks to close that game first, closes it, then
|
||
starts yours. Before, the running game closed and the new one never started.
|
||
- **Clearer messages:** a game the PS5 refuses to start while kstuff is running points at
|
||
ShadowMount+; Mount on an image ShadowMount+ manages says it mounts when the game starts;
|
||
on a Mac, "No route to host" names the Local Network permission; "not accepting new
|
||
pairings" has a **Resend helper** button.
|
||
- **Connections:** closing a package you viewed returns to the same folder.
|
||
- **Payloads:** ps5debug-NG is in the catalogue.
|
||
|
||
---
|
||
|
||
## 6.2.3
|
||
|
||
The 6.2.2 fixes, with a more reliable CI test run. No app or helper behavior changed.
|
||
|
||
---
|
||
|
||
## 6.2.2
|
||
|
||
**Fan control that respects the console, and a round of fixes from your reports.** Update the app and the helper together.
|
||
|
||
- **Fan:** the app now shows the temperature the console is really holding and its own
|
||
setting, and has a **Use the console's own setting** button. Earlier versions treated 60 °C
|
||
as the console's default; it is much higher, so any setting ran the fans harder than normal
|
||
with no way back. A curve that never asks for full speed now leaves the fan to the console.
|
||
- **Convert to FPKG:** reads `.ffpfs` images and `.ffpfsc` files that hold one, including from
|
||
the console.
|
||
- **Other payloads keep running:** connecting no longer replaces the console's loader on every
|
||
app start, and never when doing so would stop kstuff or ShadowMount+. The auto-loader no
|
||
longer runs its playlist twice in one boot.
|
||
- **Saves:** optional automatic backups of changed saves to a folder on your computer (Saves
|
||
screen).
|
||
- **Front light and beeper:** beep the console, turn its light off or on, set its brightness
|
||
(Hardware screen).
|
||
- **Link downloads to the PS5** no longer fail on a slow host.
|
||
- **"Why was this slow?"** names the network link instead of blaming console memory.
|
||
- **Installs:** an optional last resort for a console that cannot reach this computer
|
||
(Settings → Beta features; off by default).
|
||
- **Uploads** are a little faster.
|
||
|
||
---
|
||
|
||
## 6.2.1
|
||
|
||
**Retrying a big file continues where it stopped.** Update the app and the helper together.
|
||
|
||
- **Retrying a single-file upload:** starting the same file again (Start, or adding it to the
|
||
queue again) now continues the copy the PS5 kept, instead of asking for room for the whole
|
||
file a second time while the partial copy still takes up that room.
|
||
- **Fan Curve:** the screen now says what it really sets. The PS5 has one fan setting, the
|
||
temperature at which the fans go to full speed, and cannot follow a curve; the screen shows
|
||
the temperature your points give.
|
||
- **"The PS5 declined the install":** now shows Sony's error code, so a report can say which
|
||
refusal it was.
|
||
|
||
---
|
||
|
||
## 6.2.0
|
||
|
||
**Games launch again, and installs stop giving up early.** Update the app and the helper together.
|
||
|
||
- **Games that would not start:** since 6.0, games uploaded from Windows lost their run
|
||
permission, so the PS5 refused them. Everything the helper writes is now readable and runnable
|
||
(777), including its own folders. Games uploaded with 6.0–6.1.2 get a **Fix permissions**
|
||
button, and Play repairs them by itself when it can.
|
||
- **"PS5 launcher returned 0x80940033":** now says what it means. If kstuff isn't running,
|
||
the app tells you to load it; that error is not about the one game.
|
||
- **Installs:** a package the PS5 refuses from its own storage can always be tried again, and
|
||
Stream is tried straight away instead of after a connection pre-check.
|
||
- **"The PS5 cannot connect to this computer":** failed queue items offer the Windows firewall
|
||
fix in one click. The FAQ lists every port ps5upload uses.
|
||
- **Storage:** an upload you gave up on no longer leaves its half-written copy behind for good;
|
||
the helper clears it after a week. If a drive runs out of room part-way through an upload, the
|
||
app remembers how much that drive really holds, so the next upload that cannot fit is
|
||
refused before it starts and Volumes shows the real "safe for new uploads" figure.
|
||
|
||
---
|
||
|
||
## 6.1.2
|
||
|
||
**Game folders upload all the way through.**
|
||
|
||
- **Uploads:** a folder with many mid-sized files could freeze part-way on the console
|
||
(seen at about 13,000 of 35,000 files). Fixed in the helper, so update the helper too.
|
||
- **Errors:** when the console refuses a connection, the app shows the console's reason
|
||
(for example, not paired) instead of "broken pipe".
|
||
|
||
---
|
||
|
||
## 6.1.1
|
||
|
||
**Smoother recovery after a stalled upload.**
|
||
|
||
- **Uploads:** an upload that stalls now releases the console's destination, so the retry
|
||
resumes instead of being refused as busy.
|
||
- **Docker web UI:** can be served under a sub-path with `PS5UPLOAD_BASE_URL`.
|
||
|
||
---
|
||
|
||
## 6.1.0
|
||
|
||
**Files works like FileZilla.**
|
||
|
||
- **Files:** add whole folders, drag files and folders in from your computer, right-click
|
||
any item (open, download, cut, copy, paste into, rename, copy path, delete), keyboard
|
||
shortcuts, sort by name, size or date, and type a path to jump to it.
|
||
- **One console at a time:** the upload queue and Activity show only the selected console.
|
||
- **Re-pairing:** a console that got a new identity opens the "forget and re-pair" dialog
|
||
instead of retrying for 20 seconds.
|
||
- **Fixed:** a resumed zip download from the console could fail on a file that was already
|
||
complete; a connection could drop right after it was made on a busy console; a stopped
|
||
console-to-console copy could leave work running in the background.
|
||
|
||
---
|
||
|
||
## 6.0.0
|
||
|
||
**One encrypted connection for everything (AVA1).**
|
||
|
||
**Update the app and the helper together.** 6.0 uses a new protocol, AVA1, on one port: **9120**.
|
||
Ports 9113 and 9114 are gone, so allow only **9120** and **9021** (your ELF loader) in a
|
||
firewall. A 6.0 app cannot use a v5.41 helper (or the reverse); the app offers **Update the
|
||
helper** and replaces an old one in one click.
|
||
|
||
- **Pairing:** a helper the app launched pairs by itself; otherwise confirm the 6-digit code
|
||
shown on the console once.
|
||
- **Uploads resume** after a dropped connection, a helper restart or rest mode, from what is
|
||
already on the console.
|
||
- **Out of space is said up front:** a job that will not fit is refused in seconds, and a retry
|
||
counts what is already there (#365).
|
||
- **Convert reads games from the console** without ftpsrv (#351).
|
||
- **7z and RAR uploads resume;** a multi-package RAR installs base, then patch, then DLC.
|
||
- **Links:** a link that serves a .pkg installs, and any other file can be downloaded to a console folder.
|
||
- **Progress and cancel** for copy, paste and Add files; the web UI keeps an upload running when
|
||
the tab closes.
|
||
- **Installs:** a package the PS5 refuses from its own storage offers **Retry with Stream**.
|
||
- **Fixed:** cheats toggling and names (#373), fan curve at 100% (#354), Windows sleep after a
|
||
transfer (#360), Windows installer updates (#348), game files offered as packages (#349),
|
||
Docker "Permission denied" (#361), fpkg output path (#364), macOS 11 white screen (#352),
|
||
payload build for FW 13.60 (#341).
|
||
- **Removed:** the "Parallel upload streams" setting; AVA1 picks lanes itself.
|
||
- **Thanks** to mrnpc336 (Persian), GriefNorth (NixOS docs), nopoz (`PS5UPLOAD_BROWSE_ROOTS`),
|
||
intelp917-crypto (queue size chip) and lowbit (#360).
|
||
|
||
| Measured on two PS5s, gigabit | 6.0 | 5.41 |
|
||
|---|---|---|
|
||
| 4 GiB file, internal SSD | 105-108 MB/s | 108-111 MB/s |
|
||
| Real game, 7 GiB, 1,018 files | **108 MB/s** | 88 MB/s |
|
||
| Resume after helper killed | **94-97 MB/s** | 66-68 MB/s |
|
||
| 2,000 tiny files to USB | **446 files/s** | 330 files/s |
|
||
| 2,000 tiny files to internal SSD | 192-235 files/s | 260-327 files/s |
|
||
|
||
**Environment variables:** `FTX2_*` settings are now `PS5UPLOAD_*` (old names work for this release only).
|
||
|
||
**Known limitations:** tiny files to the internal SSD are slower than 5.41; the compressed zip
|
||
download cannot resume.
|
||
|
||
## 5.41.0
|
||
|
||
**Installs that the PS5 used to decline now go through.** On FW 13.60 the
|
||
console refuses a package it serves to itself — every "Upload & install",
|
||
every install from a USB drive, every install from the phone app — with
|
||
"The PS5 declined the install" (0x80B2116F), especially when the app was
|
||
already installed. ps5upload now notices that refusal and serves the same
|
||
package to the console itself, which the console accepts. Nothing to set;
|
||
it happens inside the same install. Tested on a 13.60 PS5 Pro with stream,
|
||
Upload & install (fresh and over an installed app) and USB.
|
||
|
||
- **Fake packages do work above FW 11.60.** 5.40.0 said they didn't; that
|
||
was wrong — PS4 and PS5 fake packages install and start on 13.60. The
|
||
warnings are gone from Install Package, Games and Convert.
|
||
- **Folder games register on FW 13.60.** Sony removed the call we used; we
|
||
now use the one that's still there, and uninstalling a folder game no
|
||
longer leaves hidden entries behind.
|
||
- **Payload Manager as a backup loader.** When the console's ELF loader on
|
||
port 9021 stops answering (the stock elfldr wedges easily), ps5upload
|
||
starts its installer — and puts its helper back after a disconnect —
|
||
through itsPLK's Payload Manager, and replaces the stuck elfldr with its
|
||
own fixed one. Your Payload Manager list is never touched.
|
||
- **Firewall problems are named in seconds.** Before a stream install the
|
||
console checks it can reach this computer; if it can't, you're told why
|
||
(a firewall dropping the connection, or a network that keeps devices
|
||
apart) instead of waiting 30 seconds for "The PS5 declined the install".
|
||
- **The phone app can stream installs.** It now serves the package to the
|
||
PS5 directly, the same way the desktop app does.
|
||
- **A clearer "installing from the PS5's storage was refused" message**,
|
||
pointing at Stream & install, instead of "The PS5 declined the install".
|
||
- **Setup won't load kstuff twice.** The setup wizard skips payloads that
|
||
are already running and has a **Send only ps5upload** button for consoles
|
||
that load kstuff themselves.
|
||
- **A remote engine reads the engine's files.** With the desktop app pointed
|
||
at another machine (a homelab, say), file pickers browse that machine's
|
||
disk, and **From this device** uploads a package to it first.
|
||
- **The app reaches its engine even behind a proxy.** A proxy set in the
|
||
environment (common with VPN tools) no longer swallows the app's
|
||
connection to its own engine; errors now say what actually failed.
|
||
|
||
**The Docker images work out of the box.** The 5.40 images built fine but
|
||
had never been run in CI, and it showed:
|
||
|
||
- **Uploads work.** The image had no writable `/tmp`, so uploading a package
|
||
through the web UI failed with "Permission denied" (#346). It now has one.
|
||
- **The engine can save its state.** Saved servers, install history and the
|
||
artwork cache now live in `/data` (the engine's home). Put a volume on it
|
||
so they survive upgrades: `-v ps5upload-data:/data`. This also works when
|
||
you run the container as another user (`user: "1000:1000"`).
|
||
`PS5UPLOAD_DATA_DIR` is not needed.
|
||
- **A clear "not allowed" message.** A request from a computer that isn't
|
||
allowed used to get a bare `403 loopback only`. It now names the address it
|
||
refused and the setting to change. `PS5UPLOAD_ALLOW_IP` also takes a whole
|
||
network now, e.g. `192.168.1.0/24`, so phones and laptops that change
|
||
address keep working.
|
||
- **Stream installs on a server.** The ready-made
|
||
[`engine/compose.yaml`](engine/compose.yaml) uses host networking, which
|
||
stream installs need: on Docker's default network the PS5 can't reach the
|
||
engine to download the package. The engine now warns about this when it
|
||
starts, instead of letting every install fail.
|
||
- **A built-in health check,** so Docker and Compose can tell when the engine
|
||
is up.
|
||
- **Every release is now started and tested in CI** before the images are
|
||
published.
|
||
|
||
Coming from 5.40? The `TMPDIR` / `HOME` workaround from the FAQ can be
|
||
removed after updating.
|
||
|
||
---
|
||
|
||
## 5.40.0
|
||
|
||
**Refreshed for FW 13.60.** Tested on two consoles running 13.60 (a launch
|
||
PS5 and a PS5 Pro): uploads and downloads at full speed, folders and .zip
|
||
files, file management, mounting disk images, save backups, hardware
|
||
readings and every screen in the app.
|
||
|
||
- **Games lists your apps again.** On 13.60 the Games screen was empty: apps
|
||
installed by homebrew installers (Payload Manager, Shadow Mount+, WebKit
|
||
Autoloader…) keep their details somewhere the list didn't look. They now
|
||
show up with their names and icons. Menu entries and preinstalled tiles
|
||
that were never downloaded are left out.
|
||
- **Honest about fake packages above FW 11.60.** Fake-package support
|
||
(kstuff's FPKG build and a53_ppr_install_fast.elf) only exists up to FW
|
||
11.60 so far. On newer firmware, Install Package says so up front instead
|
||
of listing payloads that don't exist for your console, Convert warns
|
||
before you spend time building, and Games no longer claims installs are
|
||
good to go.
|
||
- **A launch that didn't happen is no longer reported as a success.** When
|
||
the console refused to start an app, the app still said "launched". It
|
||
now checks the app is actually running and shows the console's refusal.
|
||
- **File names inside .zip files keep their characters.** Names in other
|
||
languages (名前, é, …) were garbled on upload, because most zips mark them
|
||
as UTF-8 only implicitly. File contents were never affected.
|
||
- **Backing up an empty save no longer leaves an empty backup** in the list.
|
||
- **The app reopens where you left off.** This had quietly stopped working
|
||
when Home became the start screen. Opening or refreshing What's New by its
|
||
address also no longer jumps back to the previous screen.
|
||
|
||
**Known issue on FW 13.60: waking the console from rest mode doesn't work
|
||
yet.** The console refuses Remote Play when the signed-in account is an
|
||
offline-activated one, and network wake depends on Remote Play — Sony's own
|
||
Remote Play app can't wake it either. Being worked on.
|
||
|
||
---
|
||
|
||
## 5.39.1
|
||
|
||
- **Activating an offline account works again in the desktop app.** It
|
||
failed every time with "invalid type: string … expected u64": the account
|
||
id is sent as text (a 64-bit id doesn't fit a JavaScript number), and the
|
||
desktop app still expected a number. The web UI was not affected.
|
||
|
||
---
|
||
|
||
## 5.39.0
|
||
|
||
**Cheats, redesigned around your games.**
|
||
|
||
- **Start from your game, not a file name.** The Cheats screen now lists the
|
||
games on your PS5 with their covers, grouped by what you can do next:
|
||
**Playing now**, **Cheats ready**, **Cheats to download**, and (folded away)
|
||
games nobody has published cheats for. Each game shows how many cheats
|
||
exist for it, and whether any are made for the version you have.
|
||
- **Game details.** Pick a game to see its cover, version, size, install date,
|
||
when it was last opened, and its content ID.
|
||
- **Downloading is obvious.** Every cheat file has its own **Download**
|
||
button, with the one made for your installed version first and marked
|
||
**Your version**. If nothing matches your version, the screen says so and
|
||
warns that cheats for other versions usually do nothing or crash the game.
|
||
- **Switch cheats on in the same place.** Once downloaded, the game's cheats
|
||
appear as switches right above. The screen now says up front that the game
|
||
has to be running for them to work, instead of failing when you try, and
|
||
warns when your cheats were made for a different version.
|
||
- **The cheat engine explains itself.** The bar at the top says whether it
|
||
is on, what is running, and that it turns on by itself when you switch a
|
||
cheat on.
|
||
- **Browse all cheats** (for games that aren't on this PS5) is now a
|
||
labelled button instead of a small icon, and shows covers too.
|
||
- A three-step guide shows until your first download.
|
||
|
||
**On-screen messages can be marked read.**
|
||
|
||
- Every message on the PS5 on-screen messages screen used to show as unread,
|
||
with no way to change it. Each one now has **Mark read** / **Mark unread**,
|
||
and there is **Mark all as read**. The choice is remembered per console.
|
||
|
||
---
|
||
|
||
## 5.38.0
|
||
|
||
**Install queue: everything about an install, in its own row.**
|
||
|
||
- **The running install shows its own progress.** Phase (copying,
|
||
sending to the PS5, installing on the PS5), a progress bar, bytes done
|
||
of total, speed and time left now sit inside the item being installed,
|
||
instead of in a separate line further down the page. A link install
|
||
shows both speeds: downloading from the link and sending to the PS5.
|
||
- **What it's waiting on is said in the row.** "Waiting for the PS5 to be
|
||
ready", "Verifying the installed package" and similar notes appear
|
||
under the bar, and before the first numbers arrive the row says it is
|
||
getting ready instead of showing a stuck 0%.
|
||
- **Grouped the way you read it.** The queue is split into **Now**, **Up
|
||
next** (numbered in the order they will run: base game → update → DLC)
|
||
and **Finished** (failures first). The header shows only the counts that
|
||
matter, e.g. "1 in progress · 1 waiting".
|
||
- **Tidier rows.** Waiting rows are compact, with move up/down only where
|
||
a move is possible. Updates and DLC are labelled, and a finished install
|
||
says how big it was plus any closing message from the installer.
|
||
- **Less repetition on the Install page.** A stream or link install's
|
||
result is shown only on its queue row, not in extra cards as well. The
|
||
page now reads top to bottom: queue, link install, USB drives, options,
|
||
then notes. The fake-package (FPKG) checklist folds away until you open it.
|
||
- Works on phone-width screens too: titles wrap instead of being cut to
|
||
one letter, and the percentage moves next to the phase label.
|
||
|
||
---
|
||
|
||
## 5.37.2
|
||
|
||
- **No crash screen after an update.** A web UI tab left open while the app
|
||
was updated could crash when you opened a screen (for example Files) —
|
||
"Importing a module script failed". The page now reloads once and opens the
|
||
screen from the new version.
|
||
- **FAQ and What's New** load again when running the app from source.
|
||
- Building from source (`make run-client`, `make run-android`, …) no longer
|
||
reinstalls the client's packages every time, which broke a dev app already
|
||
running.
|
||
|
||
---
|
||
|
||
## 5.37.1
|
||
|
||
(5.37.0 was tagged but never published; everything it had is here.)
|
||
|
||
**No more loading elfldr again.**
|
||
|
||
- The stock elfldr on port 9021 could get stuck for good when a connection
|
||
dropped mid-send — Wi-Fi hiccups, a computer going to sleep, or the PS5
|
||
entering rest mode — and then ignored everything until you loaded it
|
||
again. ps5upload now carries an elfldr that recovers by itself, and
|
||
swaps it in whenever the console's helper comes up. (Only the standard
|
||
elfldr is replaced; any other loader on port 9021 is left alone.)
|
||
- The app no longer sends into a stuck loader: it waits for one that is
|
||
recovering, and says plainly when elfldr needs loading again.
|
||
|
||
**Add several games at once.** (#335)
|
||
|
||
- **Upload several sources together.** Pick several files or folders, drop
|
||
several at once, or use **Add games from a folder…**: they appear in a
|
||
review list that checks each one, shows where it will land and flags
|
||
problems, then queues them all with one button.
|
||
- **Tick several in the in-app browser.** In the browser build, on Android and
|
||
when browsing a saved server, the file browser now has checkboxes that stay
|
||
ticked while you move between folders, and an **Add N** button.
|
||
|
||
**Nothing hidden behind More.**
|
||
|
||
- **The sidebar lists every screen**, in its sections, from the first launch.
|
||
Hover a screen to hide it; fold a section you don't use. Hidden screens come
|
||
back from **More**, where each has a show/hide switch. (Favorites are
|
||
retired: starring screens is no longer needed to reach them.)
|
||
|
||
**Convert, more ways.**
|
||
|
||
- **A convert queue.** Queue several games; they're converted one after
|
||
another, and each finished package can go straight to the console's install
|
||
queue.
|
||
- **More sources.** Convert from a `.zip`, `.7z` or `.rar` (including a
|
||
password-protected or multi-part `.rar`), from a `.ffpfsc` image, or straight
|
||
from a game on a saved server or on the PS5, without copying it first.
|
||
- **Convert & replace.** Swaps a game dump on the console for its package: the
|
||
dump is set aside, the package installs, and the dump comes back if anything
|
||
fails.
|
||
- **Game language.** For a game that stays in English on a console set to
|
||
another language, Convert can declare one language in the package. Most
|
||
games follow the console's language and aren't affected.
|
||
- **Closer build times.** The time on each compression level now covers the
|
||
whole build — compress, write and verify — using measured drive speeds,
|
||
instead of the compression step alone (which read 17 minutes for a 71-minute
|
||
build). It can still read short for a game the computer read very recently,
|
||
while that game is in the system's file cache.
|
||
|
||
**Stream & install first.**
|
||
|
||
- **Stream & install** (renamed from Stream install) is now the main way to
|
||
install: it's the first, highlighted button on Install Package, dropping a
|
||
package onto the screen streams it, and a .pkg picked on Upload offers it
|
||
as the recommended route. Nothing is copied to the PS5 first.
|
||
- **Upload & install** (renamed from Add package) copies the package to the
|
||
PS5 first, for when the console can't reach this computer.
|
||
|
||
**See what a package is before you install it.**
|
||
|
||
- **Package viewer.** Click **View details** on a package in Install Package,
|
||
or on Upload's package card, to see its cover, version, region, minimum
|
||
firmware, SDK and build date, the update's "What's new" notes, and every
|
||
field in its PARAM. It also says plainly whether this PS5 can run it,
|
||
whether it's already installed (and if this one is newer or older), and
|
||
whether it fits. Works for .pkg files (including split sets), .exfat and
|
||
.ffpkg images, and game folders.
|
||
|
||
**One queue for each console.**
|
||
|
||
- **Queue stream installs.** Stream installs, links, library installs and
|
||
External Packages now all go into the console's queue and run one after
|
||
another — no more "Another install is in progress", and a running install
|
||
no longer greys out the buttons for the next one. A game's update and DLC
|
||
always install after the game itself, whatever order you queue them in.
|
||
- **See the queue where you install.** Install Package shows the console's
|
||
queue at the top: what is installing, and each waiting item's place in
|
||
line. The console tab shows how many items are waiting.
|
||
- **Retry via upload.** If the PS5 can't reach this computer for a stream
|
||
install, its queue row offers to upload the package and install it instead.
|
||
- An install that was running when the app closed is never re-run by itself —
|
||
check the game, then retry if needed. Queued links aren't saved to disk.
|
||
|
||
**Package viewer, everywhere.**
|
||
|
||
- The viewer now has **Files**, **Images** and **Related** tabs, and opens
|
||
packages and games on a saved server or on the PS5 as well as on this
|
||
computer — from Install Package, Upload, Convert, the queue, File System,
|
||
the server browser, or by dropping a file on the app.
|
||
|
||
**Fixes.**
|
||
|
||
- Retrying an interrupted single-file upload could write past the end of the
|
||
file; it now resumes exactly where the PS5 left off.
|
||
- Uninstalling a game folder the app registered no longer leaves it listed
|
||
in Games.
|
||
- Force-quitting or crashing the desktop app no longer leaves its engine
|
||
running and holding its port.
|
||
- A save backup folder (such as `PPSA17221.bak`) shows its game's icon and
|
||
name.
|
||
- Every screen uses the same layout, buttons never squeeze their labels, and
|
||
phones wrap long titles and button rows.
|
||
- Section headers, tabs and small buttons show at their intended size; they
|
||
were all drawn at body-text size.
|
||
- The web UI Docker image builds again (its FAQ and Changelog screens were
|
||
missing from the build).
|
||
- In the browser build, the FAQ and changelog load, and options a web page
|
||
can't provide are hidden.
|
||
|
||
---
|
||
|
||
## 5.36.0
|
||
|
||
**Choose which drive install packages are kept on.**
|
||
|
||
- **Keep packages off the internal drive.** In **Volumes**, press **Use for
|
||
packages** on a drive and uploaded install packages are kept there (in
|
||
`ps5upload/pkg_library` on that drive) instead of filling internal storage.
|
||
The choice is remembered for each console.
|
||
- **Always a safe fallback.** If the chosen drive isn't connected, packages go
|
||
to internal storage, and the app tells you.
|
||
- **One list for every drive.** Install Package lists packages from all your
|
||
drives and shows which drive each one is on, and External Packages no longer
|
||
lists them a second time.
|
||
- **A stalled install no longer blocks the next one.** If the console stopped
|
||
fetching a package partway, every retry used to fail with "an install is
|
||
already in progress" until the helper restarted. Retrying now works straight
|
||
away.
|
||
|
||
---
|
||
|
||
## 5.35.0
|
||
|
||
**One install path for everything, and Convert can install either way.**
|
||
|
||
- **Every install now goes through one engine route and PS5Upload's own
|
||
installer.** Stream installs, upload & install, links and server sources
|
||
all report the same progress and the same result, and an install is only
|
||
called finished once the console has actually pulled the whole package.
|
||
- **Convert to FPKG, then choose how to install.** After a conversion you get
|
||
**Stream install** (straight from this computer) or **Upload & install**
|
||
(copied to the PS5 first, for when the console can't reach this computer).
|
||
A failed install offers both.
|
||
- **Clearer failures.** When the PS5 can't reach this computer, or its proxy
|
||
setting blocks the stream, the app says so and suggests Upload & install —
|
||
in your language.
|
||
- **More reliable installs.** A failed stream no longer blocks the next one, a
|
||
reinstall of the same package works straight away, an installer that is
|
||
shutting down gets replaced instead of trusted, and installing no longer
|
||
restarts the helper.
|
||
- **Fully translated.** Every screen, including Convert, Backport and
|
||
Connections, is now translated in all 19 languages.
|
||
- A PS4 package is now labelled as a PS4 package on the Upload screen.
|
||
|
||
**Our own package installer.**
|
||
|
||
- **PS5Upload now ships its own on-console install daemon** (`:9115`) in place
|
||
of the third-party DPI daemon it used before. It runs alongside the helper,
|
||
and for an "upload & install" it serves the staged package to the console's
|
||
installer over a local connection — the same path a stream install uses — so
|
||
both routes now behave the same.
|
||
- **The etaHEN `:12800` install bridge is no longer used**; every console
|
||
installs through our own daemon, for consistent behaviour everywhere.
|
||
|
||
**Convert to FPKG compresses, like Sony's own packages.**
|
||
|
||
- **Compressed packages.** Converted games are Kraken-compressed, the format the
|
||
PS5 decompresses in hardware. Spider-Man 2 comes out within a few percent of
|
||
Sony's own package size.
|
||
- **Choose Fast, Balanced or Smallest** in Convert. Balanced is the default;
|
||
Fast is about four times quicker for a slightly bigger package.
|
||
- **Converting needs about the package's size free,** not twice the game: the
|
||
compressed data goes straight into the package.
|
||
- **Games that need `ampr_emu.index` get one made for them.** No more copying it
|
||
from another release. Large games that need it are also detected reliably now.
|
||
- **An install keeps going if the app restarts** while the PS5 is still
|
||
downloading the package.
|
||
- Free space is checked on Windows too.
|
||
|
||
---
|
||
|
||
## 5.34.0
|
||
|
||
**See every install's progress, and a big step for game conversion.**
|
||
|
||
- **Link installs show their progress.** "Download through this computer" now
|
||
shows a progress bar, download speed, time left and a Cancel button from the
|
||
start, instead of nothing until the download finished. Stream installs show
|
||
time left next to their speeds, and "Let the PS5 download it" now appears in
|
||
Tasks.
|
||
- **Clearer stream-install error.** When the PS5 can't reach your computer, the
|
||
app now says so and suggests what to check (firewall, VPN, same network),
|
||
instead of always blaming the proxy.
|
||
- **Convert to FPKG (beta) uses a new package layout** that got a converted game
|
||
playing in testing. Packages are uncompressed for now, so they're about the
|
||
size of the game, and converting needs about twice that free. Games that need
|
||
an `ampr_emu.index` file get a warning if it's missing.
|
||
- **Using an autoloader or PLDMGR?** Put **elfldr first** in its list, before
|
||
ps5upload.elf. Without it, ps5upload connects and then drops within seconds.
|
||
The Connection screen now says this too.
|
||
|
||
---
|
||
|
||
## 5.33.3
|
||
|
||
**Fewer disconnects.**
|
||
|
||
- **Fixed: the connection dropping and not coming back.** When the PS5 cut off
|
||
the helper's network, the helper stayed half-running and the app could not
|
||
reach it. It now shuts down cleanly so a fresh one can start.
|
||
- **Fixed: the helper being started twice.** The app could send it two at once,
|
||
and the two knocked each other out. It now sends one at a time.
|
||
- **Fixed: the app restarting a helper that was still running.**
|
||
- **"Check" on the Connection screen** no longer reports an error when the
|
||
helper is already connected (some loaders, like pldmgr, close port 9021).
|
||
|
||
---
|
||
|
||
## 5.33.2
|
||
|
||
**The helper no longer drops the connection a few seconds after you start it,
|
||
installing straight from a link works, and you can now install directly from a
|
||
network share.**
|
||
|
||
- **Fixed: "connects, then disconnects as soon as I click anything."** When
|
||
the PS5 returned an unusual network error, the helper quietly stopped
|
||
accepting connections while still running — so the app showed it as gone
|
||
until you started it again. It now recovers on its own and keeps going. This
|
||
affected every recent version, not just the newest ones.
|
||
- **"Let the PS5 download it" now works.** It wasn't starting the PS5's
|
||
installer service first, it said "sent" even when the PS5 had refused the
|
||
link, and the PS5 can't take links longer than 127 characters — which most
|
||
library links are. All three are fixed: a long link now goes through a short
|
||
address on this computer (keep ps5upload open until the PS5 finishes).
|
||
- **New: install straight from an SMB / network share.** Pick a package in the
|
||
SMB browser and choose Install on PS5 — it streams from the share into the
|
||
PS5, with nothing copied to your computer or the console first.
|
||
- **Better bug reports when the helper keeps dying.** They now include the
|
||
helper's own logs even if it crashed just before the report was made, and
|
||
say which step it stopped responding on.
|
||
- **Android:** the bottom tabs are no longer hidden behind the gesture bar.
|
||
|
||
---
|
||
|
||
## 5.33.1
|
||
|
||
**Installing from a link is much faster, there is now a third way to do it,
|
||
and "skip the certificate check" actually works.**
|
||
|
||
- **Links install about 65% faster.** Measured installing a 101 GB game: 108
|
||
MB/s, against 65 MB/s before, and it no longer slows to a crawl part way
|
||
through. ps5upload was getting in its own way — dropping and reopening
|
||
connections that were already fast, fetching the same piece of the file over
|
||
and over, and piling on more connections when the site was already
|
||
struggling. It now downloads about as many bytes as the game actually is,
|
||
instead of roughly six times that.
|
||
- **New: download the package first, then install it.** The third choice
|
||
alongside letting the PS5 fetch the link and streaming it through this
|
||
computer. It is the one to pick when a link keeps dying part way through:
|
||
the download finishes on its own and can be retried by itself, and the
|
||
install afterwards never touches the internet. It needs room on your disk
|
||
for the package; the other two do not.
|
||
- **"Skip the certificate check" was doing nothing.** Ticking it made no
|
||
difference — the setting never reached the downloader. Fixed, and checked
|
||
against a server with a self-signed certificate: off it refuses, on it
|
||
downloads. It still applies only when this computer is downloading, since
|
||
the PS5 checks certificates itself.
|
||
- **A clearer message when the PS5 refuses a link.** The console's installer
|
||
will not accept a link longer than 127 characters, and many library links
|
||
are longer than that. It used to say something about re-adding the package
|
||
to your library, which made no sense for a pasted link. It now explains the
|
||
length limit and points you at the two options that do not have it.
|
||
- Cancelling a link download now deletes the half-finished file instead of
|
||
leaving something that looks like a real package.
|
||
- For developers: the app can be built and smoke-tested on a headless Android
|
||
emulator, so Android changes no longer need a phone plugged in.
|
||
|
||
---
|
||
|
||
## 5.32.0
|
||
|
||
**You now choose how an install from a link downloads: let the PS5 fetch it
|
||
itself, or have this computer fetch it over many connections.**
|
||
|
||
- **New: let the PS5 download the link itself.** ps5upload hands the console
|
||
the link and steps aside — this computer sends nothing after that, so you
|
||
can close the app. On a quick or nearby link this is the fastest option:
|
||
measured at 114 MB/s installing a 101 GB game from a local server. The PS5
|
||
has to be able to reach the link itself, and it only opens a couple of
|
||
connections, so it is not the best choice for a slow or distant one.
|
||
- **Downloading through this computer is still the default, and got faster.**
|
||
It now opens more connections when that actually helps and fewer when the
|
||
site pushes back, instead of always using eight — and keeps fetching ahead
|
||
instead of pausing every time the PS5 does.
|
||
- **New: skip the certificate check**, for your own server or a site whose
|
||
certificate has expired. Off unless you turn it on, per install, and only
|
||
when this computer is downloading — the PS5 checks certificates itself.
|
||
- Both choices are remembered per console, and explained in your own language.
|
||
- **A dropped connection no longer restarts itself.** If your auto-loader was
|
||
set to send ps5upload's own helper, it could knock out the copy already
|
||
running and then do it again. That is now refused, with an explanation.
|
||
- **Problem reports are far more useful.** An unreachable console used to fill
|
||
the log with the same line dozens of times, and the PS5's own log could come
|
||
back with two messages shredded together. Both fixed, and reports now record
|
||
which server a link came from and how far away it is.
|
||
|
||
If your link installs are still slow, the limit is the site you are
|
||
downloading from. We measured one that gives every connection the same small
|
||
share no matter what, and nothing on our side changes what a server is willing
|
||
to send.
|
||
|
||
---
|
||
|
||
## 5.31.4
|
||
|
||
**Faster installs from a link when the file host is throttling, honest
|
||
progress for "Upload and install", and a data-loss guard that was not
|
||
arming on the link path.**
|
||
|
||
- **Installing from a link no longer runs at the speed of its slowest
|
||
connection.** We fetch a package in eight parallel connections. Some file
|
||
hosts serve one of them quickly and throttle the rest, and we used to give
|
||
each connection a fixed share and wait for all of them — so a connection
|
||
that finished in a second then sat idle for twenty while a throttled one
|
||
crawled. Connections now pull work from a shared queue, so a fast one keeps
|
||
going instead of waiting. On the measured pattern that is about 4x.
|
||
- **A connection the host has throttled is now dropped and reopened**, which
|
||
is what a download manager does and a normal HTTP client does not. Some
|
||
hosts slow a connection permanently once it has carried enough data.
|
||
- **A host asking us to slow down no longer fails the install.** A "too many
|
||
requests" reply was treated as a dead connection, retried four times in a
|
||
second and then given up on. It now waits as long as the host asks.
|
||
- **"Upload and install" shows real progress.** It reported 0 bytes and 0%
|
||
for the entire install — for hours on a large game — while the PS5 was
|
||
installing perfectly. It had no way to identify the package it was
|
||
watching. It now shows GB, speed and time remaining like every other
|
||
install.
|
||
- **Installs show the download and the send speed separately**, so when one
|
||
is slow you can see which. The "PS5 is installing" stage shows GB done,
|
||
speed and time remaining too, instead of a bare percentage.
|
||
- **Fixed a way to lose an installed game.** A PS5 patch installed from a
|
||
link was labelled as a PS4 full game, which stopped the safety check that
|
||
keeps a patch from overwriting its base game. A patch shares its base's
|
||
identity, so that check is the only thing standing between a failed patch
|
||
and a deleted game.
|
||
|
||
Verified on a real console: a 101 GB PS5 game installed from an http link at
|
||
about 103 MB/s — the speed of the network link itself — and launched. If your
|
||
own link installs are still slow, the limit is the file host, not ps5upload:
|
||
the same package over a fast link saturates the connection.
|
||
|
||
---
|
||
|
||
## 5.31.3
|
||
|
||
**Installing from a link was many times slower than it should have been.
|
||
Fixed, and installs now tell you what they are actually doing.**
|
||
|
||
- **Install from http/https was crawling.** Every chunk we requested opened a
|
||
brand-new connection to the server instead of reusing the one already open.
|
||
A 3 GB install made around 800 of them, and each one had to start from
|
||
scratch and get up to speed before being thrown away — so it never reached
|
||
full speed at all. One user measured 1.9 MB/s in ps5upload while a download
|
||
manager pulled the same file at 40-50 MB/s on the same connection. Fixed.
|
||
How much faster depends on your distance to the server, but it should be a
|
||
large difference.
|
||
- **Installs now show download speed and send speed separately.** A link
|
||
install has two halves — fetching the package to your PC, and feeding it to
|
||
the PS5 — and one combined number could never tell you which was slow.
|
||
- **The "PS5 is installing" stage now shows real progress.** It was a bare
|
||
percentage, and the speed it did show sat at 0 for that whole stage because
|
||
it was measuring the wrong thing. It now shows GB done, actual speed, and
|
||
time remaining, the same as the transfer stage.
|
||
- Time remaining is shown for both stages, and left out entirely when there
|
||
is no reliable speed to estimate from rather than showing a made-up figure.
|
||
|
||
---
|
||
|
||
## 5.31.2
|
||
|
||
**Honest status for installs we can't confirm, and the payload finally gets
|
||
its own name on the console.**
|
||
|
||
- **Your payload really does have its own name now.** 5.31.0 said this was
|
||
done. It wasn't — checked on a real console, ps5upload was still listed as
|
||
the generic `payload.elf`. Only one of its ~16 threads had been renamed, and
|
||
the console shows whichever thread it feels like. All of them are named now,
|
||
and it reads `ps5upload.elf`. This also repairs the cleanup that reuses that
|
||
name: ps5upload can once again spot and clear a stuck copy of itself on
|
||
reconnect, while leaving other homebrew on the console alone.
|
||
- **An install we can't confirm no longer says "Cancelled".** Nothing was
|
||
cancelled — the PS5 took the package and is very likely still installing it.
|
||
Those rows now say **Unverified**, in every language.
|
||
- **The Recheck button now appears when you need it.** If a console was busy
|
||
transferring something else, the automatic re-check politely waited its turn
|
||
— forever — and the row never offered you the manual Recheck. It now hands
|
||
the row over on time.
|
||
- **No more "ps5upload keeps checking" when it can't.** For a package with
|
||
nothing to identify it by, that message appeared next to a row that had just
|
||
closed. It now says what's actually true.
|
||
- Verified on real hardware: a 101 GB PS5 game and an 80 GB PS4 game with its
|
||
patch, both installed end to end at around 100 MB/s.
|
||
|
||
---
|
||
|
||
## 5.31.1
|
||
|
||
**Fixes the Android build, which 5.31.0 broke.**
|
||
|
||
- **The Android app failed to build in 5.31.0.** The link-install readahead
|
||
added in 5.31.0 called into a module the Android build deliberately leaves
|
||
out, so the APK never got made — 5.31.0 shipped desktop builds only. Fixed,
|
||
and verified against the Android target this time.
|
||
- No behaviour changes on desktop; 5.31.0's fixes are all still here.
|
||
|
||
---
|
||
|
||
## 5.31.0
|
||
|
||
**The helper no longer dies during installs, a slow install is no longer
|
||
reported as a failure, and link installs got faster.**
|
||
|
||
### The helper crashing during a PKG install
|
||
|
||
- **Fixed.** ps5upload asked the PS5 how an install was going, roughly once a
|
||
second. That question kills the process that asks it — measured on two
|
||
consoles against an otherwise identical build. If your helper went down every
|
||
time you installed a package, this was why. It no longer asks.
|
||
- **Your payload now has its own name on the console.** It used to run as
|
||
`payload.elf`, the same generic name every payload gets — and several PS5
|
||
tools shut down "their" previous copy by that name. It is now `ps5upload`, so
|
||
nothing else mistakes it for its own.
|
||
- **A helper that was killed or crashed now says so on the next start**, instead
|
||
of leaving you to guess.
|
||
|
||
### "Was not verified as installed"
|
||
|
||
- **A big install is no longer called a failure while the PS5 is still working
|
||
on it.** A 40 GB game routinely keeps installing after the transfer ends;
|
||
ps5upload was giving up after three minutes and showing a red error for
|
||
installs that went on to succeed.
|
||
- **It now keeps checking in the background** and marks the install done when
|
||
the game actually registers — with a **Recheck** button if you want to look
|
||
again yourself. The package is kept until it is confirmed, as before.
|
||
|
||
### Installing from a link
|
||
|
||
- **Faster.** The download now runs ahead of the console instead of waiting for
|
||
it, so your connection stays busy rather than stopping at every chunk.
|
||
Expect a few times quicker; the ceiling after that is the PS5's own
|
||
installer, not your line.
|
||
|
||
### Also
|
||
|
||
- **Hungarian.** Thanks to the request in #326 — machine-translated for now and
|
||
not yet checked by a native speaker, so corrections are very welcome.
|
||
- **Fixed a message that read "reboot dispatched to reboot"** instead of naming
|
||
your console. It was wrong in English and in all 19 translations.
|
||
- Dependency updates.
|
||
|
||
---
|
||
|
||
## 5.30.0
|
||
|
||
**Install a game straight from a link, at your line speed — and a fix for
|
||
installs that died halfway.**
|
||
|
||
### Install from an HTTP(S) link
|
||
|
||
- **Paste a direct package URL and install it, with nothing staged anywhere.**
|
||
Install Package has a new link field. No copy lands on your PC and none on
|
||
the console, so a 100 GB game no longer needs twice its size free — only the
|
||
space the installed game itself takes.
|
||
- **The download is parallel, so it runs at your line speed.** ps5upload
|
||
fetches the link over several connections at once (eight by default) and
|
||
feeds the bytes to the PS5 over your network. Handing the URL to the console
|
||
instead — what other tools do — leaves Sony's single-stream downloader in
|
||
charge, which is why those top out around 5-10 MB/s on a gigabit line.
|
||
- **The link is identified before anything starts.** ps5upload reads a few
|
||
byte ranges to name the title, its content id and its exact size, so a share
|
||
page or a non-package file is rejected up front instead of after an hour.
|
||
- **Dropped connections are resumed, not restarted.** A connection that dies
|
||
partway through re-requests only the missing tail, and any forward progress
|
||
refreshes the retry budget — a lossy mirror still finishes.
|
||
- **Your PC has to stay awake and connected** for the whole install, since it
|
||
is the one doing the downloading. The URL is never written to logs, task
|
||
records or diagnostic bundles, so a signed download token stays private.
|
||
- Tuning, if you need it: `PS5UPLOAD_URL_THREADS` (default 8),
|
||
`PS5UPLOAD_URL_WINDOW_MB` (32) and `PS5UPLOAD_URL_CACHE_WINDOWS` (4). Memory
|
||
use is roughly window × windows, so about 128 MB at the defaults.
|
||
- Not available in the Android build, which deliberately ships without an HTTP
|
||
client.
|
||
|
||
### Large installs (the "it fails halfway" / "lost connection" reports)
|
||
|
||
- **A big package is no longer truncated mid-request.** The package host capped
|
||
every response at 16 MiB and expected the console to ask for the rest. Sony
|
||
doesn't: it reads a package's trailing metadata in a *single* request whose
|
||
size grows with the package, and it never re-requests the part it didn't get.
|
||
One user's 121 GB install asked for **249.6 MiB in one range** and was refused
|
||
with `0x80b211cd` immediately after our 16 MiB answer; another report shows
|
||
**718** truncated requests. Small packages stay under the cap — which is
|
||
exactly why installs "worked with small files and failed with big ones".
|
||
Responses are now streamed in bounded chunks, so any range is served whole
|
||
without the engine holding it in memory.
|
||
- **A long install no longer has its session pulled out from under it.** The
|
||
package host expired sessions 2 hours after they were *created*, regardless of
|
||
whether the console was still downloading. A 200-300 GB game on a modest
|
||
connection runs well past that, so the console's next request got
|
||
"no such install session" — the dropped/lost connection people reported.
|
||
Expiry is now measured from the last sign of life, so an install that is still
|
||
moving is never reaped, while genuinely abandoned sessions still are.
|
||
- Verified on hardware: a 250 MiB single range now returns complete and
|
||
byte-identical to the source, and full installs still complete and register.
|
||
|
||
### The FPKG builder warns about an AMPR title before you build it
|
||
|
||
- **Convert to FPKG now flags a game that needs `ampr_emu`.** A title whose
|
||
`eboot.bin` imports `libSceAmpr` packages and installs perfectly well, and then
|
||
will not start unless `ampr_emu` is loaded on the console — which looks like a
|
||
broken package rather than a missing dependency. The readiness report names it
|
||
before the build, alongside the checks already there. It is a warning, not a
|
||
block: you can still build it, you just know what it will need.
|
||
|
||
### A warning before you install a package the console won't run
|
||
|
||
- **Packages are now checked for a DRM type the PS5 refuses to start.** A title
|
||
dumped from a disc or store install keeps the DRM type it shipped with, and a
|
||
package built from that dump as-is installs and then won't launch. The parser
|
||
now flags a `param.json` whose `applicationDrmType` isn't `standard`, and the
|
||
package's row shows a "check package" badge explaining the fix — so you learn
|
||
before spending an hour uploading and installing, rather than meeting a bare
|
||
Sony error code afterwards. It stays a warning: you can still install it.
|
||
|
||
### "It says error, but my PS5 installed it fine"
|
||
|
||
- **The post-install check no longer gives up after 3 minutes.** After the PS5
|
||
accepted a staged install, ps5upload looked for the finished package for a
|
||
flat three minutes and then reported the install unverified. A large title
|
||
cannot finish writing in that time, so the app showed an error for an install
|
||
the console went on to complete — and, because an unverified install keeps
|
||
its staged copy, left a package behind to delete by hand. The check now
|
||
watches the title's files grow and waits as long as the PS5 is still writing,
|
||
giving up only after three minutes of no movement at all. A stalled install is
|
||
still caught just as quickly as before.
|
||
- **Watching a running install is no longer capped by the clock.** The same fix
|
||
applies to Stream installs: the three-hour watch window now restarts on every
|
||
bit of progress, so a 200-300 GB title on a modest connection is followed to
|
||
the end instead of being abandoned as unverified while it is still going.
|
||
- With verification now succeeding, "Auto Delete after installation" cleans up
|
||
the staged package as it always should have.
|
||
|
||
### Installs stop disturbing your loaded payloads
|
||
|
||
- **If your console already runs etaHEN or elf-arsenal, ps5upload now uses its
|
||
installer bridge** (the "DPI v2" listener on port 12800) instead of sending
|
||
its own DPI payload. That send is the fragile part of a Stream install: it
|
||
needs the payload loader alive on :9021 and it **replaces the running
|
||
ps5upload payload** for the duration. When a bridge is there, nothing is
|
||
sent, nothing is displaced, and a carefully built stack of payloads keeps
|
||
running through the install.
|
||
- **We no longer "restore" a payload we never replaced.** The restore ran
|
||
unconditionally at the end of every stream install, so even a run that sent
|
||
nothing re-pushed the payload to the loader — exactly the disruption the
|
||
bridge avoids. It now runs only when something was actually swapped.
|
||
- The install result says which bridge handled it, and a completed install
|
||
tells you when your payloads were left alone.
|
||
- If the loader is closed and no bridge is running, the error now says that
|
||
running etaHEN or elf-arsenal is a way out, instead of only offering a
|
||
loader reload.
|
||
|
||
### Stream installs that failed halfway
|
||
|
||
- **The package host now sends a `Last-Modified` validator.** Sony's downloader
|
||
only advances to the next chunk against a response it considers cacheable, so
|
||
without it a transfer could simply stop partway through with no error that
|
||
pointed anywhere. This is the most likely cause of the "always fails halfway"
|
||
reports on 5.29.0 and affects every Stream install, not just link installs.
|
||
- **A rejected byte range now answers with `Content-Range: bytes */<size>`**, as
|
||
the HTTP spec requires, so the console can re-derive the real size and retry
|
||
instead of dead-ending.
|
||
|
||
## 5.29.0
|
||
|
||
**Bug reports stop leaking your network, and a conversion survives leaving the
|
||
page.**
|
||
|
||
### Bug reports redact the logs, not just the summary
|
||
|
||
- **"Redact IP addresses" now covers every text file in the zip.** It used to
|
||
apply only to the structured fields in `report.json`, so the engine log,
|
||
the payload logs, crash reports, klog and syslog went in verbatim — a
|
||
connection error reading `connect 192.168.1.50:9021 refused` published the
|
||
full address anyway. Every textual entry is now redacted as the archive is
|
||
written, on desktop and in the self-hosted browser build alike.
|
||
- **Addresses are hidden completely** (`<IPv4>`, `[<IPv6>]`) instead of being
|
||
shortened to `192.168.X.X`, which still identified the network. Ports and
|
||
surrounding punctuation are preserved so the logs stay readable.
|
||
- **Screenshots are still not scrubbed, and cannot be automatically.** The
|
||
page now says so next to the option rather than implying the zip is clean.
|
||
|
||
### Convert to FPKG
|
||
|
||
- **A conversion no longer dies when you navigate away.** The job always ran
|
||
to completion in the engine; what stopped was the page polling for it, so
|
||
the result vanished with the screen. Tracking now lives outside the page,
|
||
and finishing or failing raises a notification that links back to Convert.
|
||
- **You can pick the output folder**, including browsing the engine host's
|
||
disk in the browser build.
|
||
- **Relative paths and `~` work.** They resolve on the machine running the
|
||
engine, and a missing output folder is created when the conversion starts.
|
||
- **An existing package is never overwritten.** A conversion that would land
|
||
on an existing output name now stops with an error instead of replacing the
|
||
file. Re-running a conversion previously destroyed the package it had
|
||
produced the first time.
|
||
- **The work-in-progress warning says what it means**: a package can install
|
||
and still refuse to launch, so keep the source you converted from.
|
||
|
||
### Install failures say what actually happened
|
||
|
||
- **Stream install no longer sends you off to upload a multi-GB package when
|
||
the real problem is the loader.** If the installer helper could not be
|
||
delivered because port 9021 was closed, the app offered "Upload & install"
|
||
as a recovery — which cannot reopen the loader and only repeated the same
|
||
failure after a full upload. It now tells you to reload the payload loader
|
||
and retry Stream.
|
||
- **`0x80B2116F` is described honestly.** The old text called it a known
|
||
firmware/package incompatibility. The code turns up across several packages
|
||
and several firmwares, and the cause is not established, so the message now
|
||
says that while still pointing at the PS5's own Debug Settings → Package
|
||
Installer route.
|
||
- **An update skips a step we already know is rejected.** A staged patch used
|
||
to be sent to the helper first, which tried an in-process install measured as
|
||
failing on both tested consoles (`0x80B2150F` on 5.10, `0x80B2116F` on
|
||
9.60), and only then fell back to the standalone installer. It now goes
|
||
straight to that installer — but *only* when it is already running, so a
|
||
console whose loader is not loaded keeps the previous path rather than
|
||
failing early on hardware where the in-process route does work.
|
||
|
||
### Payload
|
||
|
||
- The opt-in installer experiment (`PS5UPLOAD_FULL_ESCALATE`) now escalates
|
||
before AppInst initializes, matching the standalone DPI daemon's order, and
|
||
restores the original credentials and aborts if any step fails. It remains
|
||
off by default.
|
||
|
||
## 5.28.0
|
||
|
||
**Screens wait for a console instead of pretending, and every on/off setting
|
||
is the same switch.**
|
||
|
||
### Screens that need a console now say so
|
||
|
||
- **Install Package no longer draws its whole staging UI with nothing
|
||
connected.** It used to show a small "No PS5 host set" warning and then the
|
||
full screen anyway. It now hands the screen to the same connection gate the
|
||
rest of the app uses, which names the actual problem — the engine is down, no
|
||
console is set up, or the helper isn't running — and offers the one click
|
||
that fixes it. The header stays, so the console chip still tells you what you
|
||
are pointed at.
|
||
- **The same fix for Screenshots, Videos, Library, nanoDNS, and Processes,**
|
||
each of which was drawing its own version of "connect first" underneath a
|
||
full set of controls.
|
||
- **Convert to FPKG keeps working with no console.** The conversion runs on the
|
||
machine hosting the engine, so only the install step at the end is gated.
|
||
|
||
### One switch for every setting
|
||
|
||
- **The checkboxes that turn something on or off are now the switch** used by
|
||
the beta-feature setting. That covers all of Settings, Continue on failure,
|
||
Auto-refresh, Mount read-only, Also patch libc.prx, the bug-report sections,
|
||
and the view filters on Processes, Installed apps and Cheats.
|
||
- **Picking things is still a checkbox.** Table rows, file-system entries, the
|
||
payload multi-pick, and the tri-state "select all" keep their checkboxes — a
|
||
switch means "on/off", not "these ones".
|
||
|
||
### Fixed
|
||
|
||
- **Stream install refused to run with no console set** instead of failing
|
||
somewhere further in.
|
||
- **Dropping a `.pkg` on the window with no console connected no longer starts
|
||
a staging upload.** The drop handler is registered on the window, outside the
|
||
screen, so it needed its own guard.
|
||
|
||
## 5.27.1
|
||
|
||
**The Android build compiles again. Nothing else changed.**
|
||
|
||
The 5.27.0 release went out without its Android app: the build failed while
|
||
that release was already being assembled. The cause was an arithmetic error in
|
||
the package converter that only exists on 32-bit ARM — the Android build
|
||
targets armv7, where a memory offset is 32 bits wide, and one was shifted by
|
||
32. Desktop and Docker were never affected, and the bytes written by the
|
||
converter are unchanged.
|
||
|
||
If you installed 5.27.0 on desktop, you already have everything in 5.27.1. The
|
||
Android app is the only thing this adds. For what actually changed in the
|
||
feature set, read the 5.27.0 entry below.
|
||
|
||
## 5.27.0
|
||
|
||
**Installs tell you more and lie less, and a first look at the package converter.**
|
||
|
||
### Installing packages
|
||
|
||
- **It tells you when the console already has the package**, before anything is
|
||
transferred. The check is the engine's own — the same one the completion test
|
||
uses — so the badge and the install result cannot disagree.
|
||
- **Progress no longer runs past 100%.** The console re-fetches ranges, so the
|
||
old number was a raw byte sum: a 1.35 GB package reported 1.53 GB fetched. It
|
||
now reports the furthest byte reached, and never runs backwards across the
|
||
handover from download to install.
|
||
- **A stalled install says it is stalled** instead of looking like a failure,
|
||
and the phase names come from the console.
|
||
- **Installing a fake package (FPKG) says what it needs.** The card above the
|
||
button names the three things the console must have loaded first — kstuff,
|
||
`a53_ppr_install_fast.elf` and `shadowmountplus.elf`.
|
||
|
||
### Web UI
|
||
|
||
- **Install packages straight from the server's library.** The web UI could
|
||
only stream a package sitting on the machine you had it open on; it can now
|
||
install what the engine itself is holding.
|
||
|
||
### Connection
|
||
|
||
- **The helper redeploy loop stops before it hurts.** Every delivered payload
|
||
replaces the helper running at :9021, so a console that had stopped answering
|
||
could be held down by the very loop meant to revive it. It now stops after
|
||
three unanswered deliveries and says so.
|
||
|
||
### Beta
|
||
|
||
- **Convert to FPKG** — behind Settings → Beta features — turns a game folder
|
||
or an `.exfat` / `.ffpkg` mount image into an installable package. It is
|
||
**not finished**: it can produce a package the console installs and then will
|
||
not mount. Off by default, and the screen says so.
|
||
|
||
## 5.26.0
|
||
|
||
**Your account ID, a readable fan curve, and consoles in the order you want them.**
|
||
|
||
### Profile
|
||
|
||
- **Your account ID is visible again.** It always reached the app; the screen
|
||
was throwing it away and showing a dash instead, on every console that has
|
||
an account.
|
||
- **Both forms are shown, and both copy.** The same account is written one way
|
||
by the console and another by Remote Play pairing — pasting the wrong one
|
||
into the Remote Play field simply fails. The Remote Play form is now
|
||
labelled as such, so there is nothing to work out.
|
||
- **You can change the account ID**, with a warning that spells out what it
|
||
costs: saves made under the old ID stop being recognised until you put it
|
||
back. It asks you to confirm, and shows you the old value first.
|
||
- The account section is no longer called "Offline-account slots" unless you
|
||
actually have an offline-activated account — a normal PSN account lives
|
||
there too.
|
||
|
||
### Console
|
||
|
||
- **The fan curve editor is readable.** Bigger, responsive, with presets, and
|
||
it tells you the duty cycle at any temperature instead of making you read it
|
||
off a cramped graph.
|
||
- **Console health explains itself when it is empty.** It used to show a wall
|
||
of dashes with no hint whether the reading was unsupported, still loading,
|
||
or genuinely broken. It also no longer trusts a boot count the console does
|
||
not reliably report.
|
||
|
||
### Getting around
|
||
|
||
- **Order your PS5s.** Drag them into the order you want in Manage PS5s, and
|
||
both the console dropdown and the tabs at the top follow it.
|
||
- **About sits at the bottom of the sidebar**, below whatever you have starred,
|
||
instead of pushing your own screens down.
|
||
- **Settings line up.** The panels were different sizes and aligned oddly; the
|
||
grid is now even at every window width.
|
||
- **Discord is linked from About**, alongside GitHub and X, and the bug-report
|
||
screen points at GitHub issues and the Discord bug channel.
|
||
- **Payload suggestions.** If you are not sure what to install, the essentials
|
||
are named: kstuff-lite, shadowmountplus and nanodns.
|
||
|
||
### Under the hood
|
||
|
||
- A 64-bit account ID can no longer be quietly rounded in transit — it used to
|
||
be possible to activate a *different* account than the one you typed, failing
|
||
in the worst way by appearing to work.
|
||
|
||
## 5.25.0
|
||
|
||
**Fixes the console disconnects and "ps5upload isn't responding".**
|
||
|
||
### Hardware
|
||
|
||
- **Reading sensors no longer risks dropping your console connection.**
|
||
ps5upload asked the PS5 for SoC power draw using the wrong call shape, and
|
||
the console wrote far more data back than ps5upload had made room for. On
|
||
consoles that report power draw this corrupted the helper's memory — which
|
||
showed up as the app going unresponsive, or the connection dying moments
|
||
after it was established. It has been reported as a firmware problem for
|
||
months; it was ours.
|
||
- **Power draw is now read correctly** — the total across the PS5's eight
|
||
power rails, instead of a mis-read number that had to be guessed at.
|
||
|
||
If you saw disconnects, this is very likely the cause. Consoles that never
|
||
reported power draw were never affected.
|
||
|
||
## 5.24.0
|
||
|
||
**Choose whether you get early releases or only verified ones.**
|
||
|
||
### Updates
|
||
|
||
- **New setting: "Get pre-release versions"** (Settings → Updates). Off by
|
||
default, and your choice is remembered.
|
||
- **Releases are now checked on real hardware before they're offered to you.**
|
||
Every release is published as a pre-release first and promoted by hand once
|
||
it has been verified, so leaving the new setting off means you're only
|
||
offered builds that someone has actually run on a console.
|
||
- Turn it on to be offered new releases as soon as they're published.
|
||
|
||
## 5.23.0
|
||
|
||
**Waking your PS5 now signs you in on PS5 firmware 9.60.**
|
||
|
||
### Wake & sign in
|
||
|
||
- **Wake-from-standby lands on your user, not the user-select screen** — on
|
||
consoles running firmware 9.60, verified repeatedly from a cold rest. It
|
||
takes about 10-15 seconds.
|
||
- **Honest errors when it doesn't work.** ps5upload used to blame your RP-Key
|
||
for failures that had nothing to do with it, and in one case reported
|
||
"signed in" for a console still sitting on the user-select screen. It now
|
||
says what actually happened.
|
||
|
||
### Known limitation
|
||
|
||
- **Firmware 5.10 consoles still stop at user-select after a wake.** Signing
|
||
in works normally on those consoles once they're already awake. This needs a
|
||
further piece of Sony's Remote Play protocol that ps5upload doesn't yet
|
||
implement — tracked in issue #318.
|
||
|
||
## 5.22.0
|
||
|
||
**Wake and sign-in set themselves up, and installs stop reporting success as
|
||
failure.**
|
||
|
||
### Wake & sign in
|
||
|
||
- **One button now sets up wake-from-standby.** ps5upload reads what it needs
|
||
from the console itself — you no longer have to hunt down a wake code, a
|
||
registration key and an RP-Key, and you no longer need Chiaki or any other app
|
||
to get them. Typing them by hand is still there as a fallback, tucked away.
|
||
- **Remote Play is switched on for you** as part of that setup, instead of the
|
||
attempt failing with "Remote Play is turned off on the console".
|
||
- **Setting up used to silently save nothing.** The keys the console returns
|
||
were a different length than the app expected, so a setup that looked
|
||
successful left sign-in unconfigured. Fixed.
|
||
- **The panel says what's happening** — whether it's ready, part-way (wake works
|
||
but stops at user-select), busy, or waiting for you to turn the console on.
|
||
|
||
### Installs
|
||
|
||
- **Successful installs are no longer reported as failures.** The install helper
|
||
on the console was crashing right after it queued the work, so the app never
|
||
heard back and said the install had failed — while the game or patch was
|
||
installing normally. Packages that looked broken were fine all along.
|
||
- **Package installs show up in Tasks** with progress, like uploads do, instead
|
||
of leaving you guessing whether anything was happening.
|
||
- **Better advice when a patch really is refused.** The old message pointed at
|
||
the console's own Package Installer, which is the same path ps5upload already
|
||
uses, so it could not have helped.
|
||
|
||
### Fixes
|
||
|
||
- The app no longer risks a blank screen on older Android WebViews.
|
||
|
||
## 5.21.0
|
||
|
||
**Cheats show up for every game, patch installs are honest, and interrupted work
|
||
recovers on its own.**
|
||
|
||
### Cheats
|
||
|
||
- **Downloaded cheats now appear for every game.** Some cheat files are saved in
|
||
UTF-16, which the on-console reader couldn't see — so those games showed "No
|
||
cheats found" even though the file was there. They're now read correctly.
|
||
- **Cheat versions are shown in the list**, so it's easy to pick a cheat that
|
||
matches your installed game build.
|
||
|
||
### Installs
|
||
|
||
- **Patch failures explain themselves.** When a patch or DLC can't install, you
|
||
get the real reason — base game missing, wrong version, content-id mismatch,
|
||
not enough space, console busy — instead of a silent stall or a false success.
|
||
- **Patch and DLC installs check for the base game first.** Installing an update
|
||
or add-on whose base game isn't on the console used to accept the job and
|
||
stall for ten minutes before failing. Now it's rejected instantly with a clear
|
||
"install the base game first."
|
||
- **The update installer is kept ready.** The install daemon is re-armed
|
||
automatically after a standby, and if it dies while the console stays awake —
|
||
so applying an update no longer fails by discovering, minutes in, that the
|
||
installer was never there.
|
||
|
||
### Reliability
|
||
|
||
- **Interrupted uploads resume on wake.** If the console rests part-way through
|
||
an upload, the transfer used to give up and wait for you to click Retry. Now,
|
||
once the console wakes and the helper is back, the upload picks up where it
|
||
left off on its own — only for connection-class interruptions, never for a
|
||
real failure like out-of-space.
|
||
- **Cleaner wake sign-in teardown**, closing the Remote Play control session
|
||
gracefully after signing your user in.
|
||
|
||
## 5.20.0
|
||
|
||
**Wake your PS5 from standby — and wake it straight into your user.**
|
||
|
||
### Power
|
||
|
||
- **Wake from standby over the network.** When the console is asleep, a Wake
|
||
button brings it back on, using Sony's discovery protocol (a PS5 does not
|
||
answer Wake-on-LAN). The setup panel spells out the three console settings
|
||
wake needs — Remote Play, plus *Stay Connected to the Internet* and *Enable
|
||
Turning On PS5 from Network* — because without any one of them the wake
|
||
fails silently.
|
||
|
||
- **Wake & sign in.** A plain wake stops at the user-select screen. Give the
|
||
console its Remote Play session keys and the wake also signs your user in,
|
||
bringing the console up on the home screen the way the official Remote Play
|
||
app does. If the account has a login passcode, the app says so rather than
|
||
hanging.
|
||
|
||
## 5.19.0
|
||
|
||
**Cheats tell you what they are and when they fire, and the power controls are
|
||
on the home screen.**
|
||
|
||
### Cheats
|
||
|
||
- **Downloaded cheats show the game's name**, with the title ID underneath —
|
||
including games you do not have installed, which is exactly when a bare ID is
|
||
least helpful.
|
||
|
||
- **The console tells you when a cheat takes.** Turn one on while you are
|
||
playing and a notification appears on the PS5 naming the cheat. You also get
|
||
one when a game starts with cheats already enabled.
|
||
|
||
- **Filter the collection** by cheat format, by the game version a cheat was
|
||
written for, and by "only my games" — which turns thousands of entries into
|
||
your shelf.
|
||
|
||
### Power
|
||
|
||
- **Power controls are on the home dashboard**, not just at the bottom of
|
||
Manage connections.
|
||
|
||
- **Wake a sleeping console.** If ps5upload has seen your PS5 before, it can
|
||
wake it from rest mode. This needs "Enable Turning On PS5 from Network"
|
||
switched on in the console's power settings — the app tells you so if nothing
|
||
happens.
|
||
|
||
Thanks to @realgooseman for both suggestions.
|
||
|
||
---
|
||
|
||
## 5.18.2
|
||
|
||
- **Backport is no longer greyed out for the wrong reason.** A library-overlay
|
||
problem reported while one game was starting could disable backporting for a
|
||
completely different game, and a brief hiccup during a normal launch could
|
||
disable it for that game too. A problem now only counts against the game it
|
||
actually concerns.
|
||
|
||
- Housekeeping: removed some stray development screenshots that had been
|
||
committed by accident, and tightened the ignore rules so the next ones cannot
|
||
follow them in.
|
||
|
||
---
|
||
|
||
## 5.18.1
|
||
|
||
**The new backport-pack screens now speak every language ps5upload supports.**
|
||
|
||
- The 22 strings added for installing a backport pack — and for the clearer
|
||
overlay and scan messages — shipped in English for everyone. They are now
|
||
translated into all 18 languages, placeholders and all, and checked by the
|
||
coverage gate rather than excused from it.
|
||
|
||
- Translated by hand, because several of them are instructions. "Restart the
|
||
console, because closing the payload that made the mount does not remove it"
|
||
is not a sentence worth guessing at.
|
||
|
||
---
|
||
|
||
## 5.18.0
|
||
|
||
**ps5upload can install a whole downloaded backport pack, and the library
|
||
corpus stops learning things that were never true.**
|
||
|
||
### Install a backport pack, not just a third of one
|
||
|
||
Backports circulate as a folder — `fakelib/` plus an `eboot.bin` that is
|
||
already patched, replacement `sce_module/` files, and the game's own engine
|
||
plugins. Until now ps5upload could only ever apply the `fakelib/` part, so a
|
||
pack that fixed a game anywhere else could not be used here at all.
|
||
|
||
- **Point it at the folder and it installs the lot.** Everything it replaces is
|
||
backed up first, so Undo puts the game back exactly as it was. The eboot is
|
||
written last: if anything goes wrong before that, the game still starts
|
||
exactly as it did.
|
||
|
||
- **No SDK patch is applied.** A pack's eboot arrives already downgraded, and
|
||
patching it again would rewrite a correct field and break the signature it
|
||
shipped with.
|
||
|
||
- **Only the libraries are kept for later.** They are the reusable part and go
|
||
into the corpus for every future backport; the eboot and modules belong to
|
||
one game and are installed straight from the folder rather than stored.
|
||
|
||
- **It warns before it runs out of room.** The backup is a copy, so replacing a
|
||
256 MB eboot briefly needs space for two.
|
||
|
||
- **Pointing the old import at a pack used to make a mess.** Every pack carries
|
||
`.prx` files outside `fakelib/`, and all of them were swept into one library
|
||
set — a combination no game has ever run. Files are now recognised by where
|
||
they sit in the pack, not by their extension.
|
||
|
||
### The corpus stops collecting things that are not backports
|
||
|
||
- **A `fakelib/` folder is no longer taken as proof.** A game that was dumped
|
||
but never downgraded can still have one, and its leftover files were being
|
||
recorded as a library set — which the app then offered FIRST for that very
|
||
game, where it could never work. Those titles are now skipped and counted, so
|
||
a scan that finds nothing says why instead of looking broken.
|
||
|
||
- **Sets are offered based on what actually ran.** A set your other console is
|
||
recorded running for a game is now preferred for that game, even when the set
|
||
was originally harvested from something else entirely.
|
||
|
||
- **One console stops counting as two.** Sightings were told apart by the name
|
||
you gave a console, so renaming it — or the app using its address once and its
|
||
name the next time — made a single machine look like corroborating evidence
|
||
from two.
|
||
|
||
### Backporting explains itself better
|
||
|
||
- **"An external BackPork is active" was often us.** A game starts more than
|
||
once as it launches, and the second pass was seeing the overlay the first pass
|
||
had just created. It now recognises its own work, and tells apart "BackPork is
|
||
running, stop it" from "something left a mount behind, restart the console" —
|
||
which need opposite fixes.
|
||
|
||
- **A blocked launch no longer sticks.** The warning used to stay up until the
|
||
payload was reloaded, long after the cause was gone.
|
||
|
||
---
|
||
|
||
## 5.17.10
|
||
|
||
**Backporting can now find a working library set on its own, and scanning a
|
||
second console finally counts for something.**
|
||
|
||
### Let it try the sets for you
|
||
|
||
Finding the right library set was always a loop: install, launch, watch, undo,
|
||
pick the next one, repeat. Nothing about that needed a human.
|
||
|
||
- **"Try sets automatically" does the whole loop.** It installs a set, launches
|
||
the game, watches it, and if it does not start it undoes the change and moves
|
||
to the next candidate — stopping as soon as one runs, and leaving that set
|
||
installed. There is a Stop button; it finishes the set it is on rather than
|
||
abandoning a half-installed title, so the game is never left in pieces.
|
||
|
||
- **It stops when trying more cannot help.** If the title's eboot turns out not
|
||
to be backported at all, no library set can fix it, so it says so once instead
|
||
of working through every set to reach the same answer a dozen times. And a
|
||
failure that asked for MORE libraries only tries larger sets afterwards.
|
||
|
||
- **Every launch is still judged the careful way.** Launching fails on its own
|
||
roughly one time in three, so a set is only rejected after repeated attempts
|
||
agree — auto mode uses the same evidence rules as doing it by hand.
|
||
|
||
### Scanning a second console now makes the next backport smarter
|
||
|
||
- **Sets remember which game and console they came from.** The same backported
|
||
game on two consoles stores as one set — and the second console's copy used to
|
||
be thrown away as a duplicate, taking the evidence with it. Both are now
|
||
recorded.
|
||
|
||
- **Sets that more than one console runs are offered first.** A combination two
|
||
separate machines actually run is a better first guess than one seen once.
|
||
Your own game's set still comes first when the corpus has it. Re-scanning the
|
||
same console does not make a set look better attested than it is.
|
||
|
||
- **Nothing you already collected is lost.** Existing corpora keep working and
|
||
are counted as one sighting rather than none, so sets you gathered before this
|
||
release do not sink below newly scanned ones.
|
||
|
||
---
|
||
|
||
## 5.17.9
|
||
|
||
**Backporting works again: the library scan finds your games, it now collects
|
||
from every console you own, and the Backport button is no longer stuck behind a
|
||
warning that was not true.**
|
||
|
||
### The scan finds your backported games again
|
||
|
||
Scanning a console for backport libraries reported "No backported games found"
|
||
even on a console full of them, which left you with an empty library corpus and
|
||
no way to back anything port.
|
||
|
||
- **The scan was talking to the wrong port.** It asked the console for each
|
||
game's `fakelib/` folder on the transfer port instead of the management port,
|
||
so every single lookup failed. Measured on a 9.60 console: all 40 titles came
|
||
back as "not backported" before, 34 library sets after.
|
||
|
||
- **A failed scan no longer looks like an empty console.** Any error reading a
|
||
game — console asleep, unreachable, permissions — was reported identically to
|
||
"this game was never backported", and the summary said zero errors. It now
|
||
tells those apart and says which console it could not reach.
|
||
|
||
### One library corpus, fed by every console
|
||
|
||
- **Scan collects from all your consoles at once.** The button used to read
|
||
only the console you had selected. It now sweeps every console you have set
|
||
up, skips any that are asleep (naming them), and files everything into the
|
||
one shared library corpus. Libraries harvested from one console are usable
|
||
when backporting on any other.
|
||
|
||
### The Backport button is no longer falsely blocked
|
||
|
||
- **"Library overlay is not available — send the current ps5upload payload"
|
||
was wrong.** The payload was reporting its overlay status correctly all
|
||
along; the engine was silently dropping that status before it reached the
|
||
screen, so the button stayed disabled no matter how current your payload was.
|
||
Backport is available again on a console running a current payload.
|
||
|
||
### Smaller things
|
||
|
||
- The backport summary showed a literal `{profile}` instead of the set name.
|
||
- Backport wording now says "set" throughout, matching what the corpus actually
|
||
stores, instead of the older "profile".
|
||
|
||
---
|
||
|
||
## 5.17.8
|
||
|
||
**Backport a game from inside ps5upload — including disk-image titles — plus a
|
||
fix for update failures that blamed the wrong thing.**
|
||
|
||
### Backporting, without the four-tool ritual
|
||
|
||
Games built for firmware newer than your console need their SDK version
|
||
lowered and replacement system libraries added. That used to mean a separate
|
||
SDK changer, a separate BackPork, and a folder of libraries you had to source
|
||
yourself. It is now one button in Games, and the pieces it needs are managed
|
||
for you.
|
||
|
||
- **The libraries come from your own games.** They are Sony files, so
|
||
ps5upload cannot ship them. The first time you back port something, it offers
|
||
two ways to get them: import a pack you already have, or scan your console
|
||
and collect them from games that are already backported. Either way they are
|
||
kept once and reused for every later backport, and you can add more at any
|
||
time from Settings → Backport libraries.
|
||
|
||
- **A library set is installed whole.** Sets are never mixed. Testing on
|
||
hardware showed a game that runs fine on its own nine libraries fail to start
|
||
at all on a different game's six — so ps5upload offers you sets that a real
|
||
game actually shipped, rather than assembling one from parts that have never
|
||
run together.
|
||
|
||
- **Disk-image games work too.** Titles that live in a `.exfat`/`.ffpkg` image
|
||
managed by ShadowMount+ used to be out of reach because the image is mounted
|
||
read-only. ps5upload now asks ShadowMount+ to remount just that one image
|
||
writable for the duration, patches it, and puts it back — no payload restart,
|
||
no moving your game file anywhere.
|
||
|
||
- **It tells you what happened, and does not pretend to know more than it
|
||
does.** After installing a set it launches the title and watches. A failed
|
||
launch is retried, because launching is unreliable enough on its own that one
|
||
failure proves nothing. If the game is still running afterwards it asks *you*
|
||
to confirm it reaches gameplay rather than declaring success — and if the
|
||
title was never patched in the first place, it says so instead of blaming the
|
||
libraries. Undo puts the game back exactly as it was.
|
||
|
||
### Update installs
|
||
|
||
- **Failures now name the reason the console actually gave.** When the PS5
|
||
declines an update, ps5upload retries through a small installer it sends to
|
||
the console. If that installer could not be delivered, you used to be told
|
||
only about the delivery problem — the code the console rejected it with, and
|
||
the remedy that goes with it, were dropped. Both halves are now reported.
|
||
|
||
- **No more "re-run your loader" when your loader is running.** That advice was
|
||
shown whenever port 9021 refused a connection, including to people whose
|
||
loader process was plainly alive — it had simply stopped listening. When a
|
||
loader is visible, ps5upload now says so, and suggests loading it again
|
||
rather than starting it.
|
||
|
||
If your PS5 refuses an update this way, the route that works is on the
|
||
console itself: Settings → System → Debug Settings → Game → Package
|
||
Installer. Your upload is not wasted — the package is already on the PS5.
|
||
|
||
---
|
||
|
||
## 5.17.7
|
||
|
||
**One report, four fixes: updates that couldn't reach the console, an error
|
||
that blamed the wrong thing, and a 6 GB re-upload nobody asked for.**
|
||
|
||
- **A failed install no longer restarts the upload on its own.** When an update
|
||
failed to install, the app treated it like a dropped connection and re-ran the
|
||
whole queue item — which for a package means uploading it again from scratch.
|
||
One user watched a 5.93 GiB update start over six seconds after the error,
|
||
with no prompt. The bytes were already on the console; re-sending them could
|
||
never have changed the outcome. Anything that fails *after* the upload has
|
||
committed — the install, or a mount — is now final, and the package stays on
|
||
the PS5 for a retry.
|
||
|
||
- **The update installer is now started early, while the console is known to be
|
||
reachable.** ps5upload applies updates through a small installer it hands to
|
||
the console's own payload loader. That loader belongs to your jailbreak, not
|
||
to us, and it can stop answering partway through a session — which is exactly
|
||
what happened to the person who reported this: it accepted ps5upload's helper
|
||
and then refused everything four minutes later, so the installer could never
|
||
be delivered and the update failed. ps5upload now starts that installer as
|
||
soon as it has talked to the console, rather than an hour later when an
|
||
upload has already finished. Once started it stays running, so the loader is
|
||
never needed again.
|
||
|
||
Verified on two consoles: the installer comes up in about half a second,
|
||
leaves the helper running beside it, and a later install uses it without
|
||
touching the loader at all.
|
||
|
||
- **The self-hosted web UI can now redeploy the helper.** Its check for "is the
|
||
console running the right helper" asked the desktop shell for the app
|
||
version — a call that does not exist in a browser and threw, so the whole
|
||
check quietly did nothing there. That is also why the web UI could never
|
||
restore a helper it had just found stale or offline.
|
||
|
||
- **"ps5upload couldn't start the PS5's update installer" told most people the
|
||
wrong thing.** That message blamed a self-hosted engine built without the PS5
|
||
payload SDK. That is one of three unrelated causes, and it was the *least*
|
||
likely: the common one is that the console's own ELF loader has stopped
|
||
answering on port 9021, so the installer can't be delivered at all. The
|
||
message now names which of the three actually happened, and what to do about
|
||
it — and all three now say the package is already on the PS5, so nothing needs
|
||
uploading again. In every language the app speaks.
|
||
|
||
- **The web UI stopped logging a warning on every upload.** It asked the
|
||
desktop shell to keep the machine awake — a call that doesn't exist in a
|
||
browser. Nothing was broken, but each attempt left a scary-looking failure in
|
||
the log and in any bug report captured during a transfer.
|
||
|
||
- **Bug reports now record which PS5 ports were answering.** The loader port is
|
||
the one dependency the whole update-install fallback rests on, and it isn't
|
||
ours. A report where it was down took a log grep to spot; now it's in the
|
||
snapshot alongside free space and the installed titles.
|
||
|
||
---
|
||
|
||
## 5.17.6
|
||
|
||
**A build fix, and one that quietly protected the Docker image.**
|
||
|
||
- **Building the app no longer damages its own dependency lockfile.** Every
|
||
build ran `npm install`, which on npm 10 deletes information newer npm
|
||
versions record — including which native components match Alpine/musl, the
|
||
base the web UI Docker image is built on. It had to be undone by hand before
|
||
every release, and had it ever been committed, that image could have been
|
||
built with the wrong native binaries. Builds now install strictly from the
|
||
lockfile (`npm ci`, the same thing CI does) and leave it alone, and a new
|
||
check fails the build if the file ever loses that information again.
|
||
|
||
---
|
||
|
||
## 5.17.5
|
||
|
||
**An update that silently does nothing is now reported as a failure, and tells you how to fix it.**
|
||
|
||
- **The PS5 could accept an update and then discard it.** The console returned
|
||
success, ps5upload believed it, and the game stayed on its old version with
|
||
nothing to explain why. That is the "base game installs but the update fails"
|
||
problem people have been reporting. ps5upload now checks the game's version
|
||
after an update and, if it did not move, says so instead of claiming success.
|
||
|
||
- **And it tells you the fix.** It happens when the console cannot match the
|
||
update to the base game you have installed: it reports success and copies
|
||
nothing. Installing the matching base package through ps5upload (choose
|
||
Override) and then applying the update makes it work. That is now the message
|
||
you get, in every language the app speaks.
|
||
|
||
Verified on a console: the same update did nothing at all over the base game
|
||
that was already there, and applied in about two and a half minutes after the
|
||
base was re-installed from its matching package — same console, same
|
||
firmware, same storage.
|
||
|
||
- **You are warned before it can happen.** When you install an update for a game
|
||
whose base package did not come from ps5upload, you now get a heads-up first,
|
||
with the fix, instead of finding out afterwards. It is a warning, not a block:
|
||
it means the update may not apply, not that it will fail.
|
||
|
||
- **A re-installed update is not mistaken for a failure.** The console removes
|
||
the old update before putting the new one in place, so for a minute or two a
|
||
game legitimately looks like it has gone backwards. ps5upload waits that out
|
||
rather than reporting a problem that is not there.
|
||
|
||
- Verified end to end on two consoles from a clean slate — base game, update
|
||
and three DLC, on both an older and a newer firmware, installing to internal
|
||
storage and to an M.2.
|
||
|
||
---
|
||
|
||
## 5.17.4
|
||
|
||
**You can file a bug report from the self-hosted web UI.**
|
||
|
||
- **The web UI could not produce a bug report at all.** It showed the whole
|
||
form — description, options, screenshot list — and then, where the button
|
||
should have been, a line of grey text saying a bug report needed the desktop
|
||
app. So you filled everything in and only then found out you could not send
|
||
it. One reporter put it plainly: "Could not capture a bug report on the
|
||
webui." The button is now there and it works: the engine builds the zip and
|
||
your browser downloads it.
|
||
|
||
- **Screenshots can be attached in the browser too**, using the normal file
|
||
picker.
|
||
|
||
- **The bundle tells you what it is.** A report built in a browser cannot
|
||
contain quite the same things as one built by the desktop app, so the README
|
||
inside the zip now says which parts differ and where to get the rest — for a
|
||
Docker setup, the engine's full log is `docker logs` on the container.
|
||
Nobody should have to guess whether a missing file is a clue.
|
||
|
||
---
|
||
|
||
## 5.17.3
|
||
|
||
**A repeat upload no longer deletes the file it already delivered — and failure messages now speak your language.**
|
||
|
||
- **Re-uploading something that had already finished could destroy it.** When a
|
||
transfer was retried after it had actually completed — the Retry button, or a
|
||
retry the app made on its own — the console deleted the finished file and then
|
||
reported `direct_rename_failed`. Every further retry repeated the deletion, so
|
||
the file you had successfully uploaded simply vanished and the queue sat at
|
||
0 B. Committing the same transfer twice is now harmless: if the file is
|
||
already in place at the right size, that is treated as success and nothing is
|
||
touched. Nothing deletes a destination any more until there is a verified
|
||
replacement ready to take its place.
|
||
|
||
This was reproduced on a real console before and after the fix — old build:
|
||
file gone; fixed build: file intact.
|
||
|
||
- **Transfer and install failure messages are translated.** These messages —
|
||
out of space, drive disconnected, path refused, transfer interrupted — were
|
||
English-only in every language, which is the worst moment to be handed a
|
||
language you may not read. All of them are now available in the app's 19
|
||
languages.
|
||
|
||
- **Clearer wording when there is genuinely nothing to publish.** The old
|
||
message blamed a rename and printed an empty path. It now says what actually
|
||
happened and what to do: upload again and choose Override rather than Resume.
|
||
|
||
---
|
||
|
||
## 5.17.2
|
||
|
||
**Logs say what they mean, and a bug report now carries what we actually need.**
|
||
|
||
- **The engine log no longer labels everything an error.** The engine writes
|
||
all of its output — routine, warning, failure alike — down one pipe, and the
|
||
app was stamping that whole pipe as an error. A perfectly healthy session read
|
||
as a wall of `[engine:err] ... 200 (0ms)` lines, every one of which was a
|
||
success. Lines that already state their own level are now left alone. The Logs
|
||
screen in the app was always right about this; it was the log file inside a bug
|
||
report — the one a maintainer reads — that was wrong.
|
||
|
||
- **The log stopped filling up with itself.** The Logs screen asks the engine for
|
||
new lines about once a second, and each of those requests was being written to
|
||
the log. Watching the log made it grow, forever, burying real activity. Reading
|
||
the log is no longer an event.
|
||
|
||
- **Failures are recorded as failures.** Nothing in the engine had ever been
|
||
logged at error level, so every bug report said "0 errors" no matter what had
|
||
gone wrong, and filtering for errors showed an empty list. A transfer that dies
|
||
and an install the console refuses are now errors. Advisories that cost you
|
||
nothing stay warnings.
|
||
|
||
- **Bug reports capture more of what a report is usually about.** Newly included:
|
||
free space per drive *with the reserved amount* (a 5.17.0 report about missing
|
||
space needed a hand-grep through helper logs to explain — that is now visible
|
||
at a glance), the list of installed titles, why each transfer ended rather than
|
||
just that it did, and what the console reported about an install. Package
|
||
filenames are included; the folders they came from are not.
|
||
|
||
---
|
||
|
||
## 5.17.1
|
||
|
||
**Uploads to internal storage are no longer refused when there is plenty of room.**
|
||
|
||
- **The "not enough space" rejection was wrong.** 5.17.0 added a capacity check
|
||
that held back a flat 80 GB on the PS5's internal storage before deciding
|
||
whether an upload would fit. That figure came from one console where the PS5
|
||
really did stop accepting writes with ~86 GB still showing free, and it does
|
||
not carry over to other consoles: the gap it was modelling turned out to be
|
||
anywhere from nothing at all to about 58 GB. The result was a check that
|
||
refused transfers with obvious room for them — a 2.5 GB update onto a console
|
||
reporting 86 GB free, a 70 GB game onto one reporting 136 GB. If your Volumes
|
||
screen showed a large "reserved for system" figure and almost nothing
|
||
available, that was this.
|
||
|
||
The check now holds back only a small filesystem working margin, so it stops
|
||
a transfer only when the space genuinely is not there. A console that
|
||
overstates its own free space is still caught — but while writing, where
|
||
ps5upload already turns it into a plain explanation of what happened instead
|
||
of a bare connection error, rather than up front on a guess.
|
||
|
||
If you update the app but keep an older helper on the console, you are not
|
||
stuck: the app now ignores the old 80 GB figure when the helper reports it.
|
||
|
||
---
|
||
|
||
## 5.17.0
|
||
|
||
**The self-hosted web UI catches up with the desktop app.**
|
||
|
||
- **Most of the app now works from the self-hosted web UI.** The browser build
|
||
translates each of the desktop app's actions into an engine request, and that
|
||
translation table had fallen a long way behind: Cheats, the SMB browser,
|
||
Backup, SDK Changer, Game Activity, Notifications, the FTP server, Fan Curve,
|
||
FW Spoof, drive sensors, avatar apply, TMDB lookups, package and archive
|
||
inspection (zip / 7z / rar / ffpkg / bps), user create and delete, and every
|
||
transfer and download action were all missing from it. The engine had been
|
||
serving every one of those routes the whole time, so the screens rendered
|
||
normally in a browser and then failed the moment you pressed a button. All of
|
||
them now go through. A build-time check keeps the two sides in step, so a
|
||
newly added action can no longer go missing here unnoticed.
|
||
|
||
- **Connection status works in the browser.** Steps 1 and 2 of the Connect
|
||
screen could not tell whether your PS5 was reachable, because probing a TCP
|
||
port is something a browser cannot do. The engine now probes on its behalf —
|
||
and it is the better vantage point anyway, since it sits on the same network
|
||
as the console.
|
||
|
||
- **No more "Save failed" alert on a successful install.** Every change to the
|
||
upload queue tried to write the desktop app's queue file, which does not
|
||
exist in a browser. The Upload screen reported that as "Queue changes could
|
||
not be saved — free disk space or fix permissions" over installs that had in
|
||
fact succeeded. The queue is now kept in the browser itself, and survives a
|
||
reload.
|
||
|
||
- **Docker images built from source carry the on-console installer.** The two
|
||
helper images the engine embeds were never copied into the build context, so
|
||
anyone building their own image got one that installed base games but turned
|
||
every update away — the same failure this release fixes everywhere else. Only
|
||
the official images were unaffected.
|
||
|
||
- **Screens that cannot work in a browser are no longer offered there.** The
|
||
first-run wizard and the SMB "download to this computer" button both need the
|
||
desktop app; they now stay hidden instead of failing when used.
|
||
|
||
---
|
||
|
||
## 5.16.0
|
||
|
||
**Game updates and DLC install from the self-hosted web UI.**
|
||
|
||
- **Updates and add-ons now install from the browser, not just base games.**
|
||
An update can't go through the PS5's in-app installer — on firmware 10 and
|
||
newer it turns patches away, and the one remaining in-app route is the
|
||
destructive one that can wipe the base game, so ps5upload refuses it. The
|
||
install that actually works hands the package to a separate on-console
|
||
installer daemon, which means sending that daemon to the console and putting
|
||
the ps5upload helper back afterwards. The desktop app does that from its own
|
||
bundled copies. A browser tab can't: it has no way to open a socket to the
|
||
console, and no copy of the files. So every update installed from the web UI
|
||
stopped with "this update couldn't be applied", while base games — which
|
||
never need that route — installed fine. The engine now carries both helper
|
||
images and does this itself, so the browser and the desktop app take the same
|
||
install path. This also unblocks Stream (beta) installs in the browser.
|
||
|
||
The released engine binaries and the official Docker images
|
||
(`ghcr.io/phantomptr/ps5upload-engine`, `…-engine-webui`) include the images.
|
||
If you build the engine from source without the PS5 payload SDK it has none,
|
||
and it now says so plainly instead of reporting the console as having
|
||
declined the update; you can point it at your own copies with
|
||
`PS5UPLOAD_PAYLOAD_DIR`.
|
||
|
||
- **A clearer message when the update never reached the console.** "The PS5
|
||
declined it — most often because the update doesn't match your installed
|
||
version" was shown even when the request never got that far, which sent
|
||
people hunting for the wrong version of a game. Failing to start the
|
||
installer now says exactly that, and what to do about it.
|
||
|
||
---
|
||
|
||
## 5.15.0
|
||
|
||
**Reliable browser uploads, safer firmware-12 helper recovery, and an opt-in 7z decoder speed-up.**
|
||
|
||
- **Folder uploads now start from the self-hosted UI over plain HTTP.** The
|
||
browser build used a secure-context-only UUID API before it contacted the
|
||
engine. Browsers hide that API on LAN addresses such as
|
||
`http://192.168.x.x:19113`, leaving the task at “Starting…” forever. Upload,
|
||
queue, and payload-playlist IDs now use the browser's LAN-safe cryptographic
|
||
random source, with a compatibility fallback for older webviews. Once the
|
||
engine accepts an upload, it continues independently if that browser tab is
|
||
closed.
|
||
|
||
- **The helper's rest-mode recovery is fail-closed on newer firmware.** A
|
||
network or manual clock correction can no longer be mistaken for a wake and
|
||
trigger raw credential writes. Recovery now requires matching realtime and
|
||
monotonic gaps plus a successful proof that no game is running. Unknown
|
||
process layouts are rejected, failed elevation stops the sequence, and the
|
||
detached watchdog no longer calls the mount scan that can hang on some
|
||
firmware/loader combinations.
|
||
|
||
- **7z/LZMA2 uploads can opt into multiple decoder threads.** The engine
|
||
updates to `sevenz-rust2` 0.22.2 and `lzma-rust2` 0.20.1, and adds
|
||
`PS5UPLOAD_7Z_THREADS` (1–16). It stays on one decoder thread by default,
|
||
because multi-threaded LZMA2 decode is not free: the decoder splits work on
|
||
dictionary-reset chunks and buffers each unit's decompressed output in
|
||
memory. On a 2.5 GB test archive, peak RAM went from 74 MiB to 2.3 GiB for
|
||
an archive packed with 7-Zip's own multithreading (about 24% faster), and to
|
||
4.4 GiB with **no** speed-up at all for a solid archive — the RAM cost
|
||
scales with the archive, not with the thread count, so a large game dump
|
||
could exhaust memory. Turn it on if you are CPU-bound on a multi-threaded
|
||
archive and have RAM to spare. File and shard order is unchanged either way,
|
||
preserving byte correctness and resume safety.
|
||
|
||
---
|
||
|
||
## 5.14.0
|
||
|
||
**Search your games, and a steadier Tasks list.**
|
||
|
||
- **Search the "Ready to play" tab by name or game code.** A search box at the
|
||
top of Games → Ready to play filters as you type, matching the game's name,
|
||
its CUSA/PPSA code, and the path it was registered from. It searches every
|
||
section at once — installed, disk images, folder homebrew, system — so you
|
||
don't need to know which one a title lives in, and sections with no matches
|
||
get out of the way. Game codes match however you type them: `CUSA00900`,
|
||
`cusa-00900` and `ppsa 01342` all find the right game, because codes get
|
||
copied out of filenames and forum posts with punctuation attached. Escape
|
||
clears the box. The "Game files" tab already had its own search; this closes
|
||
the gap on the other tab.
|
||
|
||
### Fixes
|
||
|
||
- **The Tasks list no longer shuffles while transfers run.** With two uploads
|
||
going, the rows were ordered by "most recently updated" — and since every
|
||
progress tick updates a task, the two rows swapped places about twice a
|
||
second, so the progress bars appeared to flicker between them. Active tasks
|
||
are now ordered by when they started, which doesn't change while they run:
|
||
new tasks appear below, and nothing already on screen moves. Thanks to the
|
||
reporter.
|
||
|
||
---
|
||
|
||
## 5.13.1
|
||
|
||
**Fixes the Fan threshold card appearing over and over on the Console tab.**
|
||
|
||
- **The Console tab no longer fills up with copies of the Fan threshold
|
||
card.** Introduced in 5.13.0: the card kept its own copy of the console's
|
||
address as its identity, and the new System time card was given the same
|
||
one — so the app could no longer tell the two apart and added a fresh copy
|
||
of the card on every five-second sensor refresh. The longer the tab stayed
|
||
open, the more copies appeared. Both cards now have distinct identities,
|
||
and a test fails the build if any two cards on a screen are ever given the
|
||
same one again. Thanks to the reporter who spotted it the day 5.13.0 went
|
||
out.
|
||
|
||
- **The Linux white-screen fix now adapts to your graphics setup.** The app
|
||
detects what it is running on and applies only the workarounds that stack
|
||
needs: every Linux session gets the DMABUF renderer disabled, and NVIDIA on
|
||
Wayland additionally gets accelerated compositing disabled and — when
|
||
launched through `PS5Upload.sh` — your system's `libwayland-client`
|
||
preloaded. Previously only the first of those was applied, so NVIDIA
|
||
Wayland users still got a white window and had to find the other two
|
||
themselves. The extra switches stay off everywhere else on purpose: they
|
||
cost scrolling smoothness, which this app's long lists feel. If detection
|
||
misses your setup, `PS5UPLOAD_FORCE_WAYLAND_PRELOAD=1` forces it, and
|
||
setting any of the variables yourself still overrides the app. Thanks to
|
||
the reporter of issue #285. See the FAQ entry "white/blank screen" for the
|
||
full table.
|
||
|
||
- **Don't launch the Linux build with `sudo`** — it is never needed, and it
|
||
leaves root-owned files in `~/.ps5upload` that make later normal launches
|
||
fail in confusing ways. The FAQ now says so, with the one-line fix if you
|
||
have already done it.
|
||
|
||
---
|
||
|
||
## 5.13.0
|
||
|
||
**Sets your PS5's clock from internet time.**
|
||
|
||
- **Sync the console clock to internet time.** Hardware → System time now
|
||
shows the PS5's clock next to your PC's, the drift between them, and a
|
||
button that corrects it from an internet time server (NTP). Both consoles
|
||
this was tested on had drifted on their own — one by three minutes — which
|
||
matters more than it sounds: a clock that is far out breaks PSN sign-in and
|
||
can make games fail their licence checks. There is a second button to sync
|
||
to your PC's clock instead, for a console on a network that cannot reach an
|
||
internet time server.
|
||
|
||
- **The clock now works on firmware where Sony's own API is missing.** On both
|
||
9.60 and 5.10 the system call for reading and setting the date is not
|
||
exported at all, so the console could not even report its own time — the
|
||
panel just showed a dash. It now falls back to the system clock directly,
|
||
which is what actually sets the time on those firmwares. When that path is
|
||
used the app says so, because Sony's own Settings screen may keep showing
|
||
the old time until you reopen it.
|
||
|
||
- **The time reply is now checked before it is trusted.** Internet time
|
||
arrives over a protocol with no authentication, and whatever it says would
|
||
become your console's clock. Replies that do not answer the request we
|
||
actually sent, come from a server admitting its own clock is unset, are a
|
||
rate-limit rejection, or claim an implausible date are now refused rather
|
||
than written to the console.
|
||
|
||
- **Restores the System time panel**, which was removed in 2.23.5 while it was
|
||
experimental. The timezone and DST editor stays out for now.
|
||
|
||
### Fixes
|
||
|
||
- **The PS5 payload builds again.** A toolchain update started rejecting four
|
||
leftover variables that were set but never read; they have been removed.
|
||
This blocked building the payload at all, not just this feature.
|
||
|
||
---
|
||
|
||
## 5.12.1
|
||
|
||
**Fixes picking an avatar image on Android.**
|
||
|
||
- **Choosing a profile picture works on Android again.** The avatar picker
|
||
used the system file chooser, which hands back a reference the app cannot
|
||
actually read — so the image never appeared and you got a "read image"
|
||
error instead. It now uses the same in-app file browser every other picker
|
||
in the app already used, which is why uploads worked while this did not.
|
||
Thanks to the reporter on issue #278.
|
||
|
||
---
|
||
|
||
## 5.12.0
|
||
|
||
**Android layout fixes, a "now playing" cue, and covers that stop reloading.**
|
||
|
||
- **The Play / Close game button is no longer sliced in half.** On a narrow
|
||
screen the button was not allowed to shrink below its own label, so a long
|
||
one ("Close game", "Needs ShadowMount+") overflowed its card and the card
|
||
cut it off mid-letter. The main action now gets a full-width line of its
|
||
own, and no button anywhere in the app can be clipped like that again.
|
||
- **The notifications panel opens on-screen on Android.** It was anchored for
|
||
the desktop sidebar, where the bell sits on the left. On the phone the bell
|
||
is on the right, so the panel grew straight off the edge of the display.
|
||
- **Starring a screen now does something on Android.** Favourites only ever
|
||
fed the desktop sidebar, so the star in More changed nothing on a phone.
|
||
Starred screens now appear pinned at the top of More.
|
||
- **A running game is easy to find.** It moves to the top of Games with a
|
||
"Now playing" strip — cover, name, play time and Close game — and the Games
|
||
tab shows a dot while something is running, from any screen.
|
||
- **Covers appear instantly when you return to a screen.** They were cached
|
||
since 5.11.0, but nothing looked in the cache until two loads had failed
|
||
and a retry timer had elapsed — so every visit still showed grey boxes for
|
||
a second or two. The app now uses artwork it already holds straight away,
|
||
and once it learns your window blocks direct image loading it stops
|
||
re-testing that for every single cover.
|
||
- Play time is now counted whenever the app is open, not only while the
|
||
Library screen is showing.
|
||
|
||
---
|
||
|
||
## 5.11.0
|
||
|
||
**Game covers load instantly instead of being fetched over and over.**
|
||
|
||
- **Covers are now kept on your computer.** Every time you opened a screen
|
||
with artwork, every cover was read from the PS5 again — about 290 KB per
|
||
game, so roughly 6.5 MB for a 23-game library, every single visit. They
|
||
are stored locally now and reused. A repeat view is around 2.5x faster,
|
||
and re-checking a cover that has not changed transfers nothing at all.
|
||
- **Games with no cover stop costing anything.** The app remembers that a
|
||
title has no artwork instead of asking the console again on every screen.
|
||
- **Nothing is kept forever.** Covers refresh on their own after a day, and
|
||
a console's artwork is cleared the moment you install or uninstall a game
|
||
on it, so you never see a cover for something that is no longer there.
|
||
- **Settings → Cached artwork** shows how much space it is using, with a
|
||
button to clear it. "Reset PS5Upload" already removed it too.
|
||
- Covers cached for one PS5 are never shown for another.
|
||
|
||
---
|
||
|
||
## 5.10.1
|
||
|
||
**Game covers, actually fixed this time.**
|
||
|
||
- **Covers now load even when the app's window refuses to fetch them.**
|
||
Cover art was the one thing the app loaded directly over the network
|
||
instead of through its own backend — and on some systems the app window
|
||
quietly blocks that, so every cover fell back to a controller icon while
|
||
the backend reported success. Covers now come through the same channel as
|
||
everything else if the direct load is refused. Verified by blocking every
|
||
direct image load and confirming all artwork still appears.
|
||
- 5.10.0 fixed a different cover bug (the scrolling change from 5.9.2). That
|
||
fix was real but was not this one.
|
||
|
||
---
|
||
|
||
## 5.10.0
|
||
|
||
**Game covers are back, and the helper reads the PS5's own databases properly.**
|
||
|
||
- **Game covers work again.** 5.9.2's scrolling change stopped covers from
|
||
loading in the Library and the Installed games grid. That change has been
|
||
taken off both screens — it can't be combined with artwork that loads as
|
||
you scroll. The file browser keeps it, which is where it mattered most.
|
||
- **A cover that fails once now tries again.** Every cover in the app gave
|
||
up permanently on its first failed load, so a moment's hiccup — the app
|
||
still starting, the console busy with something else — left a blank tile
|
||
until you navigated away and back. They retry a couple of times before
|
||
falling back to the controller icon. This is why covers kept breaking:
|
||
three screens each had their own copy of the same give-up-forever logic.
|
||
- **Game lists come from the real database instead of a guess.** Reading
|
||
the console's app list meant scanning the raw file for anything that
|
||
looked like text, which sometimes returned a game's name glued to the
|
||
file path next to it. The helper now reads the database properly, so
|
||
names come back as names. The old scanner still covers the case where
|
||
the PS5 has the file locked.
|
||
- **New: Console Play Time.** Game Activity can now show the playtime the
|
||
PS5 itself recorded, alongside the time this app has measured. It used
|
||
to report that the console couldn't provide it.
|
||
- **New: per-game storage details.** The database behind Settings →
|
||
Storage can be read for any installed game, and a single entry repaired
|
||
when it goes wrong. That repair is guarded: the game has to be closed,
|
||
the entry has to already exist, and both databases are backed up first —
|
||
if the backup fails, the edit doesn't happen at all.
|
||
|
||
---
|
||
|
||
## 5.9.2
|
||
|
||
**Installing is safer, and Stream install is no longer beta.**
|
||
|
||
- **A failed "Upload & install" could delete the game it was replacing.**
|
||
The PS5 clears the old copy before writing the new one, so an install
|
||
that failed part-way left you with neither. Re-installing a game that
|
||
is already installed from PS5 storage is now refused, with a pointer to
|
||
Stream install instead.
|
||
- **Stream install has left beta.** Across both test consoles and
|
||
packages up to 3.5 GB it worked every time, while the staged upload
|
||
path failed every time. It no longer hides behind a warning — and the
|
||
old warning's advice ("if it fails, use Upload & install") pointed at
|
||
the one path that can lose a game.
|
||
- **Failed installs say so immediately.** A rejected install used to sit
|
||
on a spinner for ten minutes before admitting it. Installing an update
|
||
whose base game is missing now tells you at once, and errors the PS5
|
||
reports come with the fix rather than just a number.
|
||
- **Installs tell you they finished — on the PS5 itself.** A notification
|
||
appears on the console when an install completes, stalls or fails, and
|
||
Stream install now shows its result in the Install Package view instead
|
||
of only in the app's notification bell.
|
||
- **Smoother scrolling in long lists.** Game and file lists skip the work
|
||
of drawing rows that are off-screen.
|
||
- Bug reports now include the console's own logs on the web build, where
|
||
they were silently empty, plus ShadowMount+'s log, a helper-version
|
||
mismatch flag and the console clock.
|
||
|
||
---
|
||
|
||
## 5.9.1
|
||
|
||
- **"Bring to front" is gone.** Raising an already-running game had to go
|
||
through the PS5's launcher, and every route to it either did nothing or
|
||
destabilised the console UI — which then took the screen back, doing
|
||
the opposite of what the button promised. Press the PS button on your
|
||
controller instead; it always works.
|
||
|
||
---
|
||
|
||
## 5.9.0
|
||
|
||
**Games started from the app stay on screen.**
|
||
|
||
- **A game would appear, run for about twenty seconds, then drop back to
|
||
the dashboard.** The app misread the PS5's "launched successfully"
|
||
reply as a failure and quietly launched the game a second time, and
|
||
that second launch was what knocked the console UI over. Fixed, and a
|
||
game now holds the screen.
|
||
- **A stale helper is now visible.** When the helper running on the PS5
|
||
is older than the app, a banner says so — the most common reason a
|
||
fix appears not to work is that the console is still running the old
|
||
one.
|
||
- Covers show for disk images in Games and Game files.
|
||
|
||
---
|
||
|
||
## 5.8.0
|
||
|
||
**Scrolling on Linux is smooth again, and a game that starts behind the
|
||
dashboard can be brought forward.**
|
||
|
||
- **Linux scrolling was sluggish because the app turned off graphics
|
||
acceleration for everyone.** Both WebKitGTK rendering workarounds were
|
||
applied by default to rescue a blank window on some GPU setups — but
|
||
one of them, disabling accelerated compositing, makes the whole page
|
||
render in software. That is barely noticeable on a static window and
|
||
very noticeable on this app's long lists. Only the targeted workaround
|
||
is on by default now; the heavier one is still available if you need
|
||
it (`WEBKIT_DISABLE_COMPOSITING_MODE=1 ./PS5Upload.sh`), and the FAQ
|
||
says what it costs.
|
||
- **"Bring to front" for a running game.** Starting a game and putting
|
||
it on screen are separate things on the PS5, and a game started from
|
||
here often comes up behind the dashboard. The button appears only
|
||
while a title is running, and asks the console to show it. It confirms
|
||
first — switching to the game on the console is still the reliable
|
||
way, and this only works once the game has finished loading.
|
||
- **Play no longer waits around.** It returns as soon as the game is
|
||
confirmed started, instead of holding on while trying to raise it.
|
||
- Closing a game and starting one are unchanged from 5.7.x; the
|
||
automatic foreground attempt that briefly existed during development
|
||
never shipped.
|
||
|
||
---
|
||
|
||
## 5.7.1
|
||
|
||
**Mount and Edit files stopped opening the same window, and a failed
|
||
hand-off no longer quietly mounts the image somewhere else.**
|
||
|
||
- **Mount and Edit files are now visibly different actions.** They opened
|
||
an identical window, which is a fair reason to think they did the same
|
||
thing. Worse, that shared window was misleading in both directions: with
|
||
ShadowMount+ running, Mount asked you to pick a mount point and then
|
||
discarded your choice (ShadowMount+ picks it), and Edit files offered a
|
||
"read-only" tickbox that contradicts the button you just pressed. Mount
|
||
now hands off with no dialog at all — there was never a choice to make —
|
||
and Edit files has its own window without the tickbox.
|
||
- **A failed hand-off says so instead of doing something else.** If
|
||
ShadowMount+ owns an image and handing it over fails, the app used to
|
||
fall back to mounting the image itself — silently putting it somewhere
|
||
ShadowMount+ doesn't manage, which is the opposite of what the button
|
||
said. It now reports the problem and changes nothing.
|
||
- **The web UI can hand games to ShadowMount+ again.** Writing a small
|
||
file to the console had no browser-mode route, so this failed every
|
||
time there (and, before the fix above, failed silently).
|
||
- Deciding whether ShadowMount+ is running no longer re-probes it on every
|
||
click. That probe reads a 256 KB log, and a slow one was enough to send
|
||
a mount or a register down the wrong path — the register case races
|
||
ShadowMount+ for the home-screen entry.
|
||
- The disk-images list now says what you can do with an image — mount it
|
||
to play, or edit it to add DLC or apply a backport — instead of leaving
|
||
that to be discovered by pressing something.
|
||
- "Not seen playing" was styled as a warning via a colour token that
|
||
doesn't exist, so it silently had no colour at all. It's information,
|
||
not a warning, and now reads as such.
|
||
|
||
---
|
||
|
||
## 5.7.0
|
||
|
||
**Pasting and adding files now merges instead of failing, Play and Close
|
||
game both behave, and editing an image is easier to find.**
|
||
|
||
- **Replacing a file that already exists works.** Pasting or adding a
|
||
file over one of the same name failed outright with
|
||
`fs_copy_dest_exists` and left you no way forward. Now you're asked
|
||
once, and only about the files that actually collide.
|
||
- **Folders merge rather than replace.** Pasting a folder over an
|
||
existing one drops in the files you brought and leaves everything
|
||
else alone — copying a folder containing just `eboot.bin` into a game
|
||
no longer threatens the other 900 files beside it. A file still can't
|
||
silently replace a folder (or the reverse); that's refused.
|
||
- **Closing a game now closes it properly.** "Close game" was falling
|
||
back to killing the process outright, because the API it tried first
|
||
can't see running apps on this firmware at all — it reported an empty
|
||
list with a game plainly running, and rejected the app id. It now goes
|
||
through the launcher's own close call, the same one the console uses,
|
||
and falls back only if that fails. Verified on both consoles across a
|
||
PS5 title, a native PS4 title, and a PS2 Classic (which runs as two
|
||
processes — both close from the one call).
|
||
- **Play no longer starts a game and then minimises it.** Sony's launch
|
||
calls can report failure for a launch that is actually going ahead.
|
||
The fallback ladder believed them and fired a *second* launch at a
|
||
title already starting — and the shell answers a second request by
|
||
pushing the game to the background, which is why the game was running
|
||
but had to be reopened on the console. Each attempt is now confirmed
|
||
against the running-process list before the next one is tried. Pressing
|
||
Play on a game that's already running brings it to the front instead of
|
||
re-launching it.
|
||
- **"Open files" in the edit banner actually opens the folder.** It did
|
||
nothing when you were already on the Files screen.
|
||
- **Finishing an edit refreshes the list**, so the image reappears and
|
||
the edit mount disappears without a manual refresh.
|
||
- **Editing is visible without hunting for it.** "Edit files" now sits
|
||
next to Mount on every disk-image row instead of hiding in the ⋯ menu,
|
||
which also makes the difference between the two obvious: Mount hands
|
||
the image to ShadowMount+ so you can play it, Edit checks it out so you
|
||
can change what's inside.
|
||
- **Editing an image on a USB or external drive picks a mount point that
|
||
works.** It defaulted to the image's own drive, which the PS5 kernel
|
||
refuses to mount into. It now defaults to internal storage — the same
|
||
thing ShadowMount+ does with images on USB.
|
||
- The ShadowMount+ speed tip no longer quotes a firmware range that had
|
||
gone stale; the Payloads library entry is the maintained source.
|
||
|
||
---
|
||
|
||
## 5.6.1
|
||
|
||
**Fixes "Edit files…" for any game image that isn't on internal storage.**
|
||
|
||
- **Editing an image on a USB or external drive failed immediately** with
|
||
`journal the edit session on the console: FS_WRITE_BYTES failed:
|
||
open_failed`. An edit session records itself on the console so an
|
||
interrupted edit can still be finished, and that record always lives on
|
||
`/data` — but the folder holding it was only ever created on the drive
|
||
the *image* was on. For an image on `/mnt/usb0` or `/mnt/ext1` the two
|
||
are different drives, so the record had nowhere to go and the edit
|
||
never started. Images on internal storage were unaffected, which is
|
||
why this got through testing.
|
||
|
||
---
|
||
|
||
## 5.6.0
|
||
|
||
**Disk images show their real name and cover art, editing a game
|
||
ShadowMount+ owns now works end to end, and Favorites stick.**
|
||
|
||
- **Cover art and real names for disk images.** In *Games → Game files*
|
||
every `.exfat`/`.ffpkg` row showed a grey placeholder and a bare
|
||
filename like `PPSA30223.exfat`. The image itself has no readable
|
||
metadata — it's all sealed inside — but the console already knows the
|
||
title, so those rows now read *Yakuza Kiwami 3 & Dark Ties ·
|
||
PPSA30223* with the cover next to them.
|
||
- **Edit a game image that ShadowMount+ is holding.** ShadowMount+
|
||
mounts everything read-only, and it re-attaches any image whose mount
|
||
disappears within about 15 seconds — so there was no safe way to open
|
||
one for writing. The new **Edit files…** action checks the image out:
|
||
it moves the image out of ShadowMount+'s scan folder, waits for it to
|
||
let go, and mounts it read-write where you choose. **Finish editing**
|
||
puts it back and ShadowMount+ re-registers it. While a session is
|
||
open the game is hidden from the PS5 home screen, so a banner says so
|
||
on the screens you'll be using.
|
||
- **An interrupted edit is recoverable.** The checkout is recorded on
|
||
the console, not on your computer. If the app crashes, the console
|
||
reboots, or you just close the window mid-edit, the banner comes back
|
||
the next time you connect — from any machine — and finishing still
|
||
puts the image back where it belongs.
|
||
- **Mounting an image ShadowMount+ owns no longer lies about it.** The
|
||
old message said the image had been "handed to ShadowMount+" without
|
||
mentioning that the mount point you had just chosen was discarded. It
|
||
now says where the image actually landed, and what to do if you wanted
|
||
it somewhere of your own.
|
||
- **Favorites survive.** Pinned sidebar screens were the one preference
|
||
that lived only in browser storage and were never written to
|
||
`~/.ps5upload/settings.json`, so they were the one thing you could
|
||
lose. They're now saved alongside theme, language and everything else.
|
||
- **The ShadowMount+ log panel shows recent lines.** It was reading the
|
||
*start* of `debug.log` rather than the end, so on a console that had
|
||
been up for a while it showed hours-old startup output and never the
|
||
event you were troubleshooting.
|
||
|
||
---
|
||
|
||
## 5.5.0
|
||
|
||
**Uploads that can't fit are now refused before they start, big folders
|
||
finish, and you can edit a mounted game image in place.**
|
||
|
||
- **"It won't fit" is said up front, not four hours in.** The PS5 holds
|
||
back a large chunk of internal storage that the free-space number never
|
||
shows, so an upload could pass every check, run for seventeen minutes,
|
||
and die at 53% with a connection error that never mentioned the disk.
|
||
Uploads are now checked against the space actually usable, on both the
|
||
app and the console, and the destination picker shows **usable** space
|
||
instead of free space.
|
||
- **If it does run out mid-upload, it says so.** That failure used to
|
||
surface as six identical "connection forcibly closed" messages. Now it
|
||
names the drive, the numbers, and stops retrying something that cannot
|
||
succeed.
|
||
- **Folders with thousands of small files upload again.** Anything over
|
||
about 7,000 small files used to fail with an unreadable socket error
|
||
after all the data had already arrived. A 20,000-file folder now
|
||
completes.
|
||
- **Edit a mounted disk image in place.** Mount an `.exfat` read-write and
|
||
the File Browser becomes an image editor: **Add files** copies files in
|
||
from your computer, and **Replace** overwrites one file keeping its name.
|
||
This is what lets you drop in DLC, swap assets, or apply a backport patch
|
||
when a game ships as an image instead of a folder. Edits are permanent
|
||
and there is no undo — the app now says so before you start.
|
||
- **The sidebar is yours.** It used to assume five screens mattered to
|
||
everyone. Now only Home is pinned, and you star whatever you actually use
|
||
from **More**.
|
||
- **Firmware 12 installs stop pretending.** The last-resort installer path
|
||
could report success after copying nothing at all. It is gone from the
|
||
automatic sequence; the app keeps your staged package and explains the
|
||
real error instead.
|
||
- **Translation fixes.** "From" and "To" in the file move screens had been
|
||
translated as the *email* senses — German read "Mr.", Spanish "born in",
|
||
Japanese "start date". Several messages also showed raw `\n` and `\"`
|
||
instead of line breaks and quotes.
|
||
- **The sidebar shows which version you are running**, so a bug report can
|
||
say so without hunting through About.
|
||
|
||
---
|
||
|
||
## 5.4.19
|
||
|
||
**Every way an archive can be split is now recognised — including the ones
|
||
that used to upload silently as a useless raw file.**
|
||
|
||
- **`Game.7z.001`, `Game.zip.001` and friends.** These are what 7-Zip
|
||
produces when it splits a file. They don't end in `.zip`/`.7z`/`.rar`, so
|
||
ps5upload didn't see them as archives at all and sent the raw volume to
|
||
your PS5, where it's unusable — with no warning. Now it says so, and tells
|
||
you to join the volumes first.
|
||
- **Spanned zips (`Game.z01` + `Game.zip`).** The `.zip` opens but its
|
||
contents live in the other volumes, which ps5upload can't read. Flagged
|
||
instead of half-uploading.
|
||
- **Old-style RAR volumes (`Game.r00`).** If you pick one of these, you're
|
||
now pointed at the `Game.rar` that opens the whole set — one click, and
|
||
the rest are read automatically.
|
||
- **Ordinary files are left alone.** A `save.2024` or `backup.1999` is not
|
||
a split archive, so a numeric suffix only counts when a real second
|
||
volume is sitting next to it.
|
||
|
||
---
|
||
|
||
## 5.4.18
|
||
|
||
**If your parts are a mix of `.zip` and `.rar`, ps5upload now tells you
|
||
before you spend hours uploading — instead of saying nothing.**
|
||
|
||
- **Mismatched part sets are detected.** A folder holding
|
||
`Game.part01.zip` next to `Game.part02.rar` … `part11.rar` is two
|
||
different downloads, not one set. The `.zip` cannot open the `.rar`
|
||
volumes, so uploading it delivers only its own files and stops. Until
|
||
now nothing was shown at all, because the part detector only matched
|
||
parts that shared an extension.
|
||
- **It tells you what's missing.** When the other parts have no first
|
||
volume of their own, the warning names the exact file to re-download
|
||
(`Game.part01.rar`) so you can fix the set and pick that instead.
|
||
|
||
---
|
||
|
||
## 5.4.17
|
||
|
||
**A game split into `part01.zip`, `part02.zip`, … can now be queued in one
|
||
click, instead of you uploading each part by hand.**
|
||
|
||
- **"Add all N parts to the queue".** Pick part 1 and ps5upload looks in the
|
||
same folder for the rest of the set. If it finds them, one button queues
|
||
every part, in order, all going to the same destination folder so they
|
||
merge into one game.
|
||
- **Why part 1 alone was never enough.** Each `.partNN.zip` is a complete,
|
||
separate archive holding a different slice of the game — nothing inside
|
||
part 1 points at part 2, so there is no way to follow them automatically.
|
||
Uploading part 1 really did finish; it just wasn't the whole game. That is
|
||
why the warning, and now the button, are there.
|
||
- **Better bug reports.** When a multi-part set is detected it's now written
|
||
to the log, so a bug report shows whether the warning appeared.
|
||
|
||
---
|
||
|
||
## 5.4.16
|
||
|
||
**A `.rar` upload no longer fails just because the archive lists its files
|
||
in a different order than it extracts them.**
|
||
|
||
- **"rar stream desynced from plan" is fixed.** Uploading a `.rar` reads it
|
||
twice: once to list what's inside, once to send the files. If those two
|
||
passes reported the files in a different order — which some archives do —
|
||
the upload stopped dead, even though nothing was wrong with it. Each file
|
||
is now matched by name instead of by position, so it goes to the right
|
||
place no matter what order it arrives in.
|
||
- **A damaged or incomplete archive now says so.** Instead of a confusing
|
||
"desynced" message you get which files are missing, and a suggestion to
|
||
test-extract the archive locally first.
|
||
- **Resuming an upload of such an archive is refused rather than risked.**
|
||
If the order differs, resuming could skip the wrong parts and leave a
|
||
broken install, so the app asks you to start again with Overwrite.
|
||
|
||
---
|
||
|
||
## 5.4.15
|
||
|
||
**Multi-part archives, and updates that match how you installed.**
|
||
|
||
- **All parts of a split game now land in one folder.** A game published as
|
||
`Game.part01.zip` … `Game.part06.zip` used to get a separate folder per
|
||
part — `…part01/`, `…part02/` — scattering one game across six
|
||
directories so it couldn't launch. The part number is now dropped from
|
||
the folder name, so every part unpacks into the same place.
|
||
- **The app tells you when an archive is one of several.** Pick
|
||
`Game.part03.zip` and it now says "This is part 3 of 6" and explains that
|
||
each part is its own archive and must be uploaded too. Previously the
|
||
upload finished, said nothing, and only some of the game was there. This
|
||
is only shown for `.zip`/`.7z` sets — a multi-part `.rar` really does pull
|
||
its other volumes in on its own, and still does.
|
||
- **Updates now offer the same package type you installed.** If you
|
||
installed the `.rpm`, the updater offered a `.zip` you couldn't install
|
||
with your package manager. It now checks which package owns the running
|
||
app and offers the matching `.rpm` or `.deb`, falling back to the
|
||
portable download for an unpacked copy.
|
||
|
||
---
|
||
|
||
## 5.4.14
|
||
|
||
**Large `.zip` uploads no longer die while your PC is still decompressing.**
|
||
|
||
- **Big zip entries could stall the transfer for minutes, then fail.** The app
|
||
used to fully decompress each large file inside a `.zip` before sending any
|
||
of it. The console treated that silence as a dead connection and dropped the
|
||
upload after about two minutes — so live speed looked like a crawl even when
|
||
Activity later showed a healthy average from a short burst. Large zip
|
||
members are now streamed as they decompress (same idea as `.7z`), and the
|
||
console keeps the transfer socket alive for much longer once an upload has
|
||
started.
|
||
- **Activity speed labels are clearer.** Running rows say “live”; finished
|
||
rows still say “avg”. Tiny jobs that finish in a blink no longer show absurd
|
||
multi‑GB/s averages.
|
||
|
||
---
|
||
|
||
## 5.4.13
|
||
|
||
**Big uploads no longer get killed by the app's own reconnect.**
|
||
|
||
- **A large upload could restart forever and never finish.** While an upload
|
||
is saturating the console, the app's background health check can start
|
||
timing out — the console is too busy to answer. The app took that as "the
|
||
helper has died", pushed a fresh helper to the console, and that in turn
|
||
killed the upload that was running perfectly well. The upload started over,
|
||
saturated the console again, and the whole thing repeated. One report
|
||
showed 132 GB sent for a 20 GB game that never arrived. The app now never
|
||
reloads the helper while an upload to that console is in progress.
|
||
- **The health check no longer competes with your upload.** While files are
|
||
moving, the app takes that as proof the console is alive instead of
|
||
interrupting to ask — so it stops adding traffic to a console that is
|
||
already busy. If the transfer genuinely stalls, it checks properly again.
|
||
- **A busy console is no longer mistaken for a missing one.** During an
|
||
upload the app now waits a full minute of silence before reporting the
|
||
helper as down, instead of twenty seconds.
|
||
|
||
---
|
||
|
||
## 5.4.12
|
||
|
||
**When the console refuses an uninstall, the app now says so.**
|
||
|
||
- **An uninstall the console rejected was reported as success.** The helper
|
||
asks the PS5's own uninstaller to remove a game; if the console refused,
|
||
that refusal was written to a log file and nowhere else, so the app
|
||
cheerfully reported the game as uninstalled while it stayed in Settings →
|
||
Storage. The refusal, and the console's reason code, are now returned and
|
||
logged. Found while chasing a real case where a game could not be deleted
|
||
and every attempt looked like it had worked.
|
||
- **You can now snapshot the console's content databases.** These two files
|
||
are the console's record of what is installed, and they can drift from
|
||
what is actually on the drives — which is how a game with no files left
|
||
can still sit in Storage refusing to be deleted. Taking a copy before
|
||
changing anything turns a bad repair into one you can undo.
|
||
|
||
---
|
||
|
||
## 5.4.11
|
||
|
||
**Changing a console's IP address sticks.**
|
||
|
||
- **Typing a new address and pressing Check snapped back to the old one.**
|
||
The address box was only updating its own copy of the address, while the
|
||
console list — which is what actually decides which PS5 is selected — kept
|
||
the previous one and put it back a moment later. Committing an address now
|
||
changes the selected console itself, so it stays changed.
|
||
([#276](https://github.com/phantomptr/ps5upload/issues/276))
|
||
- **A check could report success against an address your PS5 no longer
|
||
had.** When the address snapped back, the app restored that console's
|
||
last-known state along with it — firmware, helper status, "already
|
||
checked" — so it looked like the new address had been verified when
|
||
nothing had been contacted.
|
||
- **Pointing a console at a new IP no longer keeps the old console's
|
||
details.** Its remembered firmware and helper version are cleared, and an
|
||
automatic name follows the new address instead of still reading
|
||
`PS5 (192.168.1.10)` while pointing somewhere else. A name you chose
|
||
yourself is left alone.
|
||
- **Typing an address that belongs to another console you've already added
|
||
now switches to it,** rather than leaving two entries pointing at the same
|
||
PS5.
|
||
|
||
---
|
||
|
||
## 5.4.10
|
||
|
||
**Folder uploads in the browser no longer look stuck on "Starting…".**
|
||
|
||
- **Uploading a folder from the self-hosted web UI (Docker) appeared to
|
||
hang.** The button sat on "Starting…" and nothing else happened. The
|
||
engine was reading through the whole folder before it told the app the
|
||
upload had begun, and until that finished the app had nothing to show and
|
||
no way to cancel. On a big game folder — especially one mounted into a
|
||
Docker container, where reading file details is far slower — that is
|
||
minutes of looking frozen. The upload now registers immediately and
|
||
reports progress while the folder is still being read, matching what
|
||
Resume-style folder uploads already did. ([#275](https://github.com/phantomptr/ps5upload/issues/275))
|
||
- **A folder that doesn't exist now reports a proper error** instead of
|
||
failing the request outright.
|
||
- Updated `sevenz-rust2` and `mdns-sd`.
|
||
|
||
---
|
||
|
||
## 5.4.9
|
||
|
||
**Typing an address works properly, stalled uploads recover, and every
|
||
language is complete.**
|
||
|
||
- **Typing a console address no longer fights you.** Each keystroke was
|
||
treated as switching to a different console, so the screen reset itself
|
||
mid-word: the text box lost focus and the scene-tools strip jumped back
|
||
to "Probing scene tools…". You can now type the whole address normally.
|
||
It is applied when you press Enter, press Check, pick a console from
|
||
Discover, or click away from the box.
|
||
- **A half-typed address is no longer looked up.** An unfinished address
|
||
like `192.168.0.` was treated as a host name and sent off for a DNS
|
||
lookup that took ten seconds to give up. The strip now waits until the
|
||
address is actually complete.
|
||
- **An interrupted upload resumes instead of giving up.** A recoverable
|
||
hiccup could be hidden behind an unrelated error and read as fatal, so
|
||
the whole upload was abandoned when it could have carried on.
|
||
- **.zip, .7z and .rar uploads get the same second chances as everything
|
||
else.** They were capped at two quick retries, spent inside the first
|
||
second and a half, so a brief Wi-Fi drop ended the transfer with
|
||
"gave up after 2 retries".
|
||
- **A failed attempt now says what actually went wrong,** instead of a bare
|
||
"write frame split" with the real cause stripped off.
|
||
- **The finished-upload notice can be dismissed.** It used to sit there
|
||
until the next transfer.
|
||
- **All 18 languages are complete.** 130 phrases — the Health Check screen,
|
||
the disclaimer, Fakelib, the SDK version changer, Remote Play checks and
|
||
more — were still showing in English in every language. They had been
|
||
parked on a list of known gaps, so nothing complained. They are now
|
||
translated and that list is empty.
|
||
- **Bengali: the "Close" button was showing corrupted text.**
|
||
|
||
---
|
||
|
||
## 5.4.8
|
||
|
||
**Cancel really cancels, and a console can be reached by name.**
|
||
|
||
- **Cancelling an upload stops it.** If you hit Cancel while the upload was
|
||
still being set up — the window is longest for a `.rar`, where the whole
|
||
archive is read through before the transfer starts — the transfer went
|
||
ahead anyway. Free space on the console kept shrinking, and closing the
|
||
app was the only way to stop it. Cancel now takes effect no matter when
|
||
you press it, and a cancelled upload is never quietly retried.
|
||
- **You can use a host name instead of an IP address.** Typing something
|
||
like `ps5.lan` never worked: the address was only ever read as a literal
|
||
IP, so nothing could connect and the app reported the console as not
|
||
running the helper. Names now resolve, and IPv4 is preferred so a stale
|
||
IPv6 record doesn't slow every connection down.
|
||
- **A failed connection check says why.** "Port 9021 is not open" now comes
|
||
with the actual reason, so a name that didn't resolve reads differently
|
||
from a console that isn't ready yet.
|
||
- **The scene-tools strip no longer shows the previous console's tools.**
|
||
After switching address it kept the old results on screen until the new
|
||
check finished.
|
||
|
||
---
|
||
|
||
## 5.4.7
|
||
|
||
**Play time is counted more honestly.**
|
||
|
||
- **"Times played" no longer climbs on its own.** Reloading the helper while
|
||
a game was running counted as a fresh launch, so the number crept up with
|
||
no relation to how often you actually started the game. It now counts only
|
||
launches it saw happen.
|
||
- **A game already running when the helper starts is shown.** It appears
|
||
straight away with its time counting up, instead of being invisible until
|
||
you quit it.
|
||
|
||
---
|
||
|
||
## 5.4.6
|
||
|
||
**Fixes game detection, which 5.4.5 broke — and makes Game Activity work.**
|
||
|
||
- **Games are identified correctly again.** 5.4.5 changed how the helper
|
||
reads a game's ID and got it wrong, so IDs came back with the first four
|
||
characters missing. Anything that asks "which game is this?" was affected:
|
||
the process list, cheats, and play-time tracking. Reverted and checked
|
||
against two consoles.
|
||
- **Game Activity records play time.** Verified on a real game: launches,
|
||
seconds played, and a live "playing now" marker.
|
||
- **Game Activity knows what you're playing right now.** The screen asked
|
||
the console for the current game and the console never answered, so it
|
||
could not tell a session in progress from a finished one.
|
||
|
||
---
|
||
|
||
## 5.4.5
|
||
|
||
**A new screen for editing game images, and a quieter log.**
|
||
|
||
- **New: Edit Game Image.** Open a `.exfat` or `.img` game image as a drive
|
||
on your computer, so you can replace patch files or change details inside
|
||
it with your normal tools, then eject it when you're done. Your operating
|
||
system does all the writing — ps5upload never modifies the image itself.
|
||
macOS and Linux for now; Windows needs an extra driver and says so.
|
||
- **The log no longer fills up when a console is off.** A console that isn't
|
||
switched on was reported once a second, forever, burying everything else.
|
||
It now reports once, stays quiet, and says when the console comes back.
|
||
|
||
---
|
||
|
||
## 5.4.4
|
||
|
||
**Fixes the console never reporting which game is running.**
|
||
|
||
- **Play time, cheats and the process list can see your games again.** The
|
||
helper asked the console "which game is this?" using a slightly wrong
|
||
memory layout, and got an empty answer back every single time. Three
|
||
features quietly depended on that answer:
|
||
- **Game Activity** recorded nothing, because it never saw a game start.
|
||
- **Cheats** could not tell which game was running.
|
||
- **Processes** showed no game IDs.
|
||
|
||
All three share one cause and one fix.
|
||
|
||
---
|
||
|
||
## 5.4.3
|
||
|
||
**Game Metadata works again, and finding cheats is much easier.**
|
||
|
||
- **Game Metadata: fixed "Invalid format".** Picking one of your installed
|
||
games looked up an ID one part short of what the console wanted, so every
|
||
lookup failed. Both the app and the console now accept the shorter form.
|
||
- **Cheats: pick your game from a list.** The cheat browser now shows the
|
||
games installed on your console. Click one and it finds cheats for it —
|
||
no need to know or type a game ID.
|
||
- **Cheats: fixed downloads from two of the three sources.** Every download
|
||
was requested from the first source regardless of where the cheat was
|
||
found, so anything only available in the other two could not be
|
||
installed.
|
||
|
||
---
|
||
|
||
## 5.4.2
|
||
|
||
**Fixes uploading from a folder in the browser / Docker version.**
|
||
|
||
- **Choosing a folder no longer breaks the upload screen.** In the web UI
|
||
and Docker builds, picking a folder failed with an error and stopped the
|
||
upload before it started. The screen was trying to show the game's cover
|
||
image using a feature that only exists in the desktop app. It now simply
|
||
leaves the cover out there, and the upload works normally.
|
||
|
||
---
|
||
|
||
## 5.4.1
|
||
|
||
**Clearing things out, and a quieter, cleaner build.**
|
||
|
||
- **Clear your PS5 notifications.** The Notifications screen now has a
|
||
Clear all button. These are messages ps5upload put on your TV and keeps
|
||
its own list of, so clearing really does empty it.
|
||
- **Reset recorded play time.** Game Activity can now be reset, with a
|
||
confirmation that says plainly it cannot be undone. Your console's own
|
||
records are not touched.
|
||
- **Cheats are easier to use.** The download button was a tiny unlabelled
|
||
icon that was easy to miss. It is now a clear Install button that says
|
||
what it does, and shows Installed when it is done. Entries from one
|
||
source were also showing a blank name; they now show the title id.
|
||
- **Switching consoles no longer carries anything across.** Picking a
|
||
different PS5 now starts every screen fresh, so one console's results
|
||
can never appear under another's name.
|
||
- Fixed build warnings in the Android app.
|
||
- Fixed a problem where running the tests could send requests to a
|
||
running console helper.
|
||
|
||
---
|
||
|
||
## 5.4.0
|
||
|
||
**A new Health Check screen, and a fix for a crash that could shut your
|
||
console down.**
|
||
|
||
- **New: Health Check.** One screen that tells you whether your console and
|
||
this app are set up correctly and working. It checks the connection, the
|
||
helper, storage, system settings and Remote Play, and puts a Fix button
|
||
next to anything it can repair for you. Where something genuinely cannot
|
||
be checked on your firmware, it says so rather than pretending it passed
|
||
or failed.
|
||
- **Clean up leftover files.** Health Check finds unfinished files left
|
||
behind by interrupted transfers and offers to delete them. It shows you
|
||
the exact list and total size first, and only ever touches its own
|
||
folders.
|
||
- **Fixed a crash that could shut the console down.** Opening the Profile
|
||
screen while Remote Play was being checked in the background could crash
|
||
the console and force a restart. Two things were talking to the same part
|
||
of the system at once; they now take turns.
|
||
- **Play-time totals can no longer be lost.** If the console ran out of
|
||
space while saving, the file was replaced with an incomplete one and every
|
||
recorded total was gone. It now leaves the previous file alone if the save
|
||
does not fully succeed.
|
||
- **One of the built-in cheat sources returned nothing.** It was looking in
|
||
the wrong place, so it silently contributed no results. It now works, and
|
||
roughly doubles the number of cheats you can find.
|
||
- **Remote Play works.** It never has: the helper called one of Sony's
|
||
functions the wrong way and gave up before it started. You can now pair
|
||
a device from the Remote Play screen and get a PIN.
|
||
- **The Remote Play screen tells you what's missing.** Instead of an error
|
||
code, you get a short checklist — signed in, account activated, Remote
|
||
Play on, and (on firmware 10.00 and later) allowed for your user — with
|
||
a button next to anything it can fix for you.
|
||
- **Date and time settings work again.** The console's timezone and clock
|
||
format were always blank. Same underlying cause as Remote Play: the
|
||
helper could not read the console's settings at all.
|
||
- **`.rar` uploads no longer need free space on your PC.** A `.rar` used to
|
||
be extracted in full before anything was sent, so a 180 GB game needed
|
||
180 GB free on top of the archive. It is now decompressed and sent at the
|
||
same time, exactly like `.zip` and `.7z` — nothing is written to your disk
|
||
at all.
|
||
- Because of that, the `FTX2_ARCHIVE_STAGE_MB` setting is gone. It is no
|
||
longer needed; you can delete it if you set it.
|
||
- A failed `.rar` upload can no longer leave a part-extracted folder behind,
|
||
because there is no longer anywhere for one to be left.
|
||
- **Added a disclaimer.** This is research and homebrew software for
|
||
consoles you own, provided as is, and you take responsibility for what you
|
||
do with it. See DISCLAIMER.md.
|
||
|
||
Verified on two consoles — firmware 5.10 and 9.60 — including the crash
|
||
fix, the health checks, and a real 9-volume, 127 GB password-protected
|
||
archive (181 files, every name and size matching).
|
||
|
||
---
|
||
|
||
## 5.3.3
|
||
|
||
**Fixes the Docker images, which 5.3.2 broke.**
|
||
|
||
- The `ps5upload-engine` Docker images failed to build in 5.3.2. If you
|
||
run the engine in Docker, 5.3.2 has no image — use this release
|
||
instead. Everything else in 5.3.2 was unaffected.
|
||
|
||
---
|
||
|
||
## 5.3.2
|
||
|
||
**`.rar` uploads now show the game's real name — and a memory-safety bug in multi-part handling is fixed.**
|
||
|
||
- **Fixed a memory-safety bug that affected every multi-part `.rar`.** The
|
||
library ps5upload uses to read RAR files misreads memory each time it
|
||
moves from one part to the next — reading about 8 KB out of a buffer far
|
||
smaller than that. In practice it usually got away with it, but it could
|
||
crash at any point during a multi-part upload. The library has no fixed
|
||
version available, so ps5upload now carries a corrected copy.
|
||
|
||
- **A `.rar` upload finally identifies the game inside it.** It used to
|
||
show no title at all and land in a folder named after the archive — so a
|
||
game arrived as `[DLPSGAME.COM]- 01.021 PPSA23226` instead of its actual
|
||
name. `.zip` uploads had always read the title properly; `.rar` simply
|
||
never looked. It now reads the same file `.zip` does, so you get the
|
||
title, title ID and content ID before the upload starts. Verified on a
|
||
real nine-part, 127 GB archive, where it resolves in about a tenth of a
|
||
second.
|
||
|
||
---
|
||
|
||
## 5.3.1
|
||
|
||
**A big `.rar` that fills your PC's disk now says so — before it wastes your time.**
|
||
|
||
- **Uploading a large `.rar` no longer fails five minutes in with "Write
|
||
error".** A `.rar` is extracted on your PC before being sent, and a big
|
||
game can need far more free space than people expect — one 180 GB game
|
||
needed 180 GB of temporary space on top of the archive itself. ps5upload
|
||
now checks before it starts, and if there isn't room it says how much is
|
||
needed, how much you have, and what to do about it. If a disk fills up
|
||
part-way anyway, the error now names the real cause instead of just
|
||
saying "Write error".
|
||
- **A failed upload no longer leaves tens of GB behind.** On Windows the
|
||
temporary folder sometimes couldn't be deleted because a file was still
|
||
in use, silently keeping the space. It now retries, and if it still
|
||
can't, it tells you the folder to delete.
|
||
- **The helper's log no longer drowns out its own errors.** Routine
|
||
connection checks were each writing an error line — over 8,000 identical
|
||
lines in one report, which pushed out every genuinely useful message.
|
||
Those are now silent; real truncated transfers are still logged.
|
||
- Log lines from different parts of the helper no longer get spliced
|
||
together into unreadable text.
|
||
|
||
---
|
||
|
||
## 5.3.0
|
||
|
||
**Two ways the console could crash, fixed — and RAR uploads that don't fill up your PC.**
|
||
|
||
- **The helper no longer shuts down your console's system UI.** Reading a
|
||
temperature goes through the PS5's system UI, and if that took too long
|
||
— most likely when a game had been running for hours — the helper would
|
||
shut it down, leaving you with a black screen and pulling the power
|
||
cord. This is the most likely cause of the 5.2.1 lockup reports on
|
||
firmware 12.40. It has not been reproduced on hardware, so it is a
|
||
strong suspect rather than a confirmed fix.
|
||
- **Renaming a file between two drives over FTP no longer crashes the
|
||
console.** On the PS5 this kind of rename takes the whole system down
|
||
instead of just failing. It is now refused with a clear message — copy
|
||
the file and delete the original instead.
|
||
- **Multi-part RAR uploads tell you which part is missing**, by name,
|
||
instead of repeating advice you may have already followed.
|
||
- **RAR uploads can use far less disk space on your PC.** A `.rar` used to
|
||
be extracted in full before anything was sent, so a 100 GB game needed
|
||
100 GB free. Setting `FTX2_ARCHIVE_STAGE_MB=4096` on the engine sends it
|
||
in ~4 GB batches instead. Off by default — the original way is still
|
||
better on a slow or unreliable connection, because only it can resume
|
||
anywhere in the archive.
|
||
- **New FAQ answers**: moving a save between two consoles, "Port 9021 is
|
||
not open", PS4 update packages that won't install, and the new FTP
|
||
rename message.
|
||
- Dependency updates.
|
||
|
||
---
|
||
|
||
## 5.2.1
|
||
|
||
**Fixes for things that could freeze or mislead you.**
|
||
|
||
- The built-in FTP server no longer freezes the console. Stop now really
|
||
stops it, even mid-transfer.
|
||
- `df` in the Shell screen returned broken output and took the payload
|
||
down with it. Fixed.
|
||
- Folder upload works in the browser/self-hosted web UI again, not just
|
||
the desktop app.
|
||
- Installed Apps shows real game names on consoles that were only showing
|
||
title IDs.
|
||
- Package installs restore the main payload afterwards, so the console
|
||
does not appear to go offline.
|
||
- The package installer no longer looks dead while it is still starting
|
||
up on firmware 10.40.
|
||
- SDK Changer is safer with your game files and clearer about what it
|
||
changed — and it says when a title is encrypted and cannot be patched.
|
||
- Sundry hardening around SMB staging and shell input.
|
||
|
||
---
|
||
|
||
## 5.2.0
|
||
|
||
**Clearer failures, working FTP, and NAS → PS5 upload.**
|
||
|
||
- Actions that the console refused now show a real error instead of looking
|
||
like nothing happened (FTP start, backups, user create/delete, and more).
|
||
- Built-in FTP server no longer freezes the console on the first real
|
||
transfer; default port is 2122 so it does not clash with ftpsrv.
|
||
- Game Activity and Game Metadata read titles from the console again
|
||
(no broken store scrape).
|
||
- SMB browser can upload a file or whole folder from your NAS straight to
|
||
the PS5 in one step (stage on the PC, then FTX2).
|
||
- Backport helpers: Fakelib manager, BPS patches, and SDK Changer fixes so
|
||
“patched” means something actually changed.
|
||
- SDK Changer uses real firmware numbers (BCD) and reports signed SELFs
|
||
it cannot touch.
|
||
|
||
---
|
||
|
||
## 5.1.8
|
||
|
||
**Clear package choices and a safer Stream fallback.**
|
||
|
||
- Groups each game's base, updates, and DLC while keeping every uploaded
|
||
variant visible and selectable per console.
|
||
- Shows the original filename, source location, upload time, and PS5 location.
|
||
- Diagnoses Stream HTTP/proxy failures and offers one-click staged installation.
|
||
- Routes staged DLC through the verified installer path to prevent false success.
|
||
|
||
---
|
||
|
||
## 5.1.7
|
||
|
||
**Reliable package installs with multiple updates and DLC.**
|
||
|
||
- Keeps base games, multiple patch variants, and DLC side by side without
|
||
overwriting staged files.
|
||
- Prevents conflicting same-version patches from being installed as a batch
|
||
and shows which exact package is installed.
|
||
- Fixes duplicate drag-and-drop uploads and older-firmware package-path errors.
|
||
- Restores Stream install on capable firmware and reports console HTTP/proxy
|
||
failures with a staged-install fallback.
|
||
|
||
---
|
||
|
||
## 5.1.6
|
||
|
||
**Updated the PS5 build toolchain.**
|
||
|
||
- Builds the main payload and package installer with PS5 Payload SDK v0.42.
|
||
- Keeps local setup, pull-request checks, and release builds on the same
|
||
checksum-verified SDK version.
|
||
- Fixes SDK upgrades and LLVM detection on macOS.
|
||
- Restores the package-installer helper in release bundles.
|
||
|
||
---
|
||
|
||
## 5.1.5
|
||
|
||
**nanoDNS 0.3 and 0.4 compatibility.**
|
||
|
||
- Detects the loaded nanoDNS version from its runtime log and keeps 0.3 in
|
||
legacy-safe mode.
|
||
- Adds nanoDNS 0.4 controls for quiet mode and IPv6.
|
||
- Safely updates old configs without deleting custom rules, comments, paths,
|
||
or resolvers, and corrects the old Yandex.DNS address.
|
||
|
||
---
|
||
|
||
## 5.1.4
|
||
|
||
**A stability hotfix for the 5.1 release.**
|
||
|
||
- Restores clear, labeled desktop navigation and direct access to package
|
||
installation.
|
||
- Prevents timeout recovery from leaving the PS5 interface unresponsive.
|
||
- Makes package installation status reliable and keeps staged packages until
|
||
completion is confirmed.
|
||
- Improves telemetry and task handling across multiple consoles and transfers.
|
||
- Includes dependency updates and expanded regression coverage.
|
||
|
||
---
|
||
|
||
## 5.1.3
|
||
|
||
Same contents as 5.1.2, re-cut. The 5.1.2 tag itself was left in a
|
||
half-synced state by the very bug 5.1.2 was fixing — the lockfiles were
|
||
corrected but not included in the release commit — so its own build
|
||
check failed after the fact. 5.1.3 is the clean one. Downloads from
|
||
5.1.2 work fine; there's nothing wrong with the app in either.
|
||
|
||
---
|
||
|
||
## 5.1.2
|
||
|
||
**Build and release plumbing. Nothing changes in the app itself — if
|
||
you're on 5.1.1 there's no need to update.**
|
||
|
||
Two checks turned out to cover less than they appeared to:
|
||
|
||
- The version-sync step updated every version-bearing file except the
|
||
two `Cargo.lock` files, which also record a version for each of our
|
||
own crates. Nothing failed loudly, so the symptom was that a freshly
|
||
released tree went dirty the moment anyone built it. 5.1.1 shipped
|
||
that way; this release carries the correction.
|
||
- Continuous integration checked formatting on the engine but never on
|
||
the desktop app, so a handful of files there had drifted. Reformatted,
|
||
and the check now covers both.
|
||
|
||
---
|
||
|
||
## 5.1.1
|
||
|
||
**A console-freeze fix, and every language is now genuinely complete.**
|
||
|
||
### The app can no longer hang your console
|
||
|
||
When ps5upload reads certain console state, it briefly attaches to a
|
||
system process and waits for it to answer. That wait had no time limit.
|
||
If the console didn't answer — which can happen on some firmware — the
|
||
payload sat there holding that process open, and the console locked up
|
||
until you cut the power.
|
||
|
||
Every one of those waits now gives up after ten seconds and releases the
|
||
process cleanly. This is the fix for the freeze reported on 5.0; if you
|
||
were holding off on updating, this is the release to take.
|
||
|
||
### The search box is on tablets too
|
||
|
||
5.1.0 said the "More" screen had a search box. On phones it did. On
|
||
tablets and desktop the old sidebar was still being shown, so it didn't.
|
||
Both now use the same screen, so search works everywhere.
|
||
|
||
### Empty readings say why they're empty
|
||
|
||
The power telemetry panel showed four blanks whether your firmware
|
||
doesn't expose those sensors, or the reading genuinely failed. It now
|
||
tells you which, so you're not left guessing whether something is broken.
|
||
|
||
### All 18 languages are actually finished
|
||
|
||
Every language reported "100% translated" — but the check only asked
|
||
whether a phrase was *present*, not whether it had been *translated*.
|
||
Roughly 300 phrases per language were sitting there as untouched
|
||
English. All of them are now translated, and the check was rebuilt so
|
||
this can't quietly happen again.
|
||
|
||
Also fixed: five English phrases that displayed literal nonsense like
|
||
"5 rule5" and "Save 3 edit3" instead of counting properly.
|
||
|
||
---
|
||
|
||
## 5.1.0
|
||
|
||
**Mobile got a proper rethink, and a long-standing hardware bug is
|
||
fixed.**
|
||
|
||
### Drive sensors actually report your storage
|
||
|
||
The Hardware screen showed 0 B for every drive — internal SSD, M.2
|
||
expansion and USB alike. The console was sending the numbers all along;
|
||
the app was reading them under the wrong names and quietly throwing them
|
||
away. It now shows real capacity, usage and temperature.
|
||
|
||
If you have a console still running an older payload, it keeps working —
|
||
no need to re-send anything by hand.
|
||
|
||
### The "More" tab on Android is a real screen now
|
||
|
||
It used to be the desktop sidebar squeezed into a pop-up sheet: a narrow
|
||
column stranded in the middle of the screen, tiny tap targets, and two
|
||
scrollbars fighting each other.
|
||
|
||
It's now a full screen with a **search box** — type a few letters to jump
|
||
to any of the 38 screens. Search also matches the English name, so it
|
||
works whatever language you use the app in. Your console switcher stays
|
||
pinned at the top, and the Android back button behaves normally.
|
||
|
||
### Everything is easier to tap
|
||
|
||
Buttons, switches, checkboxes, tabs and dropdowns across every screen
|
||
were below the recommended minimum touch size — most of them by just a
|
||
few pixels, which is exactly enough to make them annoying. All 41 screens
|
||
were measured at phone size and fixed. Desktop is unchanged.
|
||
|
||
### The Game Hub is finished
|
||
|
||
Launch actually launches, and the Play button stays disabled until the
|
||
game is really up, so a second tap can't kill a title that's still
|
||
starting. The Cheats, Saves, Add-ons and Updates tabs are live. Media
|
||
explains why per-game filtering isn't possible (the PS5 files captures by
|
||
date, not by game) and links you to the full browsers.
|
||
|
||
### Translations
|
||
|
||
The 152 most-used strings — navigation, Game Hub, More, Processes, FTP,
|
||
Backup, accessibility settings — are now translated in all 18 languages
|
||
instead of falling back to English.
|
||
|
||
---
|
||
|
||
## 5.0.0
|
||
|
||
**The v5 redesign is here.** This release delivers the complete v5
|
||
component primitive library — all 28 primitives from the master spec
|
||
are now implemented — plus Badge adoption across 8 screens.
|
||
|
||
### New component primitives (6 new)
|
||
|
||
- **`Table` / `DataGrid`** (§22.13) — WAI-ARIA Grid pattern with
|
||
arrow-key cell navigation, sortable headers, selectable rows,
|
||
sticky header, and progressive-render virtualization (no new
|
||
dependency). Full keyboard support: arrows, Home/End, Ctrl+Home/End.
|
||
- **`ContextMenu`** (§22.16) — right-click (desktop) / long-press
|
||
(mobile) menu. Portaled to `document.body`, viewport-clamped,
|
||
WAI-ARIA Menu pattern with arrow keys, type-ahead, Home/End.
|
||
- **`Spotlight`** (§22.21) — Games-tab hero overlay. Full-screen on
|
||
mobile, large panel on desktop. Blurred backdrop from game icon.
|
||
Focus trap, Escape-to-close, primary + secondary action bar.
|
||
|
||
### Evolved primitives (3 evolved)
|
||
|
||
- **`Modal`** (§22.26) — new `size="full"` for fullscreen modals,
|
||
new `variant="sheet"` for bottom-sheet-on-mobile / centered-on-
|
||
desktop. New `anim-sheet-up` CSS animation with proper reduced-
|
||
motion / data-motion guards.
|
||
- **`Menu`** (§22.27) — new primitive with full WAI-ARIA Menu
|
||
keyboard nav (arrows, type-ahead, Home/End, Escape). `OverflowMenu`
|
||
now wraps `Menu` internally — all existing overflow menus gain
|
||
proper keyboard navigation for free.
|
||
- **`EmptyState`** (§22.29) — new `body` (ReactNode), `hero`,
|
||
`role` ("status" / "alert"), and `headingTag` props. `min-height`
|
||
fixed to canonical 55vh (was the 72vh v4 bug). Full backward
|
||
compat with the v4 `icon` / `message` props.
|
||
|
||
### Badge adoption (8 screens)
|
||
|
||
Migrated 13 raw `<span className="rounded-full …">` pills to the
|
||
typed `<Badge>` primitive across About, Activity, InstallPackage,
|
||
Processes, Profile, Volumes, and Payloads (CatalogPanel +
|
||
PlaylistsPanel). Badges now use consistent semantic tones (good,
|
||
warn, accent, neutral) and variants (soft, outline).
|
||
|
||
### i18n
|
||
|
||
- 3 new translation keys: `table_select_all`, `table_select_row`,
|
||
`table_loading_more`.
|
||
- i18n allowlist regenerated for 18 languages.
|
||
|
||
### What's NOT in this release
|
||
|
||
- **Card adoption** — 249 raw `rounded-lg border …` card patterns
|
||
still exist across screens (Upload, FileSystem, Library are the
|
||
top offenders). Deferred to a follow-up mechanical refactor.
|
||
- **MC4 encrypted XML cheat format** — still requires AES-256-CBC.
|
||
- **PS Store scraping** — still broken (client-side rendering).
|
||
|
||
---
|
||
|
||
## 4.6.1
|
||
|
||
Hotfix release — eliminates 7 compiler warnings that appeared when
|
||
building `ps5upload-core` for the Android target (aarch64-linux-android).
|
||
No user-visible behavior changes.
|
||
|
||
- **Fixed: Android-target dead-code warnings** — three helper functions
|
||
(`format_from_index`, `parse_index_line`, `cheat_install_path`) and
|
||
four variables (`q`, `repo`, `filename`, `region`) were only
|
||
referenced inside `#[cfg(not(target_os = "android"))]` blocks, making
|
||
them dead code on Android. All are now properly cfg-gated. The
|
||
engine workspace, desktop crate, and Android target now all compile
|
||
with **zero warnings**.
|
||
|
||
---
|
||
|
||
## 4.6.0
|
||
|
||
Maintenance release — CI gate fixes, code hygiene, and dependency
|
||
health. No user-visible behavior changes; this release supersedes the
|
||
v4.5.0 artifacts that were published from a commit failing the i18n
|
||
and rustfmt gates.
|
||
|
||
- **Fixed: i18n coverage gate** — 55 `tr()` call-site keys that were
|
||
referenced in code but missing from `en.ts` have been added. Without
|
||
them, those strings rendered their English fallback for every locale
|
||
(including non-English) and could never be translated. The
|
||
`i18n-known-missing.json` allowlist was regenerated in the explicit
|
||
`{missing, stale}` object form so stale-key tracking works going
|
||
forward.
|
||
- **Fixed: cargo fmt gate** — 8 engine source files reformatted
|
||
(`cargo fmt --all`). Purely cosmetic (line wrapping, module
|
||
ordering); zero logic changes.
|
||
- **Fixed: Dependabot alerts** — all open Rust crate vulnerabilities
|
||
(openssl, rustls-webpki, lz4_flex, bytes, rand, time, glib) are now
|
||
resolved in the lockfiles.
|
||
|
||
---
|
||
|
||
## 4.5.0
|
||
|
||
Android & mobile UX release — comprehensive touch device fixes,
|
||
soft-keyboard handling, fan curve persistence, and accessibility
|
||
improvements across the entire app.
|
||
|
||
- **Fixed: fan curve now loads from the PS5 on screen open** — the
|
||
FanCurve screen fetches the persisted threshold via a new
|
||
`fan_curve_get` engine command on mount, so you see the actual saved
|
||
curve instead of defaults. A persistence info banner communicates
|
||
that the curve survives reboots and rest mode.
|
||
- **Soft-keyboard avoidance** — added `interactive-widget=resizes-content`
|
||
to the viewport meta, switched all modal/sheet max-heights from `vh`
|
||
to `dvh`, and added a `visualViewport` listener that scrolls the
|
||
focused input into view when the keyboard appears. No more hidden
|
||
text fields behind the on-screen keyboard.
|
||
- **Numeric keyboard hints** — all numeric inputs (ports, temperatures,
|
||
fan duty, speed caps, counts) now have `inputMode="numeric"` or
|
||
`"decimal"`, and all IP address fields have `inputMode="decimal"`.
|
||
Android shows the numeric keypad instead of the full alphabet.
|
||
- **Fixed: Toggle no longer distorted on touch devices** — the global
|
||
44px touch-target rule was stretching the Toggle switch into a tall
|
||
rectangle. The CSS now excludes `role="switch"` and properly targets
|
||
`role="tab"`, `role="menuitem"`, `role="option"`, etc. instead of
|
||
blindly catching every `<button>`.
|
||
- **Minimum text size enforced** — all sub-12px text bumped to `text-xs`
|
||
(12px). Bottom nav labels, badges, hints, section headings, and
|
||
metadata text are now comfortably legible on mobile.
|
||
- **Reactive responsive tier** — Sheet and Drawer components now use the
|
||
`useResponsiveTier()` hook instead of a one-shot `matchMedia` check,
|
||
so they respond correctly to orientation changes and window resizing.
|
||
- **Accessibility: aria-labels on icon buttons** — all icon-only buttons
|
||
in PlaylistsPanel, NotificationInbox, and ConsoleTabs now have proper
|
||
`aria-label` attributes for screen readers.
|
||
|
||
---
|
||
|
||
## 4.4.0
|
||
|
||
UI modernization release — redesigned navigation, 28 reusable UI
|
||
components, full i18n compliance, accessibility infrastructure, and a
|
||
unified visual language across every screen.
|
||
|
||
- **New 5-tab navigation** — Home, Games, Files, Console, Tasks. The old
|
||
40-item sidebar is now a clean tab rail (desktop) and bottom nav
|
||
(mobile), with secondary destinations in a "More" drawer.
|
||
- **Home dashboard** — new landing page with console status, quick
|
||
actions, recent activity, storage, and telemetry widgets.
|
||
- **28 UI component primitives** — Spinner, Badge, ErrorCard, EmptyState,
|
||
Callout, Card, Tabs, Tooltip, Drawer, Sheet, Toaster, LiveRegion,
|
||
SkipNav, and more. All screens now use a shared design system instead
|
||
of ad-hoc markup.
|
||
- **Unified loading & error states** — every screen's spinner and error
|
||
display now uses the centralized `Spinner` and `ErrorCard` components
|
||
for consistent visual feedback and screen-reader announcements.
|
||
- **Full i18n compliance** — all hardcoded UI strings migrated to the
|
||
translation system. Zero lint errors from the `no-untranslated-jsx`
|
||
rule.
|
||
- **Accessibility infrastructure** — WCAG 2.2 AA groundwork: skip-nav,
|
||
live regions, reduced-motion support, 44px touch targets, keyboard
|
||
navigation, and focus management.
|
||
- **Mobile groundwork** — pull-to-refresh, bottom tab nav, back-stack
|
||
support, and haptic feedback hooks.
|
||
- **Engine fix** — `cheats.rs` compile fix for Android (NDK rustc type
|
||
inference).
|
||
|
||
---
|
||
|
||
## 4.3.2
|
||
|
||
Version-number fix — the v4.3.0 and v4.3.1 releases shipped code fixes
|
||
but forgot to bump the version strings in the desktop app, engine, and
|
||
payload. This release aligns all version numbers across every component.
|
||
|
||
- **Fixed: all version strings now report `4.3.2`** — `package.json`,
|
||
`tauri.conf.json`, both `Cargo.toml`s, `VERSION` file,
|
||
`package-lock.json`, and the payload's `PS5UPLOAD2_VERSION` define.
|
||
- **Includes all v4.3.1 fixes** (cheat engine crash fix).
|
||
|
||
---
|
||
|
||
## 4.3.1
|
||
|
||
Critical cheat engine crash fix.
|
||
|
||
- **Fixed: cheat engine payload crash.** The `cheat_file_t` struct was
|
||
~1.1 MB and was allocated on the stack in 5 functions. The PS5
|
||
payload thread stack is too small for this, causing an immediate
|
||
stack overflow and payload crash whenever any cheat endpoint was
|
||
called (`/cheats/get`, `/cheats/toggle`, etc.). All 5 stack
|
||
allocations were changed to heap (`malloc`/`free`), and the struct
|
||
limits were reduced (`MAX_MODS_PER_FILE` 256→64, `MAX_MEM_ENTRIES`
|
||
64→32).
|
||
- **Stress-tested: 42,000+ commands across two PS5s with zero crashes.**
|
||
|
||
---
|
||
|
||
## 4.3.0
|
||
|
||
Major feature release — cheats, SDK changer, FTP, TMDB, fan curves,
|
||
firmware spoofing, backup/restore, remote play, and more.
|
||
|
||
- **Cheat engine** — Download, toggle, and apply cheats from
|
||
GoldHEN/etaHEN repositories. Supports JSON, SHN, and MC4 formats.
|
||
Background watcher auto-applies patches when a game starts.
|
||
- **SDK Changer** — Scan installed titles and patch/restore the SDK
|
||
version in `param.sfo`. Includes restore-from-backup.
|
||
- **FTP server** — Full FTP server on the PS5 with `SITE MTRW` support
|
||
for remounting system partitions read-write.
|
||
- **TMDB integration** — Fetch and store game cover art and metadata
|
||
from TMDB. Region selector for accurate results.
|
||
- **Fan curve control** — Custom fan curve with temperature/duty
|
||
points. Persisted across reboots.
|
||
- **Firmware spoofing** — View and spoof the reported firmware version.
|
||
- **Backup/restore** — Snapshot, list, restore, and delete system
|
||
backups.
|
||
- **Remote Play** — Enable/disable and check Remote Play status.
|
||
- **Notifications** — List persistent notifications.
|
||
- **Activity log** — Transfer log (renamed from "Activity") tracks all
|
||
file operations with DB query support.
|
||
- **Docker & Android builds** — Engine runs in Docker; full Android
|
||
build support.
|
||
- **FTP thread persistence fix** — Stopping FTP (`port:0`) before
|
||
redeploying the payload prevents zombie threads.
|
||
|
||
---
|
||
|
||
## 4.1.8
|
||
|
||
Dependency maintenance + security hardening from full codebase audit.
|
||
|
||
- **Upgraded: docker/login-action v4 → v4.5.2** (CI workflow).
|
||
- **Upgraded: mdns-sd 0.20.2 → 0.20.3** (Tauri mDNS discovery).
|
||
- **Upgraded: lucide-react 1.26.0 → 1.27.0** (icon library).
|
||
- **Upgraded: eslint 10.7.0 → 10.8.0** (dev dependency).
|
||
- **Security: replaced `rm` command's broken path normalizer with
|
||
`is_path_allowed()`.** The old code had a logic bug in its
|
||
`/./` collapsing logic (the `while` condition was tautological)
|
||
and an incomplete banned-prefix list missing `/system_data` and
|
||
`/dev`. A path like `/data/../system_ex/foo` could bypass the
|
||
system-path refusal. The fix delegates to the same battle-tested
|
||
`is_path_allowed()` function used by all other destructive
|
||
operations — it rejects `..` traversal, validates against
|
||
`realpath()`, and covers all writable roots correctly.
|
||
- **Fixed: `snprintf` truncation overflow in `power_telemetry`,
|
||
`appdb_raw_scan`, and `proc_modules` handlers.** All three used
|
||
`n += snprintf(buf + n, cap - n, ...)` without checking whether
|
||
`snprintf` returned a value larger than the remaining space. If
|
||
the output was ever truncated, `n` would exceed `cap`, making
|
||
`cap - n` wrap to a huge value (as `size_t`), causing subsequent
|
||
writes past the buffer. In practice the current data fits in the
|
||
buffers, but the pattern was a latent vulnerability.
|
||
- **Fixed: integer overflow in `PackPlanner::record_size`** (engine).
|
||
`size as usize` silently truncated on 32-bit builds; now uses
|
||
`usize::try_from` + saturating arithmetic to match the guard in
|
||
`materialise_body`.
|
||
- **Fixed: overflow in `read_split_range`** (engine). `prefix +
|
||
part_size` could overflow `u64`; `take as usize` could truncate on
|
||
32-bit. Now uses `checked_add` and `usize::try_from`.
|
||
- **Fixed: UFS2 directory entry `name_len` could exceed `rec_len`**
|
||
(pkg parser). A crafted UFS2 image could declare `name_len = 1000`
|
||
inside a 16-byte record, reading past the record boundary into
|
||
adjacent entries. Now validates `name_len + 8 <= rec_len`.
|
||
|
||
## 4.1.7
|
||
|
||
Security: upgrade react-router to v8.3.0 (CVE fix) and fix transitive
|
||
`brace-expansion` DoS vulnerability.
|
||
|
||
- **Upgraded: react-router-dom 7.18.1 → react-router 8.3.0.** The
|
||
`react-router-dom` package was removed in v8; all imports now come
|
||
from `react-router`. Fixes the high-severity CSRF bypass advisory
|
||
(GHSA) affecting RSC mode. Our app uses a standard Vite SPA
|
||
(BrowserRouter + Routes), so the v8 migration was import-only —
|
||
no API or behavior changes.
|
||
- **Fixed: brace-expansion transitive dependency.** `npm audit fix`
|
||
bumped the vulnerable `brace-expansion` package (DoS via unbounded
|
||
expansion).
|
||
|
||
## 4.1.6
|
||
|
||
Fix: pkg install stuck at "installing" on unverifiable firmware (issue #230).
|
||
|
||
- **Fixed: installs never completed on FW 12.xx.** On firmware where
|
||
`app.db` is unreadable (FW 12.20+), `verify_launchable` returns
|
||
`Unsupported` (`None`), which prevented the synthetic-DONE grace
|
||
period from firing. The install would succeed on the PS5 but the UI
|
||
showed "installing" indefinitely. The grace verdict now fires on
|
||
both `None` (unverifiable) and `Some(false)` (not yet registered).
|
||
- **Fixed: Tier-0 worker installs not recognised as synthetic-DONE.**
|
||
`is_synthetic_done_tier` now includes `APPINST_VIA_TIER0_FLAG`
|
||
(0x10000000). Installs via the Tier-0 worker path were missing the
|
||
synthetic-DONE classification, causing the same stuck-at-installing
|
||
symptom.
|
||
|
||
## 4.1.5
|
||
|
||
Security hardening patch for the system file read feature (4.1.4).
|
||
|
||
- **Fixed: symlink escape in unsafe-read mode.** The `is_safe_unsafe_read_path`
|
||
check now restricts reads to the three documented system partitions
|
||
(`/system`, `/system_data`, `/system_ex`) only. Previously, any absolute
|
||
path without `..` was accepted in unsafe mode, meaning virtual filesystems
|
||
like `/dev`, `/proc`, `/kernel` were reachable. Additionally, the check now
|
||
resolves symlinks via `realpath()` and re-validates the canonical path —
|
||
a symlink inside `/data` pointing to a forbidden location is rejected,
|
||
mirroring the same CWE-59 guard used for writable-root operations.
|
||
- **Fixed: `is_unsafe_read_request` whitespace tolerance.** The JSON
|
||
`"unsafe":true` flag matcher now tolerates whitespace around the colon
|
||
(e.g. `"unsafe": true`). Previously only the exact no-space form matched;
|
||
a future client emitting spaced JSON would silently fail to engage
|
||
unsafe mode.
|
||
- **Fixed: `is_profile_avatar_read_path` dotdot check.** Replaced bare
|
||
`strstr(p, "..")` with the component-aware `path_has_dotdot_component()`,
|
||
consistent with the rest of the codebase. Legitimate filenames containing
|
||
`..` (e.g. `file..bak`) are no longer false-positive rejected.
|
||
|
||
## 4.1.4
|
||
|
||
New: optional system-file read access for the File Browser.
|
||
|
||
- **New: download system files from read-only partitions (issue #241).**
|
||
A new toggle in Settings → **Allow downloading system files** (OFF by
|
||
default) lifts the writable-root allowlist for FS_READ/FS_HASH
|
||
operations only. When enabled, the File Browser can download files
|
||
from `/system/common/lib`, `/system_data/priv`, `/system_ex`, and
|
||
other read-only system partitions — useful for dumping `.sprx`
|
||
modules, fonts, and other system assets. This is strictly read-only:
|
||
destructive operations (delete, move, chmod, mkdir, copy, write,
|
||
mount) ignore the flag entirely and always enforce the full
|
||
allowlist. Path traversal (`..`) guards still apply even in unsafe
|
||
mode. When the toggle is off and a system path is requested, the
|
||
error message points the user to the Settings toggle rather than
|
||
giving a generic access-denied error.
|
||
|
||
## 4.1.3
|
||
|
||
Fixes for PS4 backward-compat title resolution, Windows installer deps, and
|
||
several dependency security advisories.
|
||
|
||
- **Fixed: PS4 BC titles show as bare IDs in the games list.** PS4 titles
|
||
running under backwards compatibility store their names only in `app.db` —
|
||
not in the per-title appmeta folder. When sqlite symbols are unavailable
|
||
(FW 5.10 and 9.60), the payload now falls back to a raw file scan of
|
||
`app.db`, extracting title names directly from the SQLite B-tree pages.
|
||
The engine's title resolver now has a three-tier fallback chain:
|
||
`param.json` → `param.sfo` → `app.db` query.
|
||
- **Fixed: Windows 10 installer missing WebView2 runtime.** The NSIS
|
||
installer now bundles the WebView2 bootstrapper so first-run on Windows 10
|
||
no longer silently fails when the Edge WebView2 runtime isn't present.
|
||
- **Fixed: Remote Play error masking + JXR screenshot signature.** Remote
|
||
Play cancellation no longer masks the real `sceRemoteplayInitialize` error
|
||
code, and JXR (JPEG XR) screenshots are correctly identified by their
|
||
file signature rather than relying on extension alone.
|
||
- **Security: dependency updates.** Patched `quinn-proto`, and bumped the
|
||
engine and frontend dependency groups to clear outstanding Dependabot
|
||
advisories.
|
||
|
||
## 4.1.2
|
||
|
||
A payload reliability patch. Fixes a helper crash ~5 seconds after install
|
||
rejection on firmware 10.xx, and adds Polish language support.
|
||
|
||
- **Fixed: helper dies after install rejection on FW 10.00+ (issue #152).**
|
||
The payload's install-init authid threshold was `fw_major >= 11` — use the
|
||
`SYSTEM` authid only on FW 11+, `ShellCore` everywhere below. But FW 10.xx
|
||
has the same `SYSTEM`-authid gate for `sceAppInstUtilInitialize`: calling it
|
||
under `ShellCore` leaves Sony's installer daemon (IPMI) half-wedged. The
|
||
immediate `InstallByPackage` returns `0x80B2116F`, and roughly 5 seconds
|
||
later Sony's installer watchdog `SIGKILL`s our process — exactly the
|
||
"helper dies after I click install" symptom in the bug bundle. The threshold
|
||
is now `fw_major >= 10`, matching what the standalone DPI daemon already
|
||
does on all firmwares. Users on FW 10.xx+ who push the updated payload from
|
||
`Connection → Send payload` will stop seeing the post-reject crash.
|
||
- **Fixed: outdated "Connect to your PS5" description (issue #208).** The
|
||
connection-screen blurb still said the helper stays loaded only until rest
|
||
mode — which was true before the 4.1.0 auto-reconnect release but reads as
|
||
stale now. Rewritten to point at the auto-reconnect toggle (on by default).
|
||
- **New: Polish (Polski) language support.** Thanks @heni0xyz for the
|
||
contribution. Selectable from the language picker; the completeness test
|
||
now covers `pl` alongside the other 18 locales.
|
||
|
||
## 4.1.1
|
||
|
||
A security and reliability patch. Path-traversal and buffer-overflow fixes,
|
||
Android mDNS discovery that actually works, and a hardened CI pipeline.
|
||
|
||
- **Fixed: path traversal in payload runtime.** The PS5 payload's
|
||
`is_path_allowed()` validation had edge cases that could allow crafted
|
||
paths to escape the writable-roots allowlist. Tightened the validation
|
||
logic to prevent directory traversal via `..` sequences and symlink-style
|
||
overrides.
|
||
- **Fixed: buffer overflow in `drive_sensors.c` (CRITICAL).** A fixed-size
|
||
buffer in the drive-sensors path could overflow when parsing SMART
|
||
responses with unexpectedly long model/serial fields. Capped the copy
|
||
length to prevent stack corruption on the PS5 side.
|
||
- **Fixed: `fan_curve.c` truncation.** Fan-curve duty-cycle values could be
|
||
truncated when converting between integer formats, potentially applying a
|
||
slightly wrong fan speed at certain temperature points. Added proper
|
||
bounds checking on the conversion path.
|
||
- **Fixed: async unmount cleanup.** An unmount initiated while a transfer
|
||
was still winding down could leave stale state, blocking the next mount.
|
||
The unmount path now properly awaits async cleanup before signaling
|
||
completion.
|
||
- **Fixed: localStorage credentials sweep.** 57 call sites storing sensitive
|
||
data (engine URL, tokens) in `localStorage` were audited and migrated to
|
||
Electron/Tauri `safeStorage` (encrypted at rest with OS keychain) where
|
||
applicable, or cleared after use.
|
||
- **New: Android mDNS discovery via MulticastLock.** Most Android handsets
|
||
silently filter Wi-Fi multicast frames at the firmware level to save
|
||
power, so mDNS-based PS5 discovery found nothing even though the console
|
||
was right there on the same LAN. The app now acquires a
|
||
`WifiManager.MulticastLock` around the mDNS browse via JNI, so multicast
|
||
frames (224.0.0.251:5353) are delivered reliably. The LAN-sweep fallback
|
||
still catches what mDNS misses.
|
||
- **Improved: Android CI now builds both arm64 and armv7.** The release
|
||
pipeline ships an armv7 APK, but CI only ever built arm64 — so an armv7
|
||
breakage could ship undetected. Both ABIs are now compiled on every PR.
|
||
- **Improved: NDK version pinned in CI.** The Android NDK version was
|
||
picked by taking the newest installed on the runner image, which meant a
|
||
runner-image rotation could silently break the build (new clang warnings
|
||
→ errors, libc symbol changes). The NDK is now pinned to a known-good
|
||
major version (r27) with a fallback + warning.
|
||
- **Improved: Android release failures are no longer silent.** The
|
||
`build-android` release job kept `continue-on-error` (a flaky APK build
|
||
shouldn't block the desktop release) but now emits a prominent warning
|
||
annotation so the failure is never missed.
|
||
- **Security: dependency updates.** `@babel/core` 7.29.0 → 7.29.7 (CVE
|
||
fix), `tokio` 1.52 → 1.53 (engine + client), `lucide-react` 1.24 → 1.25,
|
||
Docker build stage `node` 22 → 26-alpine.
|
||
- **Improved: Docker hardening.** The engine Docker image now runs as a
|
||
non-root user with a read-only filesystem and minimal capabilities.
|
||
- **Improved: SPDX license identifiers.** All source files now carry
|
||
proper SPDX license identifiers for clarity and license-scanning tools.
|
||
- **Improved: CI webui existence check.** A CI step now verifies the
|
||
`webui/` folder exists (rust-embed v8 requires it at compile time) before
|
||
building, with a clear error message instead of a cryptic compile failure.
|
||
- **New: `npm run dist:android` script.** Convenience script to build a
|
||
dual-ABI (arm64 + armv7) debug APK locally.
|
||
|
||
---
|
||
|
||
## 4.1.0
|
||
|
||
A reliability release. The desktop app now recovers on its own when the PS5's
|
||
helper goes offline, and PS4-format saves get a clear restore warning.
|
||
|
||
- **New: automatic reconnection after rest mode and network drops.** When the
|
||
PS5's helper goes offline — rest mode wake, a WiFi switch, a payload crash —
|
||
the desktop app now periodically tries to re-send it in the background. The
|
||
helper, your pinned fan threshold, and the upload port come back by
|
||
themselves once the console is reachable again, without clicking Connect. On
|
||
by default (Settings → "Reconnect automatically after rest mode / network
|
||
drops"). Browser sessions are unaffected (no bundled ELF to push). Includes
|
||
an immediate re-probe on the browser `online` event for fast recovery after a
|
||
network change.
|
||
- **Fixed: PS4 save restore warning.** PS4-format saves (PS4 games running via
|
||
backward compatibility on PS5) use sealed PFS images. The PS4 emulator caches
|
||
save data internally, so a raw file copy back to the console doesn't always
|
||
trigger a remount — a restored PS4 save may not appear in-game until the game
|
||
is closed/reopened or the console is restarted. The Saves screen now shows a
|
||
warning banner for PS4 saves, the restore confirmation dialog includes a
|
||
PS4-specific note, and the post-restore notification hints about the
|
||
workaround. *(Issue #198.)*
|
||
|
||
---
|
||
|
||
## 4.0.0
|
||
|
||
A major release. Four new PS5 features, a self-hosted browser web UI, and a
|
||
big reliability fix so the desktop app always opens.
|
||
|
||
- **New: Remote Play PIN generator.** Generate a Remote Play PIN and see the
|
||
account ID needed to pair Chiaki / pxplay — right from ps5upload, without
|
||
digging through the PS5's hidden Remote Play settings. Shows the PIN, a
|
||
countdown timer, and pairing status; account ID is auto-detected from the
|
||
console.
|
||
- **New: Fan Curve editor.** Beyond the single-threshold fan pinning, you can
|
||
now define a multi-point temperature → duty-cycle curve for smoother fan
|
||
behavior. The curve is pinned through the same hardware path as the fixed
|
||
threshold, so it survives game launches and is re-applied automatically.
|
||
- **New: Persistent on-PS5 notifications.** Payload-side events (backups, fan
|
||
actions, errors) are now written to a store on the console that survives
|
||
payload restarts, so the next time you connect you see everything that
|
||
happened while you weren't looking.
|
||
- **New: Backup & restore snapshots.** Tag-based snapshots of files or
|
||
directory trees on the PS5 (e.g. the app database), with list, restore, and
|
||
delete — a safety net before risky operations.
|
||
- **New: self-hosted browser web UI.** The engine can now serve the full UI in
|
||
a browser, published as a Docker image
|
||
(`ghcr.io/phantomptr/ps5upload-engine-webui`). Native-only features (host
|
||
file/folder pickers, etc.) are gracefully gated out in the browser client.
|
||
- **New: drive sensors + permanent fan speed status.** Per-drive SMART/temp
|
||
readings and a persistent fan-speed indicator on the Hardware screen.
|
||
- **New: user ID management.** Create and delete local PS5 user accounts from
|
||
the Profile screen.
|
||
- **Fixed: the desktop app now always opens.** If the engine's default port
|
||
(19113) is held by something the app can't reclaim — e.g. a standalone
|
||
`ps5upload-engine` a user launched by mistake — the app now falls back to a
|
||
free port instead of failing to start, and the UI follows the engine to
|
||
wherever it actually bound.
|
||
- **Changed: cleaner sidebar.** The navigation was consolidated to remove a
|
||
duplicate "System" heading and group everything under clear sections.
|
||
- Plus dependency updates and a round of v4.0.0 audit fixes.
|
||
|
||
---
|
||
|
||
## 3.4.0
|
||
|
||
A reliability and feature release. The big themes: transfer and install
|
||
robustness on all firmwares, a new hardware sensor, the web UI engine image,
|
||
and a payload code consolidation.
|
||
|
||
- **New: M.2 NVMe temperature sensor.** The Dashboard and Hardware screens now
|
||
show the temperature of an installed M.2 SSD expansion drive, alongside the
|
||
existing CPU and SoC readings. The value is read from the same SoC sensor
|
||
sweep that already feeds the SoC temp — zero extra API calls. An empty slot
|
||
simply shows no reading.
|
||
- **Fixed: transfer stream ID collisions.** The FNV-1a hash used to identify
|
||
active transfer streams could collide across concurrent jobs, causing one
|
||
transfer to accidentally cancel another. The hash is now correctly computed
|
||
and the cancel registry hardened so a dead stream's cancel signal can never
|
||
fire. *(Issue #164.)*
|
||
- **Fixed: RFC 9110 suffix byte-ranges.** Range requests of the form
|
||
`bytes=-N` (last N bytes) were rejected; now handled correctly per spec,
|
||
so more HTTP clients can resume partial downloads from the engine.
|
||
- **Fixed: dashboard polling starved transfers.** The Dashboard's 5-second
|
||
auto-poll was never paused during an active upload, adding unnecessary load
|
||
and occasionally slowing transfers on slower connections. Polling now
|
||
pauses while any transfer is in flight and resumes on completion.
|
||
- **Fixed: package install settle fraction too aggressive.** The install
|
||
progress tracker considered an install "settled" at 97%; raised to 99% so
|
||
the UI doesn't report success before Sony's installer has actually finished
|
||
writing data.
|
||
- **Fixed: DPI daemon authid on FW 11+.** The fallback install daemon now
|
||
correctly acquires ShellCore credentials on firmware 11 and above (not just
|
||
below 11), using a shared two-tier firmware detection routine. *(Issues #152
|
||
and #164.)*
|
||
- **Fixed: a batch of payload hardening fixes.** Profile loading now rejects
|
||
symlinks (`O_NOFOLLOW`), `sys_time` uses `pthread_once` for thread-safe
|
||
one-time init, and the shellui RPC handler fixed for copyout overflow and
|
||
stack buffer issues.
|
||
- **New: `ps5upload-engine-webui` Docker image.** The engine + full React web
|
||
UI is now published as a separate multi-arch (amd64 + arm64) image on GHCR,
|
||
in lockstep with the plain engine image on every release. No manual
|
||
`Dockerfile.webui` build needed.
|
||
- **Internal: authid/firmware code consolidated.** The ShellCore/System-Install/
|
||
JB authid constants and the firmware-major detection logic — previously
|
||
triplicated across bgft.c, register.c, and the DPI daemon — are now in a
|
||
single shared header (`payload/include/authid.h`). The DPI daemon now uses
|
||
the full two-tier firmware parser, matching the rest of the codebase.
|
||
- **Internal: removed unused frontend dependencies.** `@tauri-apps/plugin-fs`
|
||
and `@tauri-apps/plugin-shell` npm packages were never imported by any
|
||
frontend code; removed to shrink the install footprint. (The Rust plugins
|
||
remain registered.)
|
||
- **Internal: engine URL lock poison recovery.** The RwLock guarding the
|
||
runtime-configurable engine URL now recovers from poison instead of
|
||
propagating a panic, so a thread failure elsewhere can't wedge the settings.
|
||
|
||
## 3.3.26
|
||
|
||
A reliability release focused on fixing package installs on older firmware (FW < 11).
|
||
|
||
- **Fixed: package installs that failed with error 0x80B21106 on FW < 11.** The install
|
||
helper was wrapping local file paths in `file://` before handing them to Sony's
|
||
installer, but the installer's URI parser rejects that scheme on older firmware and
|
||
returns a parser error — producing hollow, metadata-only installs that would never
|
||
launch. Bare local paths are now passed through directly, matching the standalone DPI
|
||
daemon's behaviour. *(HW-verified on a PS5 Pro FW 9.60 and a PS5 Fat.)*
|
||
- **Fixed: the DPI fallback daemon now self-escalates to the right credentials.** On
|
||
FW < 11, `InstallByPackage` needs ShellCore authority to succeed. The daemon (loaded
|
||
fresh via the elfldr port) now self-escalates its own credentials on startup and swaps
|
||
to ShellCore before each install, so the fallback path lands real data instead of
|
||
silently failing. *(Issues #152 and #164 — the "helper dies ~4s after a rejected
|
||
install" symptom is gone.)*
|
||
- **Fixed: Stream (beta) no longer offered on firmware where it hangs.** Stream install
|
||
pulls a `.pkg` straight from your PC over HTTP without staging it first, but on
|
||
FW < 11 Sony's PlayGo pre-flight check never returns without kernel patches we don't
|
||
have for those firmwares. The Stream button is now disabled with an explanatory
|
||
tooltip when the connected PS5 is on FW < 11 — use the normal Upload → Install (staged)
|
||
instead, which works perfectly everywhere.
|
||
- **New: persistent fan-control threshold.** Set a custom fan speed on the Fan Control
|
||
tab and it survives a reboot — the payload restores it at boot.
|
||
|
||
## 3.3.25
|
||
|
||
A big feature + reliability release.
|
||
|
||
- **Fixed: PKG updates that crashed the on-console helper.** On some firmware,
|
||
trying to install a game update could kill the PS5-side helper a few seconds
|
||
later, so the update never applied. The root cause was the install-fallback
|
||
daemon calling Sony's installer without initialising it first. It now
|
||
initialises properly (with a boot-timing wait and retry), so a rejected
|
||
update no longer takes the helper down. *(Verified on real FW 5.10 + 9.60
|
||
hardware — the helper survives now.)*
|
||
- **New: manage ps5upload from a web browser.** The engine can serve the full
|
||
app over HTTP, so a NAS/Docker user can drive their PS5 from any browser on
|
||
the LAN — no desktop app needed.
|
||
- **New: install a .pkg straight from your PC — "Stream (beta)".** Installs a
|
||
package over HTTP without staging the whole file on the PS5 first, so you can
|
||
install even when disk space is tight. Labeled beta; the normal
|
||
upload-then-install path is still the reliable default.
|
||
- **New: your own payload repos.** Add any GitHub/Gitea repo to the Payloads
|
||
tab and ps5upload tracks its releases and caches the ELF locally — no more
|
||
keeping a pile of `.elf` files on your PC.
|
||
- **New: repo-based playlists.** A payload playlist can now pull from a repo at
|
||
run time instead of a local file, so a boot sequence needs no local files.
|
||
- **New: video clips.** Browse and download the PS5's gameplay video clips,
|
||
like the Screenshots tab.
|
||
- **New: "Install all" for packages.** Install every staged package in one tap,
|
||
in the right order (base game → update → DLC).
|
||
- **New: rest mode after uploads.** Optionally put the PS5 to sleep once its
|
||
upload queue finishes — handy for an overnight queue. Off by default.
|
||
- **New: restore a save straight from a USB drive** on the PS5 (the counterpart
|
||
to Save-to-USB), plus **find unused games** on the Installed Apps screen —
|
||
sort by play time and surface the ones you haven't touched, then uninstall.
|
||
- **Fixed: a dead payload in the catalogue** (the Lapy JB Daemon source had
|
||
moved) and a batch of **UI text that always showed in English** even in other
|
||
languages.
|
||
- Routine dependency and CI updates.
|
||
|
||
## 3.3.24
|
||
|
||
- **New: back up a PS5 save straight to a USB drive.** From the Saves screen you
|
||
can now copy a save (or all of them) to a USB drive plugged into the PS5 — each
|
||
backup lands in its own timestamped folder so nothing gets overwritten. There's
|
||
a configurable save path in Settings too. *(Thanks to @Twice6804 for the
|
||
contribution.)*
|
||
- **Fixed: a few payloads in the catalogue showed "Not Found."** ps5-app-dumper
|
||
and Itemzflow had moved to different repos and were 404ing in the Payloads
|
||
catalogue — both now point at their current homes.
|
||
- Routine dependency and CI updates.
|
||
|
||
## 3.3.23
|
||
|
||
- **Fixed: game updates that couldn't install on newer firmware.** When the PS5's
|
||
in-app installer turned an update away (a common first step on firmware 11/12),
|
||
the tool was deleting the staged update file a split second too early — so the
|
||
fallback installer (the one that actually lands updates) had nothing left to
|
||
install. The update file is now kept until the whole install cascade has had its
|
||
turn, so updates can fall through to the path that works. Your base game is never
|
||
touched either way. *(Needs a final confirmation on real firmware-12 hardware.)*
|
||
- **Fixed: the "Close game" button did nothing on some firmware.** On firmware
|
||
12.20, the PS5's clean "close app" call is rejected, and the tool was giving up
|
||
there instead of trying its backup way of stopping the game. It now falls through
|
||
to the backup stop so the button actually closes the game.
|
||
- **Faster uploads while the app is open.** The Installed Apps and Library screens
|
||
quietly check what's running on your PS5 every few seconds. That check shares a
|
||
channel with uploads, and on big multi-part games (exfat/ShadowMount dumps) it
|
||
could drag transfer speed down. Those checks now pause while an upload to that
|
||
console is running, and resume the moment it finishes.
|
||
- Routine dependency and CI updates.
|
||
|
||
## 3.3.22
|
||
|
||
- **See what's playing, and stop it.** Installed Apps now shows a "Playing" badge
|
||
on whatever game is currently running, and the Play button turns into **Close
|
||
game** so you can stop it right from the app (with a confirm — it's the same
|
||
as quitting on the console).
|
||
- **More patience when launching a game.** A first launch (just-installed, or a
|
||
cold start) can take a while to come up. Pressing Play now shows "Starting…"
|
||
and waits for the game to actually appear before saying it's playing — and it
|
||
won't let you fire a second launch into a game that's still starting (which is
|
||
what could knock it back down). If it's taking a while, you get a calm "give
|
||
it a moment" note rather than an error.
|
||
|
||
## 3.3.21
|
||
|
||
- **Fixed: moving files from USB to the internal SSD crashed the console.** Cut
|
||
& paste from a USB drive to internal storage was reliably kernel-panicking the
|
||
PS5 (a hard crash + reboot). The tool was asking the console to *rename* the
|
||
file across drives, which this kernel can't do — it panics instead of
|
||
reporting the error. ps5upload now detects a cross-drive move up front and
|
||
completes it the safe way (copy, then remove the original) — the same thing it
|
||
already did for copies. **Hardware-verified: the move that used to crash the
|
||
console now completes without a hitch.** (Same fix applied to the shell tab's
|
||
`mv` command.)
|
||
|
||
## 3.3.20
|
||
|
||
- **Installs wait for the PS5 to be ready — fewer "couldn't be applied" errors.**
|
||
Right after an install the PS5 has a brief recovery moment (the screen-black
|
||
blink); starting the next install during it was getting rejected with a
|
||
transient error, so you'd have to wait and retry by hand. ps5upload now checks
|
||
the console is settled before it installs, and if the PS5 says it's busy it
|
||
waits and retries automatically instead of failing — so back-to-back updates
|
||
and DLC just work. (Shows "Waiting for the PS5 to be ready…" while it waits.)
|
||
|
||
## 3.3.19
|
||
|
||
- **"Installed" no longer leaks between consoles.** If you staged the same .pkg
|
||
on more than one PS5 and installed it on just one, the others wrongly showed
|
||
it as already installed (Reinstall). Each console now tracks its own installs,
|
||
so a package reads as installed only on the console you actually installed it
|
||
on.
|
||
|
||
## 3.3.18
|
||
|
||
- **Cancel a single upload without stopping the whole queue.** The item that's
|
||
actively uploading now has a Cancel button. It stops just that transfer (the
|
||
partial upload stays resumable) and the rest of that console's queue keeps
|
||
going — handy when one big item is hogging the line. ("Stop" still halts
|
||
everything as before.)
|
||
- **A ready-to-run engine Docker image.** The self-hosted transfer engine is
|
||
now published as an official multi-arch image at
|
||
`ghcr.io/phantomptr/ps5upload-engine` (`:latest` or pin `:<version>`), so you
|
||
can run it on a NAS or home server without building from source. As always:
|
||
the engine has no password — keep it on a trusted LAN, never the internet.
|
||
Thanks to @Twice6804 for the contribution.
|
||
|
||
## 3.3.17
|
||
|
||
UI polish pass — tighter on phones and small windows.
|
||
|
||
- **"More actions" menus never run off the bottom of the screen.** A row's ⋮
|
||
menu now opens upward when it's near the bottom edge and scrolls inside itself
|
||
if it's very long, instead of spilling past the window.
|
||
- **No more scrolling the page behind a dialog.** When a pop-up (a file/image
|
||
preview, an upload prompt, any modal) is open, the content behind it stays
|
||
put — especially noticeable on touchscreens.
|
||
- **More of the app is ready for translation.** The new "Install from USB /
|
||
external drive" labels are now in the translation catalog, and a check was
|
||
added so future text can't quietly go missing from it.
|
||
- Verified the whole app stays clean with no cut-off or off-edge content across
|
||
phone, tablet, and desktop widths.
|
||
|
||
## 3.3.16
|
||
|
||
- **You control when USB / external drives are scanned.** The "Install from USB
|
||
/ external drive" section has a new **"Automatically scan when this tab
|
||
opens"** checkbox. Leave it on (the default) and it works as before; turn it
|
||
off and nothing is scanned until you click **Scan** — handy when no drive is
|
||
plugged in, or to skip the check each time you open the tab. The Scan button
|
||
is always there for an on-demand look.
|
||
|
||
## 3.3.15
|
||
|
||
- **An installed update or DLC now shows "Reinstall."** After you install a
|
||
patch or add-on from the Install Package tab (or via the upload queue), its
|
||
row correctly reads "Installed · Reinstall" instead of still offering
|
||
"Install." Base game, update, and DLC are each tracked on their own — the
|
||
console can only confirm the base game is present, so ps5upload now remembers
|
||
the specific updates and DLC you've installed itself (and remembers across
|
||
restarts).
|
||
|
||
## 3.3.14
|
||
|
||
- **Upload progress no longer overshoots the file size.** If an upload's
|
||
connection blipped and resumed, the progress could read past 100% — e.g.
|
||
"36 GiB / 24.6 GiB". The progress now caps at the file size (the upload itself
|
||
was always fine; this was just the counter double-counting resent bytes).
|
||
|
||
## 3.3.13
|
||
|
||
Smoother, smarter installs — especially when queueing a game with updates + DLC.
|
||
|
||
- **Installs now go in the right order: base game → update → DLC.** Queue a game
|
||
with its updates and add-ons and they install base-first, so an update or DLC
|
||
never tries to install before the game it belongs to (which wasted the upload
|
||
and space). Items within the same kind keep the order you added them.
|
||
- **A heads-up before an install that won't fit.** ps5upload now checks free
|
||
space up-front and, if a package is clearly too big for what's left, tells you
|
||
to free up space *before* you wait through a doomed install (estimate-based —
|
||
the real installed size can vary a little).
|
||
- **No more spurious "Delete failed" after a successful install.** The staged
|
||
package is now removed with a brief wait + retry (the PS5 can hold the file
|
||
for a moment right after installing), and if cleanup still can't happen it's
|
||
left quietly for "Clear finished" instead of throwing an error at you.
|
||
- **Queues of small updates/DLC no longer stall on FW 12.** After each install
|
||
the app waits for the console to settle (the brief "screen goes black" blip on
|
||
FW 12) before starting the next item's upload.
|
||
|
||
## 3.3.12
|
||
|
||
- **Download a PS5 file or folder straight to a `.zip`.** In the File System
|
||
browser, each entry now has a "Download as ZIP" button next to Download. It
|
||
streams the file(s) from the PS5 and zips them on the fly — no temporary copy,
|
||
no waiting for a separate compress step. Great for grabbing a save folder, a
|
||
homebrew folder, or a single big file as one tidy archive.
|
||
|
||
## 3.3.11
|
||
|
||
Installs you can watch from anywhere, plus a few handy touches.
|
||
|
||
- **Installs now show in the activity bar at the bottom, with a live %.** Start
|
||
an install and it appears in the bottom activity strip just like uploads and
|
||
downloads do — so you can browse the rest of the app and still see what's
|
||
progressing and how far along it is.
|
||
- **A toast pops on the PS5 itself when an install finishes** (in addition to
|
||
the in-app notification), so you get the "done" confirmation on the console
|
||
screen even when the app isn't in front of you.
|
||
- **Drag a payload file onto the Send file screen** to fill in its path — no
|
||
need to click Choose every time.
|
||
- **The File System returns to /data when a folder no longer exists.** Land on a
|
||
remembered path that's since been deleted (or an unplugged drive) and it now
|
||
drops you back to /data with a note, instead of a stuck error.
|
||
|
||
## 3.3.10
|
||
|
||
Smoother installs and a few UI fixes.
|
||
|
||
- **Installs no longer cry failure while the PS5 is still installing.** On newer
|
||
firmware the PS5 registers a game and then downloads/extracts it in the
|
||
background (its own "Downloading…" tile). ps5upload used to give up after two
|
||
minutes and show a scary "nothing was installed" error even though the install
|
||
was fine. It now waits much longer for the console to finish, the message
|
||
(if it ever does time out) explains the background install instead of alarming
|
||
you, and you get a notification when a title finishes and is ready to play.
|
||
- **The Install Package screen no longer flashes "Install" on every package**
|
||
for a split second when you open it — it remembers which titles are installed.
|
||
- **Fixed the Play button on disc-image titles** being squeezed and clipped to
|
||
"Pla" on wide windows.
|
||
|
||
## 3.3.9
|
||
|
||
A clearer, more helpful "Install from USB / external drive" section.
|
||
|
||
- **The USB / external drive section is redesigned.** It used to hide itself
|
||
whenever a scan found nothing — so it "popped in" only after results arrived,
|
||
and when a drive was empty the whole thing (Refresh button included)
|
||
disappeared, leaving no way to look again. It's now always present with clear
|
||
**Scanning…**, **nothing found**, and **list** states, a refresh that's always
|
||
available, and a short explanation of what it does (it copies the package onto
|
||
the console first — your drive's copy is left untouched — then installs it).
|
||
- **External packages now show real details.** Each one is read on demand for
|
||
its cover art, real game title, version (e.g. `v01.02`), and an Update/DLC
|
||
badge — so two packages for the same game (a base and its update) are finally
|
||
distinguishable instead of both just showing a code. The list still appears
|
||
instantly; the details fill in as it reads each package. (PS5-native packages
|
||
that can't be read keep their filename.)
|
||
- **Your uploaded packages show their version too.** The package version (and
|
||
whether it's a base game, update, or DLC) now appears on packages already in
|
||
your library, read straight from the package on the console — so it shows even
|
||
for packages you added before this update, with no need to re-upload them.
|
||
- **PS4 game updates now install.** Applying a game's update (its patch) used
|
||
to fail on some firmware with a confusing "PKG header — corrupt or wrongly
|
||
named" — the update shares the base game's ID, and the usual install path
|
||
couldn't apply it. ps5upload now routes updates through the PS5's own update
|
||
installer, which applies the update on top of your game **without touching the
|
||
base** (hardware-confirmed: a Jak X update applied with the 3.8 GB base game
|
||
fully intact). If an update still can't apply — usually because it doesn't
|
||
match your installed version — you get a clear message instead of a scary one,
|
||
and your base game is never at risk.
|
||
- **Installing some USB / external packages no longer fails to register.**
|
||
Packages whose name already includes the game's ID were staged under the wrong
|
||
filename and rejected by the PS5; ps5upload now reads the real ID from the
|
||
package first and stages it correctly.
|
||
|
||
## 3.3.8
|
||
|
||
Tell a game's updates apart at a glance — and stop an update from looking
|
||
"installed" when it isn't.
|
||
|
||
- **An update/DLC no longer shows "Installed · Reinstall" just because the base
|
||
game is installed.** A PS4 update shares the base game's title id, so once the
|
||
base was on the console its never-installed update inherited the "installed"
|
||
badge and a "Reinstall" button. Add-ons now always read as installable —
|
||
only the base game shows as installed (its install state is the one the PS5
|
||
can actually confirm).
|
||
- **Each package now shows its version and original filename.** Updates share a
|
||
ContentID *and* a title, so they used to look identical apart from the
|
||
"update" badge. The library now shows the real package version (e.g. `v01.04`,
|
||
read straight from the package) plus the filename you uploaded — so you can
|
||
tell `[v01.00]` from `[v01.04]` at a glance. (Newer uploads carry this; an
|
||
already-staged package shows it again once re-uploaded.)
|
||
|
||
## 3.3.7
|
||
|
||
The 3.3.6 data-loss fix now actually covers PS4 game updates — plus clearer
|
||
messaging when an install fails.
|
||
|
||
- **Installing a PS4 game's update (patch) can no longer delete the base game.**
|
||
3.3.6 added this protection, but it relied on the update being labelled as one
|
||
in a way the install couldn't always see — so a PS4 patch still looked like a
|
||
full game, reinstalled the shared ID, and **wiped the installed base**
|
||
(hardware-confirmed on two consoles: a Jak X patch deleted its 3.8 GB base).
|
||
The app now reads the real "update vs. full game" flag **straight from the
|
||
package on the console** at install time, so an update is recognised no matter
|
||
how it reached the PS5 (uploaded, copied from USB, or picked from the file
|
||
browser) — while a normal full-game re-install still works as before. Verified
|
||
on real hardware, internal *and* extended storage: the base game stays put and
|
||
an update that can't apply on top simply fails harmlessly.
|
||
- **Clearer guidance when an install fails or stalls.** A failed install no
|
||
longer blames free space, tells you the empty tile it left behind is safe to
|
||
delete, and points to the PS5's own Package Installer for stubborn packages.
|
||
An "out of space" error from the PS5 now notes it can mean fragmented storage
|
||
even when space is free (rebuild the database from Safe Mode).
|
||
- **The Library no longer flickers.** When nothing was running, the "Running
|
||
apps" panel flashed in and out every few seconds as it refreshed; it now stays
|
||
hidden until there's actually something to show.
|
||
- **The Avatar changer shows the selected user's current avatar.** The picture
|
||
box now loads the chosen user's existing avatar by default (instead of a blank
|
||
placeholder), so you can see what's there before replacing it. (Picking
|
||
different users was already supported.)
|
||
- **Screenshots show thumbnails.** Each row now shows a small preview of the
|
||
shot instead of a generic icon. Previews decode lazily as you scroll (PS5
|
||
screenshots are HDR JPEG XR, so this is desktop-only — same as Convert/Preview)
|
||
and are cached so each decodes once.
|
||
- **Run the engine separately / point the app at a remote engine.** You can now
|
||
host the transfer engine elsewhere (including a tiny Docker image) and set its
|
||
URL in Settings; the app talks to it instead of the bundled one. Game/app
|
||
cover art now loads from a remote engine too. Thanks @Twice6804. *(Security:
|
||
the engine's API has no password — only use the "allow extra IP" option on a
|
||
trusted home network, never expose the engine to the internet.)*
|
||
|
||
## 3.3.6
|
||
|
||
A data-loss fix: installing a game's update can no longer delete the game.
|
||
|
||
- **Installing an update (patch) can never overwrite or delete your base game.**
|
||
A game's update shares the same ID as the game itself, so the installer could
|
||
end up *re-installing that ID* — wiping the installed game instead of patching
|
||
it (hardware-confirmed: a 26 GB game was deleted by installing its update). An
|
||
update now installs **only** via the safe path that applies it on top; if that
|
||
can't apply it, the update **fails harmlessly and your game stays completely
|
||
intact** — never replaced or removed. Base games and DLC are unaffected.
|
||
*(If an update won't install through the app on your firmware, install it from
|
||
the PS5's own Package Installer — your game is safe either way.)*
|
||
- **Installed Apps cards line up evenly.** Tiles with a longer two-line name no
|
||
longer knocked their neighbours out of alignment.
|
||
|
||
## 3.3.5
|
||
|
||
USB install fixes — no more stuck "downloading" tile, and a copy that survives a flaky connection.
|
||
|
||
- **Installing a big game from USB no longer leaves a broken "Downloading…"
|
||
tile.** 3.3.4 tried to install straight off the USB drive, which made the PS5
|
||
register the game as a download it then streamed off USB at a crawl (a 25 GB
|
||
game showed *"Downloading… 50 hours left"* and left an undeletable tile eating
|
||
space). Installs now always copy to internal storage first and never trigger
|
||
that. *(If you have a stuck Bloodborne/other tile from 3.3.4: delete it from
|
||
the PS5 to reclaim the space — your PKG on the USB drive is untouched.)*
|
||
- **The USB→internal copy survives connection drops.** A 25 GB copy used to die
|
||
the instant the PS5 connection blipped — even though the console was still
|
||
copying fine. The copy is now tracked by how much data has actually landed, so
|
||
a dropped connection (or Wi-Fi hiccup) no longer aborts a healthy copy, and a
|
||
**live percentage** shows throughout. *(For very large games, uploading from a
|
||
PC is still the most reliable path — that transfer is fully resumable.)*
|
||
|
||
## 3.3.4
|
||
|
||
Install verification + extended-storage fixes.
|
||
|
||
- **Installs to an extended / M.2 SSD are recognized correctly.** If your PS5
|
||
installs games to an extended drive (not internal storage), the app used to
|
||
report the install as *failed* — even though the game installed perfectly and
|
||
plays — because it only looked for the game in internal storage. It now
|
||
confirms an install by the actual data written to **any** drive, so
|
||
extended-storage installs are no longer wrongly flagged as failures. (If you
|
||
hit this before: the game was fine all along — just launch it.)
|
||
- **A "hollow" install still can't masquerade as success.** The app confirms a
|
||
title's content actually landed before reporting success, and tells you
|
||
honestly if it didn't — now measured by what was really written, so it's
|
||
accurate on every drive *and* still catches a genuinely empty "dead tile."
|
||
- **Firmware-aware installs.** On newer firmware (11.xx/12.xx) the installer runs
|
||
under the correct system authority so content lands properly; on FW 9.60 and
|
||
below the proven path is unchanged.
|
||
- **Big games install from USB without the slow copy.** Installing a PKG from a
|
||
USB drive used to copy the entire file to internal storage first — a single
|
||
blocking step that, for a 25 GB game, could run for hours and then fail. The
|
||
app now installs **directly from the USB path** when it can, falling back to a
|
||
copy only if needed, with a live install **percentage** throughout.
|
||
|
||
## 3.3.3
|
||
|
||
A big-install data-loss fix, plus the in-app updater.
|
||
|
||
- **Large PKGs (25 GB, 100 GB, 200 GB+) install reliably now.** The tool used to
|
||
decide an install was "done" after a fixed ~100-second timer, then delete the
|
||
uploaded PKG — but Sony's installer reads that PKG for the *entire* install,
|
||
which for a big game takes many minutes. So a 25 GB game would upload, get
|
||
deleted mid-install, and leave you with no game and no PKG (the reported
|
||
Bloodborne case on FW 12.20). The tool now **watches the install actually
|
||
finish** instead of guessing: it tracks the title landing on the console and
|
||
the bytes writing to disk, with no size limit, and only deletes the staged PKG
|
||
once the install is genuinely complete. A live install **percentage** shows
|
||
while a big title installs in the background.
|
||
- **Stalled installs keep your PKG.** If an install stops making progress before
|
||
it finishes, the tool now says so and **keeps the PKG on the PS5** so you can
|
||
retry — it never deletes a package for an install that didn't complete.
|
||
- **In-app update works on Android (and everywhere).** "Download update" used to
|
||
fail on Android (it tried to launch a desktop-style opener); it now opens the
|
||
release via the proper system handler on every platform, with OS/arch detected
|
||
automatically.
|
||
- **Processes screen won't offer to kill the tool itself.** The helper's own
|
||
process is now marked and its Kill/Restart actions disabled — no more
|
||
confusing "Operation not permitted" when trying to kill it.
|
||
|
||
## 3.3.2
|
||
|
||
A data-loss fix.
|
||
|
||
- **"Auto Delete after installation" is now actually respected.** With it OFF,
|
||
an uploaded PKG was still being deleted after install — because the engine
|
||
always cleaned up the staged file regardless of the setting. It now keeps the
|
||
PKG when you ask it to. The same fix stops the File System → Install action
|
||
from deleting a PKG you point it at in place.
|
||
- **Better install logging.** Bug reports now capture your Auto Install / Auto
|
||
Delete settings and log the exact install/delete decision for each PKG, so
|
||
issues like this are diagnosable without a repro.
|
||
|
||
## 3.3.1
|
||
|
||
A polish + fixes release.
|
||
|
||
- **Hardware temperatures now show °F as well as °C** (e.g. `62°C / 144°F`).
|
||
- **Bigger checkboxes.** Checkboxes everywhere (Settings included) were tiny;
|
||
they're now comfortably sized and accent-coloured, and larger still on touch.
|
||
- **File System drive list is consistent.** `/data` used to look dimmer than
|
||
your USB/external drives; now every drive reads equally clearly, with just the
|
||
border + icon marking which is active/external/internal.
|
||
- **Quieter PS5 kernel log.** The Hardware screen used to query `hw.physmem`,
|
||
which the PS5 rejects and logs as an error on every read. It now uses only
|
||
approved sources for the same RAM figure — no more log spam.
|
||
- Fixed a handful of UI strings that weren't translatable.
|
||
|
||
## 3.3.0
|
||
|
||
A big feature release.
|
||
|
||
- **Process manager (new Processes tab).** A live task-manager for your PS5:
|
||
see every running process with its memory and thread count, **Kill** anything,
|
||
or **Restart** a game (closes + relaunches it). User payloads and games show by
|
||
default; a toggle reveals system processes, and killing a system or game
|
||
process asks first. Hardware-verified.
|
||
- **Quick bring-up.** One tap on the Connection screen runs your bring-up
|
||
payloads (kernel R/W, SMP), sends the helper, and waits until the PS5 is ready
|
||
— instead of sending each one by hand every boot. Configure the chain in
|
||
Payloads → Playlists.
|
||
- **Auto-loader.** Pick a playlist that runs by itself whenever a PS5's helper
|
||
becomes ready (after first-time setup or a reconnect).
|
||
- **Drag-and-drop payloads into a playlist.** Drag one or more payloads onto the
|
||
Playlists panel to build a playlist in one gesture (or "From files…").
|
||
- **Unified file/folder picker.** The Upload screen's two buttons are now one
|
||
**Browse** menu, and drag-drop auto-detects file vs folder.
|
||
- **Game art on the upload queue.** Queue rows now show the game's cover, name,
|
||
and PS4/PS5 badge so you can tell what's what at a glance.
|
||
- **Faster Library.** Big libraries no longer lag on search and refresh —
|
||
rows are memoized, the list reconciles in place, search is debounced, and
|
||
thumbnails load as you scroll.
|
||
- Plus a sweep of bug, logging, performance, and cross-platform fixes from a
|
||
multi-perspective review (kill/playlist failures now leave a trace in bug
|
||
reports, drag-drop hit-testing, process-poll throttling, and more).
|
||
|
||
## 3.2.9
|
||
|
||
- **Shutdown now fully powers off the PS5.** The Shutdown button was putting the
|
||
console into rest mode instead of turning it off, because the API it used
|
||
respects the system's rest-mode setting. It now does a true power-off (use the
|
||
separate **Rest mode** button if you want standby). Hardware-verified.
|
||
|
||
## 3.2.8
|
||
|
||
- **More large-Text-size layout fixes on the Payloads screen.** 3.2.6 fixed the
|
||
send form at the top; this fixes the rest. The payload catalog cards no
|
||
longer crush a payload's name to one letter per line, and playlist steps keep
|
||
the payload path visible instead of hiding it behind the controls. Verified
|
||
across a range of screen sizes and text scales.
|
||
|
||
## 3.2.7
|
||
|
||
- **Download files from mounted disc images.** Browsing a ShadowMount+ game
|
||
under `/mnt/shadowmnt` worked, but downloading a file from it (e.g.
|
||
`eboot.bin`) failed with "path not allowed". You can now read/download files
|
||
from mounted disc images.
|
||
- **Preview SDR screenshots.** Consoles that save screenshots as `.jpg` (rather
|
||
than HDR `.jxr`) hit a "not a JPEG XR file" error on Preview. `.jpg`/`.png`
|
||
screenshots now preview and save directly; only HDR `.jxr` shots are
|
||
converted.
|
||
|
||
## 3.2.6
|
||
|
||
- **Properly fixed the Payloads "Send file" screen at large Text sizes.** The
|
||
previous attempt only fixed part of it — on some tablets (especially with a
|
||
bigger Text-size setting) the form still collapsed and the labels wrapped one
|
||
letter per line. The whole screen now reflows correctly at any text size and
|
||
window width. Verified across a range of phone, tablet, and desktop sizes.
|
||
|
||
## 3.2.5
|
||
|
||
A stability + bug-fix release from a round of user reports.
|
||
|
||
**The helper is much better behaved.**
|
||
|
||
- It no longer risks interfering with your *other* homebrew. A safety bug
|
||
could, after a reboot, target an unrelated tool you'd autoloaded (a cheat
|
||
loader, nanoDNS) when clearing a stale instance — it now only ever touches
|
||
an instance from the current boot session.
|
||
- "Helper keeps dropping randomly" is fixed: the app no longer flips to
|
||
"Helper isn't running" on a single missed status check, and the helper
|
||
itself survives transient network hiccups instead of exiting.
|
||
- Spurious "Delete failed" errors after installing a package (when
|
||
auto-delete is on) are gone — a file that's already gone or still briefly
|
||
in use is no longer treated as a hard error.
|
||
|
||
**UI fixes.**
|
||
|
||
- Deleting a PS5 in Manage PS5s now shows the confirmation dialog on top
|
||
instead of just dimming the background.
|
||
- Larger Text-size settings no longer break the Payloads send screen
|
||
layout.
|
||
- The Library no longer flickers a wall of placeholder rows during a scan.
|
||
- Installed Apps gained an **Open folder** button (for homebrew/disc titles)
|
||
that jumps to the app's folder in the File System browser.
|
||
|
||
**Payloads.**
|
||
|
||
- Added **CheatRunner** to the catalog.
|
||
- Added a **search box** to the payload catalog.
|
||
- A payload source that's temporarily unreachable now shows a quiet note
|
||
instead of a loud error, so it no longer looks broken or removed.
|
||
|
||
## 3.2.4
|
||
|
||
A big polish release built from real-user feedback and a full UI/UX pass.
|
||
|
||
**Fewer reasons to restart your PS5.** If the helper gets stuck, the app now
|
||
detects and force-clears the previous instance on its own before sending the
|
||
new one — so you usually don't have to reboot the console or kill it by hand
|
||
anymore. Verified on FW 5.10 and 9.60.
|
||
|
||
**Packages & USB.**
|
||
|
||
- Install a `.pkg` straight from the **File System** browser — right where the
|
||
file sits, no detour through the scan.
|
||
- PS4 packages now show up reliably with the correct PS4/PS5 badge, and
|
||
scanning USB/external drives for packages is much faster.
|
||
- The "copying to your PS5" notice now explains it's a temporary stage that's
|
||
removed after install, so it won't fill up your SSD.
|
||
|
||
**Save data & screens.**
|
||
|
||
- Save data shows the **game's name** next to its ID (e.g. "Saros
|
||
(PPSA07631)"), and missing save thumbnails now fall back to cover art.
|
||
- Unplugging a USB drive in the File System browser drops you back to `/data`
|
||
instead of throwing an error.
|
||
- Installed Apps no longer flashes a "needs ShadowMount+" warning on load, and
|
||
Play is clearly disabled (not just failing) for disc games that need it.
|
||
|
||
**A clearer, more consistent app.**
|
||
|
||
- **Payloads** moved next to **Connection** in the sidebar — sending the helper
|
||
is a setup step, so it now lives with "get started".
|
||
- Added an **automatic update check** (on by default) that notifies you when a
|
||
new version is out.
|
||
- Tidier loading states, consistent modals, clearer labels and terminology, a
|
||
redesigned bottom status bar, and accessibility improvements throughout — in
|
||
all 18 languages.
|
||
|
||
## 3.2.3
|
||
|
||
- **Clearer status bar.** The strip along the bottom used to cram five
|
||
things together (`engine | Fat | v3.2.0 | PS5 | FW 5.10`), which was hard
|
||
to read. It now shows just the two things that matter at a glance — the
|
||
**Engine** and your **PS5** (with its firmware) — neatly separated. The
|
||
console name dims when it's not connected, and the helper version and
|
||
kernel details are tucked into the tooltip when you hover.
|
||
|
||
## 3.2.2
|
||
|
||
- **New look, and a new theme.** The two main themes are now **PS5 Dark** and
|
||
**PS5 Light** — coloured after the console's own black- and white-plastic
|
||
panels with the PlayStation-blue accent. And there's a brand-new **Rose**
|
||
theme: warm, bright, and soft, built around a bold rose accent. Pick any of
|
||
them (plus OLED) in **Settings → Appearance**.
|
||
- **Tidier releases.** The engine now carries the same version number as the
|
||
app, and each release also ships the engine binary on its own for every
|
||
platform.
|
||
|
||
## 3.2.1
|
||
|
||
- **Save Data now shows game cover art.** The save thumbnails were trying to
|
||
read each save's own icon, which lives inside a sealed container and always
|
||
failed — so every save showed a plain icon and the log filled with warnings.
|
||
They now use the game's cover, which actually displays.
|
||
- **No more harmless-but-noisy errors in the log.** Opening Install Package
|
||
logged a string of `502` errors while checking for update/DLC folders that
|
||
didn't exist yet. The check is now done without those false errors.
|
||
|
||
## 3.2.0
|
||
|
||
- **Install games straight from a USB or external drive.** Plug a drive with
|
||
`.pkg` files into the PS5 and install them right from the app — no uploading
|
||
from your computer first. A new **External Packages** section finds them
|
||
automatically. (The app copies the package onto the console before installing,
|
||
because the PS5's installer can't read a USB drive directly.)
|
||
- **PS4 / PS5 badges on every package**, so you can tell at a glance which
|
||
console a `.pkg` is for.
|
||
- **Installs are honest about whether they actually worked.** The app now
|
||
confirms the game really landed on the console before saying "installed" — and
|
||
reworked which install method it uses under the hood, so packages that used to
|
||
quietly fail now install correctly. (Verified end-to-end on real hardware
|
||
across multiple firmwares.)
|
||
- **Base games and their updates no longer clash.** A game and its update share
|
||
the same ID; the app keeps them apart so one never overwrites the other, and
|
||
warns you if you try to install an update before its base game is on the
|
||
console.
|
||
- **A friendlier, more visual interface.** Preview a screenshot before
|
||
downloading it, search inside a single game instead of the whole console, see
|
||
all your drives at the top of the File System tab, get a heads-up banner when a
|
||
new version is out, and reach quick actions (Open folder, Copy details) from a
|
||
menu on each package. Game artwork shows up in more places.
|
||
- **Adjust the text size.** If the app renders too large (common on some Android
|
||
phones with a big display-size setting), Settings now has a Text size control
|
||
that resizes the whole interface.
|
||
- **Now officially covers firmware up to 12.70.**
|
||
|
||
## 3.1.6
|
||
|
||
- **Renaming a profile sticks now.** Renaming a console user updated the name
|
||
everywhere except the PS5 home screen, which kept showing the old name after a
|
||
reboot — even though the console still said the new name was "already taken."
|
||
The rename now also updates the home-screen display name so the two match, and
|
||
your avatar is left untouched. (Verified end-to-end on a real console.)
|
||
- **No more shutdown moving a game from an external SSD to internal.** A
|
||
cross-volume move falls back to a local copy, and the faster copy path added
|
||
in 3.1.4 could flood the kernel with un-flushed writes during a multi-GB game
|
||
and panic the console. The copy now flushes on a fixed cadence so that backlog
|
||
can't build up. (Stress-tested with a sustained multi-GB copy on real
|
||
hardware.)
|
||
- **Package installs stop claiming success when they didn't.** On FW 12.x an
|
||
install could be accepted and then fail in the background, leaving a
|
||
"corrupted" tile while the app showed "Installed." The app now waits for the
|
||
install to actually finish and surfaces a real error — pointing you to the
|
||
PS5's own Package Installer — instead of a false success. The Cancel button
|
||
can no longer interrupt a real install mid-way either.
|
||
- **Android: bug reports and exports save again.** Saving a bug report, crash
|
||
bundle, settings / search / stats / log export, or save-data backup failed on
|
||
Android ("No such file or directory"). They now land in your Downloads folder,
|
||
each with its own filename.
|
||
- **A pile of reliability and UI fixes.** Switching consoles no longer leaves
|
||
stale info on the Profile, Hardware, Screenshots, or Upload screens; failed
|
||
exports now tell you instead of silently doing nothing; the USB autoloader no
|
||
longer gets stuck after a failed scan; the command palette scrolls to keep the
|
||
selected item in view; `.rar` uploads land in a correctly named folder; the
|
||
engine re-extracts itself if its file goes missing; and the settings backup
|
||
now captures every preference (and stops losing your play-time on restore).
|
||
Plus internal fixes to large uploads, the transfer engine, and broader
|
||
translation coverage.
|
||
|
||
---
|
||
|
||
## 3.1.5
|
||
|
||
- **Stop a running upload, for real.** The Stop button on the Activity page now
|
||
actually halts the transfer on the spot — before, it only stopped *showing*
|
||
the upload while the PS5 kept receiving it in the background. Works for both
|
||
one-off uploads and queued ones; whatever already landed stays on the PS5, so
|
||
you can resume later if you want. (Verified on a real console mid-transfer.)
|
||
|
||
---
|
||
|
||
## 3.1.4
|
||
|
||
- **Game details open on Android now.** Tapping a game's **Details** in the
|
||
Library did nothing on phones — the detail popup was being positioned to a
|
||
scrolled area instead of the screen, so it opened off-screen. It now opens
|
||
centered, every time.
|
||
- Internal: green CI again (code formatting, translation coverage, and the
|
||
RAR test fixtures) — no user-facing change.
|
||
|
||
---
|
||
|
||
## 3.1.3
|
||
|
||
- **Each PS5 keeps its own upload, even when you switch.** Pick a file and set
|
||
up an upload for one console, hop to another console in the top tabs, then
|
||
hop back — your picked file, password, and options are right where you left
|
||
them. The cut/copy clipboard and your place in the File System are remembered
|
||
per console too, so switching never loses what you were doing.
|
||
- **No more accidental reloads.** Right-clicking no longer pops the WebView's
|
||
Back / Reload / Inspect menu (which could restart the app mid-upload and make
|
||
it look like everything stopped), and the reload shortcuts are blocked in the
|
||
packaged app. Right-click still works inside text fields for copy/paste.
|
||
|
||
---
|
||
|
||
## 3.1.2
|
||
|
||
- **Windows packaging fixed.** The new `.rar` support pulled in a library that
|
||
didn't link cleanly on Windows, which broke the 3.1.0 / 3.1.1 Windows builds
|
||
(so those never shipped). Fixed — this release packages on every platform
|
||
again, and includes everything from 3.1.0 and 3.1.1 below.
|
||
|
||
---
|
||
|
||
## 3.1.1
|
||
|
||
Fixes and polish from your feedback.
|
||
|
||
- **Community payloads download again.** Fixed the download for NP Fake
|
||
Sign-in and the other earthonion payloads (their host moved), and **added
|
||
Ghostpad** (virtual controller / input redirection) to the payload list.
|
||
- **Library details open on your phone.** On Android the game row's
|
||
Play / Details / ⋯ buttons could be pushed off the edge of the screen and
|
||
were untappable — the row now wraps so every action is reachable.
|
||
- **A clearer Activity log.** Clearing history no longer removes uploads that
|
||
are still running; you can **delete individual entries**; each row has a
|
||
**View** button that shows the full details; and an upload that hasn't
|
||
started moving bytes now says **"Preparing…"** (compressed `.rar`/`.7z`
|
||
archives are extracted on your PC first, so there's a wait before the speed
|
||
appears) instead of a confusing "Uploading…" with no progress.
|
||
- **Upload button tidy-up.** The button just says **Upload** again; which PS5
|
||
you're sending to is shown as a small chip next to it, so a long console
|
||
name no longer stretches the button.
|
||
- **Profile changes tell you to reboot.** After changing a console avatar or a
|
||
local username, a note reminds you the change only shows on the PS5 after a
|
||
restart.
|
||
|
||
---
|
||
|
||
## 3.1.0
|
||
|
||
More formats, faster big uploads, and packages that install themselves.
|
||
|
||
- **Upload `.7z` and `.rar` archives, not just `.zip`.** Pick a compressed
|
||
game dump and it's decompressed on your PC and streamed in — it lands
|
||
already extracted on the PS5. RAR also handles **multi-part sets** (just
|
||
pick the first part — the rest are found automatically) and
|
||
**password-protected** archives. (RAR is desktop-only; Android does `.zip`
|
||
and `.7z`.)
|
||
- **Packages install themselves — in your queue.** Add a `.pkg` on the Upload
|
||
tab and it uploads, installs, and (optionally) deletes the staged copy as
|
||
one step, right alongside your folders, images, and archives. Add it to the
|
||
queue and it ends up playable — no separate trip to the Install Package tab
|
||
(which is still there as a package manager).
|
||
- **Big uploads stay fast the whole way.** Fixed a slowdown where a large
|
||
single file — like a 150 GB disk image — would crawl to a few KB/s partway
|
||
through and only recover if you restarted. It now holds full speed from
|
||
start to finish.
|
||
- **Every PS5 keeps its own everything.** Switch consoles and the library,
|
||
uploads, saves, and installed-apps lists all switch with you — no leftover
|
||
data from the other console, and no risk of a Restore or Uninstall landing
|
||
on the wrong PS5 mid-switch.
|
||
- **Profile pictures + rename local users.** Set a console avatar and rename
|
||
offline accounts right from the Profile screen.
|
||
- **Text fits everywhere.** Fixed text wrapping one letter per line in tight
|
||
or large-font layouts (the Register overflow menu and others) — on every OS.
|
||
- **Steadier under the hood.** Fixed a payload crash during profile reads and
|
||
tightened a few rough edges.
|
||
|
||
---
|
||
|
||
## 3.0.0
|
||
|
||
The big redesign. Same tool, sharper look, fewer steps, fewer surprises.
|
||
|
||
- **A fresh look across the whole app.** Deeper, richer dark theme with real
|
||
depth and a more vivid PlayStation blue; refreshed light and OLED themes;
|
||
smooth animations on dialogs, menus, and page changes (and the four
|
||
PlayStation shapes as the new loading mark). Every button and field now
|
||
shows a visible focus ring for keyboard users, and motion respects your
|
||
system's reduced-motion setting.
|
||
- **Keep your PS5 awake — your choice.** Settings → Upload now has a
|
||
three-way "Keep the PS5 awake" option: **Off**, **During transfers**
|
||
(default, protects long uploads from rest mode), or **Always while
|
||
connected** — your PS5 never auto-enters rest mode while the app is open.
|
||
Putting the console to rest manually always still works. A small ⚡ in the
|
||
status bar shows when always-on is active. Verified on real consoles.
|
||
- **Games go straight to your home screen.** Upload a game folder and it's
|
||
registered on the PS5 automatically when the transfer finishes (works from
|
||
the queue too) — no more hunting for "Register" in the Library. You can
|
||
turn this off per upload, and the menu is now called **"Add to home
|
||
screen"** so it says what it does.
|
||
- **No more dead ends.** Every screen now tells you exactly what's wrong and
|
||
how to fix it — no console set up yet, console offline, helper not
|
||
running, or the engine not responding — with a button that takes you
|
||
there. New installs land directly on the Connection screen.
|
||
- **Errors can't slip past you anymore.** When a delete, move, mount, rename
|
||
or download fails, the error now also lands in the notification inbox —
|
||
navigating away no longer makes it vanish.
|
||
- **Quality of life.** Loading screens show smooth placeholders instead of
|
||
blank space; huge game libraries render instantly ("Show all" expands the
|
||
rest); scheduled power-ticks now always target the console you created
|
||
them for; Dashboard moved next to Connection where you'd look for it.
|
||
- **Fully translated.** Every string in the app is now translated in all
|
||
18 languages — no English fallbacks left anywhere.
|
||
|
||
---
|
||
|
||
## 2.30.0
|
||
|
||
- **Running several PS5s hard at once won't crash a console.** When work
|
||
overlapped on one console — reading its live temperature while a package was
|
||
installing, or registering a game on one PS5 while another was mid-install —
|
||
the helper's low-level kernel operations could collide and, in the worst
|
||
case, black-screen and restart the console. Those operations are now
|
||
serialized internally, so heavy concurrent use across consoles stays stable.
|
||
Verified on real hardware (PS5 and PS5 Pro) under a thousand-plus
|
||
concurrent operations.
|
||
- **One busy console no longer freezes the app for the others.** A slow or
|
||
very large upload (especially from a network drive) used to be able to stall
|
||
the desktop engine for *every* connected console at once. Each console's
|
||
work is now handled independently, so a busy PS5 keeps to itself.
|
||
- **The Upload screen always shows the right console.** Switching tabs mid-
|
||
upload now correctly shows each console's own progress, and the "stay awake"
|
||
and folder-comparison helpers follow the console you're actually uploading
|
||
to. Switching consoles also clears the previous console's game list
|
||
immediately, so an action can never land on the wrong PS5.
|
||
|
||
---
|
||
|
||
## 2.29.1
|
||
|
||
- **Connecting two (or more) PS5s at once is stable again.** A status-checking
|
||
bug introduced in 2.29.0 could flood the consoles with rapid back-to-back
|
||
reconnect checks, which knocked the second console offline a few seconds
|
||
after it connected. The app now checks each console at a steady pace, so
|
||
every PS5 stays connected.
|
||
- **Recover a crash log after the helper drops.** In the bug report, when the
|
||
helper is disconnected you can now reconnect it in one tap to grab the PS5
|
||
kernel log — it survives the helper crash, so you can still capture what went
|
||
wrong (just don't reboot the console first, which clears it).
|
||
|
||
---
|
||
|
||
## 2.29.0
|
||
|
||
- **Run multiple PS5s at the same time.** When you have more than one console,
|
||
a tab strip appears at the top — one tab per PS5, each with its own live
|
||
status. Switch between them freely; every console keeps its own uploads and
|
||
package installs running in parallel in the background. Installing on one
|
||
console no longer makes the others wait — start work on each independently.
|
||
- **Big uploads are reliable again.** Fixed a crash that could drop the
|
||
connection partway through very large uploads (you'd have had to re-send the
|
||
helper). On top of that, if a transfer ever drops, the app now automatically
|
||
re-deploys the helper and resumes from where it left off instead of giving up.
|
||
|
||
---
|
||
|
||
## 2.28.3
|
||
|
||
- **The app fits your phone screen now.** Pages that used to run off the right
|
||
edge on Android (Settings and others) always fit the screen width — only
|
||
vertical scrolling, the way it should be. This holds in every language,
|
||
including the longer ones.
|
||
- **Easier to tap.** Buttons and controls are now finger-sized (44px) on phones
|
||
and tablets, while desktop keeps its compact layout.
|
||
|
||
---
|
||
|
||
## 2.28.2
|
||
|
||
- Docs only: added a troubleshooting entry for the Hardware screen dropping
|
||
the connection (the actual fix shipped in 2.28.1) with the recovery steps.
|
||
No app changes from 2.28.1.
|
||
|
||
---
|
||
|
||
## 2.28.1
|
||
|
||
- **Fixes a crash that could drop the PS5 connection when opening the Hardware
|
||
screen.** On some console/loader combinations a single misbehaving hardware
|
||
reading could take the whole helper down (you'd see "connection refused" and
|
||
have to re-send the payload). Now a reading that misbehaves on a given
|
||
firmware just shows as "unavailable" for that one field instead of dropping
|
||
the connection — and the helper logs exactly which reading misbehaved so
|
||
the cause is easy to pin down.
|
||
- Built against the latest PS5 payload SDK.
|
||
|
||
---
|
||
|
||
## 2.28.0
|
||
|
||
- **Fixes games that install but won't start on newer firmware.** Installing a
|
||
package now always prefers the methods that produce a *launchable* game and
|
||
only falls back to the riskier last-resort method when everything else
|
||
fails. If it ever has to use that fallback, the app clearly warns you — and
|
||
points you to the PS5's own Package Installer — instead of showing a
|
||
misleading "Installed." This targets the "can't start the game or app" error
|
||
some people hit on recent firmware.
|
||
- **Smoother upload speed readout.** Speed and ETA now update continuously as
|
||
data goes out instead of jumping once per chunk, so they no longer sawtooth
|
||
on Wi-Fi or slower links.
|
||
- Plus better firmware diagnostics and more install-path test coverage.
|
||
|
||
---
|
||
|
||
## 2.27.1
|
||
|
||
- Routine dependency updates (frontend libraries and a networking crate). No
|
||
user-facing changes — just keeping things current and secure.
|
||
|
||
---
|
||
|
||
## 2.27.0
|
||
|
||
- **Report a bug without leaving the app.** A new **Bug Report** page (under
|
||
Diagnostics) lets you describe what happened, attach screenshots, and bundle
|
||
the app's logs plus a snapshot of your PS5 into a single `.zip` to post on
|
||
Discord — so issues come with enough detail to actually fix. Your PS5's IP and
|
||
serial are stripped by default.
|
||
- **Capture screenshots in one click.** A camera button in the status bar grabs
|
||
whatever screen you're on and saves it; on the Bug Report page you pick which
|
||
captures to include. Works on every platform.
|
||
- **Much better logging.** The app now keeps a detailed log on disk (with an
|
||
adjustable detail level) that survives a crash, and it captures engine and
|
||
helper errors and crashes — so a bug report contains what actually went wrong
|
||
instead of a blank. You choose how much of the recent log to package.
|
||
- **The helper no longer leaves a stuck copy behind.** Resending the helper
|
||
after it crashed could spawn a second copy that couldn't be removed; it now
|
||
cleans up the old one on startup. (If one is ever truly stuck, a quick PS5
|
||
reboot clears it.)
|
||
- Plus connection-stability fixes for the Hardware screen and assorted polish.
|
||
|
||
---
|
||
|
||
## 2.26.1
|
||
|
||
- **Turn PS5 screenshots into normal pictures.** The PS5 saves screenshots as
|
||
HDR `.jxr` files that most photo viewers and browsers can't open. The
|
||
Screenshots screen now has a **Convert** button on each shot that turns it into
|
||
a regular `.png` you can open and share anywhere — no extra apps or extensions
|
||
needed. (Desktop app.)
|
||
- **Fan speed in the Hardware screen.** "Read sensors" now also shows the
|
||
console's current fan duty, next to temperatures and CPU clock.
|
||
- **Reading sensors is safe on every console.** The one sensor that could freeze
|
||
the helper on some firmware (power draw) is no longer read, so live readings
|
||
can never knock the connection offline — on any PS5 model or firmware.
|
||
- Screenshots that used to appear twice (the full-size shot and its thumbnail)
|
||
now show as a single row.
|
||
- Build and packaging fixes so the app keeps building cleanly on Windows, macOS,
|
||
and Linux.
|
||
|
||
---
|
||
|
||
## 2.25.5
|
||
|
||
- **System → Hardware no longer drops the connection.** On some consoles,
|
||
opening the Hardware screen (or the dashboard's live readouts) could break the
|
||
connection to the helper and force you to send it again. Live temperatures and
|
||
CPU clock are now read in a way that's safe on every firmware, so the
|
||
connection stays put. (Power draw now shows as "unavailable" on firmware where
|
||
reading it isn't safe — a deliberate trade so it can never knock the helper
|
||
offline.)
|
||
- **File search can't run the console out of memory.** Indexing a very large
|
||
drive is now capped, so a big game library won't exhaust the helper's memory;
|
||
the results just show as partial when the limit is hit.
|
||
- Hardened the helper against malformed and out-of-range values so it stays
|
||
stable under unusual conditions.
|
||
|
||
---
|
||
|
||
## 2.25.4
|
||
|
||
- **Plays nice with ShadowMount+.** If you run ShadowMount+, ps5upload now hands
|
||
games off to it instead of doing its own thing and clashing. Uploading or
|
||
registering a game adds it to ShadowMount+'s install list and lets SMP do the
|
||
mounting + registering — so trophies, disc images, and nested PFS all work,
|
||
and the two tools stop fighting over the same title. Falls back to ps5upload's
|
||
own mount/register when ShadowMount+ isn't running.
|
||
- **nanoDNS support.** Added the nanoDNS payload — a tiny on-console DNS server
|
||
that blocks PlayStation Network / update domains (and can redirect any domain)
|
||
— to the Payloads list, plus a new **nanoDNS** screen to edit its config and a
|
||
guide for pointing your PS5's DNS at it.
|
||
- **More disc-image formats.** You can now upload `.ffpfs` and `.ffpfsc` (PFS and
|
||
compressed/nested PFS) images, alongside the existing `.exfat` and `.ffpkg`.
|
||
- Refreshed the payload info for ShadowMount+ and kstuff-lite (firmware 12.xx),
|
||
and fixed a couple of small Installed Apps glitches.
|
||
|
||
---
|
||
|
||
## 2.25.3
|
||
|
||
- **A much better Installed Apps screen.** Every game now has a **Play** button
|
||
to launch it straight from the app. Titles are grouped by what they are —
|
||
installed games & apps, disc images, folder homebrew, and system — and each is
|
||
tagged **PS4** or **PS5**. The screen also warns you when **kstuff** isn't
|
||
active (so you know games won't launch) and when a disc image needs
|
||
**ShadowMount+**, with a one-tap button to send it to the console.
|
||
|
||
---
|
||
|
||
## 2.25.2
|
||
|
||
- **Installed packages actually launch now.** Installing a `.pkg` from the
|
||
Install Package page registered the game's icon but never laid down its
|
||
actual content — so the tile appeared on the PS5 but launching it failed with
|
||
"can't start the game or app." Installs now go through the path that installs
|
||
the full game content (the same approach etaHEN uses), so the game launches.
|
||
|
||
---
|
||
|
||
## 2.25.1
|
||
|
||
- **Installed games actually launch now.** Some games installed without any
|
||
error but wouldn't start ("can't start the game or app"). They now install
|
||
with their full content and launch normally.
|
||
- **Interrupted uploads resume for real.** If a big folder upload drops partway
|
||
through, it keeps everything that already made it across and continues from
|
||
there — instead of re-sending the whole game every time — and it holds onto
|
||
that progress across several interruptions in a row.
|
||
- **Manage several PS5s at once.** The upload queue is now grouped by console:
|
||
each PS5 has its own Start and Stop, consoles upload in parallel, and you can
|
||
reorder one console's games while another console is still uploading.
|
||
- **Translated into every supported language.**
|
||
|
||
---
|
||
|
||
## 2.25.0
|
||
|
||
- **More reliable uploads by default.** Sending several streams at once could
|
||
crash the PS5 helper mid-upload on some consoles, so uploads now use a single
|
||
stream by default. You can still turn streams up in Settings — with a heads-up
|
||
that it's less stable — but the single-stream path is the rock-solid one.
|
||
- **Uploads recover on their own.** If a transfer drops mid-upload — most often
|
||
because the helper crashed — the app now re-sends the helper and picks up
|
||
exactly where it left off, retrying a few times before giving up. Real
|
||
problems like the PS5 running out of space still stop right away. On by
|
||
default.
|
||
- **Keeps your PS5 awake while uploading.** Long uploads used to die when the
|
||
console slipped into rest mode. The app now keeps the PS5 awake for the
|
||
duration of a transfer. On by default.
|
||
- **Finds your PS5 across every network.** "Find PS5s on the network" now scans
|
||
all of your computer's connections at once (Ethernet + Wi-Fi), so it locates
|
||
your console even when it's not on your computer's main network.
|
||
- **Reset everything.** A new button under Settings → Data & reset wipes all
|
||
local app data — settings, saved consoles, history, and caches — and starts
|
||
fresh. Nothing on your PS5 is touched.
|
||
- **Cleaner, easier-to-read interface.** Bigger text and logo, a tidier layout
|
||
that wastes less space, and friendlier "nothing here yet" screens. Settings is
|
||
reorganized into clear sections, and the upload-speed limit is now a proper
|
||
control there.
|
||
|
||
---
|
||
|
||
## 2.24.0
|
||
|
||
- **Much faster downloads (backup console → PC).** Saving a game to your PC
|
||
used to reconnect for every small chunk; it now keeps one connection open
|
||
and reads ahead, and pulls folders over several connections at once. A big
|
||
single file roughly doubled to about full network speed, and folder backups
|
||
are much quicker. It also resumes from where it left off if the connection
|
||
drops. Nothing new to send to your PS5 — it's all in the app.
|
||
- **See which console each upload is for.** Every item in the upload and
|
||
install queues now shows its target console, so a mixed queue isn't a
|
||
guessing game.
|
||
- **Upload to several consoles at once (optional).** New setting under
|
||
Settings → Upload to send queued games to different consoles in parallel
|
||
instead of one console at a time. Off by default.
|
||
- **Pick a payload version — and downgrade.** The Payloads catalog now lets
|
||
you choose any past release of a payload, not just the latest, and flags
|
||
pre-release builds as possibly unstable. Handy for rolling back when a fresh
|
||
build misbehaves.
|
||
- **Adding a game's update no longer clashes with its base.** A base game and
|
||
its update share an ID, which made the app treat an added update as the base
|
||
again. They're now kept separate, with clear "Update" / "DLC" labels.
|
||
- **Tidy up the staged-package list.** New "Clear finished" and "Clear all"
|
||
buttons, plus an optional "auto-delete after install."
|
||
|
||
---
|
||
|
||
## 2.23.11
|
||
|
||
- **Uploads no longer abort with a "buffer space" error on Windows.** During a
|
||
fast multi-stream upload, Windows could briefly run out of network buffers
|
||
(`os error 10055`), and the app treated that as fatal — stopping the whole
|
||
transfer partway through. It now waits a moment and retries the connection
|
||
automatically, so a temporary hiccup no longer ends your upload. Engine-only
|
||
fix; no need to re-send the payload to your PS5.
|
||
|
||
---
|
||
|
||
## 2.23.10
|
||
|
||
- **Faster uploads from network drives / NAS.** The app now reads the next chunk
|
||
from your source while the current one is still going out over the network, so
|
||
the connection no longer sits idle waiting on a slow disk read. No change if
|
||
your files are on a fast local drive (there the PS5 or the network is the
|
||
limit) — this specifically helps slow or network sources.
|
||
- **More stable uploads of huge multi-file folders.** Removed per-file memory
|
||
churn in the PS5 payload's write path that could fragment the console's memory
|
||
on very large folders — especially now that uploads use several parallel
|
||
streams. (Requires sending the updated payload to your PS5.)
|
||
|
||
---
|
||
|
||
## 2.23.9
|
||
|
||
- **Faster uploads — large folders now send over several connections at once.**
|
||
A single upload stream is limited by the console's per-connection write speed
|
||
(around 40 MB/s on non-Pro PS5s — a single-thread limit, not your network or
|
||
SSD). Uploads now split a folder's files across up to 4 parallel streams,
|
||
which adds up to a much higher total. Measured on wired gigabit: ~1.7× faster
|
||
on a PS5 (fat) and ~1.4× on a PS5 Pro (which was already close to the network
|
||
limit). It turns on automatically and falls back to a single stream on older
|
||
payloads; you can change it under Settings → Upload → Parallel upload streams.
|
||
(Tiny-file folders are limited by the console's filesystem, not bandwidth, so
|
||
they don't speed up — this helps games with real-sized files.)
|
||
|
||
---
|
||
|
||
## 2.23.8
|
||
|
||
- **Uploading from a network drive no longer crashes the helper.** When the
|
||
source folder lives on a network share (SMB/UNC), scanning it can take
|
||
minutes. The app was sometimes running several of those scans at once — a
|
||
background "diff vs PS5" preview on top of your actual upload — which fought
|
||
over the same share and could take the helper down on big games. Now only one
|
||
scan runs at a time, and the preview pauses while a transfer is in progress
|
||
and resumes when it's done.
|
||
|
||
---
|
||
|
||
## 2.23.7
|
||
|
||
- **Queued uploads are more reliable.** Before running a queue, the app now
|
||
makes sure your PS5 is on the matching helper, and it paces jobs so a long
|
||
list no longer crashes the helper partway through.
|
||
- **Install and upload now take turns instead of colliding.** Starting an
|
||
install (or adding a .pkg) while something is uploading no longer drops the
|
||
connection — it waits in line and starts automatically when the current
|
||
transfer finishes, and the screen tells you it's waiting (with a Cancel
|
||
option). The transfer also no longer needlessly blips during a package
|
||
install.
|
||
|
||
---
|
||
|
||
## 2.23.6
|
||
|
||
- **No more phantom crash reports during uploads.** A harmless browser-engine
|
||
hiccup that could happen as a screen changed mid-upload was being recorded
|
||
as a crash. It's now ignored, and genuine errors capture more detail to make
|
||
them easier to track down.
|
||
|
||
---
|
||
|
||
## 2.23.5
|
||
|
||
- **Android build restored.** The 2.23.4 window-placement fix didn't compile
|
||
for Android, so that release shipped desktop-only (no APK). The same fixes
|
||
— a centered, on-screen window and a working "Open folder" — are back on
|
||
Android too.
|
||
- **Logs: Copy and Download work again.** "Copy" now reliably puts the log on
|
||
your clipboard, and both buttons confirm when they're done.
|
||
- **Removed the experimental Date & Time settings** from the Hardware screen.
|
||
- **Fewer phantom crash reports.** A harmless internal hiccup is no longer
|
||
recorded as a crash.
|
||
|
||
---
|
||
|
||
## 2.23.4
|
||
|
||
- **Fix: the crash-report "Open folder" and "Clear" buttons (Settings →
|
||
Diagnostics) no longer stay greyed out.** "Open folder" now reliably opens
|
||
the reports folder — and if your OS blocks that (or on Android, where the
|
||
folder is private to the app), it shows you the exact path instead. The
|
||
folder location is now also shown under the report count.
|
||
|
||
---
|
||
|
||
## 2.23.3
|
||
|
||
- **Big uploads are much more stable.** Large game folders (thousands of
|
||
files) no longer crash the on-PS5 helper mid-upload — the app now talks to
|
||
the console one directory scan at a time instead of flooding it. Validated
|
||
on real hardware across folder, `.zip`, and `.exfat` disc-image uploads.
|
||
- **Unusual file/folder names work now.** Names containing characters like
|
||
`}`, or very long paths, no longer get the whole upload rejected with a
|
||
cryptic error. (Re-send the payload to your PS5 to pick this up —
|
||
Connection → Send payload.)
|
||
- **One-click crash reporting.** If something goes wrong, the app now saves a
|
||
detailed report automatically and gives you a **"Report this crash"**
|
||
button (also in Settings → Diagnostics) that packages everything into a
|
||
`.zip` and opens our Discord so you can post it.
|
||
- **Fully translated.** All 18 languages now cover every screen, including
|
||
error and troubleshooting messages (previously English-only).
|
||
- Smaller fixes: an `etaHEN/games` upload destination preset, and "Save logs"
|
||
in the Logs tab works again.
|
||
|
||
---
|
||
|
||
## 2.22.0
|
||
|
||
- **Android: the screen now stays on during transfers.** While an upload,
|
||
download, or install is running, your phone or tablet no longer dims or
|
||
sleeps and drops the transfer mid-stream. Settings → Keep Awake also works
|
||
on Android now, to hold the screen on while the app is open. Desktop
|
||
already did this; Android has caught up. Verified on-device (Pixel 9,
|
||
Android 16).
|
||
|
||
---
|
||
|
||
## 2.21.3
|
||
|
||
- **Fix: a playlist step ran off the edge on phones.** In Payloads →
|
||
Playlists, a step's path plus its per-step IP / port / sleep fields and
|
||
buttons were packed into one row that overflowed narrow screens. The
|
||
controls now wrap neatly underneath on small screens; desktop is
|
||
unchanged.
|
||
|
||
---
|
||
|
||
## 2.21.2
|
||
|
||
- **Fix: the Android app still crashed on launch — now fixed for real.** It
|
||
opened, then closed after about a second. The 2.21.1 fix turned out to
|
||
address an unrelated issue; the actual cause was a native crash in the
|
||
startup file-access permission check, which read an Android system
|
||
context that Tauri doesn't set up. It now obtains that context itself.
|
||
Verified working on-device (Pixel 9, Android 16). The app is fully
|
||
self-contained — it runs its own engine on the phone and talks to your
|
||
PS5 over Wi-Fi; it never needs the computer.
|
||
|
||
---
|
||
|
||
## 2.21.1
|
||
|
||
- **Fix: the Android app crashed on launch.** The 2.21.0 build shipped
|
||
modern JavaScript that older Android System WebViews couldn't run, so
|
||
the app opened to the first screen and then closed. Builds now target a
|
||
broadly-compatible JavaScript level, so it launches on those devices.
|
||
(Desktop was unaffected. The Android app is fully self-contained — it
|
||
runs its own engine on-device and talks to your PS5 over Wi-Fi; it
|
||
never needs the computer.)
|
||
|
||
---
|
||
|
||
## 2.21.0
|
||
|
||
- **Install Package is now a package library.** Upload a `.pkg` to your
|
||
PS5 once and it stays there. The screen shows all your uploaded
|
||
packages with cover art and size, and you can **Install**, **Reinstall**,
|
||
or **Delete** any of them in a click — no need to re-upload to install
|
||
again. There's no install-method picker anymore: installs go through the
|
||
DPI daemon, the most reliable path on current firmware.
|
||
- **Under-the-hood updates.** Refreshed the desktop and UI toolchain
|
||
(React, Tauri, build tooling) and dependencies to their current releases.
|
||
|
||
---
|
||
|
||
## 2.20.2
|
||
|
||
- **Package install now works on firmware 9.60+.** Installing a `.pkg`
|
||
no longer fails (or knocks the payload offline) on consoles where
|
||
Sony's installer rejects the streamed install. Both **Stream** and
|
||
**Upload & install** complete reliably, and the app falls back from
|
||
Stream to Upload automatically when needed.
|
||
- **New: Installed Apps screen.** See everything installed on your PS5
|
||
with cover art, grouped by how it got there — installed from a
|
||
package vs. mounted/registered from a folder or disc image — and
|
||
uninstall any title in a click. Works on desktop and Android.
|
||
- **Android: SD cards and USB-OTG drives now show up.** The in-app file
|
||
picker lists removable storage alongside internal storage, so you can
|
||
upload a game straight from a memory card or a plugged-in USB drive.
|
||
|
||
---
|
||
|
||
## 2.20.1
|
||
|
||
- **Android setup is clearer.** The app now proactively explains the
|
||
required All files access permission, rechecks it after returning from
|
||
Android settings, and documents the common Android upload/install issues
|
||
in the FAQ.
|
||
- **Engine startup diagnostics are easier to find.** If the local engine
|
||
fails to start, PS5 Upload now records the reason in the app log and
|
||
status tooltip instead of only showing a red engine dot.
|
||
- **Release and docs cleanup.** Updated stale release workflow references,
|
||
marked the Android feasibility doc as historical, and tightened ignored
|
||
Android build artifacts.
|
||
|
||
---
|
||
|
||
## 2.20.0
|
||
|
||
- **Android: pick game folders and files from your phone.** "Choose
|
||
folder" and "Choose file" now work on Android — browse your phone's
|
||
storage in an in-app file browser and upload a game folder or a `.zip`
|
||
straight to the PS5, with no copying. PS5 Upload asks once for
|
||
permission to read your files. The same picker fixes file/folder
|
||
selection across the whole app on Android: Library downloads, Install
|
||
Package, Save-data restore, Screenshots, Payloads, and File System.
|
||
(Desktop is unchanged — it keeps using the native file dialogs.)
|
||
|
||
- **ShadowMount+ (and other zip-packaged payloads) now install.** The
|
||
"Set up your PS5" one-click chain and the payload catalogue failed on
|
||
ShadowMount+ with "downloaded asset is not an ELF" — newer ShadowMount+
|
||
releases ship the payload inside a `.zip` instead of as a bare `.elf`.
|
||
PS5 Upload now detects a zip-packaged payload, extracts the real `.elf`
|
||
from inside it, and sends that. Affected the recommended chain on every
|
||
platform (desktop and Android).
|
||
|
||
- **Android: your settings now survive app updates.** Earlier Android
|
||
builds were each signed with a throwaway key, so installing a newer
|
||
version meant uninstalling the old one first — which wiped all your
|
||
PS5 Upload settings. Releases are now signed with a single stable key,
|
||
so new versions install **in place** and your settings carry over,
|
||
just like on the computer. (One-time step: uninstall the current build
|
||
and install this one; every update after that keeps your settings.)
|
||
- **Settings included in device backup.** Your settings are now part of
|
||
Android's backup/restore, so they can also come back after a full
|
||
reinstall or a move to a new phone.
|
||
|
||
---
|
||
|
||
## 2.19.1
|
||
|
||
- **Android: fixed the engine showing red.** On the 2.19.0 Android build
|
||
the app couldn't reach its own built-in engine, so the status bar
|
||
showed **engine** in red and transfers couldn't start. Release Android
|
||
builds block plain-HTTP loopback traffic by default; the app now
|
||
permits it for its own local engine only (everything else stays
|
||
blocked). Desktop builds were never affected.
|
||
|
||
---
|
||
|
||
## 2.19.0
|
||
|
||
The notifications-everywhere release — plus the first Android build.
|
||
|
||
- **System notifications.** PS5 Upload can now post to your computer's
|
||
notification center (macOS, Windows, Linux — and the Android shade)
|
||
when a transfer finishes or fails while the app is in the background,
|
||
so you don't have to keep it in front of you. Toggle it under
|
||
**Settings → Notifications**.
|
||
- **The PS5 tells you too.** Uploads now flash a "started" and a
|
||
"complete" message on the console screen itself.
|
||
- **No more sleep-interrupted transfers.** Your computer is kept awake
|
||
automatically for the duration of any upload, download, or install.
|
||
The Settings switch is reworded to make clear it keeps the machine
|
||
awake while PS5 Upload is open.
|
||
- **Android (preview).** The first experimental Android build — the same
|
||
interface, with mobile-friendly navigation, safe-area handling, and our
|
||
app icon. It connects to and manages your PS5 over Wi-Fi today; download
|
||
the `.apk` from the release assets to try it. Treat it as early access.
|
||
- Reliability fixes across notifications and the release pipeline.
|
||
|
||
---
|
||
|
||
## 2.18.7
|
||
|
||
- **Choose where a `.zip` unpacks.** When you pick a `.zip`, the Upload
|
||
screen now asks **"Where should the .zip unpack?"** with two options,
|
||
each showing a live preview of where the files will land:
|
||
- **Put everything in a new folder named after the zip** (the default,
|
||
unchanged from before) — best for a plain `.zip` of loose game files.
|
||
- **Extract the contents straight into the destination** — no wrapper
|
||
folder. Use this when the `.zip` already contains the game's own
|
||
folder (e.g. `CUSA12345/`), so it doesn't end up double-nested.
|
||
The choice applies to one-shot uploads, queued uploads, and mirroring
|
||
to other consoles alike.
|
||
|
||
---
|
||
|
||
## 2.18.6
|
||
|
||
A correctness + hardening sweep — 16 fixes found by a deep multi-agent
|
||
audit across the engine, desktop app, and tooling, plus a release-pipeline
|
||
fix so new versions publish automatically.
|
||
|
||
- **Releases now publish on their own.** Tagging a release used to need a
|
||
separate manual "publish" step that was easy to forget (v2.18.5 was
|
||
tagged but never published because of it). The publish workflow now
|
||
fires automatically on the version tag, with the manual trigger kept as
|
||
a fallback.
|
||
- **Hostile/corrupt `.zip` files can no longer crash the preview.** A
|
||
crafted ZIP64 archive could make the engine abort while inspecting it
|
||
(a huge declared entry count, or an overflowing offset). Both are now
|
||
clamped/checked.
|
||
- **Windows: `.ffpkg` extraction can't escape the chosen folder.** A
|
||
malicious archive entry named like `C:evil.exe` could write outside the
|
||
destination on Windows. Such names are now rejected.
|
||
- **IPv6 PS5 addresses work.** The address helper used to mangle IPv6
|
||
literals (e.g. `fe80::1` became `fe80`), breaking every call to an
|
||
IPv6-only console. IPv6 is now handled and bracketed correctly.
|
||
- **Several panels stop silently failing when you paste an `ip:port`.**
|
||
The Saves thumbnails, Library panels, Disk Usage, Dashboard sensors, and
|
||
Kernel Log now go through the canonical address helper, so a host typed
|
||
with a port no longer produces a broken `ip:port:9114`.
|
||
- **Destructive menu items show as red again.** Delete/uninstall items in
|
||
overflow menus referenced a non-existent color and rendered like normal
|
||
items.
|
||
- **Better error guidance for stuck PS5 downloads** (`0x80B22101`) — the
|
||
specific "clear the notification and retry" message is shown instead of
|
||
a generic one.
|
||
- **Windows update/metadata fetches are memory-bounded even without a
|
||
Content-Length**, the cross-device "file is still on disk" message now
|
||
shows on Windows, the keep-awake toggle can't abort config loading, the
|
||
Linux USB-drive picker no longer lists fixed/network mounts, archive
|
||
uploads correctly clear their resume marker, a window-listener leak is
|
||
closed, and the i18n prune tool works against the current locale layout.
|
||
|
||
---
|
||
|
||
## 2.18.5
|
||
|
||
- **`.zip` uploads — much faster scanning, with a live progress count.**
|
||
Dropping a `.zip` game dump used to show "Inspecting…" with no
|
||
feedback while the app walked the archive. On big dumps (60 GB+
|
||
with tens of thousands of files), this could take long enough to
|
||
trip the same "engine request failed: error sending request" timeout
|
||
that 2.18.4 fixed for folder deletes — the user saw a baffling error
|
||
even though nothing was actually broken. 2.18.5 makes the scan
|
||
**dramatically faster** (effectively instant once the disk is
|
||
awake) and the few seconds you do wait now show a live "Scanning
|
||
archive… N entries" counter so you can see the app is working.
|
||
- **Clearer errors when a `.zip` can't be read.** Bad path, wrong
|
||
file type, unsupported compression method — the message now tells
|
||
you exactly what's wrong instead of a generic "engine request
|
||
failed."
|
||
- **Fix: the "extracted" size in the .zip preview was sometimes
|
||
blank.** Archives made by some tools (notably `bsdtar` on macOS/Linux
|
||
and anything using libarchive) set a flag that the old code couldn't
|
||
read past, so the Upload card would show file count but a blank
|
||
"extracted" size. Now you see the real expanded size for every
|
||
archive.
|
||
- No payload changes needed; this is a desktop-app-only release.
|
||
|
||
---
|
||
|
||
## 2.18.4
|
||
|
||
- **Hotfix for "engine request failed" on huge folder deletes/copies.**
|
||
Deleting (or copying / moving) a folder with tens of thousands of
|
||
files on the PS5 surfaced as `engine request failed: error sending
|
||
request for url (http://127.0.0.1:19113/api/ps5/fs/delete)` after
|
||
about a minute — even though the operation was still running and
|
||
eventually succeeded on the console. Cause: the desktop app's
|
||
HTTP client to its own embedded engine had a 60-second ceiling
|
||
that wasn't long enough for big-tree operations (the PS5 needs
|
||
many minutes to walk and unlink tens of thousands of inodes).
|
||
v2.18.4 raises the ceiling to one hour for the three destructive
|
||
endpoints (`fs/delete`, `fs/copy`, `fs/move`), matching the
|
||
engine's own internal deadline. Other endpoints stay at 60 s so
|
||
a wedged sidecar still surfaces fast.
|
||
- No payload changes needed; this is a desktop-app-only fix.
|
||
|
||
---
|
||
|
||
## 2.18.3
|
||
|
||
- **Hotfix for multi-file upload crash.** A user reported uploading a
|
||
large game folder (~46,000 files / ~13 GB on disk) with v2.18.2
|
||
consistently fails partway through with "PS5 stopped responding."
|
||
Reproduced and tracked down: the buffer-size bump shipped in
|
||
v2.18.2 (per-shard I/O buffer from 4 MiB to 8 MiB on the PS5)
|
||
doubled the per-shard malloc/free pressure on the multi-file
|
||
upload path. On folders with many non-packed files (each one
|
||
separately spawning the on-PS5 writer thread + 2 × 8 MiB buffer),
|
||
the PS5's heap fragmented faster than its allocator could
|
||
compact and the payload listener died after roughly 5 minutes.
|
||
- **What changed:** the buffer is reverted to 4 MiB. v2.18.2's
|
||
measured speed change on the original PS5 was within run-to-run
|
||
noise anyway, so reverting costs you nothing observable.
|
||
- **Reload the payload** after upgrading. The buffer-size lives in
|
||
the on-PS5 ELF, not in the desktop app.
|
||
|
||
---
|
||
|
||
## 2.18.2
|
||
|
||
- **Background:** a user reported sustained single-file upload speed
|
||
dropping from "100 MB/s before" to "30 MB/s now" after switching
|
||
console hardware. We measured carefully and the cause is the
|
||
underlying PS5 model's internal-SSD write speed — the original
|
||
PS5 sustains ~30 MB/s on this code path; the PS5 Pro sustains
|
||
meaningfully more. Both numbers are network-fast (the host pushes
|
||
bytes into the PS5 at gigabit line rate) but disk-bound at the
|
||
console end.
|
||
- **What changed in this release:** the transfer layer was tuned
|
||
toward fewer/larger frames and bigger writer-thread buffers on the
|
||
PS5 (64 MiB shards, 256 MiB inflight, 8 MiB writer slots, up from
|
||
32/64/4 respectively). On a 10 GB `.exfat` over wired gigabit the
|
||
measured wall-clock change was within run-to-run noise — small
|
||
positive on the writer-wait portion, small negative on the
|
||
per-shard overhead, net-neutral. The changes ship anyway because
|
||
they are at worst neutral on every console class and are a
|
||
better default for any future console with a slower destination.
|
||
- **What this release does NOT do:** there is no headline speed
|
||
improvement for original-PS5 single-file uploads. We are honest
|
||
about that. Going materially past the current ceiling needs
|
||
payload-side changes deeper than buffer tuning (e.g. a third
|
||
writer-slot for more producer headroom, or a different write
|
||
pattern); we'll trial that in a future release.
|
||
- **Reload the payload** after upgrading to pick up the writer-slot
|
||
change. An older payload still pairs fine with this app.
|
||
|
||
---
|
||
|
||
## 2.18.1
|
||
|
||
- **Picking a large game folder now shows what the app is doing.**
|
||
When you pick a folder with tens of thousands of files, the
|
||
Upload + "Add to queue" buttons used to grey out for ~30 seconds
|
||
with no visible feedback. The source card now shows a clear
|
||
"Scanning game folder…" banner with a hint explaining the wait,
|
||
and hovering the disabled buttons tells you why.
|
||
|
||
---
|
||
|
||
## 2.18.0
|
||
|
||
- **The "Finalizing on PS5" wait now shows a live counter.** When a
|
||
big folder upload reaches 100% and enters the PS5-side commit
|
||
phase, the row used to sit on a generic "Finalizing on PS5"
|
||
badge with no movement for 10–30 minutes. The PS5 now streams
|
||
per-file progress back to the app while it's committing, so you
|
||
see "Finalizing on PS5 — 12,400 / 84,216 files" climbing through
|
||
the wait. Same signal in the Upload screen banner, the Upload
|
||
Queue row, and the Activity tab.
|
||
- **Old payloads still work.** If you haven't pushed the new PS5
|
||
payload yet, the upload still completes — you just see the same
|
||
countless "Finalizing on PS5" badge as before. New payloads
|
||
enable the counter automatically; nothing for users to toggle.
|
||
|
||
---
|
||
|
||
## 2.17.9
|
||
|
||
- Internal lab tool fix only. The `ps5upload-lab transfer-dir`
|
||
command's post-commit verification step was calling the wrong
|
||
PS5 port and showing a spurious error after every successful
|
||
multi-file upload. The fix lives in the developer lab tool;
|
||
no user-facing change.
|
||
|
||
---
|
||
|
||
## 2.17.8
|
||
|
||
- Internal cleanup pass after the 2.17.3 → 2.17.7 rapid-fire shipping.
|
||
No user-visible behaviour changes — comments and inline rationale
|
||
brought in line with reality (the commit-timeout helper now covers
|
||
both single- and multi-file paths, the begin-timeout helper covers
|
||
only multi-file as designed, throughput recording's known bias is
|
||
documented, and the unused `MAX_AGE_MS` constant carries an explicit
|
||
"reserved for P3" note so future readers don't try to wire it
|
||
without context).
|
||
|
||
---
|
||
|
||
## 2.17.7
|
||
|
||
- **Uploading very large game folders no longer fails before the
|
||
first file leaves your computer.** Folders with tens of thousands
|
||
of files build a multi-megabyte "manifest" the PS5 has to receive
|
||
and parse before any upload bytes are sent. On real hardware that
|
||
parse step can take longer than the previous 30-second cap on a
|
||
single request — meaning the upload failed instantly with
|
||
"Resource temporarily unavailable." The app now waits up to 5
|
||
minutes for the PS5 to acknowledge that manifest before giving
|
||
up. Once acknowledged, normal transfer continues unchanged.
|
||
- Verified end-to-end on a 169,401-file / 162 GB game folder upload
|
||
(Ghost of Yotei). Total upload time on the test rig: 3 h 13 m,
|
||
with 19.5 min of post-100% PS5 commit (still well within the
|
||
30-minute commit window we shipped in 2.17.5).
|
||
|
||
---
|
||
|
||
## 2.17.6
|
||
|
||
- **Upload screen now tells you how long a huge folder will take
|
||
*before* you click Upload.** For folders with 10,000+ files (game
|
||
dumps with tens of thousands of files inside), the source-info
|
||
card now shows a transfer-time estimate, a PS5-commit-time
|
||
estimate, and a total — so the multi-minute wait after the
|
||
progress bar hits 100% isn't a surprise. A short hint tells you
|
||
Resume mode will save an hour or more on re-uploads.
|
||
- **The estimate sharpens after your first upload to each PS5.** The
|
||
app remembers the throughput from your last successful upload to
|
||
each PS5 host and uses that figure next time, instead of a generic
|
||
default.
|
||
|
||
---
|
||
|
||
## 2.17.5
|
||
|
||
- **Huge game-folder uploads no longer fail during the "Finalizing
|
||
on PS5" wait.** A user-reported 85,000-file upload (Ghost of
|
||
Yotei) reached 100%, sat on the new "Finalizing on PS5" indicator
|
||
for 10–15 minutes, and then said "upload failed." The PS5 was
|
||
actually still committing — the app just stopped waiting too
|
||
early. The wait window is now long enough to outlast realistic
|
||
worst-case commit times (30 min cap), with TCP keeping the dead-
|
||
PS5 case detectable as before.
|
||
|
||
---
|
||
|
||
## 2.17.4
|
||
|
||
- **The "kstuff-lite (EchoStretch)" entry in the Payloads catalog
|
||
now points at the correct repository.** It was previously linking
|
||
to `EchoStretch/kstuff` (the full build); the entry's display name
|
||
said "kstuff-lite" so the download was a different artifact than
|
||
the one named. Now correctly resolves to
|
||
`EchoStretch/kstuff-lite`.
|
||
|
||
---
|
||
|
||
## 2.17.3
|
||
|
||
- **Uploading a game folder with tens of thousands of files no
|
||
longer freezes the app.** The per-file status list was trying to
|
||
render every entry to the DOM on every poll tick — for a 50,000-
|
||
file folder that pinned the main thread until the upload finished.
|
||
The list now shows a moving window around the file currently
|
||
being sent (current row + a slice of what's coming up + a slice of
|
||
what just finished). Small folders are unchanged.
|
||
|
||
---
|
||
|
||
## 2.17.2
|
||
|
||
- **Rebooting your PS5 from the Hardware tab no longer shows a fake
|
||
error.** The reboot itself always worked, but the app would
|
||
display `power: EOF while parsing an object at line 1 column 28`
|
||
right after, because the payload's "ok, rebooting now" reply was
|
||
missing one byte. Fixed on both ends.
|
||
|
||
---
|
||
|
||
## 2.17.1
|
||
|
||
- **Big multi-file uploads no longer look frozen at 100%.** When all
|
||
the bytes have reached the PS5 but it's still committing the file
|
||
index — which can take many minutes for folders with tens of
|
||
thousands of files — the row now shows a clear "Finalizing on PS5"
|
||
badge with a hint telling you not to close the app. Same signal on
|
||
the Upload screen, Upload Queue, and Activity tab.
|
||
- **Average-speed readouts on past uploads now show the actual number**
|
||
instead of the literal text `{speed}`. Cosmetic bug across every
|
||
language.
|
||
|
||
---
|
||
|
||
## 2.17.0
|
||
|
||
The v2.16.1 release pipeline didn't make it out — an ESLint failure on the
|
||
preflight banner string blocked the release run. 2.17.0 ships everything
|
||
that was meant for 2.16.1, plus the fix.
|
||
|
||
- **Game folders uploaded with ps5upload now launch first try.** Previously
|
||
some folders would land on the PS5 but refuse to launch with `CE-107750-0`,
|
||
while the same folder over FTP worked. Fixed at the source: files now land
|
||
with the right permissions inherently, no after-the-fact step.
|
||
- **Live sensors auto-update again.** Temperatures, clock, and power readings
|
||
refresh every 5 seconds on the Hardware screen via a new direct-read path
|
||
that no longer briefly suspends the PS5 UI. The manual "Read sensors"
|
||
button has been removed — it's automatic now.
|
||
- **"Find PS5s on the network" now finds yours even when your router
|
||
suppresses mDNS.** A short LAN sweep runs as a fallback so the button never
|
||
comes back empty just because of an unfriendly access point.
|
||
- **Hardware → PS5 system log.** Optional collapsible panel that shows the
|
||
PS5's kernel log (the same data underlying `dmesg`). Handy when diagnosing
|
||
homebrew payload issues without leaving the app.
|
||
- **Upload preflight no longer fails silently.** If the destination probe
|
||
can't reach the PS5, you now see a clear inline error instead of the
|
||
Upload button briefly spinning and then doing nothing.
|
||
- **Install Package: much more reliable.** The "Stream" install method now
|
||
actually works (a v2.16.0 regression made every streaming install 500;
|
||
fixed). System pkgs (NPXS-prefix) get a clear amber badge in the queue
|
||
before you try them. Cancelling a multi-GB install asks for confirmation
|
||
first. Failed installs show actionable messages for the common Sony
|
||
error codes ("clear PS5 notifications", "out of space", etc.) instead of
|
||
raw hex. The install panel also shows which path (in-process,
|
||
ShellUI-RPC, or legacy BGFT) accepted your request, and the URL the PS5
|
||
fetches the pkg from uses the pkg's canonical content-id as the filename.
|
||
- **First-install no longer looks frozen.** When you click Start on the
|
||
install queue, a banner now shows "Preparing PS5 — checking / pushing
|
||
payload…" while the desktop verifies / refreshes the payload, instead of
|
||
~30 seconds of silent waiting.
|
||
- **Stopping the queue mid-install no longer orphans the row.** Rows that
|
||
were "running" when you click Stop now correctly go back to "pending" so
|
||
the next Start picks them up.
|
||
- **Install preflight banner internals.** Refactored to carry
|
||
`{ message, ownerRunId }` instead of embedding the run-id via a zero-width
|
||
space in the banner string. Same user-visible behaviour; fixes the
|
||
no-irregular-whitespace ESLint failure that blocked the v2.16.1 release
|
||
pipeline.
|
||
|
||
---
|
||
|
||
## 2.16.0
|
||
|
||
- **Folder uploads survive network blips.** Multi-hundred-GB game folders that
|
||
used to die on a single transient drop now reconnect and resume automatically
|
||
— same resilience single-file uploads always had. A 7.3 GiB / 1007-file game
|
||
folder now uploads cleanly in one shot on real hardware.
|
||
- **Much faster on big folders.** Multi-GB files inside a folder upload now
|
||
preallocate disk space up front, removing the slow-down that hit long
|
||
transfers mid-stream. ~40 MiB/s sustained over gigabit Ethernet in testing.
|
||
- **Honest error messages on upload failures.** When something actually goes
|
||
wrong mid-transfer (drive full, drive disconnected, etc.) the app now tells
|
||
you *why* instead of the generic "PS5 stopped responding."
|
||
- **macOS junk filtered out.** Uploads from external drives no longer ship
|
||
`._*` AppleDouble metadata files into your PS5 game folders.
|
||
- **New docs: direct-Ethernet setup.** The FAQ now has a per-OS guide
|
||
(Windows 11, macOS, Linux) for cabling the PS5 straight to your computer —
|
||
the most stable + fastest upload path for huge games.
|
||
|
||
---
|
||
|
||
## 2.15.0
|
||
|
||
- **Folders with lots of tiny files now upload reliably.** Games like Astro
|
||
Bot could fail with a `packed_unsupported` error — most often when resuming.
|
||
Fixed.
|
||
- **Big uploads no longer die when your computer sleeps.** While an upload,
|
||
download, or install is running, ps5upload keeps the computer awake
|
||
automatically (macOS, Linux, Windows), then lets it sleep when idle. The
|
||
Settings → Keep Awake toggle still works on its own for idle use.
|
||
- **Native Linux packages.** Releases now ship a `.deb` (Debian/Ubuntu) and
|
||
`.rpm` (Fedora/RHEL/Bazzite) alongside the AppImage. These need a recent
|
||
distro (glibc 2.39+: Ubuntu 24.04+, Debian 13+, Fedora 40+).
|
||
- **Safer folder uploads.** If the PS5 dropped mid-upload (rest mode or power
|
||
loss), a transfer could finish "successfully" with a file that was secretly
|
||
incomplete. It now fails clearly instead, and Resume re-sends only what's
|
||
missing — even after a full power-off.
|
||
- **Docs:** how to keep long uploads alive (the PS5's own rest-mode timer)
|
||
and when to use Resume.
|
||
|
||
---
|
||
|
||
## 2.14.0
|
||
|
||
A stability-focused release.
|
||
|
||
- **Fixed: the Hardware screen could power off the PS5.** Live temperature,
|
||
clock, and power are now read on demand instead of auto-polling; system info,
|
||
uptime, storage, and the clock stay live.
|
||
- **Linux white screen fixed** for the AppImage on double-click (Ubuntu /
|
||
SteamOS / NVIDIA), not just when launched via `PS5Upload.sh`.
|
||
- **Diagnostics and exports now save** — the bug-report bundle and the
|
||
Settings / Search / Stats exports were failing silently.
|
||
- **Send Payload** now enables the Send button on the first file pick.
|
||
- **Payload playlists** can be reordered, with a one-click "recently run" list.
|
||
- **Zip uploads** show a clear message for unsupported compression, and large
|
||
archives no longer hang while being inspected.
|
||
- **Clearer install errors** when the desktop engine or PS5 helper isn't ready.
|
||
- Plus a batch of safety and correctness fixes under the hood, including two
|
||
PS5-payload memory-safety fixes.
|
||
|
||
---
|
||
|
||
## 2.13.0
|
||
|
||
**Upload a `.zip` and it lands extracted on the PS5.** Keep a game dump as a
|
||
single compressed `.zip` on your PC — smaller and easier to move around — and
|
||
upload it directly. ps5upload decompresses it on your computer and streams the
|
||
files straight into the fast-transfer pipeline, so they arrive already
|
||
extracted on the console — no manual unzip, and no temporary full-size copy
|
||
on your disk. The Upload screen previews what the archive expands to (e.g.
|
||
"12 GB zipped → 47 GB extracted · 1,204 files") and detects the game's title
|
||
from its `param.json`. Resume, excludes, the bandwidth cap, and multi-console
|
||
mirroring all work just like folder uploads. ZIP only — `.rar` stays
|
||
unsupported (modern scene `.rar` is split + encrypted; unpack it first).
|
||
|
||
**Reliability fixes (verified on real hardware):**
|
||
|
||
- Folder downloads no longer double-nest (files landed at `…/foo/foo/`) and
|
||
no longer stop at 256 files — large directories now paginate correctly.
|
||
- Uploading a single empty (0-byte) file works instead of failing at commit.
|
||
- Upload-queue failures show the plain-language hint (e.g. "PS5 ran out of
|
||
space — click Retry to resume") instead of a raw error, and per-file
|
||
progress stays accurate when a transfer resumes.
|
||
|
||
**Polish across the app:**
|
||
|
||
- Rename (single and bulk) refuses to overwrite an existing file, matching
|
||
the guard the Move dialog already had.
|
||
- Fixed several stale-data-after-host-switch bugs on the Hardware and
|
||
Volumes screens, and a Power control that showed a success line and an
|
||
error at the same time.
|
||
- Disk Usage shows a drillable list for a folder whose children are all
|
||
subfolders, instead of a blank panel.
|
||
- Smaller touches: a first-run installer Cancel button, correct Library
|
||
spinner labels, bulk screenshot/rename that continue past a failed item,
|
||
and localized Connection step messages.
|
||
|
||
**Hardening.** Untrusted `.ffpkg`/UFS2 images and upload manifests are now
|
||
validated before use — path-allowlist checks, bounded allocations, and depth
|
||
caps — and hosting a large package over HTTP serves it completely instead of
|
||
silently truncating.
|
||
|
||
**Linux white-screen fix (Bazzite / SteamOS / NVIDIA).** The `PS5Upload.sh`
|
||
launcher now disables WebKitGTK's accelerated compositing path, so the app no
|
||
longer opens as a blank white window on affected GPU/compositor stacks.
|
||
Launch via `./PS5Upload.sh` (the recommended entry point), and see the FAQ's
|
||
"white screen on Linux" entry for the rare stack that needs more.
|
||
|
||
---
|
||
|
||
## 2.12.1
|
||
|
||
Audit-fix + CI repair point release. 2.12.0's release build failed
|
||
at link time because the bundled SDK pin (v0.38) predated the
|
||
`getloadavg()` libc symbol our new load-average telemetry depends on
|
||
(added in SDK v0.39). Fixing that plus seven adversarial-audit
|
||
findings from a multi-agent pass-2 sweep:
|
||
|
||
- Bumped pinned ps5-payload-sdk to v0.39 in CI + release workflows
|
||
so payload links cleanly against the version we develop with.
|
||
- Hardened the SMP-meta control parser against embedded-NUL/control
|
||
byte injection that could false-match action prefixes.
|
||
- Closed a race in the SMP-meta worker initializer where a concurrent
|
||
caller could see "watcher started" while the pthread had actually
|
||
failed to create.
|
||
- Added `O_NOFOLLOW`/`O_EXCL` to the appmeta heal copy so a hostile
|
||
package can't symlink-redirect writes into system paths.
|
||
- Serialized the fan threshold ioctl + pin update so concurrent
|
||
callers can't leave the kernel and the auto-reapply pin out of
|
||
sync.
|
||
- Tightened the SMP-meta run-now trigger so triggers arriving during
|
||
a sweep are no longer dropped.
|
||
- Made the SMP-meta interval setter refuse the update when the JSON
|
||
payload omits the interval field, instead of clamping to the
|
||
floor.
|
||
- Added a static repo-host allowlist for the catalog (github.com +
|
||
git.earthonion.com) so a hypothetical malicious catalog PR can't
|
||
silently point at an arbitrary HTTPS host.
|
||
|
||
---
|
||
|
||
## 2.12.0
|
||
|
||
High-level fixes and packaging cleanup:
|
||
|
||
- Shell is now stateful by session: `cd /data`, then `ls` or `pwd`,
|
||
keeps the expected working directory across commands.
|
||
- Fixed shell argument parsing so commands with paths, like
|
||
`cd /data` and `ls /data`, no longer collapse to the first word.
|
||
- Added live-test coverage for shell cwd persistence and a lab CLI
|
||
command for direct shell testing against a running payload.
|
||
- Improved Linux release guidance around AppImage/WebKitGTK startup
|
||
issues on Fedora/Bazzite-style systems.
|
||
|
||
---
|
||
|
||
## 2.11.0
|
||
|
||
Phase 1 of a 4-phase design coherence pass surfaced by a 4-agent
|
||
audit (IA, workflow walkthroughs, conceptual model, cross-feature
|
||
inconsistency). The other 3 phases (rename + IA restructure +
|
||
shared primitive extraction) are intentionally scoped to follow-up
|
||
releases — they touch many call sites and want their own focused
|
||
verification windows.
|
||
|
||
This release lands 5 discrete fixes that fell out of the audit as
|
||
real user-visible bugs, none of which were on the radar before the
|
||
review:
|
||
|
||
- **The OperationBar at the bottom now lights up for Upload Queue
|
||
and Install Queue runs.** Previously `activityWiring.ts` only
|
||
subscribed to 3 of the relevant stores; queue runs (Upload Queue
|
||
Start, Install Queue Start) fired real engine transfers but the
|
||
ActivityBar / Activity tab stayed dark — "where do I look to see
|
||
what's happening?" had inconsistent answers depending on which
|
||
surface kicked off the work. Now every queue item start/progress/
|
||
terminal forwards into activityHistory, so cross-screen "what's
|
||
in flight" reads from a single source again.
|
||
- **The Upload screen and the Upload Queue panel are now mutually
|
||
exclusive.** The PS5 payload's transfer port is single-client, so
|
||
starting the queue while a one-shot upload is in flight (or vice
|
||
versa) would block at the socket while both UIs displayed
|
||
"running". The Upload button now disables with an explanatory
|
||
tooltip while the queue runs; the queue Start button does the
|
||
symmetric disable on one-shot in-flight. "Add to queue" stays
|
||
enabled because it's a staging action, not a network one.
|
||
- **AppShell drag-drop now uses `safeUnlisten`** to match Upload +
|
||
InstallPackage. Was the lone holdout using a bare `try/catch`
|
||
that the global unhandled-rejection handler from 2.7.1 only
|
||
caught after-the-fact; this brings every drag-drop site to the
|
||
same pattern and prevents the next regression of forgetting it.
|
||
- **First-Run wizard step numbers are now 1/2/3** instead of 1/3/4.
|
||
`SetupCard index={3}` was a leftover from a removed step 2 — the
|
||
numbers in the UI looked like a typo without a footnote.
|
||
- **Default PS5 host is now empty** (was hardcoded
|
||
`192.168.137.2`, the USB-tether-on-Windows-ICS gateway). Wrong
|
||
for ~95% of users, who clicked Check on first launch, got a red
|
||
error, and may not have noticed the field already had a value.
|
||
Empty default lets the placeholder (`192.168.1.50`) do its job
|
||
and forces the user to read what they're typing. The Discover
|
||
panel remains the recommended onboarding.
|
||
|
||
### Deferred to Phase 2-4
|
||
|
||
- **B3** (real cancel — payload-side ABORT_TX frame) needs a
|
||
C-payload change plus hardware verification; held for a focused
|
||
payload session.
|
||
- **B4** (open-coded poll loops in Library/FileSystem) and **B8**
|
||
(dual `toMgmtAddr` signatures) get fixed when the Phase 3
|
||
primitives (`useCancelableJob`, `lib/addr.ts`) land — extracting
|
||
them now would mean two refactors of the same code.
|
||
- **Phase 2 + 4** (vocabulary cleanup + sidebar IA restructure +
|
||
Send Payload / Payload library merge with tabs + Settings split)
|
||
is a separate i18n-heavy release with ~300 translation key
|
||
changes; held until the primitive refactor is in (Phase 3) so
|
||
renames land on stable shapes.
|
||
- **Phase 3** (extract `useCancelableJob`, `lib/addr.ts`,
|
||
`useStaleHostGuard`) is a substantial refactor pass: ~300 new
|
||
LOC of primitives, ~600+ LOC of duplication removed, touches 5
|
||
long-running-action stores and ~40 call sites. Wants its own
|
||
focused session with careful test coverage.
|
||
|
||
The full audit lives in this session's notes; the design report
|
||
identified ~20 actionable items across the 4 phases, with credit
|
||
also given to 5 things the team has clearly designed exceptionally
|
||
well (the OperationBar contract, Saves' handleRestore host guard,
|
||
transfer.ts' resume architecture, Connection's VersionBlock
|
||
rechecking UX, InstallPackage's diagnostic block).
|
||
|
||
---
|
||
|
||
## 2.10.0
|
||
|
||
Adds a full **Date & Time settings** panel to the Hardware screen
|
||
that exposes the PS5's timezone, daylight-saving policy, NTP
|
||
auto-sync flag, date/time format preference, and tzdata version —
|
||
all read/writable from ps5upload. To the best of our research (see
|
||
`reference_ps5_date_registry_keys.md`), ps5upload 2.10.0 is the
|
||
first public PS5 homebrew project to write to the
|
||
`SCE_REGMGR_ENT_KEY_DATE_*` registry namespace. Write side is
|
||
marked experimental until per-key behaviour is confirmed on real
|
||
hardware.
|
||
|
||
**Important — what this does and doesn't do.** Six community-
|
||
known gotchas are surfaced inline as an expandable warnings panel:
|
||
|
||
- The PS5 has **two clocks**: the user-visible wall clock (which
|
||
this panel reads and writes) plus a SAMU-protected secure RTC
|
||
that signs trophies and licenses. **Setting the wall clock
|
||
cannot fake trophy timestamps.**
|
||
- Setting the clock far in the past breaks PSN sign-in (TLS cert
|
||
`notBefore` validation fails).
|
||
- Setting the clock far in the future breaks game cert validation
|
||
(GTAV-stuck-at-90%-load class).
|
||
- "Use Sony's NTP" silently re-syncs the wall clock on every
|
||
reboot — manual time doesn't persist unless you turn it OFF
|
||
first.
|
||
- DST rules are bundled in the firmware's tzdata; recently-changed
|
||
regions (Lebanon 2023, Mexico 2022) may be wrong until the next
|
||
firmware update.
|
||
- Write side is novel territory; Sony's Settings will reset any
|
||
field that misbehaves.
|
||
|
||
### What landed (new code paths)
|
||
|
||
- New payload module `payload/src/sys_registry.c` — generic
|
||
`sceRegMgrGet/SetInt`, `GetStr`, and `sceRtcGetCurrentNetworkTick`
|
||
wrappers via `dlsym(RTLD_DEFAULT, ...)`, same envelope our
|
||
existing `sys_time.c` already uses for
|
||
`sceSystemServiceSet/GetCurrentDateTime`.
|
||
- New FTX2 frames 136-139 (`TimeStateGet`/`Ack`/`Set`/`Ack`) and
|
||
matching `runtime.c` handlers (`handle_time_state_get` /
|
||
`handle_time_state_set`) that read every DATE key best-effort and
|
||
surface per-field availability flags so the desktop can degrade
|
||
gracefully when a key isn't reachable on the user's firmware.
|
||
- New Rust types `PsTimeState`, `PsTimeStateSetRequest`,
|
||
`PsTimeStateSetResult` in `ps5upload-core/src/sys_time.rs`; new
|
||
`ps5_time_state_get` / `ps5_time_state_set` engine functions; new
|
||
axum routes `/api/ps5/time/state/get` and `/api/ps5/time/state/set`.
|
||
- New Tauri commands `ps5_time_state_get` / `ps5_time_state_set`
|
||
registered in `lib.rs::invoke_handler`.
|
||
- New `DateTimeStateCard` component on the Hardware screen.
|
||
Renders below the existing "System time" card. Tz/DST/format are
|
||
staged in a pending-edit buffer and committed in one "Apply"
|
||
click — same UX shape as Sony's Settings. The Apply response
|
||
surfaces per-field rc + err_code so the user sees exactly which
|
||
writes Sony accepted and which were rejected.
|
||
- **NTP-drift indicator**: `sceRtcGetCurrentNetworkTick` (cached
|
||
NTP-derived tick, not a fresh sync) shown next to the wall clock
|
||
so a large divergence visibly flags "your manual time has drifted
|
||
from what NTP would say".
|
||
- 41 new i18n keys, translated into all 17 non-English locales.
|
||
- New memory note `reference_ps5_date_registry_keys.md` documents
|
||
per-key hardware-verification status and the rationale for which
|
||
DATE namespace keys we deliberately don't expose (devkit /
|
||
unknown blob formats).
|
||
|
||
### What the panel intentionally does NOT do (research, then deferred)
|
||
|
||
- **Secure-RTC manipulation** (trophy timestamp clock) — requires
|
||
kernel patches and per-firmware offset tables, out of scope.
|
||
- **NTP-server override** (`DATE_rtc_net`) — bin8 blob format isn't
|
||
reverse-engineered yet; wrong write could brick the NTP daemon
|
||
until Settings → Init.
|
||
- **Synthetic NTP-tick injection** (`sceRtcSetCurrentNetworkTick`) —
|
||
unknown impact on Sony's sync daemon and trophy / license state.
|
||
|
||
These are documented in the research note for a possible later
|
||
release after community verification.
|
||
|
||
---
|
||
|
||
## 2.9.0
|
||
|
||
A 4-agent self-audit (race conditions, security, silent failures,
|
||
resource cleanup) surfaced ~30 issues. This release bundles the 4
|
||
data-loss-class bugs, 7 medium-severity security findings, the
|
||
6-screen host-stale-clobber family, and 5 standalone correctness
|
||
fixes. Total: 13 real fixes, with a long list of patterns the agents
|
||
investigated and verified clean.
|
||
|
||
### Data-loss / silent-corruption fixes (4)
|
||
|
||
- **Payload shard-write OOM no longer reports success.** Under PS5
|
||
RAM pressure (kstuff loaded + other payloads alive + ShellUI bloat),
|
||
`runtime_write_shard_persistent`'s malloc-fallback path was
|
||
returning `0` from `drain_shard_data`, which the dispatcher
|
||
interpreted as "shard persisted" — SHARD_ACK fired, the host
|
||
advanced its cursor, the missing bytes were never retried, and
|
||
the user saw "Upload complete" on a corrupt file. All 4 OOM /
|
||
open-failure paths now drain-then-return `-1` with a stderr log,
|
||
so the tx aborts cleanly and the user sees a real error. This
|
||
bug was silently corrupting uploads for unknown duration.
|
||
- **Saves restore no longer wipes the wrong PS5 if the user
|
||
switches roster mid-flow.** Restore goes confirm → file dialog
|
||
→ unzip → wipe → upload (often 30+ seconds for big saves). The
|
||
recursive `fsDelete` previously used whatever IP was current at
|
||
await-resolution time, so a roster swap during the dialog would
|
||
silently target a different console. Now snapshots the host at
|
||
click time and refuses with an explicit "Host changed during
|
||
restore" error if it's no longer the same.
|
||
- **FileSystem screen no longer deletes the wrong file after fast
|
||
navigation.** A slow `ps5_list_dir` (1-3s on big `/data` trees)
|
||
resolving AFTER the user navigated to a deeper folder would
|
||
display the OLDER directory's contents under the NEWER URL. A
|
||
per-row Delete click joins the CURRENT path with the displayed
|
||
name — so the user thinking they're deleting `/data/foo`'s
|
||
"screenshots" could actually delete `/data/homebrew/screenshots`
|
||
if a coincidentally-named file existed there. The refresh now
|
||
drops stale results via probed-host + probed-path guards.
|
||
- **`transfer.ts` mount no longer leaves RW when user picked RO.**
|
||
Starting a second image upload with a different `mountReadOnly`
|
||
flag while a previous `fsMount` was in flight produced a race
|
||
where the OLDER mount could win the same mount point. Now
|
||
best-effort unmounts the superseded mount before returning,
|
||
closing the silent RO/RW divergence window.
|
||
|
||
### Security hardening (3 Medium → 0)
|
||
|
||
- **`/pkg-host/*` URL is now bound to the PS5 it was issued for.**
|
||
Previously any host on the LAN that could observe the PS5↔engine
|
||
TCP stream (promiscuous WiFi, ARP-spoof, SOHO router admin) could
|
||
recover the session UUID from the first GET and hammer the URL
|
||
with Range requests to drive 16 MiB allocations per call, OOMing
|
||
the engine and potentially the Tauri shell. Now compared against
|
||
the session's recorded `ps5_mgmt_addr`; loopback callers still
|
||
allowed for dev workflows. Logs every reject with peer + expected.
|
||
- **Payload `is_path_allowed` now blocks symlink-escape.** The
|
||
lexical check confirmed paths started with `/data`/`/mnt/...`,
|
||
but a symlink in a user-mounted `.ffpkg` (e.g.
|
||
`/mnt/ps5upload/usermount/evil → /system_ex`) escaped — the
|
||
subsequent open() followed the symlink and operated on the
|
||
forbidden target. Same CWE-59 class as CVE-2007-2374. Now calls
|
||
`realpath()` and re-validates the canonical form; symlinks
|
||
pointing outside the allowlist refuse with a stderr log.
|
||
- **Engine planner's `spawn_blocking` cleanups now timeout at 10s.**
|
||
The 3 staging-file cleanup tasks in `pkg_install.rs` used bare
|
||
`fs_delete` with the default 30s socket timeout PLUS waiting for
|
||
ACK; a wedged PS5 (kernel hang, payload crashed, unreachable
|
||
LAN) parked a blocking-pool worker AND a TCP socket per call.
|
||
Repeated register-rejects could stack and exhaust the 512-thread
|
||
pool. Now uses `fs_delete_with_timeout(Some(10s))`.
|
||
|
||
### Host-stale-clobber pattern across 6 screens
|
||
|
||
Ported `Library`'s `probedHost` + `isStale()` guard to:
|
||
**Saves, Volumes, Screenshots, Hardware (both `refresh` and
|
||
`refreshPs5`), SendPayload (`probeFile`)**, and **InstallPackage
|
||
(`addPkgPath`)**. Each had the same shape — slow async call
|
||
resolves after the user switched PS5, OLD host's data lands in
|
||
state attributed to NEW host. Most were P1 (misleading UI), but
|
||
combined with the Saves restore P0 they enabled the
|
||
"wipe-wrong-console" cascade above. Six bugs closed by adopting one
|
||
proven template.
|
||
|
||
### Other correctness + DX wins
|
||
|
||
- **Payload `posix_fallocate` ENOSPC now aborts the tx immediately**
|
||
instead of silently falling back to sparse `ftruncate`. Front-of-
|
||
60GB-upload disk-full is information the user needs NOW, not 50
|
||
GB later via a piecewise "open failed" message.
|
||
- **Save backup no longer produces empty zips on `file_type()`
|
||
failure.** `flatten_wrapper_subdirs`'s 4 `.unwrap_or(false)` sites
|
||
silently treated I/O errors as "not a match," sometimes descending
|
||
past real data layers and producing empty backups that the user
|
||
was told succeeded. Now propagates the error with path context.
|
||
- **Engine planner skips + warns on metadata failure** instead of
|
||
defaulting to `size=0` (which corrupted the `total_bytes`
|
||
denominator and surfaced later as a misleading "open <path>: io
|
||
error" mid-transfer).
|
||
- **`engineLogsTail` now escalates after 10s of failures.**
|
||
Previously retried silently forever — a permanently-broken
|
||
bridge (engine binary corrupt, wrong-arch, hung sidecar) hid the
|
||
very logs the user would need to diagnose it. Now emits one
|
||
`log.error` after 10 consecutive failures, with a recovery log
|
||
if it comes back.
|
||
- **Payload binaries no longer git-tracked.** `payload/ps5upload.elf*`
|
||
are now `.gitignore`d. CI rebuilds them from C source on every
|
||
release (`make payload`), and the desktop build script errors
|
||
with a clear "Build it first: make -C payload all" if missing.
|
||
Closes the "binary churn after CI run" friction we hit twice in
|
||
2.8.0 development AND the risk of a contributor shipping a
|
||
desktop build that embeds a stale payload.
|
||
|
||
### Things the audit verified clean (NOT bugs)
|
||
|
||
For credit + future reference: agent findings that turned out to
|
||
be false positives — `Hardware` tickers DO gate on
|
||
`useDocumentVisible()` (just at the call site, not the deps),
|
||
`extract_json_string_field` DOES handle JSON escape sequences
|
||
correctly (via `json_string_end`/`json_copy_unescaped_string`
|
||
helpers, just at a different layer), and the existing
|
||
`payloads_release` stale-cache already handles network errors
|
||
(but didn't handle HTTP 4xx/5xx, which 2.8.0 fixed). Two false
|
||
positives out of ~30 findings — trust-but-verify rule paid off.
|
||
|
||
---
|
||
|
||
## 2.8.0
|
||
|
||
This release lifts a handful of ideas from sonicloader (sister
|
||
project) after a deep cross-read of their PKG install path. Three
|
||
concrete improvements landed; the big one — bundling DPI as a new
|
||
install tier — is split into a catalogue entry now and a full
|
||
install-runner integration in a follow-up release.
|
||
|
||
Also fixes a long-latent Upload-screen race that was held back from
|
||
2.7.x for verification.
|
||
|
||
- **The Upload screen no longer shows the wrong file/folder in the
|
||
destination preview after picking a second source.** When
|
||
inspectFolder for the first pick resolved AFTER the user had
|
||
already picked a different source, its closure-captured `path`
|
||
would overwrite the newer source.path — the destination preview
|
||
then rendered the OLD name even though the user had moved on, and
|
||
hitting Upload would land the wrong source at the displayed path.
|
||
Fixed by guarding the post-await `set()` with `get().source?.path
|
||
=== path` so stale inspect results are dropped. 4 unit tests
|
||
cover the race patterns (folder→folder, folder→file, stale
|
||
failure, no-race control).
|
||
|
||
- **Staged-install PKGs now land on the PS5 as `<ContentID>.pkg`
|
||
instead of `<queue-id>_<ts>.pkg`.** Sony's installer keys on the
|
||
basename for some FW points and silently rejects mismatched
|
||
names — a class of "PKG installer rejected the file" failures
|
||
that looked like the PKG was bad but were actually a naming
|
||
mismatch. Fix is symmetric with sonicloader's
|
||
`canonicalise_pkg_filename` (homebrew.c:436). Falls back to the
|
||
legacy `<id>_<ts>.pkg` shape when the PKG header has no parseable
|
||
ContentID, so malformed homebrew PKGs still get a shot at install.
|
||
- **The Payloads release info now survives a GitHub outage.** The
|
||
cache was already saving release JSON on disk and falling back on
|
||
network errors, but a 403 (rate-limited) or 5xx (Cloudflare
|
||
hiccup) bypassed it — the user saw "fetch failed" even when a
|
||
perfectly good cached snapshot was sitting there. Now any non-2xx
|
||
response (or malformed body, or read error) also falls back to
|
||
the cached snapshot, with a yellow "couldn't refresh — showing
|
||
cached" banner so it's clear the data might be stale. Pattern
|
||
ported from sonicloader's `src/releases.c:383-409` with the
|
||
`refreshError` field name kept.
|
||
- **`ezremote-dpi` (cy33hc/ps5-ezremote-dpi) is now in the payload
|
||
catalogue.** DPI is a long-lived install daemon that owns Sony's
|
||
install state machine for a PKG's full lifetime, sidestepping
|
||
the class of "install accepted then evaporates" bugs that hit
|
||
cross-process callers. Install it from the Library tab. In a
|
||
follow-up release the install runner will offer "DPI" as a new
|
||
install method that proxies through it; this release lands the
|
||
catalogue entry so anyone can install DPI today.
|
||
|
||
Sonicloader fields we explicitly verified we don't need to port
|
||
(already covered): persistent notification inbox (we have
|
||
`state/notifications.ts` with the same 64-entry ring + persistence
|
||
shape), /data → /user/data sandbox path rewrite (already in
|
||
`payload/include/config.h`), and the FTX2 wire protocol (strictly
|
||
more capable than their loopback DPI socket / chunked HTTP).
|
||
|
||
---
|
||
|
||
## 2.7.2
|
||
|
||
- **drakmor/kstuff-lite is now in the payload catalogue.** It's a
|
||
fork of EchoStretch's kstuff-lite with a hot path for `.ffpkg`
|
||
(UFS) mounting — measured 3-4× faster end-to-end — and lower
|
||
overhead in the repeated mount/unmount cycles that ShadowMount+
|
||
exercises heavily. Narrower firmware range (3.00 → 10.01) than
|
||
the default kstuff (which covers 1.00 → 12.x via runtime NID
|
||
resolution), so it's a sibling option, not a replacement. Browse
|
||
to the Payloads tab to install. Pick only one kstuff variant —
|
||
both write the same `/data/kstuff.elf` marker, and autoload runs
|
||
whichever you put in your autoload list.
|
||
- **Library tab now nudges you toward the faster build if you
|
||
actually use `.ffpkg` / `.exfat` images.** A small dismissible
|
||
tip appears under the "Disk images" section header (only when
|
||
you have at least one image in your library) with a one-click
|
||
link to the drakmor repo. Translated in all 17 non-English
|
||
locales.
|
||
|
||
---
|
||
|
||
## 2.7.1
|
||
|
||
- **Resending the payload now shuts down the running one first.**
|
||
Before re-uploading to `:9021`, the desktop opens `:9114` and
|
||
sends a graceful `Shutdown` frame (200 ms total budget). The old
|
||
payload exits cleanly, the new ELF mmaps into a fresh process,
|
||
and the cascade of stale-state errors after every resend is gone
|
||
(most visibly the `pkg_install` retry storm on the Install Package
|
||
screen, which was the old payload still answering long after a
|
||
new one had been "loaded"). If nothing's listening on `:9114`
|
||
(first boot, payload crashed), the pre-shutdown is a no-op and
|
||
the send proceeds.
|
||
- **Sidebar no longer triggers React's "setState during render"
|
||
warning.** A dev-only i18n missing-key warning was calling
|
||
`console.warn` synchronously from inside `t()`; the patched
|
||
`console.warn` in the log capture wrote into the logs store, and
|
||
the Sidebar — which reads error-count from that same store —
|
||
closed the loop. Warning is now deferred via `queueMicrotask`,
|
||
so it still fires once per missing key but outside the render
|
||
frame.
|
||
- **Tauri listener-teardown race is swallowed quietly.** When a
|
||
webview unmounts mid-`unregisterListener` the inner Promise
|
||
rejects with `TypeError: undefined is not an object (evaluating
|
||
'listeners[eventId].handlerId')`. The listener is already gone —
|
||
exactly what we wanted — so the global `unhandledrejection`
|
||
handler now intercepts that specific message, prevents the
|
||
default ERROR banner, and logs at `debug` instead.
|
||
- **Three missing i18n keys added in all 17 non-English locales:**
|
||
`queue_strategy_overwrite`, `queue_strategy_resume`, and the
|
||
pluralized `logged_error_one` / `logged_error_many` used by the
|
||
Sidebar error chip. These were template-literal lookups the
|
||
phantom extractor can't auto-detect; non-English users were
|
||
seeing English fallbacks on the Install Package strategy buttons
|
||
and the Logs nav badge.
|
||
|
||
---
|
||
|
||
## 2.7.0
|
||
|
||
- **New "Sync time" card on the Hardware screen.** Shows the PS5
|
||
clock alongside your PC's clock plus the live drift between them
|
||
(updates once a second). One click sets the PS5 system clock to
|
||
match your PC's UTC time. Confirmation prompt before the set
|
||
(clock changes can affect trophies, save timestamps, and DRM
|
||
checks).
|
||
- The set goes through Sony's `sceSystemServiceSetCurrentDateTime`,
|
||
which lives in `SceShellCore` IPC. Requires a ucred-elevated
|
||
loader (kstuff or equivalent) — without it, Sony's authid check
|
||
rejects the call and the desktop surfaces the Sony err_code with
|
||
a hint to reload via kstuff.
|
||
- The payload bookends every set with a get-before + get-after and
|
||
reports both unix epochs. On some firmwares the SDK stub returns
|
||
rc=0 but the underlying syscall is a no-op; the desktop detects
|
||
this (post-set unix more than 5 s away from the requested target)
|
||
and renders a clear "PS5 reported success but the clock didn't
|
||
actually move" warning instead of a misleading success message.
|
||
|
||
---
|
||
|
||
## 2.6.0
|
||
|
||
- **Stream install (DPI 2.0) is the new default for Install Package.**
|
||
The desktop now serves the `.pkg` over HTTP and BGFT pulls + installs
|
||
it in one pass — no upload step, no 2× disk space, native pause/
|
||
resume from BGFT itself. The previous "upload then install" path
|
||
stays available as a one-click fallback on the failure card for the
|
||
rare LAN topologies where the PS5 can't reach the desktop's HTTP
|
||
port (firewall, segregated VLAN).
|
||
- A new segmented control on the Install Package screen lets you pick
|
||
the default install method; per-row badges (`stream` / `staged`)
|
||
show at a glance which path each queued item is using.
|
||
- The engine-side HTTP serve route, BGFT URL handover, and Range
|
||
support were already in tree — this release wires the UI choice
|
||
through so the path actually gets used by default.
|
||
|
||
---
|
||
|
||
## 2.5.2
|
||
|
||
- **Windows `.exe` launches on a freshly-installed Windows 11**,
|
||
including arm64. Previous releases dynamically linked the MSVC C++
|
||
runtime (`VCRUNTIME140.dll`, `MSVCP140.dll`), which isn't preinstalled
|
||
on a vanilla Windows install — especially Windows 11 on arm64, where
|
||
almost nothing has pulled the Visual C++ Redistributable in yet. Users
|
||
saw "The code execution cannot proceed because VCRUNTIME140.dll was
|
||
not found." Both binaries shipped to Windows (`PS5Upload.exe` and the
|
||
`ps5upload-engine.exe` sidecar) now statically link the MSVC CRT via
|
||
`+crt-static`, so they're self-contained — no redistributable
|
||
required.
|
||
- **Linux `.AppImage` launches on a freshly-installed Ubuntu 24.04+**.
|
||
Ubuntu 24.04 dropped `libfuse2` from the default install, which the
|
||
AppImage's type-2 self-mount needs at startup — so on a brand-new
|
||
desktop the AppImage just failed silently. The release zip now also
|
||
contains a `PS5Upload.sh` launcher that sets
|
||
`APPIMAGE_EXTRACT_AND_RUN=1` so the AppImage self-extracts to `/tmp`
|
||
instead of fuse-mounting — no apt install, no libfuse2, no kernel
|
||
module. Users with libfuse2 already installed can still run the
|
||
`.AppImage` directly if they prefer.
|
||
- A new **Fresh-Install Verification Matrix** in `TESTING.md` documents
|
||
the historical "ships green, fails on fresh install" failure modes
|
||
per platform/arch and the hands-on test pass that catches them before
|
||
tagging.
|
||
|
||
---
|
||
|
||
## 2.5.1
|
||
|
||
- **Windows release `.zip` opens in Windows Explorer again.** The
|
||
2.5.0 release workflow used `tar -a -c -f *.zip` (bsdtar /
|
||
libarchive) to wrap `PS5Upload.exe`. bsdtar streams output, so it
|
||
sets the zip local-header flag bit 3 ("data descriptor follows") —
|
||
Windows Explorer's built-in unzip rejects bit-3 zips on many
|
||
builds with "the compressed (zipped) folder is invalid", even
|
||
though 7-Zip / WinRAR / unzip open them fine. The workflow now
|
||
uses PowerShell's `Compress-Archive` (`.NET ZipFile`) which writes
|
||
sizes + CRC in the header — guaranteed openable by every Windows
|
||
Explorer build. If you grabbed 2.5.0 and saw the "invalid folder"
|
||
error, this is the fix.
|
||
|
||
---
|
||
|
||
## 2.5.0
|
||
|
||
- **`.jar` payloads** can now be sent — both from the Send Payload
|
||
screen and as steps inside playlists. Useful for BD-JB / BDJ-runtime
|
||
loaders. A new collapsible reference under the port field lists
|
||
typical loader ports per format (`.elf` → 9021 elfldr, `.js` →
|
||
50000 WebKit-stage, `.lua` → 9026, `.jar` → 9025 BD-JB) with a
|
||
note that custom loaders may listen on any port.
|
||
- **Sidebar nav and other data-driven UI** now translate correctly in
|
||
all 17 non-English locales. Labels like "Dashboard", "Save data",
|
||
"Screenshots", "Disk usage", "Payload library", "Kernel log", and
|
||
"Shell" used to silently fall back to English even when the locale
|
||
had a translation, because the keys never made it into the
|
||
canonical English dictionary. A dev-mode console warning now
|
||
catches any future occurrences of the same gap.
|
||
- **Full translation refresh** across all non-English locales —
|
||
roughly 190 keys per locale of pending backlog caught up, including
|
||
Connection screen, Upload status messages, Install Package
|
||
diagnostics, and all the small UI fragments that had been showing
|
||
in English for months.
|
||
- **Multi-pass bug sweep** fixed several real correctness issues
|
||
across the engine, the Tauri shell, and the PS5 payload metadata
|
||
parsers — including a payload-version flicker on transient probe
|
||
misses, a library-refresh race on host switch, a Windows port-
|
||
killer that could `taskkill` an unrelated PID, an unsafe drive-path
|
||
acceptance in the USB autoloader wizard, and three corruption-error
|
||
paths in the PKG / UFS2 parsers that always surfaced as a generic
|
||
EOF instead of the descriptive `BlockOutOfRange` variant.
|
||
- **Internal**: every user-visible string in JSX is now enforced at
|
||
build time to route through the translator — adding a hardcoded
|
||
label is a lint error, not a silent gap.
|
||
|
||
---
|
||
|
||
## 2.4.0
|
||
|
||
- Save data backup is now a clean `<title_id>.zip` with just the image
|
||
and sealed key inside — matches the format save-resigning tools use.
|
||
Restores re-add the on-PS5 prefix automatically, so backups and
|
||
resigner output are now interchangeable.
|
||
- Save backup correctly handles PS2/PSP-Classic titles whose layout on
|
||
PS5 hides the real data inside nested wrapper folders; the backup
|
||
zip now contains the actual save, not an empty folder or duplicate
|
||
copies.
|
||
- Single-file uploads (.pkg / .ffpkg / large images) can now resume
|
||
from where they stopped after a wifi drop or other failure — the
|
||
next click of Retry picks up at the last acknowledged shard instead
|
||
of restarting from zero. Retry budget for single-file uploads
|
||
raised to survive several wifi blips per long upload.
|
||
- Pre-flight free-space check on the destination drive before a
|
||
single-file upload starts. If the drive can't fit the file, you
|
||
see a clear "needs X more GB free" message in seconds instead of
|
||
the upload silently dying hours later.
|
||
- Failed-upload error cards now show a humanized hint (e.g. "PS5 ran
|
||
out of free space — free space and click Retry") with the raw
|
||
payload error tucked in a collapsible "raw error" expander for
|
||
debugging.
|
||
- Install Package: better warning that the PS5 screen may go black
|
||
during install — that's normal, the install keeps running.
|
||
- Install Package: queue progress now survives a tab switch — opening
|
||
another tab and coming back no longer resets the in-flight bar.
|
||
- Listener cleanup race fixed across screens — no more occasional
|
||
"TypeError: undefined is not an object" console errors during
|
||
navigation or hot-reload.
|
||
- Startup is faster: language packs (18 locales, ~1 MB total) now
|
||
lazy-load on demand instead of all-eagerly. The main JS bundle
|
||
drops from ~1 MB to ~200 KB.
|
||
|
||
## 2.3.0
|
||
|
||
- Install Package: tries the in-process installer first (no home-screen
|
||
flash on most pkgs); falls back to the ShellUI route only when Sony's
|
||
installer requires it.
|
||
- Install Package: cleaner status — a row succeeds, fails, or rolls
|
||
back. No more low-level "we couldn't extract pkg metadata" notes; if
|
||
it fails, the error tells you why.
|
||
- Better error for DLC installs whose base game isn't installed yet
|
||
(was previously a misleading "BGFT not available" message).
|
||
- Shell tab now works on PS5 (no `/bin/sh` on the console — built-in
|
||
commands: `help`, `ls`, `cat`, `stat`, `ps`, `mount`, `df`, `id`,
|
||
`uname`, `env`, `sysctl`, `hostname`, `echo`, `sleep`).
|
||
- Save data + Screenshots tabs now populate correctly (older builds
|
||
used wrong filesystem paths and hex-vs-decimal user-ID parsing).
|
||
- Hardware → Network: lists real interfaces (eth0 / wlan / lo) via
|
||
the FreeBSD getifaddrs fallback when Sony's API returns empty.
|
||
- Disk Usage: better text visibility — small folders no longer get
|
||
cells too narrow to read, and the layout fills the window.
|
||
- Kernel Log: optional filter panel groups Sony's routine PSN /
|
||
storage / framework chatter so you can focus on real issues
|
||
(default: show everything; click Filters → "Hide Sony noise" to
|
||
collapse).
|
||
- Mount modal: warns up front when the chosen path is in the Sony-
|
||
reserved `/mnt/usb*` or `/mnt/ext*` namespaces, with one click to
|
||
switch to `/mnt/ps5upload/`.
|
||
- Bundled-payload extraction now handles concurrent app launches +
|
||
shows the real error if extraction fails (no more misleading
|
||
"run make payload" hint).
|
||
- Smaller fixes: GoldHEN entry removed from the payload library
|
||
(PS4-only); Compare PS5s tab removed.
|
||
|
||
---
|
||
|
||
## 2.2.61
|
||
|
||
**13-pass audit: boot reliability, install correctness, DoS hardening**
|
||
|
||
- Takeover handshake no longer hangs on a wedged previous payload
|
||
(added a 2 s `recv` deadline) and tolerates big-COMMIT_TX tails
|
||
(port-release wait bumped from 2 s to 10 s).
|
||
- Install path serializes correctly across files: the AppInstUtil
|
||
install-start and status-poll calls in `bgft.c` now share the same
|
||
Sony-API mutex as register / launch / uninstall in `register.c`,
|
||
closing a FW 9.60 deadlock window where a status poll concurrent
|
||
with a register on another mgmt thread could wedge the calling
|
||
thread inside Sony's kernel stub.
|
||
- Browser-launch RPC now serializes against the rest of the Sony
|
||
install/launch surface (was the only call site missing the mutex).
|
||
- pkg-host range responses capped at 16 MiB per request, preventing
|
||
a malicious LAN client from forcing a multi-GB allocation by
|
||
requesting `bytes=0-{total-1}` on a large pkg.
|
||
- ELF-loader (port 9021) destination rejects non-ELF files before
|
||
connecting; .bin / .js / .lua flows on custom loader ports
|
||
unaffected. Closes a silent wrong-file-picked failure where the
|
||
loader received garbage and the UI showed "send succeeded" with
|
||
no payload coming up.
|
||
- Boot-failure reasons now surface as PS5 toast notifications
|
||
instead of vanishing into stderr (which is invisible on a
|
||
:9021-loaded payload).
|
||
- Cleanup-on-failure for `pthread_create(mgmt)` no longer leaves a
|
||
stale ownership record.
|
||
- Deleted ~159 LOC of dead code (`payload_loader.rs`); fixed several
|
||
stale comments (notably the "we eagerly call
|
||
register_services_init" claim that contradicted the actual code).
|
||
- Tests: +21 pinned (Rust connection.rs partial-write retry,
|
||
probes.rs ELF-magic + size-cap + non-default-port behaviour,
|
||
pkg-host range cap), 255 client TS tests still green.
|
||
|
||
---
|
||
|
||
## 2.2.60
|
||
|
||
**Install Package, Library Play / Unmount, sensor fixes**
|
||
|
||
- Install Package works end-to-end on FW 9.60: a three-tier pipeline
|
||
routes Sony's installer through ShellUI's authid via ptrace RPC for
|
||
game pkgs (CUSA / PPSA / PCSA / EP / UP). NPXS-prefix system pkgs
|
||
get a fire-and-forget path with on-PS5 verification.
|
||
- Library Play always registers first (idempotent), retries with a
|
||
DRM-type patch on rejection, then launches.
|
||
- Unmount unregisters every title inside the image first, so the
|
||
dashboard stays clean — no ghost tiles, no stale title-id errors.
|
||
- Hardware sensors stop drifting over time: bgft.c restore is now
|
||
retry-with-verify; the sensor retry path re-arms the debugger
|
||
authid.
|
||
|
||
---
|
||
|
||
## 2.2.50 – 2.2.59
|
||
|
||
**Install Package: optional `file://` flow, mount visibility, audit
|
||
fixes**
|
||
|
||
- Install Package gains an optional PS5-side path (`file://` flow)
|
||
for upload-then-install workflows.
|
||
- Mounted `.ffpkg` / `.exfat` at user-chosen paths surface in
|
||
Volumes and the Library mount badge correctly.
|
||
- AppInstUtil error code humanization with actionable copy.
|
||
- Mount errors now go through a humanizer (especially nmount EPERM).
|
||
- Multi-pass audits across the install / mount paths: 9 + 4 fixes
|
||
spanning SSRF defense, pagination, JSON parsing, retry semantics.
|
||
|
||
---
|
||
|
||
## 2.2.31 – 2.2.49
|
||
|
||
**Install Package tab, Library polish, switch to AppInstUtil**
|
||
|
||
- New Install Package tab: drop `.pkg` files, queue serial installs.
|
||
- Switched primary install backend from BGFT to AppInstUtil
|
||
(compile-time linked) with synthetic task IDs to route status
|
||
polls.
|
||
- BGFT: try multiple library paths and symbol-name variants before
|
||
giving up.
|
||
- Library row: 7+ buttons collapsed into one primary action +
|
||
Details + overflow menu. Play auto-registers; 60 s launch timeout.
|
||
- Library Game Details: cover art for both PS5 (`PPSA…`) and PS4
|
||
(`CUSA…`) titles via title-id prefix routing, with hostname-allowlist
|
||
SSRF defense and a per-platform cover-host regex.
|
||
- 18 languages reach 100%+ string coverage.
|
||
- Engine: graceful axum shutdown, install-queue persist debouncing,
|
||
PKG session GC on a longer schedule.
|
||
|
||
---
|
||
|
||
## 2.2.26 – 2.2.30
|
||
|
||
**Live sensors and Launch on FW 9.60**
|
||
|
||
- Hardware tab returns real CPU / SoC temperature, frequency, and
|
||
power readings on FW 9.60. Sony gates these APIs on caller pid =
|
||
`SceShellUI.pid`; we route the calls through a ptrace-based RPC
|
||
into ShellUI itself so the check passes.
|
||
- Library Launch starts games on FW 9.60 via the same RPC path.
|
||
- Process list switched to `sysctl(KERN_PROC_PROC)` with stable
|
||
`kinfo_proc` offsets — real names show up, no per-firmware table
|
||
needed.
|
||
- Audit pass: 27 bug fixes across payload, engine, and client —
|
||
COMMIT_TX corruption guard, single-file resume reopen, spool
|
||
fallback heap migration, atomic DRM patch, updater host pinning,
|
||
download path-traversal block, JSON-escape-safe app register.
|
||
- Load order doesn't matter anymore — the loader can land before or
|
||
after our payload; the next request picks up the new privilege.
|
||
|
||
---
|
||
|
||
## 2.2.25
|
||
|
||
**Library mount picker + Library search bar**
|
||
|
||
- Mount picker: pick volume, subpath, and name. Resolved path
|
||
appears in real time. Last-used selection persists per host.
|
||
- Live search across Library: matches name, title ID, path, scope,
|
||
volume; multi-word AND across fields.
|
||
- Payload `mount_point` field plumbed through engine, Tauri command,
|
||
and TS API end-to-end. Older payloads gracefully degrade to the
|
||
legacy name-only path.
|
||
- Audit hardening: hex-escape mount-tracker keys (collision-proof),
|
||
zero-init out-buffers, picker syncs with live volume probe.
|
||
|
||
---
|
||
|
||
## 2.2.20 – 2.2.24
|
||
|
||
**Move-progress accuracy, FileSystem volume picker, engine lifecycle**
|
||
|
||
- FileSystem screen gets a volume picker dropdown above the
|
||
breadcrumb. Last-browsed path persists per host.
|
||
- PS5 host now persists across launches.
|
||
- Library Move shows live byte progress on current payloads;
|
||
threshold-specific banner when the payload is older than the
|
||
app.
|
||
- Connection screen flips to fresh version + kernel data
|
||
immediately on Replace payload, with a "rechecking…" spinner
|
||
while the probe is in flight.
|
||
- OperationBar covers every in-flight op (uploads, downloads,
|
||
FileSystem ops, Library actions).
|
||
- Engine lifecycle: stdin-EOF watcher prevents orphans on
|
||
ungraceful exits, port-killer reaper cleans up pre-existing
|
||
orphans, single-instance plugin keeps double-launch from
|
||
killing the first instance's engine.
|
||
- CI: workflows on Node 24, coverage job green again on
|
||
ubuntu-24.04 with rustup-resolved llvm-cov.
|
||
|
||
---
|
||
|
||
## 2.2.16 – 2.2.19
|
||
|
||
**Cross-mount move progress, payload DoS-safety, FS_OP slots**
|
||
|
||
- Cross-mount moves keep their speed/byte counter — buffer for
|
||
`FS_OP_STATUS` JSON snapshot bumped to fit two maxed-out
|
||
PS5-path strings.
|
||
- Payload caps `BEGIN_TX` manifest bodies at 256 MiB; oversize
|
||
refused with `begin_tx_body_too_large` and the connection
|
||
closed cleanly.
|
||
- `fs_op` slot allocation is strict first-fit; no eviction.
|
||
Refuses new ops with a clear reason instead of silently blinding
|
||
an in-flight op's progress poll.
|
||
- Library Move modal pre-flights the destination via debounced
|
||
`FS_LIST_DIR`; warns inline on existing-path collisions.
|
||
- Engine error responses carry the full anyhow chain so the root
|
||
cause reaches the client.
|
||
- `make run-client` fails fast on missing GTK / WebKit dev libs
|
||
with a copy-pasteable apt / dnf / pacman command.
|
||
|
||
---
|
||
|
||
## 2.2.10 – 2.2.15
|
||
|
||
**Activity tab, OperationBar, internationalization**
|
||
|
||
- Activity tab: persistent record of the last 100 operations with
|
||
start time, duration, outcome, bytes moved. "Running now" /
|
||
"Recent" sections; Clear button.
|
||
- OperationBar (always-visible footer strip) shows in-flight ops
|
||
across screens; click to expand per-op rows.
|
||
- Stop button on every long-running surface: FS bulk delete +
|
||
paste, Library row download / delete / chmod / mount / unmount,
|
||
uploads.
|
||
- PS5-internal copy/paste throughput: read+write overlap via a
|
||
worker thread + double-buffered ring (16 MiB × 2). Throughput
|
||
bounded by the slower device, not the sum.
|
||
- Live progress + Stop on Library Move via `FS_OP_STATUS` polling
|
||
and `FS_OP_CANCEL`.
|
||
- Engine `/api/version` endpoint; cancelled `fs_copy` cleans the
|
||
partial destination so retries have a clean slate.
|
||
- 18 languages: Activity tab, Settings keep-awake hint,
|
||
OperationBar, Connection screen + StatusBar, sidebar nav, Upload
|
||
drop zone — every visible string runs through `tr()`.
|
||
|
||
---
|
||
|
||
## 2.2.0 – 2.2.9
|
||
|
||
**Resume, in-app updates, broader firmware coverage**
|
||
|
||
- One build covers PS5 firmware 1.00 – 12.70. Core transfer,
|
||
mount, and file features work on every supported firmware.
|
||
- In-app update check (Settings → Updates): polls GitHub once a
|
||
day; archives land in Downloads — replace the app manually, no
|
||
installer.
|
||
- Resume survives app restart: close mid-upload, reopen, pick up
|
||
where you left off (24 h window).
|
||
- Folder uploads keep their name; destination preview shows the
|
||
exact PS5 path as you type.
|
||
- Cross-platform six bundles: macOS arm64 + x64, Windows x64 +
|
||
arm64, Linux x64 + arm64.
|
||
- Payload no longer crashes when a client disconnects mid-transfer
|
||
(SIGPIPE ignored).
|
||
- Multi-GiB single-file uploads stream a single shard-sized buffer
|
||
instead of memory-mapping; peak RAM bounded by shard size.
|
||
- Folder excludes (`.DS_Store`, `Thumbs.db`, `*.esbak`, `.git/**`).
|
||
- Image uploads can mount on completion via the PS5 kernel's LVD
|
||
backend.
|
||
- Engine sidecar restarts cleanly when the prior child is
|
||
unresponsive.
|
||
- Real cancel + live progress for PS5-internal copy / move.
|
||
- Better humanized error messages on Upload and Volumes screens.
|
||
|
||
---
|
||
|
||
## 2.1 and earlier
|
||
|
||
**Direct-write transfer pipeline, single-file resume, FTX2**
|
||
|
||
- Single-file transfer: direct-write to `.ps5up2-tmp` sibling;
|
||
atomic rename on COMMIT — no spool overhead.
|
||
- Multi-file transfer: manifest JSON + binary search per shard;
|
||
packed-shard worker pool absorbs transient I/O hiccups.
|
||
- BLAKE3 per-shard verification.
|
||
- Reconcile: size + hash compare for resume.
|
||
- FTX2 binary protocol with a 28-byte LE frame header
|
||
(magic / version / type / flags / body_len / trace_id), plus
|
||
86 frame types covering Tx lifecycle, FS ops, mount, app
|
||
register / unregister / launch, hardware, pkg install.
|