188 Commits
Author SHA1 Message Date
KarnerF 52c5cb8591 Update screenshot to English UI 2026-09-22 16:53:36 +02:00
KarnerF 2f2caf6dcf Fix German 'läuft' umlaut, add screenshot to README, update repo.json checksum 2026-09-22 16:47:05 +02:00
KarnerF e6b2023144 README: bump recommended SM version to 1.7beta2 2026-09-22 16:36:54 +02:00
KarnerF c47de97d09 repo.json: rename source display to 'Karner Payloads' 2026-09-21 19:46:51 +02:00
KarnerF 80f9d8babe Add pldmgr custom repository (repo.json) and README section 2026-09-21 19:42:58 +02:00
KarnerF fc192c65fb Move nested_pfs_index_cache back below fan section, above legacy block 2026-09-21 19:03:56 +02:00
KarnerF 9d9caf5c0c Hide 'ab 1.7alpha9' badge on nested_pfs_index_cache when SM already supports it 2026-09-21 19:01:10 +02:00
KarnerF c4316e2abb Enlarge HTML render buffer from 256K to 1M (Backend/nested_pfs_index_cache was getting truncated) 2026-09-21 18:58:03 +02:00
KarnerF f330179e93 Backend panel: put nested_pfs_index_cache at top under 'PFS' subheader 2026-09-21 18:41:53 +02:00
KarnerF d210631d6c Fix Backend panel closing tags so nested PFS row is inside the section 2026-09-21 18:36:12 +02:00
KarnerF 90c0815af1 Render nested PFS cache before legacy settings block 2026-09-21 18:33:47 +02:00
KarnerF 3414f31be7 Fix hidden legacy wrapper so nested PFS cache appears on beta1+ 2026-09-21 18:31:30 +02:00
KarnerF 8e9cce1286 Make nested PFS cache visible in dedicated Backend PFS section 2026-09-21 18:28:17 +02:00
KarnerF 6deb4a3e4d Keep nested PFS cache visible and preserve old release ELFs 2026-09-21 18:25:36 +02:00
KarnerF 13925e740f Release v1.0.1: keep nested PFS cache setting on beta1+ 2026-09-21 18:17:05 +02:00
KarnerF 34ac64ac5c Hide obsolete legacy mount settings for ShadowMountPlus beta1+ 2026-09-21 18:08:09 +02:00
KarnerF bdf409b03c Use numeric 65536 Media category from Pegasus metadata 2026-09-15 20:05:20 +02:00
KarnerF d07e426d1b Force tile reinstall after correcting Media category metadata 2026-09-15 19:53:30 +02:00
KarnerF 30bded1dca Use verified media application category for PS5 tile 2026-09-15 19:52:31 +02:00
KarnerF 2782b4729e Move SMPlusGui tile to Media category 2026-09-15 19:48:27 +02:00
KarnerF 6032b4a6d9 Translate Startoptionen panel: add LS_STARTOPTS and LS_RESTART_REQUIRED for all 4 languages 2026-08-31 20:16:31 +02:00
KarnerF 631c6bc8a3 README: note configurable port 2026-08-31 20:04:35 +02:00
KarnerF f80fc44990 Revert Start button to original smCtrl(); remove failed ELF picker experiment 2026-08-31 20:02:08 +02:00
KarnerF 9cc2d62886 Restore full path in ELF select (autostart) 2026-08-31 19:56:42 +02:00
KarnerF 4533e5d042 Start uses pref-elf-sel value directly; filename in ELF select not full path 2026-08-31 19:53:22 +02:00
KarnerF dd1ccfa48c Remove topbar ELF dropdown - ELF is set in Startoptionen, Start uses it directly 2026-08-31 19:48:53 +02:00
KarnerF 2593f71728 ELF dropdown opens immediately on Start click (focus + size) 2026-08-31 19:45:14 +02:00
KarnerF 77e7ee8fca Start button shows inline ELF dropdown; pick ELF to launch SM directly 2026-08-31 19:42:09 +02:00
KarnerF 3102960e4e Add ELF dropdown next to Start button in topbar; sync both selects 2026-08-31 19:22:13 +02:00
KarnerF fa8e0444b8 Show full path in ELF dropdown; show selected ELF filename next to Start button 2026-08-31 19:16:33 +02:00
KarnerF 48c1eb6ebc Rename Autostart panel to Startoptionen; separate ShadowMountPlus restart option; fix labels 2026-08-31 19:04:26 +02:00
KarnerF 6313ea6e42 Reinstall tile when: icon deleted, port changed, or first run; port stored in marker 2026-08-31 18:53:11 +02:00
KarnerF 4ed6869ad8 Fix tile deeplink port: update param.json to 7777, patch port dynamically on install 2026-08-31 18:47:58 +02:00
KarnerF 8ecd374087 Configurable HTTP port: field in Autostart panel, saved in prefs, applied at startup 2026-08-31 18:39:43 +02:00
KarnerF 46915bf6d1 Change default port from 7070 to 7777 2026-08-31 18:13:16 +02:00
KarnerF 35bfdc87a1 Add MIT License 2026-08-30 20:07:03 +02:00
KarnerF 040e4eabb6 README: correct minimum SM version to 1.6beta16 2026-08-30 19:33:32 +02:00
KarnerF 7904189cb8 README: add minimum SM version requirement (1.7alpha3+) 2026-08-30 19:31:50 +02:00
KarnerF af9ca6d26e Fix README: ELF filename v1.0.0, remove broken encoding 2026-08-30 19:16:45 +02:00
KarnerF cc1c158d21 Fix version string: 1.0.0 not v1.0.0 in notification 2026-08-30 19:11:01 +02:00
KarnerF 82b97618a0 Rename ELF to SMPlusGui_v1.0.0.elf 2026-08-30 19:08:56 +02:00
KarnerF 5fc27c24de Remove Spiele panel - belongs in SM not SMPlusGui 2026-08-30 18:35:09 +02:00
KarnerF 3339867f30 Back to /api/icon/ endpoint with ?v=3 cache buster; remove b64 overhead that caused missing games 2026-08-30 18:20:46 +02:00
KarnerF 06f05bbd3c Limit icon base64 to 30KB max; remove slow /mnt/shadowmnt/ scan; fixes missing games in list 2026-08-30 18:15:49 +02:00
KarnerF 81d41c15a8 Inline base64 icons in gamelist HTML - instant on all devices, no separate HTTP requests 2026-08-30 18:11:57 +02:00
KarnerF 2f608f8aa8 Remove synchronous icon pre-caching from gamelist (was causing slow load); add usb paths to icon search 2026-08-30 17:48:56 +02:00
KarnerF 81077b64d3 Pre-cache all icons from /user/appmeta/ when gamelist is generated 2026-08-30 17:25:53 +02:00
KarnerF 871fac5bf4 gamelist: always use /api/v1/images (always has data); enrich with title_name from games API 2026-08-30 15:55:47 +02:00
KarnerF b250018f99 Enable MG_ENABLE_POSIX_FS - p_open/p_read were stubs, making all file serving broken 2026-08-30 15:40:28 +02:00
KarnerF b383d7dec0 Use mg_http_serve_file for icons (correct binary file serving); copy-to-cache before serving 2026-08-30 15:31:57 +02:00
KarnerF 3fcf23eb20 Use /api/v1/games (title_name!); fix icon binary serving with mg_send; stat() image files for size 2026-08-30 15:28:08 +02:00
KarnerF 7363a58147 Server-side game list HTML (like GC) - no more JS string building; icons, size, buttons all in C 2026-08-30 15:23:02 +02:00
KarnerF 0f1c403d41 Cache-bust icon img src with timestamp; no-store on 404 to prevent browser caching misses 2026-08-30 15:18:17 +02:00
KarnerF 3abb58a6b0 Fix JS: use data-i attribute for button index, no quote escaping in onclick 2026-08-30 15:05:14 +02:00
KarnerF 4bef8ed17d Fix /api/icon/ path offset (+10); add type='button' to game card buttons (fix form submit) 2026-08-30 14:12:01 +02:00
KarnerF 1c9a2ca975 Fix onerror (undefined none) and ++ operator bug causing JS errors 2026-08-30 14:03:00 +02:00
KarnerF 35d7b6f935 New /api/icon/{tid} endpoint (no query string); img tag with onerror; reads /user/appmeta/ first 2026-08-30 13:59:25 +02:00
KarnerF 0415bc75cb Fix CSS url() quotes (? broke URL); use /user/appmeta/ as primary icon source 2026-08-30 13:54:04 +02:00
KarnerF 92e18c1bdf Add /api/game/icon-check endpoint to debug which icon paths are accessible 2026-08-30 13:51:31 +02:00
KarnerF b7a039e80e Fix icon: extract tid from mp, use /data/homebrew/{tid}/ symlink, cache always by tid 2026-08-30 13:47:22 +02:00
KarnerF 110c9cb1cd Add GC icon cache + /user/appmeta/ to icon search paths 2026-08-30 13:42:52 +02:00
KarnerF 240a4e2df3 Auto-refresh when all unmounted (SM starting); icon uses mount_point directly; fix duplicate var decl 2026-08-30 13:39:13 +02:00
KarnerF dc21f856c3 Mount writes to manual.lst (persistent) AND calls SM API (immediate) 2026-08-30 13:33:37 +02:00
KarnerF 68c761d6b5 Remove duplicate images table; single card list; CSS background-image icons (no broken img); fix manualMount 2026-08-30 13:30:33 +02:00
KarnerF 2734b79267 Fix JS syntax error (duplicate ternary); use global _smG array for onclick; no more escaping issues 2026-08-30 13:22:49 +02:00
KarnerF 51d79aceed Extract title_id from mount_point field; use SM mount API; scan /mnt/shadowmnt/ for icons 2026-08-30 13:16:00 +02:00
KarnerF 77ca2cb52f Add Rohdaten debug button to show raw SM API responses 2026-08-30 13:12:06 +02:00
KarnerF 984dc7150e Show images directly as games when SM games DB empty; no more retry loop 2026-08-30 13:07:45 +02:00
KarnerF 991f419f60 Replace broken local scan with manual.lst mount (GC approach); Mount button uses image path not title_id 2026-08-30 13:02:25 +02:00
KarnerF eebd3a700f Add /api/local/games filesystem scan fallback; extract renderGamesList(); title_id from /data/homebrew/ symlinks 2026-08-30 12:54:52 +02:00
KarnerF 5270958054 Auto-retry games panel 3x on empty (SM startup); mount buttons in images table when title_id known 2026-08-30 11:13:14 +02:00
KarnerF 6a39da76e3 Own icon cache at /data/SMPlusGui/icon-cache/ - auto-populated on first mount, no GC dependency 2026-08-30 11:02:39 +02:00
KarnerF 14bfbb3e78 Fix icon search paths: try /data/homebrew/{tid}/sce_sys/icon0.png and more (GC approach) 2026-08-30 10:52:52 +02:00
KarnerF e3885b47fb Merge Games+Images into one panel; add game icon endpoint; card layout with icons 2026-08-30 10:45:07 +02:00
KarnerF 857fd99f09 Fix games list disappearing after mount; improve image details; remove duplicate sm_api_post 2026-08-30 10:35:48 +02:00
KarnerF 9026d211a2 Fix: wrap loadGames/loadImages/mountGame/unmountGame in H() so JS is actually sent to browser 2026-08-30 10:22:35 +02:00
KarnerF d316ce32d1 Add Games and Images panels with SM API mount/unmount support 2026-08-30 10:14:24 +02:00
KarnerF f807fd4dcb Rename legacy_gddr5_cache to nested_pfs_index_cache (1.7alpha9) 2026-08-26 19:02:31 +02:00
KarnerF 61e59b9dbb Add one-liner description to README 2026-08-22 15:42:42 +02:00
KarnerF ddbaa36e5a Slim down README completely 2026-08-22 15:39:41 +02:00
KarnerF 104e1d94ce Merge features into intro, keep it slim 2026-08-22 15:34:34 +02:00
KarnerF e332af49a0 Clarify language detection fallback in README 2026-08-22 15:26:35 +02:00
KarnerF 7d5d1c17b0 Remove browser mention from README 2026-08-22 15:24:14 +02:00
KarnerF 2909d2335b Simplify README - less formal, more honest 2026-08-22 15:20:31 +02:00
KarnerF 8620a90bee Per-setting version badges for all 1.7alpha7 fields 2026-08-22 14:59:36 +02:00
KarnerF 90b503d84a Add inline version badges to legacy mount and emulator settings 2026-08-22 14:55:55 +02:00
KarnerF 8649d476d1 Add 1.7alpha7 settings: legacy mount profiles, emulator updates, AMPR 2026-08-22 14:50:07 +02:00
KarnerF abba950b04 Restore missing quiet_mode toggle in Notifications panel 2026-08-15 12:02:34 +02:00
KarnerF 787871b89d Update README: new features, autostart docs, fix title ID 2026-08-15 11:23:53 +02:00
KarnerF 7855f1ead8 Add always-restart-SM toggle option in Autostart panel 2026-08-15 10:58:51 +02:00
KarnerF a95d546bf7 Better restore text, add debug notification at startup 2026-08-15 10:14:29 +02:00
KarnerF a718085631 Use sceKernelSendNotificationRequest for simple restore notification 2026-08-15 10:06:54 +02:00
KarnerF c365eb8ff3 Restore: simple no-icon notification, remove icon-install notification 2026-08-15 09:59:57 +02:00
KarnerF 3111bb7df1 Fix network watchdog logic, add icon install notification 2026-08-15 09:55:39 +02:00
KarnerF 241a30796d Improve rest mode detection: SIGCONT + IP-lost-then-restored 2026-08-15 09:45:14 +02:00
KarnerF b12826fdd0 Icon option in prefs, network watchdog for rest mode recovery 2026-08-15 09:33:37 +02:00
KarnerF 7ec095b8be Revert: always reinstall icon to keep it at front of home screen 2026-08-12 21:26:50 +02:00
KarnerF 4c0ee09952 Icon stays at user position: only install once via marker file 2026-08-12 21:21:47 +02:00
KarnerF 16455110dc Remove unused JS functions: clearPrefElf, rawToggleEdit 2026-08-12 21:11:21 +02:00
KarnerF 7cd3977db1 Translate ELF select button text, all else verified 2026-08-12 21:05:53 +02:00
KarnerF 558bc47373 Async ELF send + interleaved Mongoose polls: no more browser timeout 2026-08-12 20:28:33 +02:00
KarnerF 8877dc19e7 Fix: rename g_mgr to smg_mgr to avoid mongoose.h conflict 2026-08-12 20:20:41 +02:00
KarnerF 05f74f43d2 Interleave Mongoose polls during ELF send to prevent browser crash 2026-08-12 20:18:29 +02:00
KarnerF 546c2c82e6 Fix auto-start toggle: use onchange with direct checked state 2026-08-12 19:03:53 +02:00
KarnerF 3763046c52 Auto-start delay back to 6s for elfldr initialization 2026-08-12 18:58:06 +02:00
KarnerF 4687e37ca2 Remove unused g_pending_elf variable 2026-08-11 23:30:40 +02:00
KarnerF e685ef7a8f Revert async ELF: synchronous send worked before 2026-08-11 23:27:20 +02:00
KarnerF 6aad59bc4f USB reload only when Config panel is active 2026-08-11 23:19:04 +02:00
KarnerF 8176693ecc Fix scan hint: all usb0-7, add shadowmountplus*.elf mention 2026-08-11 23:05:38 +02:00
KarnerF 901e98748e Translate scan hint, clarify USB is first USB only 2026-08-11 23:00:57 +02:00
KarnerF 5c5c15d89c Add default scan dirs hint in Autostart panel 2026-08-11 22:56:45 +02:00
KarnerF 77343dbc8a Extra scan directories list in Autostart panel 2026-08-11 22:43:56 +02:00
KarnerF 79c6df8b6c Custom ELF path on own full-width row below picker 2026-08-11 22:31:26 +02:00
KarnerF eb4b729e4f Fix missing function onAS declaration 2026-08-11 22:28:15 +02:00
KarnerF 541d499c83 Add custom ELF path input to Autostart panel 2026-08-11 22:25:11 +02:00
KarnerF f289b4dcc2 Increase USB poll interval to 5s to reduce browser load 2026-08-11 22:15:37 +02:00
KarnerF f53a1d98c0 Fix browser crash: send ELF async after HTTP response 2026-08-11 22:11:48 +02:00
KarnerF 503c736e6d Revert font size to 16px/20px 2026-08-11 22:04:56 +02:00
KarnerF feca108a4a Increase font size: 16->18px base, 20->22px large screen 2026-08-11 21:57:59 +02:00
KarnerF 75d61a105e Content scrollbar 4px, remove margin-right horizontal scroll 2026-08-11 21:49:40 +02:00
KarnerF ec9ac74d53 Apply PayloadManager scrollbar style, restore .ico class 2026-08-11 21:46:33 +02:00
KarnerF a5d015dbdf Use margin-right to offset scrollbar from edge 2026-08-11 21:41:55 +02:00
KarnerF 74de719d36 Move content scrollbar 4px from right edge 2026-08-11 21:39:56 +02:00
KarnerF 1a4e325ba6 Remove API version badge completely 2026-08-11 21:37:55 +02:00
KarnerF fd4263c1ac Remove API top hint, keep inline version badges 2026-08-11 21:34:30 +02:00
KarnerF 21f7a20c68 Revert sidebar scrollbar to 4px 2026-08-11 21:31:45 +02:00
KarnerF b953270c3f Fix API panel, thinner sidebar scrollbar 2026-08-11 21:29:24 +02:00
KarnerF 75dbf71bbc Add Auto-Remove header, match sidebar scrollbar to content 2026-08-11 21:24:40 +02:00
KarnerF 870099cca8 Restore sidebar collapse transition 2026-08-11 21:16:42 +02:00
KarnerF 4d228661e1 Scrollbar at right edge, hide sidebar scrollbar 2026-08-11 21:13:54 +02:00
KarnerF 959596c747 Split Mounting/Scan, fix menu icon, fix right margin, dark scrollbar track 2026-08-11 21:09:13 +02:00
KarnerF f2c7629764 Fix broken H() calls after panel header insertion 2026-08-11 21:04:21 +02:00
KarnerF f277a0f765 Add headers to all panels, thin scrollbar like PayloadManager 2026-08-11 21:03:09 +02:00
KarnerF ee98813ea5 Split Autostart and Auto-Remove into separate panels 2026-08-11 20:58:11 +02:00
KarnerF 70d2b693bf Split Backend/API back, remove topbar save button 2026-08-11 20:53:19 +02:00
KarnerF fb8cde190d Scroll content to top on panel switch 2026-08-11 20:49:12 +02:00
KarnerF 430b44f35d Hide scrollbar on content like PayloadManager 2026-08-11 20:44:41 +02:00
KarnerF a503301c37 Fix: html height:100%, body overflow:hidden, remove min-height:100vh 2026-08-11 20:39:23 +02:00
KarnerF 21dc88313c Fix layout align-items, add collapsible sidebar toggle 2026-08-11 20:34:29 +02:00
KarnerF 299bf425ca Fix html/body height chain for proper scrollable content 2026-08-11 20:31:16 +02:00
KarnerF 53afd032a5 Remove zoom, fix flex chain for scrollable content 2026-08-11 20:28:11 +02:00
KarnerF e08a27847f Fixed viewport layout like PayloadManager: only content scrolls 2026-08-11 20:24:50 +02:00
KarnerF 21c36d9c2e Revert layout changes, split kstuff/fakelib back 2026-08-11 20:21:10 +02:00
KarnerF f809ea0419 Fixed height layout: only content scrolls, btn-area always visible 2026-08-11 20:15:27 +02:00
KarnerF 43155f1f71 Merge kstuff+Fakelib, move save button to topbar 2026-08-11 20:10:33 +02:00
KarnerF 90e56baa03 Fix panel-bkd div imbalance: api-wrap inside panel-bkd 2026-08-11 20:03:33 +02:00
KarnerF b7ef998443 Fix em dash compile error in comment 2026-08-11 19:59:39 +02:00
KarnerF d59bb108c4 Merge Backend+API into one panel 2026-08-11 19:58:20 +02:00
KarnerF e4ea30650c Merge Mounting+Scan, add save button at top 2026-08-11 19:53:42 +02:00
KarnerF d9d5da5084 Rename Auto panel, add section headers for Autostart and Auto-Remove 2026-08-11 19:33:49 +02:00
KarnerF 53d5be63f5 Fix panel-auto: keep open across both autostart and autoremove 2026-08-11 19:31:10 +02:00
KarnerF 7ebf939533 Fix unbalanced div closing in auto panel 2026-08-11 19:28:19 +02:00
KarnerF 8c92930f29 Restore kst/fkl/bkd/api as separate panels, keep only auto merged 2026-08-11 19:21:34 +02:00
KarnerF e2dff891a5 Rename merged panels to kstuff/Fakelib and Backend/API 2026-08-11 19:16:37 +02:00
KarnerF 1da60f7674 Merge panels: Auto, Kompatibilitaet, Server 2026-08-11 19:15:01 +02:00
KarnerF 0e5777a6d0 Remove auto-scroll on panel switch 2026-08-11 19:05:24 +02:00
KarnerF 85401aa492 Fix syntax error in showP scrollTo 2026-08-11 19:02:49 +02:00
KarnerF e0c95f0412 Scroll to top on panel switch, revert fixed btn 2026-08-11 19:01:42 +02:00
KarnerF 2326ebccaf Fixed save button at bottom via position:fixed 2026-08-11 18:59:02 +02:00
KarnerF c5f7e67493 Revert sticky save button 2026-08-11 18:57:19 +02:00
KarnerF a948e0ff3a Add padding-bottom to prevent sticky btn covering content 2026-08-11 18:56:02 +02:00
KarnerF d398bdcb97 Sticky save button, remove redundant panel title 2026-08-11 18:52:39 +02:00
KarnerF 06df94d5c9 Actually remove auto-start from topbar 2026-08-11 18:46:13 +02:00
KarnerF 404db82bfe Remove duplicate auto-start from topbar 2026-08-11 18:43:44 +02:00
KarnerF 431ff5d02e Move auto-start to sidebar panel, fix manual start not overwriting preferred ELF 2026-08-11 18:41:13 +02:00
KarnerF 73bd7f36ee Auto-start at 2s, ELF button always visible (no layout shift) 2026-08-11 18:33:34 +02:00
KarnerF bda10c8ee1 Auto-start: always send ELF regardless of SM state 2026-08-11 18:29:35 +02:00
KarnerF 980218f294 Fix auto-start: check port 10101 instead of stale debug.log 2026-08-11 18:25:49 +02:00
KarnerF 10ec9505e3 Auto-Start: proper toggle switch + ELF selector 2026-08-11 18:21:59 +02:00
KarnerF 61f94fa288 Auto-Start: separate toggle + ELF selector buttons 2026-08-11 18:15:48 +02:00
KarnerF 9dca51d7a3 Auto-Start button: ELF picker on enable, same style as Start/Stop 2026-08-11 18:10:19 +02:00
KarnerF b9b9ef4974 Replace checkbox with toggle button for auto-start 2026-08-11 18:05:11 +02:00
KarnerF c3d9337009 Use onclick instead of onchange for auto-start checkbox 2026-08-11 18:00:50 +02:00
KarnerF 407d26cf0c Fix launchElf broken then chain 2026-08-11 17:56:57 +02:00
KarnerF b2d1988545 Add auto-start and preferred ELF settings 2026-08-11 17:31:22 +02:00
KarnerF e42c451e91 Fix notification icon path: PPSX99998 -> SMPL00001 2026-08-11 17:23:41 +02:00
KarnerF e6d70dc435 Fix favicon color to #10b981, limit log to last 200 lines 2026-08-10 10:12:17 +02:00
KarnerF bb6bafd392 Update gitignore 2026-08-09 23:28:46 +02:00
KarnerF d54e0207d6 USB: back to opendir, 2s interval, reload on fetch error when USB was present 2026-08-09 23:26:23 +02:00
KarnerF b29f2b3357 USB detection via getmntinfo kernel mount table 2026-08-09 23:21:25 +02:00
KarnerF 864735027d USB detection via st_dev mountpoint check 2026-08-09 23:18:58 +02:00
KarnerF db07520913 Use statvfs for reliable USB detection on unplug 2026-08-09 23:16:36 +02:00
KarnerF c7e0ff8344 USB detection runs on all panels not just Config 2026-08-09 23:13:15 +02:00
KarnerF 6d62f79c9d Keep current panel on USB plug/unplug reload 2026-08-09 23:09:49 +02:00
KarnerF 5326e468b4 Add AI assistance credit to README 2026-08-09 22:36:56 +02:00
KarnerF d848a75617 Games category, fix marker path to /data/SMPlusGui/ 2026-08-09 22:21:21 +02:00
KarnerF b0a3c25005 Fix title ID mismatch: PPSX99998 -> SMPL00001 2026-08-09 22:14:57 +02:00
KarnerF f23d8ffabb Change title ID to SMPL00001, set Media category 2026-08-09 22:05:24 +02:00
13 changed files with 1194 additions and 227 deletions

