The owner's report: tiles deleted in the page stayed on the home screen after closing
RetroArch (from the home screen, and with the picker's Quit). The console's records showed
the removals done, but late: ShadowMountPlus refuses an uninstall while a game runs, and
the WebUI's daemon only tried again at its stop, 20 s after the title closed; a title
reopened within those 20 s left them for the next close.
The daemon now tries a tile's pending work (a removal, a new name or picture) as soon as
no program of the title is linked, and every 3 s while ShadowMountPlus still refuses (the
exiting app answers "game active" for a moment); the try at the stop stays for what is
left. ps5_forwarders::finish_pending says whether anything still waits, and runs under the
WebUI's lock (the page may be open meanwhile). README: "a few seconds after RetroArch
closes".
Evidence:
- evidence/game-forwarder-delete-on-close: on the console, a tile installed, deleted
through the WebUI while RetroArch ran ({"state":"pending"}), RetroArch closed:
/user/appmeta/PPSA99170 gone after 3.0 s; the daemon "13:18:48 not removed yet ...
game_active", "13:18:51 forwarder PPSA99170: removed"; ShadowMountPlus "uninstall
requested" at 13:18:51 (before: 20 s and more).
- tests/test_webui_daemon.py test_a_tile_removal_is_done_as_soon_as_the_title_closes:
nothing while a program is linked, the uninstall within 1.5 s of the unlink, before
the stop (2 s in the tests); test_webui_forwarders checks finish_pending's answer.
- gates: format, unit (211 tests), build, integration (211 tests), evidence (139
captures, 0 failed) - PASS.
evidence/game-forwarder-webui (tools/evidence.py distil of klog/game-forwarder-webui/
record.txt, game names masked): on the owner's base PS5 (13.40, ShadowMountPlus
1.7-beta5fix1), builds 9adce7a0 (8a31a1f) and 57fc257a (2512f39):
- the routes from the PC: a tile made (PPSA99171, its files and param.json, in
manual.lst), installed by ShadowMountPlus once RetroArch closed, opened (five
arguments, "forwarder: /app0/content/snes/<game> with snes9x, closing after it"),
renamed and re-pictured and the spike's tile deleted while RetroArch ran, both
finished by the daemon once it closed ("removed", "installed again with its new name
or icon"; /user/appmeta shows the new name and icon);
- the page in a browser: 33 systems in the picker, each with its icon; a tile made from a
SNES game's 3D box and one from a Genesis game's logo with the system's icon in the
corner ("Saving..." while ShadowMountPlus answered); an installed tile deleted ("leaves
the home screen once RetroArch closes"), uninstalled and its folder gone once RetroArch
closed; the home screen's icons are byte for byte the PNGs the page drew (512x512);
the Genesis tile opened its game with genesis_plus_gx and closed after it.
Not checked (human_check): a tile opened on the home screen while RetroArch is open
should bring up the console's prompt to close it; the control payload cannot press the
home screen.
README: "Start a game from a home screen forwarder" opens with "Make a tile in the
WebUI" (the page, ShadowMountPlus 1.7 or later, why changes wait for RetroArch to
close, where games may be); the arguments follow as "Make a forwarder by hand",
unchanged. No line removed.
Gates: format, unit (210 tests), build, integration (210 tests), evidence (138
captures, 0 failed) - PASS.
.gitignore keeps every Markdown file but README.md and the release notes
on this machine, and c1ed6e5's cherry-pick added
tooling/swanstation/README.md past that rule. It is untracked again (the
file stays on disk), and README.md's build section now says how to
include SwanStation, as it does for melonDS DS. AngelXex's credit stays
where it was: native.patch's header, tooling/swanstation/notices.py and
the notices table.
Evidence: git ls-files '*.md' lists README.md and releases/ only;
format PASS; tests/test_notices.py PASS; no README line removed.
From mihawk-99/PS5_RetroArch#34 (Martin Pham). A forwarder, a small app
with a home screen tile of its own, starts the title with --rom <file>
[--core <core>] [--exit-after-game] (each also as --x=<value>). On a
launch that names no mode, src/frontend_mode_ps5.cpp takes it as game
mode takes a frontend's request: the content (absolute, or inside
/app0/content/ and never above it) and the core are checked by
ps5_game_check, RetroArch starts with -L, and afterwards the title
opens as from the home screen, or closes with --exit-after-game.
Without --core the playlists choose, else the one core whose info file
lists the extension (Genesis Plus GX for the Mega Drive extensions both
Sega cores list) or, for a folder, the one core that opens folders. A
refusal goes to trace.txt and the launch goes on as from the home
screen; a handover's --ps5-mode wins over --rom.
Changed from the pull request: its README examples and test fixtures no
longer name games and use the ES-DE folder names content/ has now; one
header comment is moved to its declaration. Its line-ending rewrites of
the PowerShell scripts are dropped (they are gone, 8f14452), and its
GitHub workflow is parked in parked/github-build-workflow, with what
would finish it at the top of build.yml: it cannot run here, and it
does not fetch PS5_MihawkGen, which the frontend compiles now.
To prove it on a console, whose control payload launches without
arguments: the relaunch test takes its restarts' arguments from the
lines after the arm line, and tools/run-title.sh --relaunch-arg writes
them.
Evidence: tests/frontend_mode_ps5_test.cpp (parsing, paths, cores by
playlist, extension and folder, refusals, after the game);
tests/relaunch_ps5_test.cpp (arguments carried; a control character or
a ninth argument arms nothing). Gates: format, unit (204), build
(staged cores reused), integration, evidence PASS. Console: with this
series' deploy.
From mihawk-99/PS5_RetroArch#53 and #52 (Jorge Feitosa), renumbered
(0131 to 0133 were taken), taken together: #52 fixes the read loop #53
turns on.
- src/microphone_ps5.cpp (0134): a native AudioIn microphone driver,
the default one, for the first controller's user. It captures only
while a core has its microphone on, sends silence under the DualSense
mute, and keeps PCM only in a bounded queue in memory. RetroArch is
configured with the microphone; the title links a host stub for
libSceAudioIn's imports.
- 0135: a microphone read that gets no frames returns silence instead of
looping forever (a paused core, an empty nonblocking device, a failed
capture).
- tools/build-melondsds.sh: melonDS DS at pinned revisions (git objects
by SHA), software renderer and a native-memory JIT, staged only with
PS5_WITH_MELONDSDS=1; DeSmuME stays the DS default. The DualSense
touchpad drives its stylus as it drives DeSmuME's.
Changed from the pull requests: the README and the 0134 entry describe
what happens, not an opt-in the code never had. RetroArch's microphone is
on by default, as upstream; melonDS DS listens only while its microphone
button is held (its default), and Settings > Audio > Microphone turns it
off for every core. tests/test_microphone_read.py applies the port's
edits to vendor/retroarch itself rather than reading build/ra-conf, which
a tree configured before 0135 would fail. The SwanStation and melonDS DS
title changes are merged into one licence-file rule.
Evidence: tests/test_microphone_ps5.py (the driver against a simulated
AudioIn: lifecycle, mute, input failure); tests/test_microphone_read.py
(it times out with upstream's loop); tests/test_touchpad_stylus.py
(melonDS DS's relative stylus); tools/build-melondsds.sh, core ABI PASS
(25 exports, kernel_web, sha256 b03d4c93...). A title built with both
optional cores: 61 notice parts, check-notices covers every shipped
executable, check-manifest PASS, 78 melonDS DS options in the catalog.
Gates (default build): format, unit (204), build (staged cores reused),
integration, evidence PASS. Console: with this series' deploy.
Testers kept reporting folders EmulationStation did not detect. The title
made a folder in content/ for each system named as RetroArch's databases
are ("Sony - PlayStation 2"); it now names each as ES-DE names the system
("ps2", "snes", "genesis", the 50 platform ids, all of them ES-DE system
names checked against ES-DE 3.5.0's own systems file), so content/ is
ES-DE's own layout, <ROM folder>/<system>.
- ps5_library_make_system_folders makes content/ first when it is missing:
a copy of the title without its empty folders had none at all, because
the frontend made content/ only later and the step gave up.
- ps5_library_rename_system_folders, at each start before any frontend:
a folder an earlier build made under RetroArch's name is renamed to the
ES-DE one, or merged into it when none of its entries' names is taken
there (else left as it is, still its system's). The paths in RetroArch's
playlists (and their scan folders) and the per-folder overrides, core
options, shader presets and remaps under config/ follow; a core whose
folder bears the content folder's own name (MAME, ScummVM) keeps its
files, which are that core's. Folders the user named (PS1) stay as they
are and are still recognised.
- The WebUI's Add Game puts a game in the system's ES-DE folder.
- README: content/<system>/ with ES-DE's names (content/Saturn/ was out of
date: only system/Saturn is made).
Evidence: tests/ps5_library_test.c (system folders by ES-DE name, a missing
content folder made, a rename, a merge, a clash left in place, a folder
whose name only begins the same, playlists, per-folder settings, a core
folder named as the content folder): python3 -m unittest
tests.test_ps5_library OK. On the console (evidence/esde-folder-names,
with the commits after this one): a home launch renamed three seeded
folders (a rename and two merges), the playlist and options file followed,
and every ES-DE system path is /app0/content/<name>. tools/verify.sh: all
five gates PASS.
The PS2 core is now PS5SX2 (Swordpdf's PCSX2 for the PS5) from the fork
../Libretro_PS5SX2, branch libretro, pinned at 308e8dc. build-ps5sx2.sh
fetches and pins its dependencies (rapidyaml 0cd25a1, glslang 275822a built
for the console, shaderc v2026.2 headers), builds the core with the fork's
ps5/libretro/Makefile.libretro, ABI-checks it and stages PCSX2's game
database in system/ps5sx2/resources. PS5SX2_DEV=1 builds the fork as it
stands. BIOS and memory cards stay in system/pcsx2/ (shared).
LRPS2 is gone: build-lrps2.sh and tooling/lrps2, its notices component,
WebUI catalog and settings-guide entries, and the title's core list.
build-title.sh empties dist/{cores,info} before staging, so a core taken
out of the list does not linger. The balanced 4K default (0102) now sets
ps5sx2_upscale to 4x; the core offers up to 8x (6x is 4K).
Also: patch 0118's tests (the block count, the XMB icon names test).
Console evidence (192.168.50.237, RADV; tools/run-title.sh --game=ps5sx2):
- Shadow of the Colossus (USA) boots and plays (klog/game-122302.png).
- tests/pad/ps5sx2-states-4k.txt: frames of 3072x2688 at 6x; a 46,562,360
byte state saved and loaded from the Quick Menu (klog/retroarch-124621.log).
- RetroAchievements: SET_SUPPORT_ACHIEVEMENTS, account logged in, disc
hashed, the core's memory map published (klog/retroarch-125231.log).
- pcsx2_libretro.{so,info} deleted from the console's cores/ and info/.
Gates: format PASS; unit and integration fail only in
test_input_ps5.test_joypad_bindings and test_webui_qr (the uncommitted
frame-generation and input work in src/, not part of this commit); notices
PASS (33 cores); manifest PASS; evidence 127 replayed, 0 failed. The title
was built with the other cores reused (PS5_REUSE_STAGED_CORES).
Package the qualified title-specific resident service and start it through
local elfldr before workers when no service is ready. Wait for preflight,
verify SDK elevation and UID 0, and reuse the service on subsequent launches.
Keep installed paths and offline fallback; no Payload Manager boot hook.
Console evidence: evidence/lapy-autostart/capture.json and expectation.json.
Reproduce with evidence/lapy-autostart/README.txt, then
python3 tools/evidence.py compare evidence/.
Verified on the base PS5: cold service startup, two authenticated achievement
sessions, reuse of one service across three requests, and NetPlay relay join
with 3837/3361 input packets and 52 matching state checks. Normal title exits;
root counts 73/72 before each request. Resident service remains running.
Installed binary hashes and unchanged Payload Manager configuration verified.
Validation: 194 unit and 194 integration tests; format; all-target build with
PS5_FRONTENDS='es-de picker' and the existing pinned build/picker-template;
manifest/notices/source bundle checks; 127 evidence captures replayed.
No secrets, saves or raw console captures included. No push.
Qualify the console build with authenticated achievement-set loading, a fresh
badge download, FCEUmm LAN hosting and relay joining. The relay session exchanges
scripted controls and passes 55 direct emulation-state CRC comparisons. Normal
quit returns the elevation service's root counts to baseline.
Expose DNS/TLS failures and add a debug-only trace at the upstream state CRC
comparison. This adds one port hook, so the intentional patch-count assertion
changes from 253 to 254. Keep the requested Online Updater removal and repeatable
RetroArch runner arguments. The verified build uses the standard SDK socket API.
Online startup still requires the qualified external Lapy service; no autoload
is installed. Document the force-close teardown timeout and untested lobby/NAT
scope. Credentials, settings, saves and raw console captures are not committed.
Validation: PS5_FRONTENDS='es-de picker' with the pinned picker template;
tools/verify.sh format unit build integration evidence passed (193 unit,
193 integration). After moving only the debug trace to the received-CRC path,
24 focused frontend/patch tests and format/build passed again, followed by the
final console runs. Final format/evidence, manifest and notices checks passed.
Evidence: evidence/online-features/capture.json and expectation.json.
Replay: python3 tools/evidence.py compare evidence/ (126 captures, zero failures).
Console reproduction: evidence/online-features/README.txt and console_netplay.py.
Use the approved banner, four subtle section accents and self-contained SVG frames preserving original screenshot bytes. Keep all README notices, headings, system icons and renderer rows.
Verification: python3 tools/make-readme-frames.py; source and XML checks; browser loads 74 images without overflow; bash tools/verify.sh format evidence passes with 118 captures. Evidence: evidence/readme-galaxy. No new dependencies. Release-note changes excluded.
Move the visible frontend section above At a glance, remove four requested subsections, and restore all 33 renderer entries. README warnings preserved. Validation: format/evidence passed with 117 captures and local preview reviewed. Release-note removal excluded from this commit after approval review rejection.
Replace the Overview hero with the Games capture, document current library/media/save and QR workflows, group 33 cores with system icons, and retain every permanent warning. Keep source-build status and known limits explicit.
Verification: bash tools/verify.sh format evidence — PASS, 116 captures. Source audit: all local links resolve and 33 cores retained. Local browser: 69 images loaded, no page overflow. Evidence: evidence/readme-beta-refresh. No publication.
The WebUI's Games page scrapes box art, screenshots, title screens and logos from
libretro's thumbnail server into /app0/library/<system>/<kind>/<game>, one store for
every frontend: RetroArch's thumbnail lookup asks it first (patch 0114, which also
gives thumbnails_directory "default" its folder: it was empty and stopped every
lookup), EmulationStation has it as its media folder and fills its game lists from
its .meta files, the Games page shows it, a future frontend calls ps5_library_media.
- src/scraper.{h,cpp}: jobs saved and resumed without repeats, exact names, exact
titles tags aside, ranked candidates for the user, fill-missing by default; PS5 mode
on the daemon (runs with the page and the title closed) and PC mode through
webui/ps5-media-helper.py (the console identifies; the bytes pass through the PC).
- The page: the method asked first and remembered on the console, sources and every
media type described, version tags on each card. ScreenScraper, LaunchBox and
EmuMovies are listed as coming (ScreenScraper's developer credentials requested).
- The daemon's HTTP is libcurl over mbedTLS 3.6 with the shipped CA bundle (Sony's SSL
failed every handshake from the payload, 0x8095f00c); its updater uses it too.
- The shared library: one path a game read from outside the title (14 games were
listed twice), a disc's listed .bin dropped beside its .cue.
- The daemon: workers on 1 MiB stacks (a 64 KiB frame overflowed one), stale hand-over
on transfers in flight rather than idle keep-alive connections, pid in its log.
Evidence: evidence/scraper-libretro (base PS5 13.40): every system in 148 s (520
complete, 28 partly, 181 kept, 61 ambiguous, 234 unmatched); cached runs fetch
nothing; HTTPS through curl; PC mode with the helper killed: 90 images each sent once;
a job finished with the title closed; 1,024 games, 0 duplicates. Not seen live:
RetroArch and ES-DE drawing the media (owner to look), updates through the daemon.
Command: build/tmp/scraper/live.py; tools/verify.sh: all five PASS.
The WebUI only ran inside RetroArch: a frontend change (LoadExec) ended it with
every upload in flight. It is now a payload of its own (daemon/webui_daemon.cpp,
webui/ps5-retroarch-webui.elf) serving the title's folder on 6769. eboot.bin, the
picker and ES-DE each keep a link to it (src/webui_link.h, 127.0.0.1:6770) and the
first to find none starts it through the ELF loader (9021) or websrv (8080 /hbldr).
It stops 20 s after the title closes, never mid-transfer; an update's Install
closes the title and the daemon installs. With no loader, eboot.bin serves the
WebUI while RetroArch runs, as before. The page names the frontend shown.
Downloads were handed to MHD as a descriptor (sendfile), which stopped at 33,300
bytes on the console; they are read in 256 KiB blocks.
Evidence: evidence/webui-daemon (base PS5 13.40). 200 MiB upload across picker ->
RetroArch -> picker and 60 MiB across picker -> ES-DE: one token throughout, 201
Created, every 256 KiB block equal on the console; daemon stopped 20 s after the
title closed; a 1,917,648,896-byte download's sha256 equals the FTP copy.
Command: tools/run-title.sh --picker-test=600:retroarch --retroarch-frames=1800
--watch 110 with build/tmp/webui-handover.py; tools/verify.sh: all five PASS.
Host tests: tests/test_webui_link.py, tests/test_webui_daemon.py.
Each from my local fork with a PS5 platform commit, through
tools/core-fork.sh:
- Opera (PS5_Opera, 3DO): FreeDO's modified LGPL forbids commercial use,
so it joins the non-commercial parts (text from its sources' headers,
tooling/notices/texts/opera-freedo.txt).
- PUAE (PS5_PUAE, Amiga): GPL-2.0-or-later; it boots Kickstart 1.3 from
system/kick34005.A500, AROS without one.
- NeoCD (PS5_NeoCD, Neo Geo CD): LGPL-3.0-or-later; BIOS in system/neocd/.
- ScummVM (PS5_ScummVM: scummvm/scummvm v2026.3.0, every engine, no
OpenGL): GPL-3.0-or-later. Its Makefile empties LDFLAGS, so the title's
link flags go in as PS5_LDFLAGS (without them the wrapper linked
libSceNet, which the core loader refuses); AR carries its flags (ar cru);
its pinned libretro deps are kept across clean checkouts.
build-title.sh stages the four; notices list them; README: systems, forks,
credits, licences (thirty-three cores).
Verified on the base PS5 (13.40), runs 224859-230600: BattleSport (from
its .iso: the archive's .cue names a file it does not hold), 3D Pool,
Metal Slug and Day of the Tentacle load, run and exit with 0
(evidence/four-cores-2026-10-06). Disc images inside archives do not load:
RetroArch extracts only the .cue; unpacked into folders on the console
they do. tools/verify.sh format, unit and evidence PASS (91 captures).
Before a release: publish the four forks.
Each from my fork beside this repository (all local, not yet on GitHub),
upstream plus a PS5 platform commit (no --no-undefined, no LTO, zstd without
trace hooks), built through tools/core-fork.sh:
- PicoDrive (PS5_PicoDrive): the 32X SH-2s on the interpreter (the
recompiler's static read-write-execute buffer faults on the PS5); frames
go out as XRGB8888. Non-commercial licence, like Snes9x and FBNeo.
- Beetle PCE (mednafen_pce, with SuperGrafx and CD), Beetle PC-FX, Beetle
VB, Beetle NeoPop, Beetle Cygne: GPL-2.0-or-later.
- PokeMini (GPL-3.0-or-later), Handy (zlib; its text is in the source
headers, tooling/notices/texts/handy-zlib.txt), Virtual Jaguar
(GPL-3.0-or-later), Stella 7.0c, a5200 (built-in Altirra BIOS; its
Makefile empties LDFLAGS, so the link flags go in as PS5_LDFLAGS),
ProSystem: GPL-2.0-or-later unless noted.
- DOSBox Pure 1.0-preview7 (now on Codeberg): the dynamic x86 core's code
cache is ps5_exec_allocate memory, and stdio replaces the VFS wrapper,
whose funopen the console lacks.
build-title.sh stages all thirteen; the notices list each; README: the
systems, forks, credits and licences (twenty-nine cores). On the console the
owner's BIOS files were moved where the cores look: system/pcfx.rom,
system/lynxboot.img, system/bios.min.
Verified on the base PS5 (13.40), one game per core with
tests/pad/boot-and-start.txt (runs 212433-220552): every core loads, runs at
its system's rate (Virtual Boy 50.3, Pokemon Mini 72, the rest 60 frames a
second) and exits with 0; pictures inspected
(evidence/new-cores-2026-10-06). tools/verify.sh format, unit and evidence
PASS (90 captures, 0 failed); build and integration not rerun this step.
Before a release: publish the thirteen forks the notices and README name.
tools/build-flycast.sh builds Flycast's libretro core from my fork
../PS5_Flycast (b95c532f: upstream flyinghead/flycast 59ed35a7e plus five
commits) through tools/core-fork.sh, like the other forked cores:
- the PS5 libretro build: no --no-undefined, 16 KiB pages;
- the SH-4, ARM7 and AICA DSP recompilers' code in the console's executable
memory (ps5_exec_allocate, near the core's code);
- anisotropic filtering takes the level chosen, not its index (upstream
bug: "16" gave 4x, the default "4" gave 2x);
- PS5 defaults: 2880x2160, per-pixel transparency, 16x filtering; the
widescreen hack stays off;
- no locale switching and no serial pseudo-terminal: the console exports
neither uselocale/newlocale nor grantpt/unlockpt/ptsname, which the
title's link refused.
The port began as rpf16rj's (pull request 3), credited in the fork's
commits; its networking (DCNet DNS and socket changes) and the
ps5_dc_rumble hook, which the title does not export, are left out.
tooling/flycast/ps5-toolchain.cmake is the cores' link contract with
libzip's Annex K and Windows probes answered no. The notices list Flycast
as GPL-2.0-or-later: its LICENSE is the GPLv2 text, and its file headers
say "version 2 or any later version", none "only". README: the system, its
resolution, the fork and the credit.
Verified on the base PS5 (13.40): runs 210509, 210719, 211230. The core
loads (core loader, Vulkan OIT renderer on RADV), Sonic Adventure (USA, Rev
A) boots through the HLE BIOS, plays its film, title screen and attract
demo at 2880x2160 with sound, and START reaches "Select a memory card";
RetroArch exits with 0 (evidence/flycast-sonic-adventure, pictures
klog/pad-210719 and klog/pad-211230). About 60 frames a second in the demo,
30 in the film (its own rate), early stalls of 0.5-1.4 s.
Gates: tools/verify.sh format, unit and evidence PASS (89 captures, 0
failed); build and integration wait for MAME's rebuild. Before a release:
publish github.com/mihawk-99/PS5_Flycast, which the notices and README name.
ShadowMountPlus 1.7beta4 mounts the console's /mnt (and /data) into every
PPSA title's sandbox while it runs. The top of the file browser and Load
Content is now INTERNAL (/app0) and each drive actually mounted there: USB 0-7
(/mnt/usbN) and EXTENDED 0-1 (/mnt/extN). A slot counts as a drive when its
root is another filesystem than /mnt. With none, EXTERNAL (/mnt) stays, as
before. /data is never offered (owner's decision). The startup trace records
what the sandbox exposes: roots, drive slots and /mnt's mount names, no file
names.
tools/build-title.sh gains PS5_REUSE_STAGED_CORES (development builds only,
refused for a release): stage a core as its last build left it, to deploy a
title change while MAME's hour-long rebuild runs.
Verified on the base PS5 (13.40), ShadowMountPlus 1.7beta4, one USB drive:
run-PPSA99169-204255; trace: "directory /mnt opened=1", "storage /mnt/usb0
(USB 0) available", no DATA root (evidence/usb-storage-roots). Before,
/mnt and /mnt/usb0 failed with errno 2. The owner confirmed the drive is
listed and a game on it plays.
Gates: tools/verify.sh format, unit and evidence PASS (87 captures, 0
failed). build and integration not run: MAME's full rebuild is in progress.
The owner asked for the warning in red, bigger, labelled "Important Warning"
and more emphatic. GitHub's alert boxes cannot carry that label or a colour of
their own, so the label is a banner image (assets/readme/important-warning.png,
white on #d1242f, 1840x208 for 2x screens, alt "Important warning") under the
title block, followed by the heading "PS5 RetroArch is a passion project, not a
piracy project." and the notice as bold points: piracy is not condoned; no
games, BIOS, firmware or keys, ever; legally obtained backups of games you own;
BIOS and firmware dumped from hardware you own; requests not welcome. The note
loads the banner from main and keeps each paragraph on one line, as the release
page turns every line break into a break.
Verified: rendered with gh api markdown (gfm) and checked at 1100 px and 420 px
in headless Chromium; owner approved the preview. tools/verify.sh format and
evidence -> PASS. No warning sentence removed (README: 6 piracy, 4 legally
obtained, 3 hardware you own).
A README rewrite on 2 October (ef34e50) collapsed the legal notice, which
febe7cf had put throughout, into one paragraph, and removing the RPCS3 section
(8c4670b) took one more. Restored at the owner's request, with the warning at
the very top: a GitHub warning box under the title block, above the WebUI
image, saying PS5 RetroArch is a passion project, not a piracy project, then
the original text (no games, BIOS, firmware or keys shipped; legally obtained
backups of games you own and dumps from hardware you own only; requests not
welcome). Supported systems, Your files and the BIOS rows have their reminders
back. The release note opens with the same box, above the pre-screen image.
Verified: gh api markdown (gfm) renders the box as markdown-alert-warning;
tools/verify.sh format and evidence -> PASS.
The owner deleted the PS5_RPCS3 repository and has discontinued the
PS3 port (the v0.6.7-alpha.6 release note says why). The README no
longer names RPCS3 anywhere:
- the PlayStation 3 build-it-yourself section;
- the PS5_RPCS3 and PS5_LLVM fork links;
- the PS5_WITH_RPCS3 notes in the build overview and in the build-script
list;
- the BIOS-alert exclusion;
- the supported-systems paragraph;
- the credits row;
- the licence paragraph and its table row.
Not pushed: the release waits for the owner's review.
The WebUI overview stays the first picture, so a new user always learns
there is a WebUI. Just under it is the pre-screen, captured on the base
PS5 (picker test, run 233754, the title's current build): RetroArch
selected, Remember off. The version paragraph names v0.6.7-alpha.6, and
Get started says the title opens on the pre-screen, with Remember and
the WebUI's Start with.
assets/releases/v0.6.7-alpha.6 holds the release's screenshot catalog:
EmulationStation's carousel with the Favorites and Last Played
collections (ES-DE capture test, run 223054), with its catalog.json.
Not pushed: the release waits for the owner's review.
PS3 is no longer a target, so no build stages rpcs3_libretro.so, its .info or
system/RPCS3, and no deployment puts them on a console. tools/build-rpcs3.sh
still builds the core on this machine; PS5_WITH_RPCS3=1 stages it for someone
building their own title, and a release refuses that before compiling anything.
Verified:
TMPDIR=build/tmp bash tools/verify.sh
-> PASS (format unit build integration evidence), 64 captures replayed
find dist/PPSA99169 -iname '*rpcs3*' -> nothing; 15 cores staged;
check-manifest PASS (11616 files); build identity eedff761...
PS5_WITH_RPCS3=1 PS5_RELEASE_TAG=v-test bash tools/build-title.sh
-> "a release never carries RPCS3", exit 2, before the frontend build
Gate log: build/verification/rpcs3-optin-gates-2.log
Download and verify published packages on-console, stage changed managed files, preserve user data, and install after frontend shutdown. Set eboot execute permission explicitly so native installations relaunch.
Validation: tools/verify.sh (118 tests, native build and all gates); browser state checks; actual Alpha 6 download/install/relaunch and unchanged config. Evidence: evidence/webui-update/.
Lead with a real console Overview screenshot and port6769 URL legend.
Organize setup, guided global/core settings, systems, balanced graphics and
file locations before developer details. Preserve licensing and attribution;
separate source-build features from release availability and remove game names.
Validation: desktop/mobile GitHub-style previews, no page overflow or missing
image; actual Overview inspected; Impeccable finish review and final delta ship.
Screenshot provenance embedded. Evidence: evidence/readme-overview, replay with
python3 tools/evidence.py compare evidence/. All project gates passed this round.
Expose 846 options from 15 pinned PS5 core catalogs before first use,
with categories, descriptions, exact choices, saved-value preservation,
and Advanced mode. Include installed cores without saved profiles and
preserve first-use PPSSPP/Dolphin edits through their profile migration.
Bind dynamic runtime options to the catalog and core binary revision.
Validation: all five tools/verify.sh gates pass (96 tests), all 15 core
browser checks pass, and the deployed native menu-only run exposes all
846 catalog keys with matching JSON, build identity and normal return.
Restore original settings and stop the temporary helper after testing.
Evidence: evidence/webui-settings-guide/{capture,expectation}.json
Reproduce: python3 tools/evidence.py compare evidence/
Raw native record: klog/webui-guide/all-cores-20261002-130144/report.json
Keep the purple dashboard at a stable desktop scale and expose searchable global configuration, saved core options, and core overrides. Apply pending core edits once on startup and preserve later native changes.
Validation: all five project gates pass (93 tests), browser regression suite passes at desktop and mobile sizes, and three native PS5 runs verify persistence, isolation, stale-save rejection, and normal shutdown. Evidence: evidence/webui-settings/. Reproduce project gates with bash tools/verify.sh.
Serve the approved purple layout with local assets, streamed content transfers, release notes and next-launch settings. Keep the service within the title lifetime and preserve explicit launch overrides.
Verify: CCACHE_DIR=build/verification/ccache BUILD_JOBS=8 bash tools/verify.sh (all five gates; 92 tests), real browser integration including throttled keyboard cancellation, and two native console launches. Evidence: evidence/webui/{capture,expectation}.json; replay with python3 tools/evidence.py compare evidence/.
Design review and normal Impeccable completion passed in a hash-verified identical-source snapshot because the original-root fingerprint scanner failed; records remain in build/verification. No game performance soak claimed.
Adapt PR #6 with matched S16/F32 buffers, startup cleanup and serialized motor fallback. Preserve active levels when streaming fails and cover both formats and failure paths with AddressSanitizer.
Verification: all five tools/verify.sh gates pass; 87 tests. Console strong/weak/combined pulse run: 2269 buffers, 568 nonzero, zero output errors, normal exit. Evidence: evidence/dualsense-rumble/capture.json and expectation.json; replay with bash tools/verify.sh evidence. Physical feel remains unconfirmed.
Co-authored-by: rpf16rj <rpf16rj@gmail.com>
Keep saved overrides authoritative and upgrade cached frontend patch trees. Document the effective starting profiles for all non-RPCS3 cores.
Verified all five gates (87 tests), installed build 541d38f5, and ran the copied Ghost of Sparta state for 80 seconds with resolution/MSAA input overrides absent: 3 loads, 1 save, normal exit, no allocation failure. Saved output selected 2880x1632/x8. Evidence: evidence/ppsspp-msaa-default. Console profile updated after backup; original state/config preserved.
Use SDK f674976 for blocking heap contention and live direct-memory availability. Trim unused PPSSPP caches under pressure, drain retired GPU objects and retry framebuffer allocation once; close content on unrecoverable failure. Report CPU/GPU/free/largest memory around state loads and failures.
Verified: all five tools/verify.sh gates, 87 tests including 108 injected GPU failures, all 16 core builds; SDK 318 checks plus memory scanner tests. Console evidence: evidence/ppsspp-memory-recovery. Balanced and 6x/8x pass repeated state round trips; prior 10x/8x crash now recovers first load, then safely closes content after device OOM on second load. Build 8b635e9b installed; user settings/state unchanged.
10x with 8x MSAA still faults after loading the affected state. Balanced defaults and the saved 6x/MSAA-off profile pass repeated loads and a save/load round trip; 6x/8x and 10x/off controls also pass.
Evidence: evidence/ppsspp-balanced-state-run/. Verified with the isolated console harness, format/evidence gates (54 captures), and git diff --check. Raw console captures and backups remain ignored.
Use PPSSPP 6x without MSAA, Dolphin/LRPS2/DeSmuME 4x, Beetle PSX HW 8x without MSAA and Azahar 6x. Apply defaults in the frontend before saved options; preserve overrides and higher selectable values. Patch count 223 to 226 adds the helper and legacy/v2 call sites.
Verification: focused real-parser regression failed before and passes after; CCACHE_DIR="$PWD/build/verification/ccache" bash tools/verify.sh passes all five gates and 85 tests. Evidence: evidence/balanced-core-defaults/{capture,expectation}.json; built title f4e9de26. Console acceptance and the reported crash's root cause remain unverified.
My console test showed the factor does not change while a game runs, so
the README no longer says it does. Beetle Saturn's battery stops at its
BIOS check.
A legal notice at the top (piracy is not condoned; legally obtained backups
only; RPCS3 is in no release and must be compiled from source), repeated where
games, system files and licences come up. A section on building RPCS3 for your
own console. The N64 row: 4x by default, factor changes applied live. Links to
documents no longer published are gone; the release notes on GitHub are the
public record.
The README lists RPCS3 (God of War HD at 4K and 60 fps; GTA IV at 4K held at
30, its busiest drives at 24 to 27) as a console build only, in no release.
The core pin brings the frame-rate patches option's new default (a game with
only an Unlock FPS patch runs it at RPCS3's frame limit of 30), the SPU
analyser's two-way jumps and the native SPU program checks (off unless asked).
The docs, the README, plans and notes are kept and updated on this machine
only: .gitignore ignores *.md, and the 37 tracked files leave the index
(they stay on disk). No build or test reads them.
A licence audit found that no published ZIP carries the licence texts its parts
require, and that three release tags name commits older than the ones built.
- tooling/notices/components.json lists every part of the title, its licence,
its licence texts and where its source is.
- tools/stage-notices.py (run by tools/build-title.sh before the manifest)
writes licenses/ into the title folder, tying every executable to its
source revision; tools/check-notices.py checks it in the integration gate.
- tools/source-bundle.py archives each part's source at that revision.
- LICENSE (GPLv3), docs/RELEASING.md, docs/releases/SOURCE_CORRESPONDENCE.md,
README licence and trademark sections, docs/RPCS3_PORT.md licence facts,
runtime/README.md (what libc.prx contains, as verified).
Evidence: stage-notices on a copy of the current 16-core build staged 28 parts,
every core equal to its build report; check-notices passes, --release fails on
uncommitted source; source-bundle built 10 archives whose sums verify;
make test-unit 83 OK; lint-shell PASS; libc.prx rebuilt from committed files is
byte-identical to every release's (e6ff45d1...).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- tools/build-title.sh links ../PS5_Vulkan's RADV release archive by default;
PS5_VULKAN_DRIVER=ps5vk still builds ps5vk, which v0.4.0-alpha.4 shipped. A
RADV build stages no libvulkan.so.1: both drivers are linked into eboot.bin
and nothing ever loaded that library (a title cannot load one).
- src/present_clock.h and src/radv_icd_ps5.c are clang-formatted, which the
format gate asked for.
- docs/releases/v0.5.0-alpha.5.md: RADV, PPSSPP's MSAA, the shader cache, the
title heap's arenas, what was tested on RADV and what only on ps5vk, and the
known issues (Dolphin's first start of a game with an empty cache).
- README.md and docs/ACTIVE.md describe the title on RADV.
Build f96bdb0e; tools/verify.sh PASS (format unit build integration evidence):
74 Python tests, 52 captures replay.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The release notes (docs/releases/v0.2.0-alpha.1.md) cover build 870bd1bb:
Dolphin, LRPS2 and PPSSPP on the GPU, the tester reports it fixes, the
stability checks it passed and the issues still open, with the component
versions it was built from. The README describes the eight cores, the
measured 60 Hz fallback, the PS2 BIOS location, the current gate numbers and
the new cores' credits and licences.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wind Waker drew its 3D scenes as a corrupt near-camera surface, then (after the
first fix) thin triangles to the screen corner and a minimap spill. Both were
primitive-restart faults in ../PS5_Vulkan: R64 (34ca3ad, a bare restart write
after each draw landed mid-draw) and R65 (75f33eb, every submission a copy
splits off starts with restart off). Found with a console FIFO log played by
the core and by desktop Dolphin from the same tree, bisected by object range.
Evidence (evidence/dolphin-restart-strips, raw klog/dolrestart-evidence.txt):
the FIFO log's screenshots against desktop Dolphin, mean difference per channel
64-71 before, 1.23-1.53 after R64, 1.13-1.16 after R65 (resampling); my save
state on Outset Island (--entryslot=0, 3600 frames) loads, draws cleanly and
exits with rarch_main 0 and audio errors=0.
Core patch (patches/dolphin/ps5-port.patch, regenerated from the tree):
- Core/Core.cpp: single-core FIFO playback returns to retro_run with the FIFO
CPU core injected, as CpuThread does; running CPU::Run() there never
returned in single-core libretro mode (.dff playback hung).
- debug mode "objects A B" plays only objects A-B of each FIFO frame (debug
file only; $FIFO_OBJECTS on the host).
- the temporary host A/B hooks (depth clamp, draw log, restart) are gone.
Title: the stale-test-file list covers /app0/dolphin-debug.txt and
/app0/ps5vk-shader-cache-dir.txt (a previous run left the latter on the
console, redirecting the driver's shader cache; removed).
tools/verify.sh PASS (format unit build integration evidence), 40 captures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Fast-forward sets PSP_CoreParameter().fastForward with frameskip 3 while
held, so __DisplayFlip no longer throttles with sleeps that overshoot on
the console; FrameTiming's skip-flip path is off on PS5 (FIFO present).
Tag Force save state, fast-forward held: 1199 flips in 10 s.
- Close Content then reopening: the loader waits up to 2 s for core threads
(counted by the thread trampoline) before unmapping a core, and PPSSPP's
MemArena re-reserves its fixed 4 GiB range on the second load.
- Yu-Gi-Oh! GX Tag Force: the console libc statvfs faults; cores now import
ps5_statvfs instead.
- Audio logs the switch to non-blocking (fast-forward) and back, once each.
- README: PPSSPP as a hardware-rendered Vulkan core, JIT, 120 Hz output,
save states and fast-forward; first-person wording.
verify.sh: PASS (format unit build integration evidence)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>