Thomas Camlong
33293ba1cf
refactor: simplify Phase 1 infrastructure code
...
- cache-invalidation: extract isExpectedRevalidateError helper
- integration-data-cache: flatten early-return chain, extract eviction
- redis-handler: extract StoredEntry type, readStreamBody, ensureConnected
- svg-purify: single getOwnPropertyDescriptor lookup per prop
- session-scoped-providers: simplify auth flow
- retryable-loader: use function declarations
- translation/request: replace spread-in-reduce with for loop
2026-08-07 21:04:42 +02:00
Thomas Camlong
b3b2d5a022
fix: SVG regex prefers </svg> terminator, add self-closing children test
...
Use greedy <svg>...</svg> match preferring closing tag over inner />
to prevent truncation at first self-closing child element.
Self-closing root <svg .../> handled as separate alternative.
Added test with <path/> + <circle/> children asserting well-formed output.
2026-08-07 21:00:55 +02:00
Thomas Camlong
67ac2bbc7c
fix: Redis expire guard, transferOwnership prev-owner, SVG regex
...
- Redis get() rejects legacy expire=0 entries and cleans them up
- transferOwnership invalidates previous owner in addition to new
- SVG regex uses non-greedy match and handles self-closing <svg />
- SVG fallback returns empty string instead of HTML wrapper
- Memory channel comment: FIFO eviction, not timestamp-based
2026-08-07 20:57:07 +02:00
Thomas Camlong
fbb2eddd87
fix: concurrent stale race, Redis expire leak, missing invalidation, UI Suspense
...
- Fix integration data cache: set pending synchronously before creating
fetch to prevent concurrent stale-revalidation from spawning duplicate
upstream calls
- Redis cache handler: skip persisting entries with expire=0 (dynamic
entries should not be stored in Redis)
- Add missing invalidation: user.changePassword, group.updateGroup,
group.transferOwnership
- Move SearchEngineOptimization inside Suspense in root layout
- Add Suspense fallback loader to root layout
- Move searchParams resolution inside Suspense in login page
2026-08-07 20:53:36 +02:00
Thomas Camlong
38ac8f3075
fix: concurrent cache miss, SVG output, narrowed error handling, format
...
- Fix integration data cache: check pending promise before TTL to
prevent returning undefined on concurrent cold-cache access
- Add concurrent-miss test (two parallel callers, one fetch)
- SVG sanitizer: extract <svg> from DOMPurify output to strip
residual HTML wrapper
- Narrow safeRevalidateTag catch: log unexpected errors, silence only
known "outside request scope" messages
- Run oxfmt across all packages (206 files formatted)
2026-08-07 20:48:17 +02:00
Thomas Camlong
451dc3ce39
fix: address review #4 — board name invalidation, SVG tests, test gaps
...
- Pass board.name to all invalidateBoardCache calls (permission mutations)
- Align integration create invalidation with update/delete
- Add initial-fetch-failure test for integration-data-cache
- Expand SVG XSS test corpus (javascript:, xlink:href, @import, onbegin)
- Forbid <style> tags in SVG sanitizer to prevent CSS injection
- Fix duplicate export in packages/common/src/index.ts
2026-08-07 19:18:18 +02:00
Thomas Camlong
6b45aca5d5
fix: address Bugbot review findings
...
- Skip module-level integration cache for multi-instance (REDIS_IS_EXTERNAL)
- Add invalidateBoardCache to permission mutations (prevents future leak)
- Remove unused cacheTags.integrationData
- Replace KEYS with SCAN in Redis cache handler refreshTags()
- Document REDIS_CACHE_DB env var
2026-08-07 19:04:53 +02:00
Thomas Camlong
018f98e318
perf: implement Phase 1 homepage diet via Next.js Cache Components
...
P1-0: V8 heap cap (HOMARR_MAX_OLD_SPACE_SIZE, default 512MB)
P1-1: Module graph cuts
- Dynamic integration imports (55 static → lazy loaders)
- Conditional DB driver loading (only configured driver loaded)
- Replace jsdom with linkedom for SVG sanitization
- Delete eager widget barrel (55 import * as → 0)
- Extract createRetryableLoader to @homarr/common
P1-2: Enable cacheComponents + restructure root layout
- Suspense boundaries around session-dependent providers
- ColorSchemeScript replaces server-side cookie reads
- Board/manage/auth layouts wrapped in Suspense
P1-3: Cache read paths
- Cache tag registry + invalidation helpers
- Cache invalidation wired into all mutation routers
- Translation deep-merge memoized per locale
P1-4: Prerendered shells + loading.tsx files
P1-5: Shared integration data cache (60s TTL, stale-while-revalidate)
P1-6: Redis-backed Next.js cache handler (@homarr/next-cache-handler)
P1-7: Redis optional (memory channel fallback), TTL on pubSub:last:*,
Redis clients consolidated from 6 to 2
2026-08-07 18:59:47 +02:00
Thomas Camlong
08af704c8a
Merge origin/dev into feat/build-performance
2026-08-03 15:21:23 +02:00
Thomas
018f84f80d
feat(dev): add Docker development CLI ( #6495 )
2026-08-03 14:38:56 +02:00
Thomas Camlong
de801f3f00
perf: optimize dashboard loading and builds
2026-08-02 15:58:16 +02:00
Thomas
27ca058088
feat(widgets): persist Beszel and Docker table layouts ( #6490 )
2026-08-01 23:20:09 +02:00
Thomas
b52bc03c8d
Merge pull request #6499 from homarr-labs/docs/update-helm-docs
...
docs(helm): update chart installation page
2026-08-01 23:07:58 +02:00
Thomas
edb56f3fcd
fix: accept direct icon URLs
...
Use valid direct HTTP(S) icon URLs without repository search.
2026-08-01 23:06:26 +02:00
github-actions[bot]
bd669a1a8f
docs(helm): update chart installation page
2026-07-31 19:35:37 +00:00
Thomas
ade640dcea
test(navidrome): complete cleanup review ( #6494 )
...
* test(navidrome): hoist album fixture helper
* test(navidrome): address coderabbit cleanup feedback
2026-07-31 14:39:11 +02:00
Thomas
61128ddcc8
fix(navidrome): clean up audio stats integration ( #6493 )
2026-07-31 14:20:51 +02:00
ajnart
81a13d3b52
Merge remote-tracking branch 'origin/dev' into feat/build-performance
2026-07-31 13:38:16 +02:00
Matt Van Horn
06d9c07d22
feat: expose Navidrome as a media-server (now-playing) integration ( #6070 )
2026-07-31 13:30:44 +02:00
ajnart
9963ba0274
fix: harden runtime isolation and regression tests
2026-07-30 00:38:34 +02:00
Thomas
49d0f1a141
docs: explain Podman socket setup ( #6487 )
...
* docs: explain Podman socket setup
* docs: clarify Podman runtime requirements
* docs: complete Podman compose examples
2026-07-29 16:53:29 +02:00
ajnart
c80e9878de
fix: handle lazy startup failures
2026-07-29 07:23:09 +02:00
ajnart
0b9c4d6375
fix: address performance review feedback
2026-07-29 06:50:13 +02:00
ajnart
7266e15356
style: auto-fix lint and format
2026-07-29 06:47:07 +02:00
ajnart
440626ba00
test(performance): add authenticated local benchmarks
2026-07-29 06:47:07 +02:00
ajnart
f8d8a09c56
perf(proxy): isolate settings database reads
2026-07-29 06:47:07 +02:00
ajnart
add6ee56ba
fix(updates): enforce a persisted daily check
2026-07-29 06:47:07 +02:00
ajnart
6b74078766
perf(widgets): lazy load the application graph
2026-07-29 06:47:07 +02:00
ajnart
4ca0b747bb
chore(next): upgrade preview and isolate dev services
2026-07-29 06:47:07 +02:00
Clarkar00
ac73b9d891
fix(widgets): refetch after render errors ( #6399 )
...
Remove incompatible persisted widget query data before resetting a crashed widget so it can fetch fresh data instead of re-rendering the same stale payload.
2026-07-28 23:12:03 +02:00
Thomas
489980814c
Merge pull request #6465 from homarr-labs/docs/update-helm-docs
...
docs(helm): update chart installation page
2026-07-28 22:59:08 +02:00
Thomas
906c9f11fa
feat(widgets): rework downloads widget with mantine-datatable ( #6430 )
2026-07-28 21:50:09 +02:00
Thomas
e66979bab6
feat(auth): link credentials users with OIDC ( #6445 )
2026-07-28 14:49:51 +02:00
github-actions[bot]
f33fc838cf
docs(helm): update chart installation page
2026-07-24 21:17:32 +00:00
Thomas
7bbfd74454
Merge pull request #6384 from homarr-labs/docs/update-helm-docs
...
docs(helm): update chart installation page
2026-07-23 02:04:11 +02:00
Thomas
14c3fa2e76
fix(beszel): prevent live subscription memory growth ( #6448 )
...
* fix(beszel): bound live stats subscriptions
* fix(beszel): avoid blocking subscription teardown
* fix(import): map new clock options
2026-07-23 02:03:08 +02:00
Thomas
9168f8114b
fix(manage): hide sidebar nav items from unprivileged users ( #6236 )
2026-07-23 02:01:10 +02:00
Thomas
cf0e469465
feat: restrict apps management to board modifiers ( #6425 )
2026-07-21 16:56:33 +02:00
Thomas
97652802f0
feat(immich): show random photos without album ( #6424 )
2026-07-21 16:10:45 +02:00
Thomas
01e0f3612d
docs(immich): list Asset View permission ( #6408 )
2026-07-20 14:57:07 +02:00
Thomas
0015a6d88d
fix(immich): use thumbnail endpoint instead of original for album carousel ( #6396 )
...
* fix(immich): use thumbnail endpoint instead of original for album carousel
Switches from /api/assets/:id/original to /api/assets/:id/thumbnail to fix
HEIC image incompatibility (thumbnails are always JPEG), reduce bandwidth,
and improve loading speed.
Closes #6388
* working on immich
* Improve image proxy error handling
* fix(image-proxy): use trusted fetch response type
* docs(immich): require Asset View permission
2026-07-20 14:53:27 +02:00
github-actions[bot]
ac6a0c9254
docs(helm): update chart installation page
2026-07-17 19:24:43 +00:00
Junker der Provinz
bc018e1fe0
fix(docker): disable the broken full-screen toggle on the container table ( #6374 )
2026-07-17 14:43:37 +02:00
Thomas
5e39c8813a
feat(preferences): add enableRightClickOnWidgets user preference ( #6298 )
2026-07-17 14:42:19 +02:00
Thomas
06719cdef0
fix(ci): remove coverage report, scope format to changed files, fix oxlint config ( #6359 )
2026-07-16 10:21:07 +02:00
Thomas
8528d5068b
feat(media-requests): filter requests list by status and time window ( #6320 )
2026-07-15 16:27:24 +02:00
Thomas
7e4cb0201b
fix(widgets): add refetchInterval to WidgetDefinition for per-widget polling ( #6352 )
2026-07-15 11:52:35 +02:00
Thomas
7887ce12c0
fix(integrations): resolve intermittent Seerr/Overseerr crashes and add query status to context menu ( #6347 )
2026-07-15 11:41:18 +02:00
homarr-renovate[bot]
bf55bcce92
fix(deps): update dependency swiper to ^14.0.5 ( #6341 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 23:55:02 +00:00
Thomas
06f1877ae1
Merge pull request #6282 from homarr-labs/docs/update-helm-docs
...
docs(helm): update chart installation page
2026-07-13 18:11:10 +02:00