No files matched your search

+2
View File
@@ -1,2 +1,4 @@
*.elf *.elf
*.o *.o
project_export.txt
export_project.ps1
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 KarnerF
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+3 -3
View File
@@ -4,8 +4,8 @@ else
$(error PS5_PAYLOAD_SDK is undefined) $(error PS5_PAYLOAD_SDK is undefined)
endif endif
VERSION := 1.0.0 VERSION := 1.0.1
TARGET := SMPlusGui_$(VERSION).elf TARGET := SMPlusGui_v$(VERSION).elf
CFLAGS += -Wall -g -I. \ CFLAGS += -Wall -g -I. \
-DPLATFORM_PS5 \ -DPLATFORM_PS5 \
-DSMPLUS_VERSION=\"$(VERSION)\" \ -DSMPLUS_VERSION=\"$(VERSION)\" \
@@ -30,4 +30,4 @@ test: $(TARGET)
$(PS5_DEPLOY) -h $(PS5_HOST) -p $(PS5_PORT) $(TARGET) $(PS5_DEPLOY) -h $(PS5_HOST) -p $(PS5_PORT) $(TARGET)
clean: clean:
rm -f SMPlusGui_*.elf rm -f $(TARGET)
+28 -55
View File
@@ -1,28 +1,18 @@
# SMPlusGui # SMPlusGui
A web-based configuration UI for [ShadowMountPlus](https://github.com/drakmor/ShadowMountPlus) running directly on the PS5 as a payload ELF. Web-based config UI for [ShadowMountPlus](https://github.com/drakmor/ShadowMountPlus) running as a PS5 payload.
Configure all SM settings from any browser, manage config backups, view the debug log, and autostart SM on launch.
Opens at **http://\<PS5-IP\>:7777** (port configurable in Startoptionen)
Opens at **http://\<PS5-IP\>:7070** from any browser — PS5, phone, laptop. ![SMPlusGui — Mounting panel](assets/screenshot.png)
---
## Features
- **Full ShadowMountPlus configuration** — all settings from one clean web interface
- **Backup management** — create, restore, download, copy and move backups between internal storage and USB
- **Multi-language UI** — German, English, French, Spanish + automatic PS5 system language detection
- **USB detection** — automatically refreshes when a USB drive is plugged or unplugged
- **Debug log viewer** — live log with category filters and clear function
- **Responsive design** — works on PS5 browser, mobile phones, and desktop
- **PS5 home screen tile** — installs a launcher icon for quick access (PPSX99998)
--- ---
## Requirements ## Requirements
- PS5 with a homebrew environment (e.g. via BD-JB or Y2JB) - Jailbroken PS5 with [ShadowMountPlus](https://github.com/drakmor/ShadowMountPlus) **1.6beta16 or newer** (1.7beta2 recommended)
- [ShadowMountPlus](https://github.com/drakmor/ShadowMountPlus) installed and running - Payload loader (e.g. [Payload Manager](https://github.com/itsPLK/ps5-payload-manager))
- A payload loader such as [Payload Manager](https://github.com/itsPLK/ps5-payload-manager) - elfldr on port 9021/9020 (for Start/Autostart)
--- ---
@@ -33,53 +23,36 @@ export PS5_PAYLOAD_SDK=/path/to/ps5-payload-sdk
make make
``` ```
Output: `SMPlusGui_1.0.0.elf`
--- ---
## Usage ## Usage
1. Load `SMPlusGui_1.0.0.elf` via your payload loader 1. Load `SMPlusGui_v1.0.1.elf`
2. Open `http://<PS5-IP>:7070` in any browser 2. Open `http://<PS5-IP>:7777`
3. Configure ShadowMountPlus settings and press **Speichern** 3. Change settings, hit **Save**
4. Use the **Backup** panel to manage configuration backups
The PS5 home screen tile is reinstalled on every launch to keep it at the front. ### Auto-Update via Payload Manager
Add this URL as a Custom Source in [Payload Manager](https://github.com/itsPLK/ps5-payload-manager) (Settings → Manage Sources → Add Source):
```
https://raw.githubusercontent.com/KarnerF/SMPlusGui/main/repo.json
```
Payload Manager will detect new SMPlusGui releases and offer the update automatically.
--- ---
## Backup System ## Credits
Backups are stored in `/data/SMPlusGui/backups/` on the PS5. - **[drakmor](https://github.com/drakmor)** � [ShadowMountPlus](https://github.com/drakmor/ShadowMountPlus)
USB backups go to `<USB>/SMPlusGui/` on the connected drive. - **[itsPLK](https://github.com/itsPLK) / [najdek](https://github.com/najdek)** � [Payload Manager](https://github.com/itsPLK/ps5-payload-manager)
- **[john-tornblom](https://github.com/john-tornblom)** � [PS5 Payload SDK](https://github.com/ps5-payload-dev)
Per-backup operations (copy/move/restore/download) are available for both internal and USB backups. - **[Cesanta](https://github.com/cesanta)** � [Mongoose](https://github.com/cesanta/mongoose)
Bulk operations (copy all, move all, download all, delete all) are available in the section footer. - **[Lucide](https://lucide.dev)** � SVG icons
- **[GitHub Copilot](https://github.com/features/copilot)** � Built with AI assistance
- PS5 homebrew community
--- ---
## Credits & Thanks Unofficial homebrew. Use at your own risk.
This project would not exist without the work of the following people:
- **[drakmor](https://github.com/drakmor)** — Creator of [ShadowMountPlus](https://github.com/drakmor/ShadowMountPlus), the mount manager this GUI is built for.
- **[itsPLK](https://github.com/itsPLK) / [najdek](https://github.com/najdek)** — [PS5 Payload Manager](https://github.com/itsPLK/ps5-payload-manager), which serves as the recommended payload loader for this ELF.
- **[john-tornblom](https://github.com/john-tornblom)** — [PS5 Payload SDK](https://github.com/ps5-payload-dev) and various reference payloads that made this project possible.
- **[Cesanta](https://github.com/cesanta)** — [Mongoose](https://github.com/cesanta/mongoose) embedded HTTP server, used as the networking backbone.
- **[Lucide](https://lucide.dev)** — Open-source icon library (MIT license), providing the clean SVG icons used throughout the UI.
- **The PS5 homebrew community** — for continued research, testing, and support.
---
## Disclaimer
This is unofficial homebrew software. Use at your own risk.
Not affiliated with Sony Interactive Entertainment or any game publisher.
Config files are stored on the PS5 internal storage under `/data/SMPlusGui/`.
Always keep backups of important configurations before making changes.
+38 -12
View File
@@ -2,6 +2,7 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
@@ -39,9 +40,9 @@ static int install_title_dir(const char *title_id, const char *dir) {
return sceAppInstUtilAppInstallAll(NULL); return sceAppInstUtilAppInstallAll(NULL);
} }
#define TITLE_ID "PPSX99998" #define TITLE_ID "SMPL00001"
#define APP_ROOT "/user/app" #define APP_ROOT "/user/app"
#define MARKER "/data/shadowmount/launcher.ok" #define MARKER "/data/SMPlusGui/launcher.ok"
static int write_file(const char *p, const uint8_t *d, size_t s) { static int write_file(const char *p, const uint8_t *d, size_t s) {
FILE *f = fopen(p, "wb"); FILE *f = fopen(p, "wb");
@@ -51,29 +52,54 @@ static int write_file(const char *p, const uint8_t *d, size_t s) {
return w == s ? 0 : -1; return w == s ? 0 : -1;
} }
void smplus_install_if_needed(void) { void smplus_install_if_needed(int icon_always_front, int http_port) {
int port = http_port>1024 ? http_port : 7777;
int need = icon_always_front;
if(!need){
/* reinstall if tile directory is missing */
struct stat tst; char tdir[256];
snprintf(tdir,sizeof(tdir),APP_ROOT "/%s",TITLE_ID);
if(stat(tdir,&tst)!=0) need=1;
}
if(!need){
/* reinstall if marker missing or port changed */
FILE *m=fopen(MARKER,"r");
if(!m){need=1;}
else{char buf[32]={0};fread(buf,1,sizeof(buf)-1,m);fclose(m);
char expected[32]; snprintf(expected,sizeof(expected),"%d|media3",port);
if(strcmp(buf,expected)!=0) need=1;}
}
if(!need) return;
if (sceAppInstUtilInitialize() != 0) return; if (sceAppInstUtilInitialize() != 0) return;
/* Always uninstall + reinstall: PS5 treats it as new install and pushes to front */
sceAppInstUtilAppUnInstall(TITLE_ID);
char adir[256], sdir[256], par[256], ico[256]; char adir[256], sdir[256], par[256], ico[256];
snprintf(adir, sizeof(adir), APP_ROOT "/%s", TITLE_ID); snprintf(adir, sizeof(adir), APP_ROOT "/%s", TITLE_ID);
snprintf(sdir, sizeof(sdir), APP_ROOT "/%s/sce_sys", TITLE_ID); snprintf(sdir, sizeof(sdir), APP_ROOT "/%s/sce_sys", TITLE_ID);
snprintf(par, sizeof(par), APP_ROOT "/%s/sce_sys/param.json", TITLE_ID); snprintf(par, sizeof(par), APP_ROOT "/%s/sce_sys/param.json", TITLE_ID);
snprintf(ico, sizeof(ico), APP_ROOT "/%s/sce_sys/icon0.png", TITLE_ID); snprintf(ico, sizeof(ico), APP_ROOT "/%s/sce_sys/icon0.png", TITLE_ID);
sceAppInstUtilAppUnInstall(TITLE_ID);
mkdir(adir, 0755); mkdir(adir, 0755);
mkdir(sdir, 0755); mkdir(sdir, 0755);
if (write_file(par, sm_param_json, sm_param_json_size) != 0) goto done; if (write_file(par, sm_param_json, sm_param_json_size) != 0) goto done;
/* patch deeplink port in the written param.json */
{FILE *pf=fopen(par,"r+");if(pf){
char buf[1024]={0};fread(buf,1,sizeof(buf)-1,pf);
char old_url[64],new_url[64];
snprintf(old_url,sizeof(old_url),"http://127.0.0.1:7777/");
snprintf(new_url,sizeof(new_url),"http://127.0.0.1:%d/",http_port>1024?http_port:7777);
char *pos=strstr(buf,old_url);
if(pos&&strlen(old_url)==strlen(new_url)){memcpy(pos,new_url,strlen(new_url));
fseek(pf,0,SEEK_SET);fwrite(buf,1,strlen(buf),pf);}
fclose(pf);}}
if (write_file(ico, sm_icon0_png, sm_icon0_png_size) != 0) goto done; if (write_file(ico, sm_icon0_png, sm_icon0_png_size) != 0) goto done;
if (install_title_dir(TITLE_ID, APP_ROOT "/") != 0) goto done; install_title_dir(TITLE_ID, APP_ROOT "/");
mkdir("/data/SMPlusGui", 0755);
mkdir("/data/shadowmount", 0755); /* write port to marker so changes trigger reinstall */
write_file(MARKER, (const uint8_t *)"ok\n", 3); {char pm[32]; snprintf(pm,sizeof(pm),"%d|media3",port);
write_file(MARKER,(const uint8_t *)pm,strlen(pm));}
done: done:
sceAppInstUtilTerminate(); sceAppInstUtilTerminate();
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef APP_INSTALLER_H #ifndef APP_INSTALLER_H
#define APP_INSTALLER_H #define APP_INSTALLER_H
void smplus_install_if_needed(void); void smplus_install_if_needed(int icon_always_front, int http_port);
#endif #endif
+3 -3
View File
@@ -1,7 +1,7 @@
{ {
"applicationCategoryType": 0, "applicationCategoryType": 65536,
"titleId": "PPSX99998", "titleId": "SMPL00001",
"deeplinkUri": "http://127.0.0.1:7070/", "deeplinkUri": "http://127.0.0.1:7777/",
"localizedParameters": { "localizedParameters": {
"defaultLanguage": "de-DE", "defaultLanguage": "de-DE",
"de-DE": { "de-DE": {
Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

+87 -3
View File
@@ -119,14 +119,31 @@ typedef enum {
LS_MOVE_FROM_USB = 107, LS_MOVE_FROM_USB = 107,
LS_MOVE_ALL_LOCAL = 108, LS_MOVE_ALL_LOCAL = 108,
LS_CLEAR_LOG = 109, LS_CLEAR_LOG = 109,
LS_COUNT = 110 LS_AUTOSTART = 110,
LS_PREF_ELF = 111,
LS_COMPAT = 112,
LS_EXTRA_SCAN = 113,
LS_SCAN_DEF_HINT = 114,
LS_SELECT_ELF = 115,
LS_ICON_FRONT = 116,
LS_ICON_FRONT_LABEL = 117,
LS_ALWAYS_RESTART_SM = 118,
LS_LEGACY_MOUNT = 119,
LS_EMUS = 120,
LS_UPDATE_EMUS = 121,
LS_EMUS_PATH = 122,
LS_GAMES = 123,
LS_IMAGES = 124,
LS_STARTOPTS = 125,
LS_RESTART_REQUIRED = 126,
LS_COUNT = 127
} LangStrId; } LangStrId;
static int ui_lang = LANG_EN; static int ui_lang = LANG_EN;
static const char *lang_table[LANG_COUNT][LS_COUNT] = { static const char *lang_table[LANG_COUNT][LS_COUNT] = {
/* DE */ { /* DE */ {
"laeuft", "läuft",
"nicht aktiv", "nicht aktiv",
"Warnung: ShadowMount", "Warnung: ShadowMount",
"Image-Overrides", "Image-Overrides",
@@ -236,6 +253,23 @@ static const char *lang_table[LANG_COUNT][LS_COUNT] = {
"Lokal verschieben", "Lokal verschieben",
"Intern verschieben", "Intern verschieben",
"Log l\u00f6schen", "Log l\u00f6schen",
"Auto-Start",
"Bevorzugte ELF",
"Kompatibilit\u00e4t",
"Zus\u00e4tzliche Scan-Verzeichnisse",
"Standard: /data/pldmgr/payloads/*/, /data/shadowmount/, /mnt/usb0-7/ \u2014 sucht shadowmount*.elf / shadowmountplus*.elf",
"ELF ausw\u00e4hlen",
"Icon-Position",
"Icon immer nach vorne schieben",
"ShadowMountPlus immer neu starten (auch wenn l\u00e4uft)",
"Legacy Mount-Profile",
"Emulatoren",
"Emulatoren aus Ordner aktualisieren",
"Emulator-Ordner",
"Spiele",
"Images",
"Startoptionen",
"Neustart von SMPlusGui erforderlich",
}, },
/* EN */ { /* EN */ {
"running", "running",
@@ -347,7 +381,23 @@ static const char *lang_table[LANG_COUNT][LS_COUNT] = {
"USB Backups", "USB Backups",
"Move local", "Move local",
"Move local", "Move local",
"Clear log", "Clear log", "Auto-Start",
"Preferred ELF",
"Compatibility",
"Additional scan directories",
"Default: /data/pldmgr/payloads/*/, /data/shadowmount/, /mnt/usb0-7/ \u2014 searches shadowmount*.elf / shadowmountplus*.elf",
"Select ELF",
"Icon Position",
"Always move icon to front",
"Always restart ShadowMountPlus (even if running)",
"Legacy Mount Profiles",
"Emulators",
"Update emulators from folder",
"Emulators path",
"Games",
"Images",
"Start Options",
"Restart SMPlusGui to apply",
}, },
/* FR */ { /* FR */ {
"actif", "actif",
@@ -460,6 +510,23 @@ static const char *lang_table[LANG_COUNT][LS_COUNT] = {
"D\u00e9placer local", "D\u00e9placer local",
"Cr\u00e9er sur USB", "Cr\u00e9er sur USB",
"Effacer le journal", "Effacer le journal",
"D\u00e9marrage auto",
"ELF pr\u00e9f\u00e9r\u00e9",
"Compatibilit\u00e9",
"R\u00e9pertoires d'analyse suppl\u00e9mentaires",
"D\u00e9faut : /data/pldmgr/payloads/*/, /data/shadowmount/, /mnt/usb0-7/ \u2014 cherche shadowmount*.elf / shadowmountplus*.elf",
"S\u00e9lectionner ELF",
"Position de l'ic\u00f4ne",
"Toujours mettre l'ic\u00f4ne au premier plan",
"Toujours red\u00e9marrer ShadowMountPlus (m\u00eame si actif)",
"Profils de montage h\u00e9rit\u00e9s",
"\u00c9mulateurs",
"Mettre \u00e0 jour les \u00e9mulateurs depuis le dossier",
"Dossier des \u00e9mulateurs",
"Jeux",
"Images",
"Options de d\u00e9marrage",
"Red\u00e9marrer SMPlusGui pour appliquer",
}, },
/* ES */ { /* ES */ {
"activo", "activo",
@@ -572,6 +639,23 @@ static const char *lang_table[LANG_COUNT][LS_COUNT] = {
"Mover local", "Mover local",
"Mover local", "Mover local",
"Borrar log", "Borrar log",
"Inicio autom\u00e1tico",
"ELF preferido",
"Compatibilidad",
"Directorios de an\u00e1lisis adicionales",
"Predeterminado: /data/pldmgr/payloads/*/, /data/shadowmount/, /mnt/usb0-7/ \u2014 busca shadowmount*.elf / shadowmountplus*.elf",
"Seleccionar ELF",
"Posici\u00f3n del icono",
"Siempre mover el icono al frente",
"Siempre reiniciar ShadowMountPlus (incluso si est\u00e1 activo)",
"Perfiles de montaje heredados",
"Emuladores",
"Actualizar emuladores desde la carpeta",
"Ruta de emuladores",
"Juegos",
"Im\u00e1genes",
"Opciones de inicio",
"Reiniciar SMPlusGui para aplicar",
} }
}; };
+992 -147
View File
File diff suppressed because it is too large. Load diff
+4 -3
View File
@@ -3501,9 +3501,10 @@ static void *p_open(const char *path, int flags) {
MultiByteToWideChar(CP_UTF8, 0, mode, -1, b2, sizeof(b2) / sizeof(b2[0])); MultiByteToWideChar(CP_UTF8, 0, mode, -1, b2, sizeof(b2) / sizeof(b2[0]));
return (void *) _wfopen(b1, b2); return (void *) _wfopen(b1, b2);
#else #else
const char *mode = flags == MG_FS_READ ? "rbe" /* PS5/FreeBSD: 'e' flag (O_CLOEXEC) may not be supported; use plain modes */
: (flags & MG_FS_EXCL) ? "wxbe" const char *mode = flags == MG_FS_READ ? "rb"
: "a+be"; // e for CLOSEXEC : (flags & MG_FS_EXCL) ? "wxb"
: "a+b";
return (void *) fopen(path, mode); return (void *) fopen(path, mode);
#endif #endif
} }
+1
View File
@@ -1,3 +1,4 @@
#ifndef MONGOOSE_CONFIG_H #ifndef MONGOOSE_CONFIG_H
#define MONGOOSE_CONFIG_H #define MONGOOSE_CONFIG_H
#define MG_ENABLE_POSIX_FS 1
#endif #endif
+14
View File
@@ -0,0 +1,14 @@
{
"name": "Karner Payloads",
"payloads": [
{
"name": "SMPlusGui",
"filename": "SMPlusGui.elf",
"url": "https://github.com/KarnerF/SMPlusGui/releases/download/v1.0.1/SMPlusGui_v1.0.1.elf",
"description": "Web-based configuration GUI for ShadowMountPlus",
"version": "v1.0.1",
"category": "ShadowMount",
"checksum": "a63ed90a4dd1c1ec1a777fdb82b0ab950180e1668344380082918fbdbaececa5"
}
]
}