This reverts commit ba529e8917.
Restore the startup option, config persistence, API fields, and translated settings toggle while preserving later validation, atomic writes, HTTP response handling, and launcher changes. Use the validated shared process lookup and cover restored behavior with regression checks.
- Serialize source and source_direct in /repository_payloads JSON response
- Serialize source and description in /list_payloads for installed repository slots
- Add source_direct fallback for repository URL resolution in PayloadDetailPanel
- Add installing/updating button loading states with spinner in PayloadDetailPanel
- Prevent abrupt modal and detail dismiss on install click
- Dynamically resolve statusInfo to reflect installed state immediately upon completion
- Add Installed badge in details screen header
- Resolve friendly repository names for 'Also installed from <repo name>' and conflict dialogs instead of raw URLs
- Populate fallback repository name during slot metadata load and legacy migration
- 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
- Place Available Payloads on the left and Autoload Sequence on the right
- Style payload cards in both columns to match dashboard (icons, badges, and title scroll on focus)
- Wrap available payloads in matching glass-panel container with visible borders
- Remove subtitle from Add Delay card
- Reduce top and bottom margins on autoload view to fill viewport cleanly
- Implement instant configuration saving with keepalive and pagehide/beforeunload sync
- 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
- Move repository badge to a new line under version and author
- Style with matching badge aesthetics as version pill
- Replace "Manual" badge for local/manual payloads with "Other Source"
- Remove legacy absolute bottom-right placement to prevent overlaps
- Remove frontend/src/locales git submodule and track translation files directly
- Credit JensJ56 for Dutch translation
- Move supported languages and past translator credits to TRANSLATIONS.md
- Document that translations since v0.6.0 are generated via Google Gemini AI
- Add issue reporting link for translation feedback
On clean PS5 systems with no prior apps or games installed, /user/app does not exist yet, causing direct mkdir() on /user/app/<title_id> to fail with ENOENT (errno: 2).
Use recursive mkdir_p to create the required directory tree (/user/app/<title_id>/sce_sys).
Resolves#108
- 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
- Redesign Get Payloads grid into wide 3-column cards with icon on left, version top-right, dynamic title width, max 3-line description, and bottom-right installed checkmark
- Overhaul Payload Details panel with hero header, compact action button, author, repository link, short description, and raw GitHub README rendering with stripped images
- Implement URL hash state persistence and hierarchical history navigation for views and deep payload links (#/payload/:filename?src=:id)
- Add unit test suite for history navigation and route parsing
- Update locales submodule pointer with new detail view translations
- Port history navigation strategy from pkg-manager to prevent PS5 Circle button from exiting browser
- Seed baseline history stack with Dashboard at root entry 0
- Navigate between top-level pages via replaceState so Back always returns directly to Dashboard
- Allow deep sub-views (Sources under Settings, Move from USB under Storage) to pop back to parent views
- Intercept modal/panel closures (confirmations, downloads, logs, payload details, dashboard edit modes) on Back press
- Exit browser via window.close / history.back only when Back is pressed from Dashboard root
This addresses the remaining minor issues outlined in ISSUES.md.
- Extracted remaining hardcoded English strings into i18n locales
- Fixed stale state and implemented lazy-loaded images in PayloadDetailPanel
- Revived 'installed' payload state in StorageHub by no longer filtering them out
- Fixed event propagation bug in dashboard manage mode where clicking anywhere triggered delete
- Hardened C backend 'is_pldmgr_filename' to strictly match pldmgr prefixes, preventing false positives
This addresses the missing UI toggle for the SHOW_UPDATE_NOTIFICATIONS config key.
- Added toggle to SettingsView under Startup section
- Wired toggle state directly to the config file via /set_config
- Included i18n keys for the new settings labels
This addresses the issue where dashboard payloads lacked icons.
Instead of passing the icon through the C backend's payload list, this leverages the existing `RepositoryContext` remote catalog.
- Wrapped the root `App` in `RepositoryProvider` inside `main.jsx`.
- Added `filenameMap` to `RepositoryContext` to build a fast O(1) lookup map of all payload metadata across sources.
- Injected the map data directly into Dashboard `PayloadButton` cards.
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.
- Removed heavy CSS shadows from payload icons for smoother scrolling
- Implemented dual-element approach for payload name marquee animations
- Re-labeled manage view to 'Remove Payload' when active
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
- Update `frontend/src/locales` submodule to pull in the latest translations from Crowdin
- Add translators for newly supported languages: German, Persian, and Ukrainian to README
- Fix Crowdin badge URLs for Italian, Portuguese (Brazilian), and Russian which shifted after adding Persian
The app will now automatically detect and use the user's browser language on first load. We can safely do this since only high-quality languages (70%+ translated) are enabled anyway.
Introduces a complete localization system using i18next, enabling the application to be translated into multiple languages by the community via Crowdin.
Key additions:
- Core i18next integration with English as the default base language.
- A language selector in the Settings menu for users to easily switch languages.
- Full UI localization, including support for complex grammar rules (e.g., dynamic pluralization) and responsive text layouts.
- A dedicated `locales` git submodule to seamlessly sync community-driven translations.
- Automatic filtering of incomplete languages (under 70% translated) to ensure a high-quality user experience.
Note:
This implementation currently applies exclusively to the frontend web UI. Native PS5 system notifications (triggered by the backend C code) remain in English and are not yet covered by this localization system.
When a repository payload explicitly defines a version, use it instead of trying to guess the version out of the filename.
Closes#60
Co-authored-by: lucaszhongsj <20980720+lucaszhongsj@users.noreply.github.com>
Sets applicationCategoryType to 65536 so the app appears in the Media tab rather than the Games tab on the PS5 home screen.
Closes#62
Co-authored-by: lucaszhongsj <20980720+lucaszhongsj@users.noreply.github.com>