Recovered all beszel integration files from the local worktree
at /Users/ajnart/.cursor/worktrees/homarr/pwxp that were built
and tested with the homarr:beszel docker image.
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.
When Docker API returns `null` for container ports (instead of `[]`),
the Docker management page crashes. Added optional chaining on
`ports?.length` to handle this case.
Fixes#5311
Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
* feat(analytics): consolidate server analytics into single Umami event
- Replace multiple separate events with single 'server-analytics' event
- Add comprehensive metrics: Homarr version, database type, Docker/K8s status
- Add auth providers status (credentials, OIDC, LDAP)
- Add counts for users, boards, groups, apps, widgets, sections, integrations
- Add counts for search engines, icon repos, icons, API keys, invites, media
- Add counts for layouts, item layouts, section layouts, cron job configs
- Include per-integration-kind breakdown (integration_sonarr, etc.)
- Add required dependencies: @homarr/auth, @homarr/common, @homarr/docker
* refactor(ui): simplify analytics settings to single toggle
- Remove individual toggles for widget/integration/user data
- Keep only the main 'Enable analytics' toggle
- All data is now collected when analytics are enabled
- Update both init settings and manage settings pages
* docs(i18n): update analytics description with collected data details
- Explain all data points collected when analytics are enabled
- List: version, DB type, Docker/K8s, auth methods, counts
- Clarify that no personal info, URLs, or names are collected
* chore(deps): update pnpm-lock.yaml for analytics package dependencies
- Add 'orphaned' container state to handle containers with null/undefined cpu_stats.online_cpus
- Display orphaned containers with gray badge in UI
- Prevent 'Cannot read properties of undefined (reading online_cpus)' error
- Add translations for 'orphaned' status in all supported languages
- Containers with invalid stats are now marked as orphaned instead of causing errors