- Muted logs for automatically polled endpoints (`/list_payloads`, etc.)
- Added explicit log line for process kill requests to keep track of terminated PIDs
- Refactored `StorageHub.jsx` to share a unified `enrichedSources` data flow between single-source and multi-source modes, eliminating duplicated rendering logic
- Payloads are now sorted alphabetically by name across all repository views (with available updates automatically pinned to the top)
- Updated `PayloadName` component to accept a `lastUpdate` prop, natively rendering the payload version and update date side-by-side
- Conditionally hide accordion headers and restore discrete grid-card styling for legacy single-source mode, preserving the original look while utilizing the normalized codebase
- Fixed a backend bug in `src/sources.c` where the `last_update` field was incorrectly omitted from the serialized JSON array during multi-source repository fetches
During the recent storage refactoring, `payload_mgr_check_existing` was updated to return a simplified `{"exists": true}` structure. However, the frontend (`App.jsx`) still relied on the `file_exists` and `folder_exists` boolean flags to display the overwrite confirmation modal when a duplicate payload is uploaded. Because those fields were missing, the frontend silently fell through and overwrote the files without asking.
This change restores the original JSON output format for the `/manage:check` endpoint (`file_exists`, `folder_exists`, and `folder_name`), ensuring the overwrite prompt appears again when an uploaded ELF already exists.
- Revert `payload_mgr_list_json` to output an array of string paths
for `"payloads"` rather than an array of objects, as expected by
the React frontend.
- Move payload metadata extraction back to a separate `"meta"` object
indexed by filename.
- Remove the redundant explicit recursive scan of `PAYLOADS_STORAGE_DIR`.
Because the directory is `/data/pldmgr/payloads`, it is already
covered by the recursive scan of `SCAN_DIRS[0]` (`/data/pldmgr`),
which was causing all internal payloads to appear twice in the list.
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.
- Adjusted Installed/USB Payloads grids from md:grid-cols-2 to lg:grid-cols-2 to prevent card overlapping on narrow windows.
- Reshaped cards to always use row layout on mobile to eliminate wasted empty vertical space.
- Moved Update button to its own full-width row at the bottom of the card with reduced vertical padding to prevent action clashing.
- Added remote version target display to the Update button.
- Cleaned up width constraints in PayloadName to enable text truncation on narrow screens.
- 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
The sidebar's expanded/collapsed state is now saved in `localStorage`. This ensures that if the user collapses the sidebar, it stays collapsed after reloading the page or returning to the app later.
Implemented via a `useState` lazy initializer and `useEffect` hook in `App.jsx`.
- Server: Fixed caching headers (no-cache) for index.html and cache.appcache to force browser revalidation.
- Build: Added seconds to the build timestamp in the Makefile to ensure every build generates a unique manifest.
- Build: Created build_release.sh to automate versioned ELF generation (pldmgr_vX.Y.Z.elf).
- UI: Refined system payload detection to support versioned filenames.
- UI: Allowed system/update payloads to be visible and deletable in the "Manage Payloads" tab, while keeping them hidden from the main dashboard.