35 Commits
Author SHA1 Message Date
najdek a35943f80e bump version to 1.4.1 v1.4.1 2026-09-27 03:30:32 +02:00
najdek 03c0397b06 Fix offline USB and disc install handling (#20) 2026-09-27 03:26:34 +02:00
najdek 210b6ae4a0 Fix Samba share name display on page reload
- Resolve Samba share label and path from local storage during initial route hydration
- Reconcile active drive state reactively when the drives list completes loading
- Add history navigation tests for hash routing, share resolution, and reconciliation
- Update v1.4.0 changelog
v1.4.0
2026-09-26 13:49:11 +02:00
najdek d5567d9692 Prepare v1.4.0 release: update changelog and bump version to 1.4.0 2026-09-26 12:50:43 +02:00
najdek f8cbcbea31 Pass package icon to PS5 system installer via stream server 2026-09-26 12:33:16 +02:00
najdek 2995bd73cd Update system installer display name to use app title and kind 2026-09-26 02:13:06 +02:00
najdek c236c09da9 Fix quick rescan dropping SMB packages on rename and add catalog recovery 2026-09-26 00:50:35 +02:00
najdek 84142efa42 Fail fast on missing package install and switch Rescan to quick rescan 2026-09-26 00:21:10 +02:00
najdek 2368a1d599 Simplify Network Shares section in README 2026-09-25 23:07:43 +02:00
najdek 7f1b3c6278 Move browse-only option inside Samba modal form body 2026-09-25 22:43:49 +02:00
najdek ac1aea3f16 Streamline Windows 11 guest sharing FAQ in README 2026-09-25 22:39:15 +02:00
najdek 5f8970ce4f Fix SMB guest authentication and accelerate signed transfers 2026-09-25 22:11:16 +02:00
najdek 2aa0b6353e Avoid cache clears on routine app updates 2026-09-25 21:15:20 +02:00
najdek d9a27f1966 Prepare v1.3.1 release notes 2026-09-25 20:40:18 +02:00
najdek 90be0e72bf Add graceful close action to settings 2026-09-25 20:35:31 +02:00
najdek 8c6533cfbf Reorder settings cards 2026-09-25 20:03:58 +02:00
najdek 9772ddeec6 Load cache stats on settings reload 2026-09-25 19:59:18 +02:00
najdek 1b9da3308f Fix SMB scans from share root 2026-09-25 19:56:15 +02:00
najdek 66f68c33d1 Remove helper smoke builds 2026-09-25 13:18:50 +02:00
Mateusz Najdek 43b6568b2f Release v1.3.0 (#18)
* Fix repeated SMB scans and add manual package browsing

* Run package installs in fresh helper processes

Launch an embedded helper through elfldr for each install and exchange requests over loopback IPC. Link the helper with the same system service dependencies as pkgmgr so AppInstUtil starts on supported firmware.

* Reduce installer log memory and diagnostic noise

* Test real helper ELF launcher handoff

* Prepare 1.3.0 release documentation

* Add large catalog mode to frontend mock

* Update docs

* Fix dirty build metadata in releases

* Include changelog section in release notes
v1.3.0
2026-09-25 12:33:36 +02:00
Mateusz Najdek f8bd2d22cc Release v1.2.4 (#13)
* Add websocket stream debug telemetry

* Close idle WebSocket upload listener and refresh on demand

* Schedule websocket uploads around installer demand

* Pipeline websocket uploads with two segments in flight

* Keep the latest 20 stream and SMB debug logs per type

* Prepare v1.2.4 release notes and version
v1.2.4
2026-09-23 19:37:19 +02:00
Mateusz Najdek 1d898d0df6 Release v1.2.3 (#10)
* Fix base and update batch handoff

* Improve PKG Manager startup diagnostics and scan ordering

* Update development and release ELF names

* bump version to 1.2.3

* Trim PS5 startup imports and add early stdout markers

* Add guided Samba share/folder picker with credential-aware browse APIs

Frontend no longer requires typing share names or paths: the share
modal offers Select share / Browse folder picker dialogs backed by new
POST /api/smb/shares and /api/smb/browse endpoints (IPC$ share enum
plus directory listing in smb_client). Browse requests reuse the stored
password when the form resends it blank, avoiding guest-logon
STATUS_ACCESS_DENIED while editing saved shares.

* Update SMB management and client behavior

* fix frontend browser history navigation

* docs: prepare v1.2.3 release notes
v1.2.3
2026-09-22 19:30:15 +02:00
Mateusz Najdek 3c9891652f Release v1.2.2 (#7)
* fix(parser): honor PS4 base SFO category

* feat(cache): rescan after cache invalidation

* bump version to 1.2.2

* docs: document cache refresh and package fixes
v1.2.2
2026-09-22 12:29:49 +02:00
najdek 774175bfd4 bump version to 1.2.1 v1.2.1 2026-09-22 02:53:10 +02:00
Mateusz Najdek 5efa45a655 Release v1.2.0 (#5)
* ws: direct-install streaming over WebSocket (RAM-only, no disk spool)

Browser pushes .pkg bytes over ws://:8846 while the PS5 installer pulls
ranges over :8845 concurrently through a demand-paged 1MB-segment ring
(64 slots, seg 0 pinned). Install can start at header_ready, mid-upload.

Backend (src/ws_stream.c, src/ws_upload.c):
- ws_live_* ring with waiter shielding, served-past / waited+acked /
  peak>0+acked LRU eviction, single store_seg_locked() truth shared by
  blocking write and non-blocking try_write (0/-1/-2 busy).
- Conn worker never blocks on storage (busy reply, browser retries);
  socket idle kill suppressed while readers are parked; stall
  diagnostics when a write parks.
- http_server.c: guarded /api/upload/* REST branch; multipart.c live:
  scheme adapter (frozen pull path untouched); installer_start_live.

Frontend: DirectInstallView + useDirectUpload pusher (FIFO seek queue
for parallel installer workers, busy requeue+retry, demand-paging
standby until install finalizes, silent-socket watchdog), wired into
the history router (#/direct-install, Circle-back closes it).

Parser: pkg_parser_parse_mem reuses in-file sub-parsers for live
header parsing (differential-tested).

Tests: ring unit (test_ws_stream), far-seek/pivot/busy/waiter unit
(test_ws_stream_far), transport (test_ws_upload, incl. socket
busy->retry), concurrent e2e incl. 90MB/64-slot parallel-pivot replay
of the production capture (test_direct_install_e2e), PS5 pull-replay
simulator (ps5_sim) + CLI tools.

Proven on console: 1GB PKG installs at status='playable' with zero
idle kills. Full host suite (13 binaries + CSS) green.

* perf(smb): pipeline reads for faster package streaming

Use a private SMB session per stream connection and keep up to eight credit-aware reads in flight, with requests up to 512 KiB. Reduce each request to the credits available in the current SMB2 window, including queued requests, so libsmb2 cannot silently shorten a request and leave a gap in the stream. Increase stream and socket buffers, and leave signing optional while still honoring servers that require it.

Add SMB timing and throughput logs plus negotiated session diagnostics to separate SMB read latency from HTTP streaming overhead. Include the SMB logger in PS5 and host builds and update the mock async API used by tests.

* fix(ws): harden direct install sessions and package preview

Tie uploads to a browser owner and one authenticated WebSocket. Resume from acknowledged segments so cache eviction does not lose progress.

Move Direct Install into media sources, show local PKG title and icon before installation, and warn before leaving an active transfer. Pass package metadata to the live installer and cover ownership and metadata parsing with tests.

* fix(smb): honor package install debug setting

Gate SMB debug file creation and per-read diagnostics behind pkg_install_debug, matching WebSocket stream logging behavior. Keep regular SMB package streaming unchanged.

* fix(ui): return direct install to drives route

Make the Direct Install Back to drives action replace the current route and restore the media source view directly. This prevents browsers that opened the page from leaving the app for an unrelated previous history entry.

* fix(ui): restore deep-linked pages on reload

Apply the initial hash route to the visible view during startup, including storage media and package details. Load package data for the linked drive so a direct package URL opens its detail page after a reload.

* fix(ui): accept package drops across the app

Handle package drops at the application level, open Direct Install, and pass the file through the existing package preview flow. Keep active uploads and installations protected from replacement.

* fix(direct): check package eligibility before install

Share the scanner's installed state and version rules with Direct Install. Check selected package metadata before enabling Install and again before starting a new transfer, while preserving resumed sessions. Show storage and active install blockers on the direct install page.

* fix(direct): share live install icon across browsers

Upload the parsed package icon once to the active direct install session and serve it from RAM through the existing icon API. Other browsers can resolve the live session path shown in installer status. Clear icon data when the session is canceled or replaced.

* fix(direct): cancel install when uploader closes

Use sendBeacon during browser teardown to call the authenticated Direct Install cancel endpoint for the sending session. Keep observer browsers unaffected and avoid duplicate cancellation requests.

* fix(direct): cancel when uploader socket closes

Treat an unexpected close of the authenticated uploader WebSocket before the final finish message as an install cancellation. Preserve normal completed sessions and reduce repetitive seek, eviction, and read-short logging in the main log.

* bump version to 1.1.1

* fix(ui): stop duplicate direct upload polling

Keep the observer watchdog stable across renders, disable it for the owning upload tab, and prevent overlapping status requests in both polling paths.

* Add PS4 and PS5 package badges

* feat: support platform-aware install storage

* fix: preserve catalog during provisional scans

* bump version to 1.2.0

* docs: add changelog for 1.2.0

* chore: remove stale refactor references

* feat: move streaming services to dedicated ports

* docs: update 1.2.0 documentation
2026-09-22 02:48:57 +02:00
najdek 4ed4c11aaf docs: update changelog for 1.1.0 v1.1.0 2026-09-20 21:31:20 +02:00
najdek d534a6a3bd fix(parser): prevent TITLE_ID from being misinterpreted as localized title TITLE_00
The SFO key TITLE_ID matched the TITLE_ prefix check before reaching its
own exact-match branch. atoi("ID") returns 0, causing the title_id value
(e.g. SKID02048) to be stored as a ja-JP localized title (lang index 0).
When resolving display titles, the fallback returned this bogus localized
entry instead of the correct TITLE from the SFO.

Fix: move TITLE_ID exact match before the TITLE_ prefix branch, and add
numeric-only validation on the suffix for TITLE_XX entries.
2026-09-20 20:49:25 +02:00
najdek 75103ce2ca bump version to 1.1.0 2026-09-20 20:28:22 +02:00
najdek eabd8b18a0 feat(frontend): support controller Circle button back navigation via History API
- Add useHistoryNavigation hook managing browser history stack with hash-based routing
- Seed baseline history stack to allow closing browser on root Drives view without trapping
- Handle popstate events to navigate backward between Title Detail, Package Grid, Settings, and Drives views
- Dismiss open modals on Circle button press without navigating away from the current page
- Allow controller Circle button to close browser during active package installation
- Deactivate background buttons and trap spatial focus when modal dialogs are open
2026-09-20 20:28:11 +02:00
najdek 6134dde29f feat: redesign storage widgets and enforce multi-drive space checks
- Redesign header storage widgets to compact height with 'INT' and 'M.2' labels below icons
- Set storage widgets to min-w-[230px] with progress bars displaying used disk space fill
- Reinstate storage checks: block installation if neither drive has sufficient space when M.2 is present, or if internal lacks space when no M.2 is present
- Add tests in test_multipart.c verifying space enforcement with and without M.2 drive
2026-09-20 19:12:42 +02:00
najdek 5f147bcfa6 Add M.2 NVMe storage support and disable pre-install storage checks
- Disable available storage pre-checks in installer and frontend UI as PS5 may install to external M.2 NVMe (/mnt/ext1)
- Add system_get_nvme_storage_info to detect and query storage for mounted /mnt/ext1
- Update GET /api/storage to report both internal (/data) and M.2 NVMe (/mnt/ext1) storage
- Update frontend header to display 'Internal' and an 'M.2 NVMe' widget when mounted
- Update unit tests for NVMe storage info and multipart handling
2026-09-20 18:28:56 +02:00
najdek 9752169a06 Support multi-language PKG titles and browser language resolution
- Resolve PS5 param.json titles by client/browser language preference instead of blindly picking the first entry (e.g. Arabic)
- If a package defines a global title outside localizedParameters or in PS4 param.sfo TITLE, use that directly
- Extract localized titles map and defaultLanguage in pkg_parser and persist them in manifest/cache
- Forward Accept-Language header in HTTP server GET /api/packages endpoint
- Dynamically resolve title in frontend UI via navigator.languages and allow searching against all localized titles
- Add unit tests for synthetic multi-language packages
2026-09-20 18:27:00 +02:00
najdek b354521b52 refactor(frontend): decompose monolithic App.jsx into modular components, hooks, and API clients
- Extract pure utils (formatters, sourceInfo, title) and constants
- Create typed API client layer (api/) for all REST endpoints
- Extract 7 domain hooks: useToast, useCache, useDonation, useInstaller, useLeftovers, useSettings, useSmb
- Modularize UI into screens, layout, views, and modals
- Reduce App.jsx from ~4,080 lines to 819 lines orchestrator
- Fix runtime reference and null-safety issues in views and layout
- Maintain strict PS5 WebKit / Safari 12 ES2015 compatibility
2026-09-19 13:39:25 +02:00
najdek 76edb55db6 feat(smb): add detailed connection diagnostics and NT status unmasking
- Add verbose step-by-step diagnostic logging ([SMB TEST]) during share connection testing
- Unmask underlying NT status codes (0xC000015B, 0xC000006D, 0xC0000022, 0xC00000CC) to prevent socket errno:9 from hiding the actual server rejection
- Enable SMB signing negotiation support required by modern Windows hosts
- Add mock test stubs and verify all unit tests pass
2026-09-18 20:58:46 +02:00
najdek d4fead927e Initial release v1.0.0 2026-09-17 19:50:31 +02:00