* 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>
* fix(deps): update dependency drizzle-zod to ^0.8.2
* chore: update zod to v4 import
* fix: path is no longer available in transform context
* fix: AnyZodObject does no longer exist
* fix: auth env.ts using wrong createEnv and remove unused file env-validation.ts
* fix: required_error no longer exists on z.string
* fix: zod error map is deprecated and replaced with config
* fix: default requires callback now
* fix: migrate zod resolver for mantine
* fix: remove unused form translation file
* fix: wrong enum type
* fix: record now requires two arguments
* fix: add-confirm-password-refinement type issues
* fix: add missing first record argument for entityStateSchema
* fix: migrate superrefine to check
* fix(deps): upgrade zod-form-data to v3
* fix: migrate superRefine to check for mediaUploadSchema
* fix: authProvidersSchema default is array
* fix: use stringbool instead of custom implementation
* fix: record requires first argument
* fix: migrate superRefine to check for certificate router
* fix: confirm pasword refinement is overwriting types
* fix: email optional not working
* fix: migrate intersection to object converter
* fix: safe parse return value rename
* fix: easier access for min and max number value
* fix: migrate superRefine to check for oldmarr import file
* fix: inference of enum shape for old-import board-size wrong
* fix: errors renamed to issues
* chore: address pull request feedback
* fix: zod form requires object
* fix: inference for use-zod-form not working
* fix: remove unnecessary convertion
* fix(deps): upgrade trpc-to-openapi to v3
* fix: build error
* fix: migrate missing zod imports to v4
* fix: migrate zod records to v4
* fix: missing core package dependency in api module
* fix: unable to convert custom zod schema to openapi schema
* fix(deps): upgrade zod to v4
* chore(renovate): enable zod dependency updates
* test: add simple unit test for convertIntersectionToZodObject
---------
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
* feat: add title to dynamic section
* fix: formatting
* feat: use badge rather than text
* fix: use board radius
* fix: use shared.ts validation
---------
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
Usenet and Torrent downloads in 1 widget.
sabNZBd, NzbGet, Deluge, qBitTorrent, and transmission support.
Columns can be reordered in Edit mode.
Sorting enabled.
Time uses Dayjs with auto translation.
Can pause/resume single items, clients, or all.
Can delete items (With option to delete assossiated files).
Clients list and details.
Include all filtering and processing for ratio from oldmarr torrent widget.
Invalidation of old data (older than 30 seconds) to show an integration is not responding anymore.
Misc (So many miscs):
Fixed validation error with multiText.
Fixed translation application for multiSelect to behave the same as select.
Added background to gitignore (I needed to add a background to visually test opacity, probably will in the future too)
Added setOptions to frontend components so potential updates made from the Dashboard can be saved.
Extracted background and border color to use in widgets.
humanFileSize function based on the si format (powers of 1024, not 1000).
Improved integrationCreatorByKind by @Meierschlumpf.
Changed integrationCreatorByKind to integrationCreator so it functions directly from the integration.
Added integrationCreatorFromSecrets to directly work with secrets from db.
Added getIntegrationKindsByCategory to get a list of integrations sharing categories.
Added IntegrationKindByCategory type to get the types possible for a category (Great to cast on integration.kind that isn't already properly limited/typed but for which we know the limitation)
Added a common AtLeastOneOf type. Applied to TKind and IntegrationSecretKind[] where it was already being used and Added to the getIntegrationKindsByCategory's output to be more freely used.
Added the Modify type, instead of omiting to then add again just to change a parameters type, use the modify instead. Applied code wide already.
Hook to get list of integration depending on permission level of user. (By @Meierschlumpf)
* fix: when removing one item and then adding another one that newly added one can not be moved
* chore: address pull request feedback
* fix: deepsource canceled
* chore: add parent_section_id and change position to x and y_offset for sqlite section table
* chore: rename existing positions to x_offset and y_offset
* chore: add related mysql migration
* chore: add missing height and width to section table
* fix: missing width and height in migration copy script
* fix: typecheck issues
* fix: test not working caused by unsimilar schemas
* wip: add dynamic section
* refactor: improve structure of gridstack sections
* feat: add rendering of dynamic sections
* feat: add saving of moved sections
* wip: add static row count, restrict min-width and height
* chore: address pull request feedback
* fix: format issues
* fix: size calculation within dynamic sections
* fix: on resize not called when min width or height is reached
* fix: size of items while dragging is to big
* chore: temporarly remove migration files
* chore: readd migrations
* fix: format and deepsource issues
* chore: remove db_dev.sqlite file
* chore: add *.sqlite to .gitignore
* chore: address pull request feedback
* feat: add dynamic section actions for adding and removing them
* chore(deps): update dependency eslint to v9
* chore: migrate eslint to v9
* fix: dependency issues
* fix: unit tests not working
* chore: disable lint check for Image component that does not work in ci
* fix: lint issue
---------
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
* feat: add custom css for board and custom classes in advanced options for items
* chore: add mysql migration
* fix: test not working
* fix: format issues
* fix: typecheck issue
* fix: build issue
* chore: add missing translations
* fix: merge issues related to migrations
* fix: format issues
* fix: merge issue with migration
* fix: format issue
style: improve styling of items on board by defining margin depending on screen size, removing general padding on card of items and reducing size of no app icon
* wip: improve user preferences
* wip: fix translations and add user danger zone
* feat: add user delete button to danger zone
* fix: test not working
* refactor: add access checks for user edit page, improve not found behaviour, change user preference link in avatar menu to correct link
* fix: remove invalid bg for container
* chore: address pull request feedback