Thomas Camlong
8594cc884f
perf(docker): stop loading the gRPC stack dockerode only needs for image builds
...
dockerode/lib/docker.js required './session' at module scope, which pulls in
@grpc/grpc-js and @grpc/proto-loader - 112 files. Its single call site is inside
Docker.prototype.buildImage, the BuildKit path. Homarr lists, starts and stops
containers and never builds images, so every install with a Docker widget paid for
a gRPC stack it cannot reach.
Measured with a forced GC, in context rather than in a bare process: requiring
dockerode goes from +26.6 MiB RSS / 5.2 MiB heap to +20.6 MiB / 2.7 MiB, with grpc
and protobufjs files going 63 and 49 to zero.
The bare-process figure was +24.1 MiB, and quoting that would have overstated the
win by 4x - most of it overlaps with what dockerode loads anyway. The patch comment
records the in-context number.
2026-08-10 08:49:02 +02:00
Thomas Camlong
3cc6ff33df
perf(docker): stop loading ssh2, which allocates a 16 MiB WASM heap nobody uses
...
Profiling at the memory high-water mark - not at idle, which is what every earlier
round measured - found the largest single retainer in every snapshot was one V8
Context holding a 16.00 MiB ArrayBuffer. Expanding it through the dominator tree
named it: ssh2's crypto module, whose POLY1305_WASM_MODULE instantiates a
WebAssembly memory for ChaCha20-Poly1305 as soon as it is required.
Homarr has no SSH feature and does not depend on ssh2. The chain is
dockerode -> docker-modem -> ssh2, and docker-modem/lib/modem.js requires './ssh'
at module scope while using it in exactly one place, already guarded by
`protocol === 'ssh'`. A pnpm patch moves the require inside that branch. SSH-based
Docker hosts still work - require() is cached, so they pay it once - and every
socket-based install, which is everyone else, never loads it.
Measured over four alternated runs on a restored real backup, external memory:
before after
board loaded 25.4, 25.1 8.3, 11.2
nav-01 28.5, 25.4 10.1, 8.6
multi-tab 31.1, 35.8 13.0, 10.0
post-soak 21.4, 21.5 5.5, 7.2
Consistently -15 to -18 MiB, ranges non-overlapping, and 30 fewer files loaded
(1470 -> 1440).
Peak RSS does NOT improve, and that is worth stating plainly: V8 sizes its heap
against available headroom, so freeing native memory lets it grow further before
collecting. What changes is the composition - a fixed 16 MiB of unusable WASM
buffer becomes headroom the app can actually use, which matters under a container
memory limit but does not move the peak number.
Also adds the instruments this needed. A heap snapshot can never explain a peak,
because V8 runs a full GC before serialising one and reports only survivors:
- memory-probe.cjs gains in-process allocation sampling, on-demand snapshots via
v8.writeHeapSnapshot, an smaps endpoint, and require-graph recording.
- analyze-allocations.mjs diffs two stages to isolate what one stage allocated.
- analyze-smaps-stages.mjs splits each stage's RSS into JS heap, JIT, native and
file-backed pages.
- analyze-heap-dominators.mjs can now expand the largest retainer, which is what
identified ssh2. A plain graph walk escapes through __proto__ and is useless.
One trap recorded in the findings: taking the peak snapshot over CDP delivers it as
JS string chunks and added ~134 MiB of ArrayBuffers to the process being measured,
producing a fake 693 MiB reading. v8.writeHeapSnapshot streams from C++ instead, and
the probe now reports its own observerCostMiB so the cost of looking is visible.
2026-08-09 22:17:25 +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
homarr-renovate[bot]
48fc8db2b4
chore(deps): update semantic-release monorepo (major) ( #6486 )
2026-08-03 14:39:28 +02:00
Thomas Camlong
de801f3f00
perf: optimize dashboard loading and builds
2026-08-02 15:58:16 +02:00
ajnart
0b9c4d6375
fix: address performance review feedback
2026-07-29 06:50:13 +02:00
ajnart
4ca0b747bb
chore(next): upgrade preview and isolate dev services
2026-07-29 06:47:07 +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
homarr-renovate[bot]
49248cedaf
chore(deps): update dependency posthog-js to ^1.399.1 ( #6340 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 22:09:52 +00:00
homarr-renovate[bot]
a0034b2cfc
chore(deps): update dependency @immich/sdk to ^3.0.2 ( #6339 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 21:01:58 +00:00
homarr-renovate[bot]
4a297180fd
chore(deps): update dependency lucide-react to ^1.24.0 ( #6334 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 19:23:26 +00:00
Thomas Camlong
29ee87c4aa
fix(docker): pin typescript to v6 via alias to fix Next.js 16.2.10 build
2026-07-14 18:11:15 +02:00
homarr-renovate[bot]
6d37710fec
chore(deps): update dependency vite@>=5.0.0 <=5.4.18 to >=8.1.4 ( #6333 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 11:26:55 +00:00
homarr-renovate[bot]
c016beb2e5
chore(deps): update dependency vite to ^8.1.4 ( #6332 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 09:06:17 +00:00
homarr-renovate[bot]
f9e1b85c6a
chore(deps): update dependency posthog-node to ^5.40.0 ( #6314 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 06:14:41 +00:00
homarr-renovate[bot]
38ba19e665
chore(deps): update dependency oxlint to ^1.73.0 ( #6306 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 03:22:16 +00:00
homarr-renovate[bot]
f55c99d2d6
chore(deps): update dependency posthog-js to ^1.399.0 ( #6331 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-14 00:00:38 +00:00
homarr-renovate[bot]
c5e8b83d8a
chore(deps): update vitest monorepo to ^4.1.10 ( #6286 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-13 23:01:00 +00:00
homarr-renovate[bot]
d52d9cfed2
chore(deps): update dependency posthog-js to ^1.398.7 ( #6319 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-13 21:58:26 +00:00
homarr-renovate[bot]
e51e39ff38
chore(deps): update dependency typescript to v7 ( #6325 )
2026-07-13 22:09:30 +02:00
homarr-renovate[bot]
6c075b6d74
chore(deps): update dependency mysql2 to v3.22.6 ( #6310 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-13 18:45:08 +00:00
homarr-renovate[bot]
1d9e8aabf3
chore(deps): update turbo monorepo to ^2.10.4 ( #6303 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-13 13:36:45 +00:00
homarr-renovate[bot]
b111e5285b
chore(deps): update dependency @scalar/api-reference-react to ^0.9.54 ( #6317 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-13 10:38:14 +00:00
homarr-renovate[bot]
f4c491b570
chore(deps): update dependency @types/node to ^24.13.3 ( #6318 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-13 10:37:23 +00:00
homarr-renovate[bot]
29bd4fd70b
chore(deps): update dependency posthog-js to ^1.398.1 ( #6311 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-12 18:09:44 +00:00
homarr-renovate[bot]
e9543dc30d
chore(deps): update tiptap monorepo to v3.27.3 ( #6308 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-12 09:12:55 +00:00
homarr-renovate[bot]
c2508dffea
chore(deps): update dependency posthog-js to ^1.396.7 ( #6285 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-12 06:18:17 +00:00
homarr-renovate[bot]
c56b91570b
chore(deps): update tiptap monorepo to v3.27.2 ( #6292 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-12 03:01:23 +00:00
homarr-renovate[bot]
d53c4e6513
chore(deps): update dependency hono@<4.6.5 to >=4.12.28 ( #6291 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-12 02:58:51 +00:00
homarr-renovate[bot]
0426d600cc
chore(deps): update dependency oxfmt to ^0.58.0 ( #6305 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-12 00:06:59 +00:00
homarr-renovate[bot]
616a444e64
chore(deps): update dependency @immich/sdk to ^3.0.1 ( #6251 )
...
* chore(deps): update dependency @immich/sdk to ^3.0.1
* style: auto-fix lint and format
---------
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-09 19:51:55 +00:00
homarr-renovate[bot]
68f8e8146b
chore(deps): update dependency @scalar/api-reference-react to ^0.9.51 ( #6243 )
...
* chore(deps): update dependency @scalar/api-reference-react to ^0.9.51
* style: auto-fix lint and format
---------
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-07 13:23:56 +00:00
homarr-renovate[bot]
c7fa7cdb50
chore(deps): update dependency vite@>=5.0.0 <=5.4.18 to >=8.1.3 ( #6242 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-07 07:49:42 +00:00
homarr-renovate[bot]
0c28224e82
chore(deps): update nextjs monorepo to v16.2.10 ( #6238 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 21:56:19 +00:00
homarr-renovate[bot]
4e6272dbe2
chore(deps): update dependency posthog-js to ^1.396.4 ( #6232 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 17:56:28 +00:00
homarr-renovate[bot]
f5bc090d36
chore(deps): update dependency lucide-react to ^1.23.0 ( #6225 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 17:53:57 +00:00
homarr-renovate[bot]
f23e06dff1
chore(deps): update dependency @semantic-release/github to ^12.0.9 ( #6231 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 17:53:39 +00:00
homarr-renovate[bot]
24188ce51f
chore(deps): update dependency posthog-node to ^5.39.2 ( #6226 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 14:37:51 +00:00
homarr-renovate[bot]
e31f60fdec
chore(deps): update dependency cookie to v2.0.1 ( #6223 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 14:36:14 +00:00
homarr-renovate[bot]
6bb547f3c5
chore(deps): update dependency conventional-changelog-conventionalcommits to ^10.2.0 ( #6222 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 10:32:35 +00:00
Thomas Camlong
0dc93c1a02
fix(deps): revert typescript from 7.0.1-rc to ^6.0.3
...
Next.js 16.2.9 does not fully support TypeScript 7 (tsgo) as the
primary typescript package. The Go-native compiler has no in-process
JavaScript API — lib/typescript.js is missing — which causes Next.js's
hasNecessaryDependencies check to fail and the build to SIGABRT with
CI=true. Vercel is working on native tsgo integration expected in Q3
2026 alongside TypeScript 7 stable.
2026-07-06 12:15:38 +02:00
Thomas
00661c9b3d
fix: fix pnpm lockfile ( #6220 )
2026-07-06 10:52:58 +02:00
Thomas and homarr-renovate[bot]
4d42eb65e4
chore(deps): mega dependency update ( #6212 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-06 10:05:51 +02:00
homarr-renovate[bot]
c5c9daf5a5
chore(deps): update dependency undici to v7.28.0 [security] ( #6188 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 18:11:47 +00:00
homarr-renovate[bot]
ab0e878fbf
chore(deps): update dependency posthog-js to ^1.396.2 ( #6189 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 16:20:03 +00:00
homarr-renovate[bot]
59c084bc57
chore(deps): update testcontainers-node monorepo to ^12.0.4 ( #6185 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 12:18:18 +00:00
homarr-renovate[bot]
f6cf262bab
chore(deps): update dependency posthog-js to ^1.396.1 ( #6183 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 10:27:08 +00:00
homarr-renovate[bot]
529942e4da
chore(deps): update dependency brace-expansion@>=1.0.0 <=1.1.11 to >=5.0.7 ( #6173 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 07:55:55 +00:00
homarr-renovate[bot]
2c2bdb6b76
chore(deps): update dependency brace-expansion@>=2.0.0 <=2.0.1 to >=5.0.7 ( #6174 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-07-04 04:45:04 +00:00