From cdcdda75df1d64b62b38b81b7d499cdea0d5435f Mon Sep 17 00:00:00 2001 From: Jesse Bofill Date: Sun, 12 Oct 2025 13:14:55 -0600 Subject: [PATCH 1/8] improve the error screen visuals --- .../src/components/DeckyErrorBoundary.tsx | 453 +++++++++++------- 1 file changed, 285 insertions(+), 168 deletions(-) diff --git a/frontend/src/components/DeckyErrorBoundary.tsx b/frontend/src/components/DeckyErrorBoundary.tsx index 7a8d2b31b..2a69be71e 100644 --- a/frontend/src/components/DeckyErrorBoundary.tsx +++ b/frontend/src/components/DeckyErrorBoundary.tsx @@ -1,4 +1,4 @@ -import { sleep } from '@decky/ui'; +import { joinClassNames, sleep } from '@decky/ui'; import { FunctionComponent, useEffect, useReducer, useState } from 'react'; import { uninstallPlugin } from '../plugin'; @@ -20,6 +20,26 @@ declare global { } } +const classes = { + root: 'deckyErrorBoundary', + likelyOccurred: 'likely-occured-msg', + panel: 'panel-section', + panelHeader: 'panel-header', + trace: 'trace', + rowList: 'row-list', + rowItem: 'row-item', + buttonDescRow: 'button-description-row', + grayText: 'gray-text', + flexRowWGap: 'flex-row', + marginBottom: 'margin-bottom', +} + +const vars = { + scrollBarwidth: '18px', + rootMarginLeft: '15px', + panelXPadding: '20px' +} + export const startSSH = DeckyBackend.callable('utilities/start_ssh'); export const starrCEFForwarding = DeckyBackend.callable('utilities/allow_remote_debugging'); @@ -64,41 +84,108 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, <> -
-

- ⚠️ An error occured while rendering this content. -

-
+      
+
+ ⚠️ Decky encountered an error while rendering this content. +
+
           
             {identifier && `Error Reference: ${identifier}`}
             {versionInfo?.current && `\nDecky Version: ${versionInfo.current}`}
           
         
-

This error likely occured in {errorSource}.

+
+ This error likely occured in {errorSource}. +
{actionLog?.length > 0 && ( -
+          
             
               Running actions...
               {actionLog}
@@ -106,172 +193,202 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
           
)} {actionsEnabled && ( - <> -

Actions:

-

Use the touch screen.

-
- - +
+
+
Actions
+
Use the touch screen.
-
- - -
- {debugAllowed && ( -
+
+
+ +
- )} - { -
- {updateProgress > -1 - ? 'Update in progress... ' + updateProgress + '%' - : updateProgress == -2 - ? 'Update complete. Restarting...' - : 'Changing your Decky Loader branch and/or \n checking for updates might help!\n'} - {updateProgress == -1 && ( -
- + {wasCausedByPlugin && ( +
+ Disable/ uninstall suspected plugin and restart Decky +
+
- )} +
+ )} +
+ Disable all plugins and restart Decky +
- } - {wasCausedByPlugin && ( -
- {'\n'} +
+ Disable Decky until next boot
- )} - + { +
+ {updateProgress > -1 + ? 'Update in progress... ' + updateProgress + '%' + : updateProgress == -2 + ? 'Update complete. Restarting...' + : 'Check for Decky updates'} + { +
+ {updateProgress == -1 && ( + <> + + + + )} +
+ } +
+ } + {debugAllowed && ( +
+ Enable remote debugging and SSH until next boot + +
+ )} +
+
)} - -
-          
-            {error.error.stack}
-            {'\n\n'}
-            Component Stack:
-            {error.info.componentStack}
-          
-        
+ {actionsEnabled && ( +
+ Swipe to scroll +
+ )} +
+
Trace
+
+            
+              {error.error.stack}
+              {'\n\n'}
+              Component Stack:
+              {error.info.componentStack}
+            
+          
+
); From 5b46a114a8ce09f667a0d7430c3281789d065820 Mon Sep 17 00:00:00 2001 From: Jesse Bofill Date: Tue, 18 Nov 2025 10:37:55 -0700 Subject: [PATCH 2/8] comment out placeholder buttons --- frontend/src/components/DeckyErrorBoundary.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/DeckyErrorBoundary.tsx b/frontend/src/components/DeckyErrorBoundary.tsx index 2a69be71e..ba9f93e84 100644 --- a/frontend/src/components/DeckyErrorBoundary.tsx +++ b/frontend/src/components/DeckyErrorBoundary.tsx @@ -173,7 +173,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
- ⚠️ Decky encountered an error while rendering this content. + ⚠️ An error occured while rendering this content.
           
@@ -227,9 +227,10 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
                 
