diff --git a/docs/evidence/framey-running-context-2026-10-26.json b/docs/evidence/framey-running-context-2026-10-26.json new file mode 100644 index 0000000..911edeb --- /dev/null +++ b/docs/evidence/framey-running-context-2026-10-26.json @@ -0,0 +1,2696 @@ +{ + "timeUtc": "2026-10-26T05:14:48.736975+00:00", + "baseCommit": "b5d50a8", + "verificationLimits": { + "fakeFrame": "Archive HTTP/SSH install/receipt/removal only; backend execution stubbed", + "localBrowser": "Exact unmodified frontends, opaque iframe; explicitly synthetic library and nonempty running-game fixture; all backend/network calls denied", + "realFrameSSH": "Frame OS 0.5.6 aarch64; exact official Discord Status read-only backend in actual Decky 3.3.0; running-context empty reads/subscription/poll/close; no game launch or process actions", + "wornVR": "Not tested" + }, + "catalogRefresh": { + "checkedAtUtc": "2026-10-26T05:18:22.485814+00:00", + "plugins": 116, + "changedIdsVersionsDigests": 0 + }, + "realFrame": { + "runtime": { + "version": "v3.3.0", + "sha256": "8ef5dcf36cbbbb6e97201a6baed5d79c4cc44ec27789fc9af1c5b6ae8f0b25b6" + }, + "plugin": { + "id": 37, + "name": "Discord Status", + "version": "1.5.0", + "sha256": "00a45dd919abb6e050685e1e408ce8023b9c4a09d6e91ba528d50aed2a63bf45" + }, + "isConnected": false, + "first": { + "apps": [], + "artwork": [], + "runningIds": [], + "mainAppId": null, + "events": [], + "cursor": 0, + "lifetimeAvailable": true + }, + "second": { + "apps": [], + "artwork": [], + "runningIds": [], + "mainAppId": null, + "events": [], + "cursor": 0, + "lifetimeAvailable": true + }, + "afterClose": { + "sessions": 0, + "timer": null + }, + "before": { + "arch": "aarch64", + "decky": "failed", + "panel": "inactive", + "battery": [ + 99 + ] + }, + "after": { + "arch": "aarch64", + "decky": "failed", + "panel": "inactive", + "battery": [ + 99 + ] + }, + "cleanup": { + "baseAbsent": true, + "unitAbsent": true + }, + "lockReleased": true, + "freshCleanupAudit": { + "locked": true, + "result": { + "sessions": 0, + "timer": null + }, + "baseAbsent": true, + "unitAbsent": true, + "service": "MainPID=0\nLoadState=not-found\nActiveState=inactive\n" + }, + "runtimeNote": "Decky startup reinjected its frontend/restarted Steam CEF; no plugin game, power, audio or process-control action was invoked." + }, + "liveAPIShape": { + "RunningAppsGetter": "Maps running IDs through GetAppOverviewByAppID and filters missing overviews", + "MainRunningAppGetter": "Looks up MainRunningAppID through GetAppOverviewByAppID", + "lifetimeHandle": { + "type": "object", + "keys": [ + "unregister" + ], + "unregister": "function" + }, + "publicArtwork": { + "vertical": "function", + "custom": "function", + "example": { + "protocol": "https:", + "hostname": "shared.steamstatic.com", + "hasQuery": true, + "validType": "string" + } + } + }, + "syntheticRunningFixture": { + "apps": [ + [ + 10, + "Test Running Game", + "test running game", + 1, + "10", + 30, + 5, + 123 + ] + ], + "runningIds": [ + 10 + ], + "mainAppId": 10, + "artwork": [ + [ + 10, + "https://shared.steamstatic.com/steam/apps/10/library_600x900.jpg", + [] + ] + ], + "events": [], + "cursor": 0, + "lifetimeAvailable": true + }, + "syntheticLibraryFixture": { + "apps": [ + [ + 10, + "Test Running Game", + "test running game", + 1, + "10", + 30, + 5, + 123 + ] + ], + "gameIds": [ + 10 + ], + "steamId": "76561198000000001" + }, + "focusedBrowser": [ + { + "id": 13, + "name": "Pause Games", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "load_settings", + "pid_from_appid" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 19, + "name": "Notebook", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "No stroke found!" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "listPages", + "loadLastSelectedPage", + "loadPage" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 46, + "name": "Steamback", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "TypeError: saveInfos.map is not a function" + } + ], + "methods": [ + "set_account_id", + "get_saveinfos" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 56, + "name": "MangoPeel", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_steamChannel", + "get_steamIndex" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 61, + "name": "TabMaster", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "%c TabMaster %c ERROR %c background: #ff6d05; color: black; background: #c70808; color: black; background: transparent; Could not find mobx.reaction" + } + ], + "methods": [ + "log_message" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 66, + "name": "PlayTime", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Impossible to get \"RunningApps\" observe. Events will not be attached." + }, + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Unable to get settings, saving defaults Error: Not found" + }, + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Failed to set current user: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "set_current_user", + "fetch_playtime_information", + "statistics_for_last_two_weeks", + "daily_statistics_for_period" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 89, + "name": "DeckySpy", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "log", + "get_token", + "log_err", + "check_token" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 93, + "name": "Deck Settings", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[decky-game-settings:AuthorFooter] Error fetching avatar image: Error: Decky proxy fetch is unavailable in Framey" + }, + { + "kind": "error", + "message": "[decky-game-settings:GameSelectView] Error fetching installed games: Error: Read-only compatibility audit: live Steam API blocked" + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 98, + "name": "Decky-Lookup", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 100, + "name": "Virtual Surround Sound", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error fetching avatar image: Error: Decky proxy fetch is unavailable in Framey" + }, + { + "kind": "error", + "message": "[decky-virtual-surround-sound:AudioControlsView] Error fetching app details: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_sink_inputs" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 103, + "name": "Decky Ludusavi", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_config", + "get_ludusavi_version" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 104, + "name": "Game Sync", + "ready": false, + "error": "Read-only compatibility audit: backend method blocked", + "logs": [], + "methods": [ + "get_config" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 113, + "name": "Decky LSFG-VK", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error loading lsfg config: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Error loading profiles: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "check_lsfg_vk_installed", + "check_lossless_scaling_dll", + "get_lsfg_config", + "get_profiles" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 124, + "name": "AlarMe", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Failed to load timers: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load recent timers: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load sleep inhibitor status: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to fetch missed items Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load timers: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load recent timers: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_active_timers", + "get_recent_timers", + "get_settings", + "get_presets", + "get_sleep_inhibitor_status", + "get_missed_items", + "stopwatch_get_state", + "get_pomodoro_state", + "get_reminders", + "get_game_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 127, + "name": "Decky Translator", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_enabled_state", + "get_provider_status", + "get_all_settings", + "check_web_reachability", + "get_hidraw_button_state" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 132, + "name": "SuggestMe", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[SuggestMe] Failed to load config: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load library status: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load play next list: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load excluded games: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load filter presets: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load history: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load non-steam info: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load collections: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "log_message", + "get_config", + "get_library_status", + "get_play_next_list", + "get_excluded_games", + "get_filter_presets", + "get_suggestion_history", + "get_non_steam_games", + "get_collections", + "get_available_genres", + "get_available_tags", + "get_available_community_tags" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 143, + "name": "Desktop Apps", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "%c @decky/ui %c DesktopApps %c background: #16a085; color: black; background: #FF0000; background: transparent; Failed to fetch apps Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_temporary_shortcuts", + "get_apps" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 37, + "name": "Discord Status", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + } + ], + "fullBrowser": { + "attempted": 116, + "ready": 103, + "notReady": 13, + "observations": [ + { + "id": 1, + "name": "XR Gaming", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "retrieve_config", + "is_breezy_install_pending", + "retrieve_driver_state", + "retrieve_dont_show_again_keys" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 7, + "name": "CSS Loader", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + }, + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + }, + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + }, + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + } + ], + "methods": [ + "get_themes", + "store_read", + "dummy_function", + "get_last_load_errors" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 10, + "name": "vibrantDeck", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "set_vibrancy" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 11, + "name": "Fantastic", + "ready": true, + "error": null, + "logs": [ + { + "kind": "rejection", + "message": "CompileError: WebAssembly.instantiateStreaming(): Compiling or instantiating WebAssembly module violates the following Content Security policy directive because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: \"script-src 'self' 'unsafe-inline' blob:\"." + }, + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'get_enable')" + }, + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'get_interpolate')" + }, + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'get_curve_x')" + }, + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'get_temperature')" + }, + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'get_fan_rpm')" + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 12, + "name": "MusicControl", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + }, + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + } + ], + "methods": [ + "sp_list_media_players" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 13, + "name": "Pause Games", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "load_settings", + "pid_from_appid" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 14, + "name": "ProtonDB Badges", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_setting" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 16, + "name": "Audio Loader", + "ready": false, + "error": "Cannot read properties of undefined (reading 'm_AudioPlaybackManager')", + "logs": [ + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + } + ], + "methods": [ + "store_read" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 18, + "name": "Bluetooth", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[Bluetooth] !! get_bluetooth_status \u2192 Error: All retries failed. Last error: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Error: All retries failed. Last error: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[Bluetooth] !! get_paired_devices_with_info \u2192 Error: All retries failed. Last error: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Error: All retries failed. Last error: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_bluetooth_status", + "get_paired_devices_with_info" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 19, + "name": "Notebook", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "No stroke found!" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "listPages", + "loadLastSelectedPage", + "loadPage" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 21, + "name": "PowerTools", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:" + }, + { + "kind": "rejection", + "message": "CompileError: WebAssembly.instantiate(): Compiling or instantiating WebAssembly module violates the following Content Security policy directive because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: \"script-src 'self' 'unsafe-inline' blob:\"." + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 22, + "name": "Memory Deck", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_processes", + "get_attached_process" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 23, + "name": "Animation Changer", + "ready": true, + "error": null, + "logs": [ + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'map')" + }, + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'map')" + } + ], + "methods": [ + "getState" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 24, + "name": "RadiYo!", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "error while fetching http://api.dar.fm/topsongs.php?callback=json&page_size=10&q=Music&partner_token=7090975725" + } + ], + "methods": [ + "fetch" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 26, + "name": "HLTB for Deck", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "HLTB - LibraryContextMenu component not found" + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 27, + "name": "AutoSuspend", + "ready": false, + "error": "Cannot read properties of undefined (reading '6')", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 28, + "name": "Emuchievements", + "ready": true, + "error": null, + "logs": [ + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'apps')" + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 30, + "name": "TunnelDeck", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "TypeError: connections.filter is not a function" + } + ], + "methods": [ + "active_connection", + "is_openvpn_pacman_installed", + "is_openvpn_enabled", + "show", + "reset_cached_data", + "get_priority_interface", + "is_internet_available", + "get_prioritized_network_info" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 32, + "name": "AutoFlatpaks", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Uncaught TypeError: Cannot read properties of undefined (reading 'batteryState')" + } + ], + "methods": [ + "settings_getSetting" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 35, + "name": "MoonDeck", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 36, + "name": "SteamGridDB", + "ready": false, + "error": "Cannot convert undefined or null to object", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 37, + "name": "Discord Status", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 38, + "name": "Volume Mixer", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[VolumeMixer] Error while calling get_sink_inputs" + } + ], + "methods": [ + "get_sink_inputs" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 40, + "name": "Controller Tools", + "ready": false, + "error": "Audit blocks WebSocket", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 43, + "name": "Tailscale Control", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_tailscale_state" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 44, + "name": "DeckMTP", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "rejection", + "message": "Read-only compatibility audit: backend method blocked" + }, + { + "kind": "rejection", + "message": "Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "is_drd_enabled", + "is_running" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 46, + "name": "Steamback", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "TypeError: saveInfos.map is not a function" + } + ], + "methods": [ + "set_account_id", + "get_saveinfos" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 48, + "name": "Quick Launch", + "ready": true, + "error": null, + "logs": [ + { + "kind": "rejection", + "message": "undefined" + } + ], + "methods": [ + "get_config" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 49, + "name": "Decky Cloud Save", + "ready": true, + "error": null, + "logs": [ + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of null (reading 'callPluginMethod')" + }, + { + "kind": "rejection", + "message": "Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_config", + "get_backend_type", + "get_log_level" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 50, + "name": "Storage Cleaner", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "list_games_with_temp_data", + "get_size" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 52, + "name": "Game Theme Music", + "ready": false, + "error": "Cannot read properties of null (reading 'type')", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 53, + "name": "Shotty", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "set_id_map_fronend" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 56, + "name": "MangoPeel", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_steamChannel", + "get_steamIndex" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 58, + "name": "Volume Boost", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Failed to get volume for channel: left" + } + ], + "methods": [ + "get_volume_state" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 59, + "name": "Web Browser", + "ready": false, + "error": "deckyFrontendLib.getReactRoot is not a function", + "logs": [ + { + "kind": "warn", + "message": "%c Web Browser %c Styling %c background: #7627D3; color: #E5E1EA; background: #AF70F9; color: black; background: transparent; No SP Window" + }, + { + "kind": "error", + "message": "%c Web Browser %c background: #7627D3; color: #E5E1EA; background: transparent; Error setting main tab for establishing ws server Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "%c Web Browser %c Settings Manager %c background: #7627D3; color: #E5E1EA; background: #AF70F9; color: black; background: transparent; Failed to load settings" + }, + { + "kind": "error", + "message": "%c Web Browser %c Settings Manager %c background: #7627D3; color: #E5E1EA; background: #AF70F9; color: black; background: transparent; Failed to load favorites" + }, + { + "kind": "error", + "message": "%c Web Browser %c Settings Manager %c background: #7627D3; color: #E5E1EA; background: #AF70F9; color: black; background: transparent; Failed to load history" + } + ], + "methods": [ + "set_main_tab", + "load" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 60, + "name": "DeckyFileServer", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 61, + "name": "TabMaster", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "%c TabMaster %c ERROR %c background: #ff6d05; color: black; background: #c70808; color: black; background: transparent; Could not find mobx.reaction" + } + ], + "methods": [ + "log_message" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 62, + "name": "TS3 QuickAccess", + "ready": true, + "error": null, + "logs": [ + { + "kind": "rejection", + "message": "Error: failed to fetch status" + } + ], + "methods": [ + "status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 63, + "name": "Free Loader", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "settings_read", + "logger_error", + "read_deals", + "logger_info" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 64, + "name": "Syncthing", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Decky Syncthing: failed loading state: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Decky Syncthing: failed loading state: Error: Audit blocks plugin network" + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 65, + "name": "Decky Terminal", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_terminals" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 66, + "name": "PlayTime", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Impossible to get \"RunningApps\" observe. Events will not be attached." + }, + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Unable to get settings, saving defaults Error: Not found" + }, + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Failed to set current user: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "%c PlayTime %c ERROR background: #16a085; color: black; background: #FF000040; Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "set_current_user", + "fetch_playtime_information", + "statistics_for_last_two_weeks", + "daily_statistics_for_period" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 67, + "name": "Battery Tracker", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "TypeError: Cannot read properties of undefined (reading 'map')" + }, + { + "kind": "rejection", + "message": "TypeError: Cannot read properties of undefined (reading 'length')" + } + ], + "methods": [ + "set_app", + "get_recent_data" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 68, + "name": "Wine Cellar", + "ready": false, + "error": "Audit blocks WebSocket", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 70, + "name": "MicroSDeck", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "%c MicroSDeck %c Error: %c Failed to fetch \"http://localhost:12412/health\" with error Error: Audit blocks plugin network background: #165da0; color: black; background: #d63a57; color: black; background: transparent; color:#6e6e6e; [object Object]" + }, + { + "kind": "error", + "message": "Error: Minified React error #31; visit https://reactjs.org/docs/error-decoder.html?invariant=31&args[]=object%20with%20keys%20%7B%24%24typeof%2C%20type%2C%20key%2C%20ref%2C%20props%7D for the full message or use the non-minified dev environment for full errors and additional helpful warnings." + }, + { + "kind": "error", + "message": "Error: Minified React error #31; visit https://reactjs.org/docs/error-decoder.html?invariant=31&args[]=object%20with%20keys%20%7B%24%24typeof%2C%20type%2C%20key%2C%20ref%2C%20props%7D for the full message or use the non-minified dev environment for full errors and additional helpful warnings." + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 72, + "name": "ScreenshotUploader", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "getCounter", + "getSetting" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 73, + "name": "EmuDecky", + "ready": true, + "error": null, + "logs": [ + { + "kind": "rejection", + "message": "SyntaxError: Unexpected token 'R', \"Read-only \"... is not valid JSON" + } + ], + "methods": [ + "getSettings" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 74, + "name": "KDE Connect", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "is_enabled" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 75, + "name": "Reshadeck", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_shader_list", + "get_screensaver_list", + "get_current_shader", + "get_current_screensaver" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 76, + "name": "CheatDeck", + "ready": false, + "error": "Cannot convert undefined or null to object", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 77, + "name": "BT Wake Control", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 78, + "name": "Brightness Bar", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "settings_load" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 79, + "name": "Decky Notifications", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "device_list", + "notification_list", + "get_event" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 80, + "name": "MagicBlack", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[MagicBlack] Failed to load allow_touch setting Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[MagicBlack] Failed to load mute_mic setting Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[MagicBlack] Failed to load mute_sound setting Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[MagicBlack] Failed to load off_anykey setting Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[MagicBlack] Failed to load off_upon_waking setting Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[MagicBlack] Failed to load overlay_opacity number setting Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "load_setting" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 81, + "name": "IsThereAnyDeal for Deck", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "settings_load" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 82, + "name": "MagicPods", + "ready": false, + "error": "Audit blocks WebSocket", + "logs": [], + "methods": [ + "load_setting", + "logger_react" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 84, + "name": "Junk-Store", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "fetch_rss_feed", + "execute_action" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 85, + "name": "Decky-Undervolt", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "init" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 87, + "name": "ScreenSaver", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_settings", + "get_event" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 88, + "name": "steamdeck-input-disabler", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 89, + "name": "DeckySpy", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "log", + "get_token", + "log_err", + "check_token" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 90, + "name": "Picture in Picture", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 91, + "name": "PlayCount", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 92, + "name": "Crosshair", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_current_offsets" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 93, + "name": "Deck Settings", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[decky-game-settings:AuthorFooter] Error fetching avatar image: Error: Decky proxy fetch is unavailable in Framey" + }, + { + "kind": "error", + "message": "[decky-game-settings:GameSelectView] Error fetching installed games: Error: Read-only compatibility audit: live Steam API blocked" + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 94, + "name": "Decky DoT DNS", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_presets", + "get_dns_settings" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 95, + "name": "Decky-SpoofDPI", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "getStatus", + "getSettings" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 96, + "name": "Simple Timer", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "load_recents", + "load_remaining_seconds", + "load_subtle_mode" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 97, + "name": "Decky-Framegen", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "check_fgmod_path", + "log_error" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 98, + "name": "Decky-Lookup", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 99, + "name": "Decky Zerotier", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "info", + "list_networks" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 100, + "name": "Virtual Surround Sound", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error fetching avatar image: Error: Decky proxy fetch is unavailable in Framey" + }, + { + "kind": "error", + "message": "[decky-virtual-surround-sound:AudioControlsView] Error fetching app details: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_sink_inputs" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 101, + "name": "XIVOmega", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "curr_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 102, + "name": "DeckSP", + "ready": false, + "error": "Cannot access 'PluginManager' before initialization", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 103, + "name": "Decky Ludusavi", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_config", + "get_ludusavi_version" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 104, + "name": "Game Sync", + "ready": false, + "error": "Read-only compatibility audit: backend method blocked", + "logs": [], + "methods": [ + "get_config" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 105, + "name": "WiFi Locker", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error getting WiFi status: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_wifi_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 106, + "name": "LetMeReShade", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error fetching games: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "check_reshade_path", + "detect_steam_deck_model", + "has_shader_preferences", + "load_autohdr_preference", + "load_installed_configuration", + "list_installed_games", + "find_heroic_games", + "log_error" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 107, + "name": "Decky Sunshine", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[SUN] Backend method isSunshineRunning failed Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SUN] Backend method areCredentialsValid failed Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SUN] Backend method getSunshineVersionInfo failed Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "isSunshineRunning", + "areCredentialsValid", + "getSunshineVersionInfo" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 108, + "name": "HueSync", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Uncaught TypeError: Cannot read properties of undefined (reading 'acStateOverwrite')" + }, + { + "kind": "warn", + "message": "[2026-10-26 05:19:20.461] WARN HueSync: ignoring empty suspend mode value" + }, + { + "kind": "error", + "message": "[2026-10-26 05:19:20.463] ERROR Failed to init power LED control: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load msi custom presets: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load ayaneo custom presets: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load rog_ally custom presets: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_settings", + "log_info", + "log_warn", + "get_device_capabilities", + "get_custom_rgb_presets", + "log_error" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 109, + "name": "MuraDeck", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[MuraDeck] Failed to register brightness listener TypeError: Cannot read properties of undefined (reading 'RegisterForBrightnessChanges')" + } + ], + "methods": [ + "get_has_seen_welcome", + "get_enabled", + "get_display_mode", + "is_external_display", + "get_ext_monitor_watcher", + "get_brightness_enabled", + "check_shader_status", + "get_sharpness_perapp_enabled", + "get_sharpness", + "get_cas_perapp_enabled", + "get_cas" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 110, + "name": "Dimmer Deck", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "activate" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 111, + "name": "Music Control", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + }, + { + "kind": "warn", + "message": "Resolve failed: [object Object] promise [object Promise]" + } + ], + "methods": [ + "sp_list_media_players" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 112, + "name": "Better Keyboard", + "ready": false, + "error": "window.SteamClient.UI.GetUIMode is not a function", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 113, + "name": "Decky LSFG-VK", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error loading lsfg config: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Error loading profiles: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "check_lsfg_vk_installed", + "check_lossless_scaling_dll", + "get_lsfg_config", + "get_profiles" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 114, + "name": "Network Sentinel", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Failed to get network status: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to get live ping: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load connection info: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to get network history: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_network_status", + "get_live_ping", + "get_settings", + "get_connection_info", + "get_network_history" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 115, + "name": "Decky Clash", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_version", + "get_config", + "get_subscription_list", + "get_dashboard_list", + "get_ip" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 116, + "name": "Muon", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Failed to fetch IP address Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to initialize settings: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_ip_address", + "load_settings" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 117, + "name": "DeckyParty File Manager", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 118, + "name": "Speed Test", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Download test error: Error: Audit blocks plugin network" + } + ], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 119, + "name": "Decky Clipboard", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Failed to get server status: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to get clipboard: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_server_status", + "get_clipboard_data" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 120, + "name": "Reroll", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_setting", + "version", + "clear" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 121, + "name": "DeckPass", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "check_setup_state", + "check_keepass_flatpak_install_state" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 123, + "name": "Steam Status", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Background monitor: Failed to fetch Steam status: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "Failed to fetch Steam status: Audit blocks plugin network" + }, + { + "kind": "error", + "message": "[SteamStatus] loadSettings: Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SteamStatus] loadSettings: Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SteamStatus] loadSettings: Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SteamStatus] loadSettings: Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_settings" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 124, + "name": "AlarMe", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Failed to load timers: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load recent timers: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load sleep inhibitor status: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to fetch missed items Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load timers: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Failed to load recent timers: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_active_timers", + "get_recent_timers", + "get_settings", + "get_presets", + "get_sleep_inhibitor_status", + "get_missed_items", + "stopwatch_get_state", + "get_pomodoro_state", + "get_reminders", + "get_game_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 125, + "name": "Decky Localsend", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Failed to load receive history: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_receive_history", + "get_backend_status", + "get_backend_config" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 126, + "name": "Launch Options", + "ready": false, + "error": "Cannot convert undefined or null to object", + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 127, + "name": "Decky Translator", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_enabled_state", + "get_provider_status", + "get_all_settings", + "check_web_reachability", + "get_hidraw_button_state" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 128, + "name": "Quick User Switcher", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[MultiUser] Pending launch check failed: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[MultiUser] Error loading users: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "trigger_pending_launch", + "get_users", + "get_current_user", + "get_setting" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 129, + "name": "ShadowDeck", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[FRONTEND] loadInitialSettings: Failed to load settings: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_all_settings" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 130, + "name": "Games Prefix Manager", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 131, + "name": "Download All", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "TypeError: Cannot read properties of undefined (reading 'RegisterForDownloadItems')" + }, + { + "kind": "error", + "message": "Failed to log: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "log_from_ui" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 132, + "name": "SuggestMe", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "[SuggestMe] Failed to load config: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load library status: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load play next list: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load excluded games: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load filter presets: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load history: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load non-steam info: Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "[SuggestMe] Failed to load collections: Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "log_message", + "get_config", + "get_library_status", + "get_play_next_list", + "get_excluded_games", + "get_filter_presets", + "get_suggestion_history", + "get_non_steam_games", + "get_collections", + "get_available_genres", + "get_available_tags", + "get_available_community_tags" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 133, + "name": "Non-Steam Badges", + "ready": true, + "error": null, + "logs": [], + "methods": [], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 134, + "name": "Deck Progress Tracker", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_settings", + "get_tag_statistics" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 135, + "name": "Deck Shelves", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_settings" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 136, + "name": "Decky-Clipper", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "is_recording" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 137, + "name": "Decky Proton Launch", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_games", + "get_configured_apps_status", + "is_script_installed", + "get_wrapper_app_ids", + "get_running_game", + "get_variables_cache" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 138, + "name": "Docky", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_state" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 139, + "name": "Output Manager", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_state", + "get_config" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 140, + "name": "IPv6 Enabler Plugin", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 141, + "name": "DeckyClocker", + "ready": true, + "error": null, + "logs": [], + "methods": [ + "get_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 142, + "name": "MuteOnSleep", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "[MuteOnSleep] couldn't hook into SuspendResumeStore" + } + ], + "methods": [ + "get_enabled" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 143, + "name": "Desktop Apps", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "%c @decky/ui %c DesktopApps %c background: #16a085; color: black; background: #FF0000; background: transparent; Failed to fetch apps Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_temporary_shortcuts", + "get_apps" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 144, + "name": "Mixer", + "ready": true, + "error": null, + "logs": [ + { + "kind": "error", + "message": "Error: Read-only compatibility audit: backend method blocked" + }, + { + "kind": "error", + "message": "Error: Read-only compatibility audit: backend method blocked" + } + ], + "methods": [ + "get_settings", + "get_playbacks" + ], + "library": "snapshot replay", + "running": "snapshot replay" + }, + { + "id": 145, + "name": "VARTA", + "ready": true, + "error": null, + "logs": [ + { + "kind": "warn", + "message": "[VARTA] library tile component not found, grid badges disabled" + } + ], + "methods": [ + "get_settings", + "get_database_stats", + "get_update_status" + ], + "library": "snapshot replay", + "running": "snapshot replay" + } + ] + }, + "fakeFrame": { + "attempted": 116, + "outcomes": { + "blocked": 56, + "installed-removed": 60 + } + }, + "remainingUnverified": [ + "Real nonempty running-app/main-app reads", + "Real launch/exit callback delivery and per-game selection", + "Discord shortcut detection, account connection and activity publishing", + "Local custom artwork", + "Closed-panel automation, suspend/input and private MobX observation", + "Worn VR and physical controller/keyboard use" + ], + "receiptIntegration": { + "prerequisite": "#301 merged at ad57662", + "verification": "Local Python/Node tests; hardware checks above preceded this authorization-only change", + "checks": [ + "Parent poll and both close paths include pinned SHA-256", + "Missing/stale receipts rejected before CEF for active polls and close after plugin replacement", + "Reopened panel accepts current receipt for poll and close", + "Finite subscription lease unchanged for rejected stale close" + ] + } +} diff --git a/docs/evidence/framey-running-context-2026-10-26.md b/docs/evidence/framey-running-context-2026-10-26.md new file mode 100644 index 0000000..07f2509 --- /dev/null +++ b/docs/evidence/framey-running-context-2026-10-26.md @@ -0,0 +1,78 @@ +# Running-game context and Discord Status, 2026-10-26 + +Framey now projects running apps and the selected main app from Steam CEF into +detached `SteamUIStore` / `DFL.Router` getters. It relays actual Steam lifetime +callbacks while the panel is open. Public Steam CDN capsule URLs are projected +for running apps; local artwork paths and URL query data never cross the bridge. +The [machine-readable evidence](framey-running-context-2026-10-26.json) records +the exact archives, fixtures, browser observations and cleanup results. + +| Plugin / scope | Result | Verification | +| --- | --- | --- | +| Discord Status 1.5.0 | **Broken → partial.** Disconnected panel renders; activity construction accepts the synthetic running game without the previous missing-store/artwork errors. | Exact unmodified official frontend in opaque Chromium iframe; backend/network denied. Actual official `is_connected` returns false in real Decky 3.3.0 ARM64, with no Discord IPC present. | +| Pause Games | **Partial.** Running-list initialization reaches `pid_from_appid` for the synthetic game. | Local Chromium fixture; all backend calls, including settings writes and process actions, denied. | +| Notebook | **Works for its previously verified default notebook scope.** Per-game context is now supplied, but real per-game selection remains unverified. | Synthetic game causes the official frontend to request `loadPage`; backend calls denied in this pass. Earlier default save/reopen ARM64 evidence remains separate. | +| PlayTime | **Partial.** Running snapshots do not satisfy its private MobX observation. | Local Chromium explicitly logs that its running-app observer is unavailable. No automatic tracking claim. | +| 14 other focused panels | Labels retained. Initialization alone does not establish backend functionality. | Exact frontends with synthetic nonempty running/library snapshots and backend/network denied; Game Sync still stops on the denied `get_config` read. | + +The bridge addresses a shared dependency detected in 34 official frontend +bundles, including hardware-inapplicable plugins whose installation remains +blocked. This is infrastructure coverage, not 34 working plugins. Catalog after +this pass: **3 works / 49 partial / 53 broken / 11 N/A**. + +## Real Frame checks and cleanup + +Every device probe acquired the atomic `/tmp/frame-test.lock` and released only +its matching owner. Read-only probes verified the actual RunningApps and +MainRunningApp getter implementations, the lifetime API's object with an +`unregister()` method, and a public `https://shared.steamstatic.com` capsule URL. + +A private removable user service ran the published Decky 3.3.0 ARM64 executable +and the exact unmodified Discord Status 1.5.0 store archive. Production +`framey_panel.call_method` returned false from `is_connected`. Production +`poll_running` verified two empty running-list reads, an actual lifetime +subscription and explicit close. The device had no running apps: **nonempty +reads and launch/exit callbacks were not observed on hardware**. Decky startup +reinjected its frontend/restarted Steam CEF. No plugin game, power, audio or process-control +action was invoked, and no Discord connection/activity mutation was allowed. + +After close, CEF reported zero sessions and a null timer. The test service, +unit and private base were removed. A fresh independently locked audit read +`LoadState=not-found`, `ActiveState=inactive`, `MainPID=0`, absent paths and zero +CEF sessions/timers. Battery stayed **99 → 99**; normal Decky stayed failed and +the normal panel service stayed inactive. No headset wipe or system service +installation was used. + +## Local verification and limits + +- Full current official store fetch: 116 IDs/versions/digests unchanged at + 2026-10-26 05:18:22 UTC. +- Fake Frame: 116 transport cases, 60 install/remove cycles and 56 expected + blockers; private Compose project and volumes removed. Plugin execution was + stubbed. +- Full local Chromium sweep: 103 of 116 initializer-ready with explicitly + synthetic library/running data. No backend/network request was allowed. + The focused Discord Status observation lasted eight seconds and constructed + `Test Running Game` activity; the visible UI correctly remained disconnected. +- Node contract tests cover actual-event queue projection, retry/deduplication, + bounds, expiry, unregister, reconnect, update-before-callback ordering, + invalid data, public-artwork filtering, stale sessions, overlapping reads, + failure clearing stale state and late replies after close. Nonempty app rows + and launch/exit notifications in these tests are explicit synthetic fixtures. + +The queue retains at most 64 real notifications per session; overflow can lose +old callbacks. Polling runs about every two seconds with no overlap. At most four +CEF sessions survive; unreachable cleanup expires after 15 seconds, checked +every five seconds. The bridge does not implement private MobX internals, +suspend/input events, game actions or closed-panel automation. + +Discord shortcut detection, real IPC connection/activity, local custom artwork, +actual running-game transitions, worn VR and physical controller/keyboard use +remain unverified. None of the new fixture checks promotes a plugin to works. + +After #301 merged, running polls and both close paths adopted its pinned SHA-256 +receipt guard. Local Python/Node tests verify the parent carries that receipt, +missing/stale receipts are rejected before CEF after plugin replacement, and a +reopened panel can poll and close with the new receipt. Rejected stale closes +retain the tested finite-lease cleanup. This authorization-only follow-up did +not repeat the device checks above; their recorded hardware scope is unchanged. diff --git a/docs/frame-plugin-author.md b/docs/frame-plugin-author.md index 65f0c1c..ab65086 100644 --- a/docs/frame-plugin-author.md +++ b/docs/frame-plugin-author.md @@ -64,7 +64,9 @@ none of these frontend controls has passed a worn-headset check yet. | `PanelSection`, rows, buttons, toggles, dropdowns | Local touch-sized controls; disabled controls stay inert during a backend call | Local browser and host unit test | | `TextField`, `SliderField`, grouped `Dropdown` options | Native text, range and select controls in the panel; disabled state, numeric slider callback and basic input types | Host unit test; worn VR use unverified | | `Tabs`, `SidebarNavigation`, spinners, dialog/menu wrappers, progress bars | Local tab navigation and ordinary HTML controls; no Steam navigation or controller focus tree | Host tests and catalog frontend smoke checks in local Chromium | -| `SteamClient` subscriptions and `DFL.Router.MainRunningApp` | Explicit inert registration methods return disposable handles; no events or attached running game. Mutating Steam/power methods are unavailable. | Host contract tests; these are safe fallbacks, not live Steam functionality | +| `SteamUIStore` / `DFL.Router.RunningApps`, `MainRunningApp` | Bounded detached Steam CEF reads while the panel is open; refresh about every two seconds; no MobX observation. Failed reads clear stale context. | Locked real Frame empty-list reads; nonempty local Chromium fixtures. Real running-game selection unverified. | +| `GameSessions.RegisterForAppLifetimeNotifications` | Actual Steam callbacks, bounded queue and disposable `.unregister()` handle; no events inferred from snapshot changes; lease cleanup after lost panels | Real Frame registration/poll/close; launch/exit, retry, expiry and duplicate tests use explicit fixtures. Real game transitions unverified. | +| Other `SteamClient` subscriptions | Explicit inert registration methods return disposable handles; no fabricated power/input/game-action events. Mutating Steam/power methods are unavailable. | Host contract tests; safe fallbacks only | | `DialogCheckbox`, `DialogButtonPrimary` | Native checkbox and button controls in the panel | Host unit test; Storage Cleaner empty-data browser check | | Optional `settings`, `frameyQuickActions` | Separate settings tab when content also exists; settings-only plugins have no empty Panel tab; up to eight actions with result text | Host unit test; these fields are Framey additions | | `serverAPI.call` / `callable` | Calls only that plugin's Decky Python backend via the headset service | Fake Frame e2e; real ARM64 Notebook save/reopen across backend restart and Simple Timer settings/recents persistence via local Chromium. No worn-VR claim. | diff --git a/docs/framey-compatibility.md b/docs/framey-compatibility.md index 0b90498..28f0290 100644 --- a/docs/framey-compatibility.md +++ b/docs/framey-compatibility.md @@ -4,7 +4,7 @@ Snapshot: 2026-10-25T23:19:48.854504+00:00; 116 current visible official plugins This table and both store views use [`ui/framey-compatibility.json`](../ui/framey-compatibility.json). Results apply only to the exact store ID, version and SHA-256. A changed digest/version is **unverified**. Regenerate this document with `python3 scripts/framey-compatibility-doc.py`; use `--check` in review. -**Works: 3 · Partial: 48 · Broken: 54 · N/A: 11.** +**Works: 3 · Partial: 49 · Broken: 53 · N/A: 11.** - **Works** requires verified useful plugin behavior with its real backend. Read the reason for the verified scope and remaining limits; it does not imply worn-VR verification. - **Partial** means only a subset or a local fixture scope was verified, often just frontend/settings initialization. The remaining backend/device functionality is unverified; read the reason for the exact scope. @@ -27,7 +27,7 @@ Open the browser audit URL in local Chromium, run `runAudit()` and inspect/downl The current published digests are pinned in the JSON; if the store changed, retain/download those exact archives for reproduction. Audit downloads permit larger ZIPs for inspection; production installer limits remain 50 MiB ZIP / 150 MiB unpacked / 30 MiB per member. -After the VR job released the shared lock, this audit acquired it and used a private temporary Decky 3.3.0 ARM64 user service. Read-only ProtonDB `get_setting` and Steam Status `get_settings` calls succeeded through the live Steam CEF websocket. The service and private base were removed and the lock released; normal managed services stayed inactive, battery was 100 → 99, and no power setting was changed. [Redacted results](evidence/framey-official-backend-2026-10-25.json) record exactly what ran. A [2026-10-26 follow-up](evidence/framey-events-backend-2026-10-26.json) verified default Notebook drawing/save/reopen across a real backend restart and Simple Timer start/cancel, countdown/completion events, a visible toast and persisted recents/subtle mode. Only private test settings were written. Simple Timer remains partial because its own expired-timer startup raises a missing `timer_task` error; sound/suspend are unsupported. A [local audio follow-up](evidence/framey-audio-backends-2026-10-26.md) exercised Volume Mixer, Volume Boost and Mixer through real Decky 3.3.0 amd64 backends on private silent virtual audio targets. Sliders, numeric volume entry, independent server readbacks and Mixer filter persistence across a runtime restart passed. An [ARM64 audio follow-up](evidence/framey-audio-arm64-2026-10-26.md) verified the unmodified official backends in actual Decky 3.3.0 on the Frame user audio session. Volume Mixer and Mixer now qualify as works for per-app volume: Chromium controls changed only a named silent stream, with independent Pulse readbacks. Volume Boost stays partial: default-sink reads matched, but real sink writes were denied. Audible output, Bluetooth playback and worn VR remain unverified. A [library context follow-up](evidence/framey-library-context-2026-10-26.md) read 1,106 app overviews, 895 game IDs and the current public Steam ID from real Frame CEF under the shared lock. Local Chromium replayed this detached snapshot to render Deck Settings game selection, Steamback's empty save panel and PlayTime statistics/settings. Steamback and PlayTime used actual Decky 3.3.0 amd64 backends in an isolated container; their ARM64 backends and automatic game hooks remain unverified. Shotty's frontend now starts, but its published backend fails on missing `click`; it stays broken. A [chunked frontend follow-up](evidence/framey-deck-shelves-browser-2026-10-26.md) loaded Deck Shelves 2.0.0 through a managed JavaScript module route and rendered its settings in an opaque local Chromium panel. Its backend was denied; Steam Home shelves and worn VR remain unverified. A [local module lookup follow-up](evidence/framey-module-lookup-2026-10-26.md) supplies a finite registry of Framey-local controls and CSS. TabMaster QAM/docs now render; Steam library-tab editing remains unavailable. Junk-Store loading/error views render, but its real backend cannot execute the extracted startup script, so it stays broken. SteamGridDB still requires Steam context-menu internals and DeckSP still fails its published MobX fallback. TabMaster/Junk-Store ran in actual isolated amd64 Decky; no ARM64 or worn-VR result is claimed. Beyond the documented checks, official backends remain unexecuted. The separate VR job proves Frame Control/sample compositor rendering, not any official plugin. No worn-VR official-plugin result is claimed. A [local UI follow-up](evidence/framey-ui-fallbacks-2026-10-26.json) rendered Pause Games and Tailscale Control settings with all backend/network actions denied; it does not verify process pausing or Tailscale changes. A [read-only Steam bridge follow-up](evidence/framey-steam-reads-2026-10-26.json) verified actual Frame country, install folders and system information, plus IsThereAnyDeal's country dropdown in local Chromium. The installed-plugin status was fixture-shaped in that relay; plugin backends stayed denied and the deployed headset HTTP endpoint remains unverified. Earlier focused checks cover [ProtonDB](evidence/framey-browser-2026-10-25.md), [Steam Status/cache](evidence/framey-cache-browser-2026-10-25.md), [Storage Cleaner](evidence/framey-api-v1-browser-2026-10-25.md), and [legacy MusicControl](evidence/framey-legacy-2026-10-25.md). +After the VR job released the shared lock, this audit acquired it and used a private temporary Decky 3.3.0 ARM64 user service. Read-only ProtonDB `get_setting` and Steam Status `get_settings` calls succeeded through the live Steam CEF websocket. The service and private base were removed and the lock released; normal managed services stayed inactive, battery was 100 → 99, and no power setting was changed. [Redacted results](evidence/framey-official-backend-2026-10-25.json) record exactly what ran. A [2026-10-26 follow-up](evidence/framey-events-backend-2026-10-26.json) verified default Notebook drawing/save/reopen across a real backend restart and Simple Timer start/cancel, countdown/completion events, a visible toast and persisted recents/subtle mode. Only private test settings were written. Simple Timer remains partial because its own expired-timer startup raises a missing `timer_task` error; sound/suspend are unsupported. A [local audio follow-up](evidence/framey-audio-backends-2026-10-26.md) exercised Volume Mixer, Volume Boost and Mixer through real Decky 3.3.0 amd64 backends on private silent virtual audio targets. Sliders, numeric volume entry, independent server readbacks and Mixer filter persistence across a runtime restart passed. An [ARM64 audio follow-up](evidence/framey-audio-arm64-2026-10-26.md) verified the unmodified official backends in actual Decky 3.3.0 on the Frame user audio session. Volume Mixer and Mixer now qualify as works for per-app volume: Chromium controls changed only a named silent stream, with independent Pulse readbacks. Volume Boost stays partial: default-sink reads matched, but real sink writes were denied. Audible output, Bluetooth playback and worn VR remain unverified. A [running-context follow-up](evidence/framey-running-context-2026-10-26.md) supplies detached running-app/main-app reads and relays actual Steam lifetime callbacks while a panel is open. Real Frame checks verified an empty list, registration/cleanup and the exact Discord Status ARM64 backend reporting no IPC connection. Nonempty games and transitions were synthetic fixtures; real game events, Discord activity and worn VR remain unverified. Discord Status moves to partial; no new works claim is made. A [library context follow-up](evidence/framey-library-context-2026-10-26.md) read 1,106 app overviews, 895 game IDs and the current public Steam ID from real Frame CEF under the shared lock. Local Chromium replayed this detached snapshot to render Deck Settings game selection, Steamback's empty save panel and PlayTime statistics/settings. Steamback and PlayTime used actual Decky 3.3.0 amd64 backends in an isolated container; their ARM64 backends and automatic game hooks remain unverified. Shotty's frontend now starts, but its published backend fails on missing `click`; it stays broken. A [chunked frontend follow-up](evidence/framey-deck-shelves-browser-2026-10-26.md) loaded Deck Shelves 2.0.0 through a managed JavaScript module route and rendered its settings in an opaque local Chromium panel. Its backend was denied; Steam Home shelves and worn VR remain unverified. A [local module lookup follow-up](evidence/framey-module-lookup-2026-10-26.md) supplies a finite registry of Framey-local controls and CSS. TabMaster QAM/docs now render; Steam library-tab editing remains unavailable. Junk-Store loading/error views render, but its real backend cannot execute the extracted startup script, so it stays broken. SteamGridDB still requires Steam context-menu internals and DeckSP still fails its published MobX fallback. TabMaster/Junk-Store ran in actual isolated amd64 Decky; no ARM64 or worn-VR result is claimed. Beyond the documented checks, official backends remain unexecuted. The separate VR job proves Frame Control/sample compositor rendering, not any official plugin. No worn-VR official-plugin result is claimed. A [local UI follow-up](evidence/framey-ui-fallbacks-2026-10-26.json) rendered Pause Games and Tailscale Control settings with all backend/network actions denied; it does not verify process pausing or Tailscale changes. A [read-only Steam bridge follow-up](evidence/framey-steam-reads-2026-10-26.json) verified actual Frame country, install folders and system information, plus IsThereAnyDeal's country dropdown in local Chromium. The installed-plugin status was fixture-shaped in that relay; plugin backends stayed denied and the deployed headset HTTP endpoint remains unverified. Earlier focused checks cover [ProtonDB](evidence/framey-browser-2026-10-25.md), [Steam Status/cache](evidence/framey-cache-browser-2026-10-25.md), [Storage Cleaner](evidence/framey-api-v1-browser-2026-10-25.md), and [legacy MusicControl](evidence/framey-legacy-2026-10-25.md). ## Every current plugin @@ -40,11 +40,11 @@ The API column shows manifest / actual bundled frontend API. Many manifests say | 10: vibrantDeck 2.0.1 | legacy / legacy | N/A | Not supported on Frame: Changes X11 gamescope color properties, not the Frame SteamVR compositor. | static archive, local browser, fake-Frame | | 11: Fantastic 0.5.1 | legacy / legacy | N/A | Not supported on Frame: Targets Steam Deck fan hardware; no Frame fan-control mapping is provided. | static archive, local browser, fake-Frame | | 12: MusicControl 1.1.6 | legacy / legacy | partial | Legacy media controls initialize; player discovery and playback are unverified. | static archive, local browser, fake-Frame | -| 13: Pause Games 1.0.3 | 1 / 2 | partial | Settings render locally with inert system-key subscriptions and empty detached Steam context. Live-game discovery, process pause/resume and suspend integration are unsupported/unverified; no backend actions ran. | static archive, local browser, fake-Frame | +| 13: Pause Games 1.0.3 | 1 / 2 | partial | Settings and running-game list initialize in local Chromium with an explicit synthetic game; live Frame empty-list reads and lifetime registration/cleanup passed. Process pause/resume, automatic pausing and suspend integration remain unverified/unsupported; backend writes were denied. | static archive, local browser, fake-Frame | | 14: ProtonDB Badges 1.3.4 | 2 / 2 | partial | Settings render locally and read-only get_setting RPC returned the default through real Decky 3.3.0 on ARM64 Frame. Steam game-page badges have no patch target; live writes and VR controls unverified. | static archive, local browser, fake-Frame, real Frame SSH | | 16: Audio Loader 1.6.1 | legacy / legacy | broken | This plugin needs root and is not supported by the Frame user service. Steam UI sound lookup is present as explicitly unsupported; the frontend still requires Steam m_GamepadUIAudioStore.m_AudioPlaybackManager, which is unavailable in the isolated panel. | static archive, local browser, fake-Frame | | 18: Bluetooth 3.1.1 | 1 / 2 | partial | Controls render with fixture replies; actual Bluetooth discovery, labels and connections remain unverified. | static archive, local browser, fake-Frame | -| 19: Notebook 0.1.5 | legacy / legacy | works | Default notebook drawing, save and reopen verified in Chromium with real Decky 3.3.0 ARM64, including backend restart. Per-game auto-selection and background artwork unavailable; worn-VR input unverified. | static archive, local browser, fake-Frame, real Frame SSH | +| 19: Notebook 0.1.5 | legacy / legacy | works | Default notebook drawing, save and reopen verified in Chromium with real Decky 3.3.0 ARM64, including backend restart. Running-game context is now supplied; per-game selection was attempted with a synthetic game and backend calls denied. Real per-game selection, background artwork and worn-VR input remain unverified. | static archive, local browser, fake-Frame, real Frame SSH | | 21: PowerTools 2.0.3 | legacy / legacy | N/A | Not supported on Frame: Targets AMD Ryzen power controls; Frame uses an ARM64 SoC. | static archive, local browser, fake-Frame | | 22: Memory Deck 0.1.8 | legacy / legacy | broken | Plugin contains a non-ARM64 Linux binary: memory-deck/bin/libscanmem.so.1.0.0. | static archive, local browser, fake-Frame | | 23: Animation Changer 1.3.2 | legacy / legacy | partial | Initializer succeeds; forced backend failure prevents loading animations. Boot-video changes untested. | static archive, local browser, fake-Frame | @@ -56,7 +56,7 @@ The API column shows manifest / actual bundled frontend API. Many manifests say | 32: AutoFlatpaks 1.6.8 | legacy / legacy | broken | This plugin needs root and is not supported by the Frame user service. | static archive, local browser, fake-Frame | | 35: MoonDeck 1.13.0 | 1 / 2 | broken | Plugin contains a non-ARM64 Linux binary: moondeck/python/externals/yarl/_quoting_c.cpython-313-x86_64-linux-gnu.so. Frontend initializes; native CPython wheels and executables in the published archive are x86_64. | static archive, local browser, fake-Frame | | 36: SteamGridDB 1.8.1 | 1 / 2 | broken | Local module mapping is available; frontend still requires the Steam LibraryContextMenu implementation, which has no target in the isolated Framey panel. | static archive, local browser, fake-Frame | -| 37: Discord Status 1.5.0 | 1 / 2 | broken | Detached app overviews are now available, but RunningApps/lifetime observations and Steam artwork helpers still lack a live mapping. Discord activity integration remains unavailable/unverified. | static archive, local browser, fake-Frame, real Frame SSH | +| 37: Discord Status 1.5.0 | 1 / 2 | partial | Disconnected panel renders; running-activity construction accepts a synthetic game in local Chromium. Exact official is_connected returned false in real Decky 3.3.0 ARM64. Empty live running-list reads and lifetime registration/cleanup passed. Real game transitions, Discord shortcut detection/connection/activity, local custom artwork and worn VR remain unverified/unsupported. | static archive, local browser, fake-Frame, real Frame SSH | | 38: Volume Mixer 1.2.1-1 | legacy / legacy | works | Per-app stream discovery and slider/keyboard volume changes pass in local Chromium through real Decky 3.3.0 ARM64 on the Frame audio session, with independent Pulse readback of a silent test stream. Bluetooth playback, audible output and worn-VR controls unverified. | static archive, local browser, fake-Frame, isolated Linux backend, real Frame SSH | | 40: Controller Tools 2.0.2 | 1 / 2 | broken | Plugin contains a non-ARM64 Linux binary: ControllerTools/bin/backend. Frontend audit failed: Audit blocks WebSocket. | static archive, local browser, fake-Frame | | 43: Tailscale Control 0.1.3 | legacy / legacy | partial | Settings render locally after the SuspensefulImage fallback. Tailscale daemon/state, connection and exit-node changes unverified; bundled localhost QR asset remains unavailable. No network settings were changed. | static archive, local browser, fake-Frame | @@ -76,7 +76,7 @@ The API column shows manifest / actual bundled frontend API. Many manifests say | 63: Free Loader 1.6.0 | 1 / 2 | broken | Unsafe plugin archive member. | static archive, local browser, fake-Frame | | 64: Syncthing 0.2.7 | legacy / legacy | broken | Plugin contains a non-ARM64 Linux binary: decky-syncthing/bin/decky-syncthing-watchdog. | static archive, local browser, fake-Frame | | 65: Decky Terminal 0.5.3 | 1 / 2 | partial | Local routes initialize after parameter-route support; no shell commands were run. | static archive, local browser, fake-Frame | -| 66: PlayTime 3.2.5 | 1 / 2 | partial | Statistics and routed settings render with a detached real Frame library/user snapshot and actual Decky 3.3.0 amd64 backend in isolation. User selection and empty statistics reads pass. ARM64 backend, live MobX/running-game observations and automatic recording remain unverified/unsupported. | static archive, local browser, fake-Frame, real Frame SSH | +| 66: PlayTime 3.2.5 | 1 / 2 | partial | Statistics and routed settings render with a detached real Frame library/user snapshot and actual Decky 3.3.0 amd64 backend in isolation. User selection and empty statistics reads pass. Running snapshots are now exposed, but its private MobX observation is unsupported; automatic recording and ARM64 backend remain unverified. | static archive, local browser, fake-Frame, real Frame SSH | | 67: Battery Tracker 0.2.0 | legacy / legacy | broken | This plugin needs root and is not supported by the Frame user service. | static archive, local browser, fake-Frame | | 68: Wine Cellar 0.2.1 | 1 / 2 | broken | Plugin contains a non-ARM64 Linux binary: decky-wine-cellar/bin/backend. Frontend audit failed: Audit blocks WebSocket. | static archive, local browser, fake-Frame | | 70: MicroSDeck 0.11.2 | legacy / 2 | broken | Plugin contains a non-ARM64 Linux binary: MicroSDeck/bin/backend. | static archive, local browser, fake-Frame | diff --git a/docs/framey-loader.md b/docs/framey-loader.md index 7331204..e98344b 100644 --- a/docs/framey-loader.md +++ b/docs/framey-loader.md @@ -115,9 +115,9 @@ Its cleanup actions were not tested; they may remove local game saves. Framey also supplies local tabs/sidebar pages, spinners, dialog/menu wrappers and progress bars. Its explicit SteamClient subscription fallbacks return -disposable handles without emitting fabricated events. There is no attached -running game in `DFL.Router`, and power, app launch and hardware mutation methods -are not supplied. Plugins that need live Steam stores still require integration +disposable handles without emitting fabricated events. Running-game reads and +lifetime notifications use the scoped bridge described below; power, app launch +and hardware mutation methods are not supplied. Other live Steam stores require integration work. IndexedDB is hidden because the browser exposes it but denies access in an opaque iframe; localForage can then select Framey's bounded localStorage. Direct IndexedDB users remain unsupported. @@ -125,13 +125,40 @@ Direct IndexedDB users remain unsupported. `SuspensefulImage` renders a native image. SteamClient `Storage.GetJSON` and `SetObject` use the same bounded per-plugin cache, including panel reopen persistence; they do not read Steam's account/global JSON store. Missing keys -reject with `Not found`. Detached `SteamUIStore.RunningApps` is a frozen empty -list, and the suspend store has no methods. Optional Steam app/account globals -are undefined. These fallbacks let settings render without inventing live +reject with `Not found`. The suspend store has no methods. Optional Steam app/account globals +are undefined until a successful library read. These fallbacks let settings render without inventing live games or account identity. [The exact-bundle follow-up](evidence/framey-ui-fallbacks-2026-10-26.json) verifies Pause Games and Tailscale Control settings in local Chromium; their primary backend actions remain unverified. PlayTime still requires Steam's -real app store and game observers. +MobX game observers for automatic tracking. + +Panels referencing running-game APIs now receive a detached, read-only +`SteamUIStore.RunningApps` / `MainRunningApp` snapshot, also exposed through +`DFL.Router`. The authenticated headset-only `/api/framey/running` endpoint +checks installed store ownership; the parent checks the active panel session. +Poll and close requests also carry the panel's pinned SHA-256 receipt. A missing +or changed installed receipt is rejected before any Steam CEF request; a rejected +stale close relies on the existing finite subscription lease for cleanup. +Fixed bundled code runs in Steam CEF. It copies at most 64 running app overviews, a main app and +public Steam CDN capsule URLs; it never copies local artwork paths, launch +commands or Steam objects. The host refreshes about every two seconds without +overlapping requests. Failure clears stale context and sets +`SteamUIStore.FrameyRunningAvailable` to false. + +`GameSessions.RegisterForAppLifetimeNotifications` relays actual Steam +`{unAppID, bRunning}` callbacks through a bounded 64-event queue. Snapshot +changes never fabricate launch/exit callbacks. Handles support `.unregister()`; +panel close/replacement removes the CEF subscription, with a 15-second lease +(checked every five seconds) if cleanup cannot reach Steam. At most four panel +sessions are retained. These are open-panel observations, not closed-panel +automation or a MobX implementation. Queue overflow can lose old callbacks. +`appStore` capsule helpers expose only projected public URLs for running apps; +unavailable or local custom artwork returns an empty value. + +[Running-context evidence](evidence/framey-running-context-2026-10-26.md) separates +real Frame empty-list/subscription/cleanup reads, the exact Discord Status +ARM64 backend connection check, and synthetic nonempty/transition fixtures. +Real game transitions, Discord activity and worn-VR operation remain unverified. Three parameterless SteamClient reads use Steam's actual CEF context: `User.GetIPCountry`, `InstallFolder.GetInstallFolders` and `System.GetSystemInfo`. diff --git a/scripts/framey-audit-browser.py b/scripts/framey-audit-browser.py index cd9d667..c7ce5de 100644 --- a/scripts/framey-audit-browser.py +++ b/scripts/framey-audit-browser.py @@ -36,7 +36,7 @@ Ready means initializer completion, not useful plugin behavior. No plugin backen