Replace flat table with a separated Accordion that groups tools by
namespace (app, docker, integration, etc.). Each category shows a tool
count badge and expands to show tools with GET/POST type badges and
descriptions. Remove troubleshooting section and divider.
Move inline CSS template literal to a proper scalar-theme.css file
imported as a side-effect stylesheet. The overrides target Scalar's
.light-mode/.dark-mode selectors so they work as global CSS, removing
the need for the customCss string prop.
Replace deep relative package.json import with existing
getPackageVersion() helper. Extract extractToolsFromProcedures into
a shared _extract-tools.ts that silences expected trpc-to-mcp warnings
for z.void() procedures. Remove dead eslint-disable comments.
Use proper TypeScript `declare global` + `??` assignment pattern to
initialize HMR-safe singletons without double casts or non-null
assertions. Also removes dead eslint-disable comments (oxlint is used).
- Sanitize error messages to prevent leaking internal details
- Add isError flag to tool-not-found and no-caller responses
- Guard against undefined procedure before invocation
- Clear auth rate limit on successful authentication
- Move setInterval timers to globalThis to prevent dev hot-reload leaks
- Add try/catch + logging to OAuth token exchange
- Deduplicate auth error responses with helper function
- Replace ternary operators with lookup tables in UI
- Remove console.error monkey-patch for trpc-to-mcp warnings
- Use lookup table for media request answer actions
createTheme was called without being imported, causing a runtime
ReferenceError on every page load. Use the already-imported theme
object from @homarr/ui which contains the full Mantine configuration.
* feat(board): persist category collapse state in localStorage for guests
Authenticated users already had their collapse state saved server-side.
This extends the same behaviour to unauthenticated (guest) users by
reading/writing localStorage keyed by section ID.
On mount, if the user is a guest, the stored value is applied to the
disclosure. On toggle, guests write to localStorage instead of calling
the protected API mutation.
Closes#3355
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: set localStorage value as useDisclosure default instead of useEffect
Replaces the useEffect that read localStorage after mount with a direct
initial value computation passed to useDisclosure. Removes the effect,
the open/close destructuring, and the useEffect import.
Note: initialCollapsed is computed during render rather than post-mount,
which may cause a hydration mismatch on SSR if localStorage differs from
the server-provided section.collapsed. The typeof window guard handles
the SSR case.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
When adding a widget from the "Choose item to add" modal, the widget
edit modal now opens immediately after placement, allowing the user to
configure options and integrations before the widget renders.
All available integrations for the widget are selected by default.