An optional "Other versions" link on a game card lists every version the
patch site knows: Prospero Patches for PS5, its sister site Orbis Patches
for PS4 (same API). Versions newer than the installed one that run on this
firmware can be picked; older ones are shown but not offered, since
installing an older patch over a newer one is untested.
Picking a version opens the existing guide for exactly that version: QR
code to the phone, copy the link on the site, paste it. Orbis offers the
piece links of a PS4 patch ("Copy all links!"); they sit in the same gs2
folder as the manifest, so PatchDL derives "<name>.json" from any
"<name>_<n>.pkg" and fetches it over http like other PS4 manifests. The
size check uses the size the list showed for the version picked.
The Prospero lookup behind "Old FW patch" now uses the same list.
PatchDL Web UI
Standalone static UI for the planned PS5 patchdl.elf web server.
Open index.html directly for the mock UI, or serve this directory from the
ELF web server. The JavaScript first tries the real API and falls back to demo
data when the API is not available.
The embedded ELF server serves this UI on port 12880 by default.
Expected API
GET /api/status
GET /api/config
POST /api/config
GET /api/titles
GET /api/downloads
GET /api/installstatus
GET /api/pkgmeta/:title_id
GET /api/pkgverify/:title_id
POST /api/titles/:title_id/check
POST /api/titles/:title_id/download
POST /api/titles/:title_id/install
POST /api/titles/:title_id/enable
POST /api/titles/:title_id/disable
Policy Model
The UI assumes deny-by-default behavior:
{
"default_policy": "deny",
"download_dir": "/data/patchdl (internal)",
"install_after_download": false,
"delete_pkg_after_install": true,
"source_policy": {
"official": { "allow_check": true, "allow_download": true, "allow_install": true },
"external": { "allow_check": true, "allow_download": true, "allow_install": true },
"shadowmount": { "allow_check": true, "allow_download": false, "allow_install": false },
"unknown": { "allow_check": true, "allow_download": false, "allow_install": false },
"fake": { "allow_check": true, "allow_download": false, "allow_install": false }
},
"cdn_allowlist": [
"sgst.prod.dl.playstation.net",
"gst.prod.dl.playstation.net",
"gs2.ww.prod.dl.playstation.net"
]
}
Per-title modes:
disabled
download_only
latest_compatible
pin
check_only
Per-title source fields:
{
"title_id": "PPSA90001_00",
"name": "Shadowmounted Test Title",
"source_type": "shadowmount",
"source_path": "/system_ex/app/PPSA90001_00",
"mount_from": "/mnt/usb0/itemzflow/Shadowmounted Test Title",
"enabled": true,
"mode": "disabled"
}
Supported source_type values:
official
external
shadowmount
unknown
The frontend lists shadowmount, unknown and fake titles under Not
supported and offers neither download nor install for them. The backend refuses
both as well, even if a client sends a forged request.
For PS5 game updates, the backend may turn a Sony manifest_url into a merged
local .pkg by downloading all manifest pieces. The delta_url *-DP.pkg is
not shown as a separate user action because it can bootstrap the storage/master
title instead of the installed regional target.
If patch_storage_match is false, the CDN stores the patch pieces under another
regional (master) title id. That is fine: the merged .pkg assembled from the
manifest carries the installed title's own content id, and AppInstUtil
AppInstallPkg installs it onto that title. The UI only adds a "Shared master"
label.