Board scaling: no sideways scrolling
- Revert the pannable narrow canvas. The canvas fits the viewport again and
`.viewport` goes back to `overflow: clip`, so a board can never widen the
document or scroll horizontally.
- Fix the unreadable-narrow-board regression at the real cause instead: cap the
inverse UI compensation at 2x (50% canvas scale). Down to 50% text and
controls keep their physical size; below it the board zooms out as a whole, so
a 200x200 logical tile hosts at most 28px logical text rather than 96px and
content stops overlapping its neighbours.
Touch editing
- Add `touch-action: none` to `.board-grid-entry`, the dnd-kit draggable and its
own drag handle. The 200ms touch activation delay is useless if the browser
has already handed the gesture to page panning and emitted `pointercancel`.
Only edit mode renders this element.
Custom widgets
- Memoize the merged `data`/`status`/`options` passed to `CustomJsxRenderer`.
They were rebuilt every render, so the compiled-template memo never hit and
the new reference-identity boundary key changed on every render, resetting the
error boundary and forcing an extra reconciliation of the widget subtree.
- Keep the cache key when the shared Redis cache is unavailable so the
process-local cache still absorbs polling instead of sending every widget
refresh upstream.
- Reclaim the shared cache's LRU/size/byte bookkeeping for TTL-expired entries
and touch the LRU in the same script, so expired ghosts stop consuming the
64 MiB budget and a read costs one round trip instead of two.
Forwarded IP
- Restore `ipAddressFromHeaders` to the full forwarding chain and add
`trustedIpAddressFromHeaders` for the last hop. Repointing the shared helper
had collapsed MCP failed-auth rate limiting into a single bucket for every
client behind a reverse proxy and replaced the client IP with the proxy IP in
API-key auth logs.
Runtime and restore
- Make the new /appdata ownership migration best-effort. Under `set -e` a mount
that rejects chown (CIFS/SMB, fixed-uid NFS) turned into a container that
refuses to start, and /appdata was never chowned before.
- Report malformed metadata.json as such instead of blaming the archive.
* fix: keep nginx IPv6 listen only when IPv6 is available (#4596)
Commit 2c48b1896 (1.45.2) made the internal nginx proxy listen on the IPv6
wildcard ('listen [::]:7575;'), which aborts nginx startup on hosts/VMs with
IPv6 disabled:
nginx: [emerg] socket() [::]:7575 failed (97: Address family not supported by protocol)
A plain revert would reintroduce #2697 and break IPv6-only/dual-stack
environments where this listener is required. Instead, only emit the IPv6
listen directive when the host actually has IPv6 configured.
Reuse the envsubst step run.sh already performs: compute NGINX_LISTEN_IPV6
from /proc/net/if_inet6 and substitute it into the template. proc files always
report size 0, so presence is detected by grepping the file (not 'test -s').
* fix: honor HOMARR_DISABLE_IPV6 override in nginx config generation
Review feedback on #6539: give users an explicit opt-out from the IPv6
listener even when the host reports IPv6. The issue reporter (#4596)
requested such an env var, and the pattern matches the existing
ENABLE_DNS_CACHING IPv6 toggle. Auto-detection behavior is unchanged when
the var is unset. Validated in containers: override wins, dual-stack
preserved by default, IPv4-only fallback on IPv6-less hosts.
* fix: rdb files can not be saved because of permission issues bug: redis can not save RDB files #318
* refactor: move db and redis dumps to /appdata directory
* feat: add user groups
* wip: add unit tests
* wip: add more tests and normalized name for creation and update
* test: add unit tests for group router
* fix: type issues, missing mysql schema, rename column creator_id to owner_id
* fix: lint and format issues
* fix: deepsource issues
* fix: forgot to add log message
* fix: build not working
* chore: address pull request feedback
* feat: add mysql migration and fix merge conflicts
* fix: format issue and test issue
* feat: make tasks script run in docker
* feat: make websocket server work in docker
* fix: format issue
* fix: broken lockfile
* fix: non matching typescript versions
* config: add dockerfile
* feat: add working dockerfile for nest and next app with sqlite migration
---------
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>