New hero, games, library, settings, phone and social-preview images
with the redesigned cards, a PS4 game and the Other versions list.
The old-firmware screenshot gives way to one of Other versions, and the
highlights mention picking a version, the ten languages and downloads
that get through blocked DNS and dropped connections.
A piece that failed was fetched again from its first byte. With pieces
of several GB, a connection that drops every few minutes never got one
finished. A retry now asks for the rest with a Range request; with
verification on, the part on disk goes into the hash first (pause and
cancel interrupt that). A server that sends the whole piece instead
overwrites it in place; one that sends another range, or 416, gets the
piece from the start without spending an attempt. A continued piece
that fails its hash is fetched whole once more before the package
counts as corrupt.
Also:
- A reply longer than its piece no longer writes into the next piece.
- Oversized replies and redirect loops are not retried as network errors.
- The diagnosis shows the no-space text for a job that ran out of space.
- README names Quad9 and Orbis Patches.
The resolver asked one server over UDP and took the first answer, even
a blocker's 0.0.0.0. It now tries UDP on four public resolvers, then
TCP, then DNS over HTTPS (Cloudflare, Google), then the addresses the
last good lookup saved. Sinkhole answers count as blocked, curl gets
every address of a host, and a host whose addresses refuse or drop the
connection is looked up again. Sony hosts stay pinned to Sony's root;
only the DoH requests use public roots.
The network check reports where each answer came from and what failed
before it.
New screenshots for the hero, games, queue, settings and phone views,
all with game icons. Add a library shot sorted A to Z, mention the
Needs FW label and the package check in the highlights, and answer
which games PatchDL updates in the FAQ.
SDK 0.44 ships kernel offsets for every firmware from 1.00 to 13.60,
and the AppInstUtil calls and app.db table PatchDL uses exist across
that range. Tested on 11.60 and 13.60.
New hero composite, desktop and phone screenshots rendered from demo
data, highlights, a get-started list, a short FAQ and a clear statement
that PatchDL only fetches official, unmodified updates for games already
on the console. Old photos showing debug output are replaced; the real
home-screen tile photo stays. docs/images/social-preview.png is ready
for the repository's social preview.
Full GPL-3.0 text in LICENSE, SPDX-License-Identifier header on every
source file, README license section updated. Copyright (C) 2026 Knutwurst.
Tidied a couple of stale comments in patchdl_tile.{c,h} while at it.
Reads like a project README now: what PatchDL is, what the UI looks
like, how to use the settings, how to install. The deeper notes
(target-id matching, source classification, partition layout, console
setup chain) are out — those belong in design docs, not the front door.
Five photos under docs/images/ render inline: home-screen tile, the
desktop browser UI, the mobile settings view, the on-console browser,
and the startup notification. Originals stay in photos/ for future
crops.
README catches up to where the code is:
- The "cross-region install is a known limitation" section is gone. We
route through sceAppInstUtilAppInstallPkg now, verified end-to-end on
Dead Island 2 (01.000.001 -> 01.000.011, including the shared-storage
case where the patch lives under a master title id).
- A Web UI section documents the filter chips (Updatable default,
Updating separate bucket, All on the right) and Update all.
- Deploy section notes the new filename shape (patchdl_<version>.elf)
so Payload Manager can parse the version out of it.
deploy_ps5.sh follows: UP_NAME is now patchdl_${VERSION}.elf to match
the released asset naming.
Document the connection-pool download (configurable 1–16, applied live), the
download queue, reboot-safe per-piece resume, Pause/Resume/Cancel, optional
SHA-256 verification, and on-device package verification. Add a Settings section.
Rewrite Status: download + verify is proven on 11.60 (a 61.6 GB update verified
byte-perfect across reboots); same-region install works; cross-region debug-magic
patches download and verify but cannot be installed via homebrew on 11.60.
Split the single morphing button into a green/amber play-pause (Update →
Pause → Resume) and a red stop (Cancel). Pause aborts the download but
keeps the partial (resumable); Cancel aborts and deletes. Backend gets a
separate pause flag distinct from cancel.
Resume now continues WITHIN a part: the partially-written piece is fetched
from its last byte via an HTTP byte range (with a safe fall back to
re-fetching the whole piece if the CDN ignores the range), instead of
re-downloading the whole part. A title is resumable as soon as any bytes
are on disk.
Version bumped to 0.0.3 (no release tagged).
Cancel a running download (the worker aborts mid-piece and the partial
file is removed) or delete a finished package, from the queue or the
title card. The progress callback now returns an abort signal that
reaches libcurl and the manifest merge loop.
Manifest merge: bound the piece scan to the "pieces" array so a later
"url" key (e.g. playgoChunkCrcUrl) can't be appended as a bogus piece,
and require each piece's fileOffset to match the bytes written so far so
an out-of-order manifest fails instead of silently producing a corrupt
package.
Report real free space on the download partition via statvfs; it was a
hardcoded 0.
Fixes found in review:
- scan: bound the SFO entry table to the bytes actually read and require
the key to be NUL-terminated before strcmp (OOB read on a crafted
param.sfo from a shadow-mounted dir).
- proc: bound the kinfo_proc walk and the name compare to the record and
the buffer.
- install: publish the API probe under the lock (data race with the MHD
worker thread) and initialize rc2.
- verxml: reject a truncated attribute value instead of returning it as
valid.
- web: keep download/install/downloaded flags across a refresh, stop the
queue poll only after repeated empty results, coerce the progress
number, and treat a cancelled download (HTTP 200, ok:false) as
not-downloaded.
Standalone PS5 payload with an embedded web UI on :12880, no etaHEN.
- Scans installed titles and classifies the source (genuine install,
ShadowMountPlus mount, preinstall, unknown) from the on-disk layout.
- Reads name, installed version and the Sony version.xml URL from the PS5
app database (vendored SQLite).
- Resolves version.xml past nanoDNS via a raw DNS query, TLS pinned to the
SCEI DNAS root.
- Filters patches to the newest one compatible with the current firmware.
- Downloads the patch and installs it through AppInstUtil (sysmodule loaded
at runtime), gated to genuine installs with a package title-id match guard.
- Action-based UI filters and an on-screen startup notification with the URL.