Disable/ uninstall suspected plugin and restart Decky
- + */}
)} -
+ {/**temp placeholder for plugin disable functionality*/} + {/*
Disable all plugins and restart Decky -
+
*/}
Disable Decky until next boot +
)} @@ -380,7 +381,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, userSelect: 'auto', overflowX: 'scroll', padding: `0px ${vars.panelXPadding}`, - maskImage: `linear-gradient(to right, transparent, black ${vars.panelXPadding}, black calc(100% - ${vars.panelXPadding}), transparent)` + maskImage: `linear-gradient(to right, transparent, black ${vars.panelXPadding}, black calc(100% - ${vars.panelXPadding}), transparent)`, }} > From 817711fd14183f58d7c59fe90b6debf312b690c9 Mon Sep 17 00:00:00 2001 From: EMERALD Date: Sun, 30 Nov 2025 15:11:03 -0600 Subject: [PATCH 4/8] Refactor DeckyErrorBoundary styles and text - Removed gray text class usage - Removed styles reminiscent of Steam BPM - Fixed typos --- .../src/components/DeckyErrorBoundary.tsx | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/frontend/src/components/DeckyErrorBoundary.tsx b/frontend/src/components/DeckyErrorBoundary.tsx index 9a116b87a..7f6d0e31c 100644 --- a/frontend/src/components/DeckyErrorBoundary.tsx +++ b/frontend/src/components/DeckyErrorBoundary.tsx @@ -29,7 +29,6 @@ const classes = { rowList: 'row-list', rowItem: 'row-item', buttonDescRow: 'button-description-row', - grayText: 'gray-text', flexRowWGap: 'flex-row', marginBottom: 'margin-bottom', }; @@ -87,7 +86,6 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, *:has(> .${classes.root}) { margin-top: var(--basicui-header-height); overflow: scroll !important; - background: radial-gradient(circle at 79% 96%, rgba(92, 21, 157, 0.23), rgba(92, 21, 157, 0) 69%), radial-gradient(circle at 14% 90%, rgba(0, 146, 219, 0.17), rgba(0, 146, 219, 0) 51%), radial-gradient(circle at 93% 11%, rgb(138 0 62 / 9%), rgba(204, 0, 92, 0) 50%), linear-gradient(to bottom right, rgba(5, 15, 31, 1), rgba(5, 15, 31, 1)); } *:has(> .${classes.root})::-webkit-scrollbar { display: initial !important; @@ -108,11 +106,10 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, .${classes.root} select { border: none; padding: 4px 16px !important; - background: #0d263f; - color: #2294f4; + background: #fff; + color: #000; font-size: 12px; border-radius: 3px; - box-shadow: 8px 9px 8px -5px rgb(4 7 31), inset 0px 14px 11px -10px rgb(38 56 74); outline: none; height: 28px; } @@ -159,9 +156,6 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, .${classes.rowList} { gap: 8px; } - .${classes.grayText} { - color: #74778096; - } .${classes.marginBottom} { margin-bottom: 10px; } @@ -173,19 +167,19 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
- ⚠️ An error occured while rendering this content. + ⚠️ An error occurred while rendering this content.
-
+        
           
             {identifier && `Error Reference: ${identifier}`}
             {versionInfo?.current && `\nDecky Version: ${versionInfo.current}`}
           
         
- This error likely occured in {errorSource}. + This error likely occurred in {errorSource}.
{actionLog?.length > 0 && ( -
+          
             
               Running actions...
               {actionLog}
@@ -196,7 +190,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
           
Actions
-
+
Use the touch screen.
@@ -225,7 +219,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
{wasCausedByPlugin && (
- Disable/ uninstall suspected plugin and restart Decky + Disable or uninstall the suspected plugin
{/**temp placeholder for plugin disable functionality*/} {/* - - +
+ Retry the action or restart +
+ + + +
{wasCausedByPlugin && (
@@ -253,21 +288,6 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, Disable All Plugins
*/} -
- Disable Decky until next boot - -
{
{updateProgress > -1 @@ -329,9 +349,24 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, }
} +
+ Disable Decky until next boot + +
{debugAllowed && (
- Enable remote debugging and SSH until next boot + Enable remote debugging and SSH until next boot (for developers)
)} {actionsEnabled && ( -
- Swipe to scroll +
+ + Swipe to scroll +
)}
From 84bbb295d7d8fe87eca977bcf9c985546e85ff12 Mon Sep 17 00:00:00 2001 From: EMERALD Date: Sun, 30 Nov 2025 16:12:14 -0600 Subject: [PATCH 6/8] Revert header boldness change --- frontend/src/components/DeckyErrorBoundary.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/DeckyErrorBoundary.tsx b/frontend/src/components/DeckyErrorBoundary.tsx index bf0a5e460..3568de004 100644 --- a/frontend/src/components/DeckyErrorBoundary.tsx +++ b/frontend/src/components/DeckyErrorBoundary.tsx @@ -127,7 +127,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, } .${classes.likelyOccurred} { font-size: 22px; - font-weight: 900; + font-weight: bold; color: #588fb4; } .${classes.rowItem} { From 659b9f8b47aee1bdecdbf0e956900641dbe31b5e Mon Sep 17 00:00:00 2001 From: Jesse Bofill Date: Mon, 5 Jan 2026 10:40:34 -0700 Subject: [PATCH 7/8] add disable plugin buttons to error screen --- backend/decky_loader/utilities.py | 12 ++++- .../src/components/DeckyErrorBoundary.tsx | 53 +++++++++++++------ 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/backend/decky_loader/utilities.py b/backend/decky_loader/utilities.py index 75593fd57..c74ac5d14 100644 --- a/backend/decky_loader/utilities.py +++ b/backend/decky_loader/utilities.py @@ -82,6 +82,7 @@ def __init__(self, context: PluginManager) -> None: context.ws.add_route("utilities/_call_legacy_utility", self._call_legacy_utility) context.ws.add_route("utilities/enable_plugin", self.enable_plugin) context.ws.add_route("utilities/disable_plugin", self.disable_plugin) + context.ws.add_route("utilities/set_all_plugins_disabled", self.set_all_plugins_disabled) context.web_app.add_routes([ post("/methods/{method_name}", self._handle_legacy_server_method_call) @@ -503,4 +504,13 @@ async def enable_plugin(self, name: str): disabled_plugins.remove(name) await self.set_setting("disabled_plugins", disabled_plugins) - await self.context.plugin_loader.import_plugin(path.join(plugin_dir, "main.py"), plugin_folder) \ No newline at end of file + await self.context.plugin_loader.import_plugin(path.join(plugin_dir, "main.py"), plugin_folder) + + async def set_all_plugins_disabled(self): + disabled_plugins: List[str] = await self.get_setting("disabled_plugins", []) + + for name, _ in self.context.plugin_loader.plugins.items(): + if name not in disabled_plugins: + disabled_plugins.append(name) + + await self.set_setting("disabled_plugins", disabled_plugins) \ No newline at end of file diff --git a/frontend/src/components/DeckyErrorBoundary.tsx b/frontend/src/components/DeckyErrorBoundary.tsx index 3568de004..9acfc8d89 100644 --- a/frontend/src/components/DeckyErrorBoundary.tsx +++ b/frontend/src/components/DeckyErrorBoundary.tsx @@ -1,7 +1,7 @@ import { joinClassNames, sleep } from '@decky/ui'; import { FunctionComponent, useEffect, useReducer, useState } from 'react'; -import { uninstallPlugin } from '../plugin'; +import { disablePlugin, uninstallPlugin } from '../plugin'; import { VerInfo, doRestart, doShutdown } from '../updater'; import { ValveReactErrorInfo, getLikelyErrorSourceFromValveReactError } from '../utils/errors'; import { useSetting } from '../utils/hooks/useSetting'; @@ -198,9 +198,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, `}
-
- An error occurred while rendering this content. -
+
An error occurred while rendering this content.
           
             {identifier && `Error Reference: ${identifier}`}
@@ -223,7 +221,8 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
             
Actions
- Use the touch screen. Solutions are listed in the recommended order. If you are still experiencing issues, please post in the #loader-support channel at decky.xyz/discord. + Use the touch screen. Solutions are listed in the recommended order. If you are still experiencing + issues, please post in the #loader-support channel at decky.xyz/discord.
@@ -256,10 +255,22 @@ const DeckyErrorBoundary: FunctionComponent = ({ error,
Disable or uninstall the suspected plugin
- {/**temp placeholder for plugin disable functionality*/} - {/* */} +
)} - {/**temp placeholder for plugin disable functionality*/} - {/*
- Disable all plugins and restart Decky - -
*/} +
{
{updateProgress > -1 @@ -391,9 +414,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, )} {actionsEnabled && (
- - Swipe to scroll - + Swipe to scroll
)}
From f1313369c050a8ec2bc9106c51fddb2ac3b4a7c8 Mon Sep 17 00:00:00 2001 From: EMERALD Date: Tue, 6 Jan 2026 09:05:55 -0600 Subject: [PATCH 8/8] Set background to black --- frontend/src/components/DeckyErrorBoundary.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/components/DeckyErrorBoundary.tsx b/frontend/src/components/DeckyErrorBoundary.tsx index 9acfc8d89..29638521e 100644 --- a/frontend/src/components/DeckyErrorBoundary.tsx +++ b/frontend/src/components/DeckyErrorBoundary.tsx @@ -87,6 +87,7 @@ const DeckyErrorBoundary: FunctionComponent = ({ error, *:has(> .${classes.root}) { margin-top: var(--basicui-header-height); overflow: scroll !important; + background: #000; } *:has(> .${classes.root})::-webkit-scrollbar { display: initial !important;