Thomas Camlong
320c51ac89
fix(http): stop destroying superseded agents, which could abort live requests
...
Follow-up to the agent caching change. When the trust material changes the caches
are cleared, and that path called agent.destroy() on the node https agents.
Node's documentation for agent.destroy() is "Destroy any sockets that are
currently in use by the agent" - so an admin uploading a certificate could have
aborted an HTTPS request that was already in flight, for instance a nextcloud
calendar sync. The agents run without keepAlive (verified: new https.Agent({})
reports keepAlive false on node 24), so destroying bought nothing anyway; each
socket closes on its own once its response completes.
undici's close() is kept, because it waits for enqueued requests to finish and
therefore cannot interrupt one in flight.
Also verified the correctness premise of sharing a single agent across every
integration, which the previous commit asserted but did not test: three origins
served by one agent each got their own pooled connection, four requests over one
connection apiece, with no response misrouted between them.
2026-08-13 15:36:12 +02:00
Thomas Camlong
3ba2800db9
perf(http): reuse the certificate agent instead of building one per request
...
fetchWithTrustedCertificatesAsync has 125 call sites and none of them pass a
dispatcher, so every HTTP request Homarr makes - every integration poll, every
proxied image - built a brand new EnvHttpProxyAgent. An agent owns its
connection pool and its TLS session cache, so a fresh one per request means a
full TLS handshake every time and no keep-alive reuse at all.
Measured against a local TLS server, 60 sequential requests:
fresh agent per request 5.11 ms/req 60 TLS handshakes
one shared agent 1.69 ms/req 2 TLS handshakes
3.0x faster and 30x fewer handshakes on loopback; over a real network the gap
is larger, since that is where handshake round-trips actually cost something.
Agent construction itself is cheap (0.004 ms, 1.7 KiB) because undici builds
the TLS store lazily at connect time - so the cost was never construction, it
was the handshake that a fresh pool forces.
The trust material is still read on every call and the cached agents are keyed
on a hash of it, so adding or removing a certificate - including by dropping a
file into the mounted folder rather than going through the UI - takes effect on
the very next request, exactly as before. Superseded agents are closed so their
idle sockets are released.
2026-08-11 16:09:37 +02:00
Thomas Camlong
b81b90875f
fix: revert DB driver to static imports, fix test regressions
...
- Revert createRequire() for DB drivers — require() can't resolve .ts
files in Vitest, breaking 49 test suites
- Make cache invalidation fail-safe via try-catch around revalidateTag
(throws outside Next.js context: tests, tasks service, websocket)
- Fix 6 integration test imports: barrel no longer exports concrete
classes, point tests at direct source paths
- Fix Redis cache handler lint errors: remove non-null assertions,
suppress __NEXT_BUILD_ID underscore warning
2026-08-07 20:43:07 +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
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
576856d634
fix(beszel): add reliable live stats and filesystem UI ( #6289 )
2026-07-11 17:55:04 +02:00
Meier Lukas
650f761325
ci(format): fails to apply format due to conflict between --write and --check ( #5815 )
2026-05-29 11:07:48 +02:00
605af19cd8
refactor: replace ESLint + Prettier with OXC (oxlint + oxfmt) ( #5741 )
...
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com >
Co-authored-by: Meierschlumpf <63781622+Meierschlumpf@users.noreply.github.com >
2026-05-27 09:37:44 +02:00
Meier Lukas
72d636c0f0
refactor(deps): migrate to pnpm catalog ( #5464 )
2026-04-13 22:45:24 +02:00
Meier Lukas
41a03ef4e0
fix(logs): missing fields from top level error with metadata in output ( #5456 )
2026-04-10 20:46:59 +02:00
homarr-renovate[bot]
0a78e3f12a
fix(deps): update dependency drizzle-orm to ^0.45.2 ( #5388 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-04-01 19:02:54 +00:00
homarr-renovate[bot] and Meier Lukas
46db8b6ab3
fix(deps): update dependency better-sqlite3 to ^12.8.0 ( #5266 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com >
2026-03-31 18:43:59 +02:00
homarr-renovate[bot]
a9582f04ed
fix(deps): update dependency zod to ^4.3.6 ( #5376 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-30 21:50:50 +00:00
homarr-renovate[bot] and Meier Lukas
2b4c83dcca
fix(deps): update dependency zod to ^4.3.5 - abandoned ( #4803 )
...
* fix(deps): update dependency zod to ^4.3.5
* fix: omit can not be used with refine
* fix: convert intersection to object due to trpc-openapi issue
* fix: remove omit after refine
---------
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com >
2026-03-30 23:11:14 +02:00
homarr-renovate[bot]
49d9394cd7
fix(deps): update dependency @t3-oss/env-nextjs to ^0.13.11 ( #5345 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-27 19:53:16 +00:00
homarr-renovate[bot]
bbd42600aa
chore(deps): update dependency @types/pg to ^8.20.0 ( #5331 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-27 18:05:32 +00:00
homarr-renovate[bot]
47b2d36f7a
fix(deps): update dependency ioredis to v5.10.1 ( #5316 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-24 18:05:01 +00:00
homarr-renovate[bot]
4fb48c23a2
fix(deps): update dependency mysql2 to v3.20.0 ( #5283 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-20 22:37:51 +00:00
homarr-renovate[bot]
1040ecac04
fix(deps): update dependency mysql2 to v3.19.1 ( #5240 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-14 16:41:47 +00:00
homarr-renovate[bot]
a9085399c0
chore(deps): update dependency eslint to ^9.39.4 ( #5218 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-12 07:57:01 +00:00
homarr-renovate[bot]
1c6e23a4b6
fix(deps): update dependency pg to ^8.20.0 ( #5198 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-11 19:55:40 +00:00
homarr-renovate[bot]
324bfd90d1
fix(deps): update dependency mysql2 to v3.19.0 ( #5206 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-10 19:10:33 +00:00
homarr-renovate[bot]
2893152377
chore(deps): update dependency @types/pg to ^8.18.0 ( #5173 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-05 16:28:46 +00:00
homarr-renovate[bot]
1c06e562c3
fix(deps): update dependency ioredis to v5.10.0 ( #5169 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-04 19:28:45 +00:00
homarr-renovate[bot]
4717a5724d
fix(deps): update dependency mysql2 to v3.18.2 ( #5164 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-03 22:38:04 +00:00
homarr-renovate[bot]
8bf2a43e06
fix(deps): update dependency mysql2 to v3.18.1 ( #5152 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-03 11:40:38 +00:00
homarr-renovate[bot]
0b0fb1c579
fix(deps): update dependency pg to ^8.19.0 ( #5153 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-03-02 17:54:46 +00:00
homarr-renovate[bot]
52792af186
fix(deps): update dependency mysql2 to v3.18.0 ( #5141 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-28 17:34:47 +00:00
homarr-renovate[bot]
66ad67eced
fix(deps): update dependency mysql2 to v3.17.5 ( #5140 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-28 09:35:09 +00:00
homarr-renovate[bot]
12ba14bb3f
chore(deps): update dependency eslint to ^9.39.3 ( #5127 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-25 14:58:57 +00:00
homarr-renovate[bot]
7ca38c3a78
fix(deps): update dependency mysql2 to v3.17.4 ( #5123 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-25 11:00:55 +00:00
homarr-renovate[bot]
42e53261ef
fix(deps): update dependency mysql2 to v3.17.3 ( #5116 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-24 16:07:35 +00:00
homarr-renovate[bot]
15c7fc5ae8
fix(deps): update dependency mysql2 to v3.17.2 ( #5104 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-22 02:21:23 +00:00
homarr-renovate[bot]
475f14dc31
fix(deps): update dependency mysql2 to v3.17.1 ( #5082 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-19 02:25:18 +00:00
homarr-renovate[bot]
4e1baa5703
fix(deps): update dependency ioredis to v5.9.3 ( #5076 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-17 20:49:50 +00:00
homarr-renovate[bot]
fcb020c191
fix(deps): update dependency mysql2 to v3.17.0 ( #5066 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-16 11:51:45 +00:00
homarr-renovate[bot]
04b35980f5
fix(deps): update dependency mysql2 to v3.16.3 ( #5014 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-08 18:47:39 +00:00
homarr-renovate[bot]
c3071a3c95
fix(deps): update dependency pg to ^8.18.0 ( #4989 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 19:00:45 +00:00
homarr-renovate[bot]
5c6eafb272
fix(deps): update dependency mysql2 to v3.16.2 ( #4961 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-31 21:30:15 +00:00
homarr-renovate[bot]
a50a29a778
fix(deps): update dependency pg to ^8.17.2 ( #4916 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-25 18:39:14 +00:00
homarr-renovate[bot] and Meier Lukas
63a0793c6e
fix(deps): update dependency better-sqlite3 to ^12.6.2 ( #4891 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com >
2026-01-23 16:13:55 +01:00
homarr-renovate[bot]
40ee667832
fix(deps): update dependency mysql2 to v3.16.1 ( #4886 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-21 09:40:26 +00:00
homarr-renovate[bot]
e3ba1ee931
fix(deps): update dependency ioredis to v5.9.2 ( #4881 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-20 15:39:59 +00:00
homarr-renovate[bot]
fcd417198f
fix(deps): update dependency pg to ^8.17.1 ( #4877 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-20 14:39:00 +00:00
homarr-renovate[bot]
b923891fac
fix(deps): update dependency pg to ^8.17.0 ( #4874 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-19 18:41:55 +00:00
homarr-renovate[bot] and Meier Lukas
9d4fb9eb46
fix(deps): update dependency better-sqlite3 to ^12.6.0 ( #4853 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com >
2026-01-18 21:07:31 +01:00
homarr-renovate[bot]
5d00642268
fix(deps): update dependency ioredis to v5.9.1 ( #4844 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-13 19:28:34 +00:00
homarr-renovate[bot]
155d4f2270
fix(deps): update dependency ioredis to v5.9.0 ( #4827 )
...
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-10 14:27:50 +00:00
Meier Lukas
7d3322576c
fix(db): connection issue do to missing host and name of db when connecting with host ( #4786 )
2026-01-03 13:44:01 +01:00
Meier Lukas
5a57115ca0
feat(http): add proxy support ( #4721 )
2025-12-25 11:32:14 +01:00