- Edit tab (replaces Inspect): rename, delete and add files in a game
folder or image, applied in place behind an undo journal or by a
verified rebuild; Extract copies files out of any source; additional
content (DLC, updates) is recognised and packaged as fpkg.
- Storage tab (replaces Library): the Library plus a File explorer that
renames, moves and deletes at once and opens a folder or image in Edit
or Convert.
- PS5: ShadowMount+'s mounted games are hidden and locked in every
write path; Forge's own files are protected; L2/R2 switch tabs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every conversion of a game whose eboot.bin imports libSceAmpr now leaves a working ampr_emu
behind (by user decision): no runtime -> the bundled release runtime is installed; an older,
unreadable or unknown one (or Forge's trace build) -> replaced; the bundled version or newer
-> kept (Pack also needs it to read packs). ampr_emu.index is kept only when it lists exactly
the files written, else rebuilt, and then the journal and logs are left out (their file ids
follow the old record order). A packed game's index and manifest stay byte for byte.
- core lz4.rs: Runtime::action (install/replace/keep/untouched), plain() for conversions
without LZ4 options, index_state (the one comparison, Inspect's too) with bounded reads
(index_bound, 64 MiB cap; read_all loops for a .pkg source's 64 MiB reads); into a .pkg
the builder writes the index; overlay keeps the source's order (solid archives).
- Inspect: Lz4Facts.index, runtime_action, pack_runtime_action; the archive index is read
after eboot.bin/fakelib so it can't push them out of the read budget. lz4 reader allows
the runtime's size to differ from its loose record (a packed game's replaced runtime).
- UI: Convert's Update AMPR switch is gone (notes say install/replace/keep and index
refresh); the LZ4 tab offers Pack/Unpack and Trace to AMPR games without a runtime and
says "This game doesn't use AMPR, so LZ4 can't be used here." otherwise.
- Targets: Convert Folder, fpkg, exfat, ffpkg, ffpfsc, ffpfs; LZ4 tab Folder, ffpkg
(default), exfat, ffpfs; ffpkg inside a .ffpfsc by default (core, so CLI and app agree).
- Save as profile removed everywhere (UI, Tauri command, server route, CLI lz4-profile,
core lz4_profile.rs); using a profile (--lz4-profile) is unchanged.
- Locales (11), AGENTS.md, DESIGN.md, docs/LZ4.md, README.md, ps5/README.md; tests in
core.rs, inspect.rs, reader.rs. Reviewed with Codex (several rounds, clean) and
/code-review.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Folder output: plain fsync per file, one full flush before the rename (macOS 44 -> 11 s)
- .fpkg build 60.6 -> 40.5 s: Kraken skips hopeless blocks (0024), CRC32C slicing-by-8 (0025),
per-file SHA3 on its own thread (0026), the source .pkg decoded 4 MiB ahead
- LZ4 profile rules compiled once with an exact-path index (preflight 8 s -> 0.03 s)
- Library: liquid-glass LZ4 label on packed games; PS5 shows free space of /data
- PS5 payload renamed "Dump Forge", home /data/dumpforge (one-time migration with a link,
old tile owner records accepted)
- Windows CI: the library test names the system drive root
- Docs: README benchmarks (PC + PS5 column), docs/LZ4.md, AGENTS.md and DESIGN.md trimmed,
TODO.md removed; release archives ship docs/LZ4.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>