- Remove disc player termination call from daemon startup in main.c
- Remove ps5_kill_disc_player, get_pid_by_name, and unused LncUtil externs
- Remove KILL_DISC_PLAYER_ON_STARTUP from config storage and HTTP endpoints
- Remove Kill Disc Player toggle row from SettingsView
- Store favorites in /data/pldmgr/favorites.txt on backend
- Return FAVORITES and FAVORITES_INITIALIZED in /get_config
- Parse and save FAVORITES in /set_config POST handler
- Automatically update/remove favorites entries on slot delete, replace, and legacy migration
- Sync favorites state from backend in frontend on startup and persist updates
- Include one-time migration from localStorage for existing clients
- Remove startup self-update check and chainloading in main.c
- Remove self-update logic and ELF version inspection from repository.c and repository.h
- Neuter /update_check route to return status none
- Remove update banners, notifications, and settings toggle from frontend
- Exclude pldmgr from repository payload listings and block installing pldmgr as a payload
- Add launch guards in HTTP server and autoload worker preventing pldmgr self-execution
- Implement managed slot layout: repo/<id>@<srchash8> and local/<key> with meta.json sidecars
- Decouple user uploads and USB imports from repository matching and updates
- Use stable slot keys for autoload.txt, favorites, launching, and deletion
- Add strict token-based version comparison in C and JS, hiding install button when repo is older
- Support cross-source duplicate handling (keep both vs replace) with conflict modals
- Auto-refresh stale repository caches on install and retry seamlessly
- Implement one-time legacy storage migration on startup (layout version 2)
- Update CUSTOM_REPOSITORIES.md with id field specifications and comparison rules
- Remove deprecated /repository_push and /repository_install_push routes
- Add full test suite for versions, payloadStatus, helpers, and markdown
This addresses the top two critical issues identified in ISSUES.md.
Backend C Fixes:
- Added `skip_top_level_wrapper()` and `find_next_object_start()` to `repository.c` to correctly parse payloads even when wrapped in a top-level JSON object or containing stringified braces.
- Updated `repository_check_self_update` and `repository_check_repo_update` to return full version, filename, and source metadata required by the frontend.
Frontend React Fixes:
- Updated the `App.jsx` update banner to properly consume the API contract.
- Added a functional `handleApplyUpdate` to load the downloaded self-update elf.
- Added a functional `handleInstallUpdate` to trigger repository installation when a new version is available.
This commit completely redesigns how users browse, view, and install payloads.
Backend C Changes:
- Updated C structures to support multiple concurrent payload sources (config.h, repository.h).
- Modified repository.c and config.c to parse and retain multi-source JSON payloads.
- Allowed the HTTP server to serve the dynamically merged JSON sources.
Frontend React Changes:
- Converted StorageHub.jsx into a grid-based "App Shop" catalog layout.
- Replaced the modal payload view with a seamless full-page PayloadDetailPanel.jsx component for extended markdown reading and details.
- Added RepositoryContext.jsx to unify repository fetching across views.
- Styled payload cards with a dynamic marquee animation for overflowing text names (PayloadName.jsx).
- Allowed external icons, with a fallback placeholder for payloads without one.
- Polished padding, margins, and transition effects for spatial controller navigation.
- Removed duplicate versioning strings in payload titles and tweaked dashboard header text.
Introduces a visual indicator to help track payloads launched during the current session.
Backend:
- Create history_mgr.c to track the last 20 launched payload paths
- Log payloads in ps5_launcher.c upon successful launch
- Add /history_list API endpoint to expose the launch history
- Update Makefile
Frontend:
- Fetch and poll /history_list in App.jsx to maintain launch history state
- Add isLaunched prop to PayloadButton.jsx to render a checkmark indicator
Closes#44
- Increased MAX_SOURCES to 50 and refactored SourceEntry allocations to the heap
- Added `category` field to payload schema (defaults to "Uncategorized")
- Updated repository UI to group payloads into collapsible category sections
- Auto-expand categories if 10 or fewer payloads are available
- Updated CUSTOM_REPOSITORIES.md
Resolves#30
Fixes#42
If github.com (Sectigo ECC) or its redirects cause mbedTLS to fail
verification due to cross-signed certificate chains or unsupported
ECC curves in the PS5 SDK, curl will now catch CURLE_PEER_FAILED_VERIFICATION
and automatically retry the download without SSL verification.
This is completely safe because repository.c securely verifies the
SHA256 checksum of the downloaded ELF against the trusted payloads.json
metadata before installing it.
Older versions of curl using the mbedTLS backend require the PEM buffer
passed via CURLOPT_CAINFO_BLOB to be explicitly NUL-terminated, with the
length field including the NUL byte. Since the auto-generated
assets_cacert_pem array lacked this terminator, mbedTLS would read past
the buffer bounds, causing sporadic 'SSL peer certificate or SSH remote
key was not OK' errors depending on the memory layout.
This commit dynamically allocates a slightly larger buffer to append the
missing NUL terminator before passing it to curl, ensuring deterministic
certificate parsing across all environments.
Also bumped version to 0.3.2.
Updates the USB import flow to provide explicit buttons for 'Copy to Internal' and 'Move to Internal'. The backend route now accepts a keep_original flag to optionally skip removing the source file.
Introduces a new "Active Processes" feature that enables users to view and
manage background processes running on the PS5.
Backend:
- Add `payload_mgr_process_list_json` using `sysctl` with `KERN_PROC_PROC`
to fetch the kernel process list and memory footprints.
- Retrieve `appinfo` via `sceKernelGetAppInfo` to filter for user-spawned
daemons (requires appid == `0000`).
- Implement `payload_mgr_process_kill` utilizing `SIGKILL`.
- Expose `/processes_list` and `/process_kill` endpoints.
Frontend:
- Add `ActiveProcessesView.jsx` with a real-time table of running processes.
- Implement background auto-refresh every 15s to maintain the UI state.
- Add safety nets to completely disable killing critical processes
(`pldmgr.elf` and `elfldr.elf`).
- Implement kill confirmation modal to avoid accidental terminations.
- Integrate "Active Processes" tab with the sidebar and mobile bottom navigation.
- Add MULTI_SOURCES_ENABLED config flag with toggle in Settings
- New "Manage Sources" view: add/remove/reorder third-party payload sources
via URL; default source is locked and non-removable
- Source JSON format: top-level `name` field sets display name; falls back
to hostname extraction if absent; checksums are optional
- PS5 mode shows QR code + URL for Manage Sources; desktop shows full list UI
- Source removal uses shared confirm modal; reorder auto-saves with toast
- Backend (payload_mgr.c):
- CRUD for sources list persisted to /data/pldmgr/sources.json
- Multi-source repository list/install routes; each source has its
own independent payload catalog
- Bounded name parsing: only searches before "payloads" key to avoid
capturing payload item names; domain fallback when name absent
- list_payloads response now includes `meta` map: walks
PAYLOADS_STORAGE_DIR subdirectories for .elf/.bin/.lua sidecar
files and emits source_name per payload
- Fallback for pre-feature sidecars: extracts hostname from
install_source_detail, skipping the official repository URL
- Frontend: source badge (Globe icon + name) shown in bottom-right corner
of each payload card on Dashboard and Management tab when
MULTI_SOURCES_ENABLED is on and payload has a non-default source
- StorageHub: accordion-style per-source catalogs when multi-source enabled
- showConfirm helper in App.jsx auto-closes modal before executing callback
- Embeds version signature dynamically into ELF
- Scans 'pldmgr' or 'payload-manager' ELFs for version on startup
- Auto-launches updated ELF without infinite loops
- Hides payload manager from UI lists to prevent accidental deletion
- Shift payload downloading from browser-side fetching to the backend C daemon
- Add OpenSSL and libcurl dependencies to the Docker SDK build environment
- Embed CA certificate bundle for secure HTTPS downloads
- Introduce the /repository_install endpoint in the internal API
Address code review findings:
- Validate USB paths (restrict to /mnt/usbN/, block .., require .elf/.bin)
- Sanitize /loadpayload route (resolve via known scan dirs only)
- Add filename validation to /manage:check endpoint
- Fix autoload config OOB write (swap fgets/line_count check order)
- Escape JSON strings in /log and /get_config responses
- Move json_escape to utils.c as nm_json_escape for reuse
- Replace global response_buffer with per-request malloc + MUST_FREE
- Add alloc_response_buffer helper to deduplicate OOM handling
- Fix overwrite flag being ignored in USB move
- Handle truncated repository JSON with proper error status
- Centralize CORS headers via add_cors_headers helper
- Fix dangling pointer in loadpayload resolved_path scope