Compare commits

...
124 Commits
Author SHA1 Message Date
Releases Homarr bc087e6e60 chore(release): 1.45.2 [skip ci] 2025-12-05 19:17:05 +00:00
homarr-releases[bot] d347d4455b chore(release): automatic release v1.45.2 2025-12-05 19:16:11 +00:00
Meier Lukas 10572ca962 fix: disable react-compiler due to issue with mantine-react-table data updates (#4593) 2025-12-05 19:10:23 +01:00
homarr-update-contributors[bot] d350e48998 chore: update contributors (#4591)
Co-authored-by: Homarr Update Contributors <210161987+homarr-update-contributors[bot]@users.noreply.github.com>
2025-12-05 14:56:10 +00:00
DZ945brH 2c48b18968 fix: add ipv6 support for internal nginx proxy 2025-12-05 13:04:17 +01:00
Meier Lukas 069ed0a267 chore: update bug-report template 2025-12-03 23:42:06 +01:00
Releases Homarr a3e53ec291 chore(release): 1.45.1 [skip ci] 2025-12-03 17:43:49 +00:00
homarr-releases[bot] 38a1c9ca83 chore(release): automatic release v1.45.1 2025-12-03 17:42:39 +00:00
Meier Lukas b40deba9ff fix(security): rce vulnerability in nextjs 2025-12-03 18:33:01 +01:00
homarr-renovate[bot] d5d59dd256 fix(deps): update mantine monorepo to ^8.3.9 (#4576)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 13:44:52 +00:00
homarr-renovate[bot] 3453482ed4 fix(deps): update trpc monorepo to ^11.7.2 (#4579)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 12:57:36 +00:00
homarr-renovate[bot] d2c1dc3cc1 fix(deps): update dependency swagger-ui-react to ^5.30.3 (#4574)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 12:54:17 +00:00
homarr-renovate[bot] 59bcbc8b4d fix(deps): update tanstack-query monorepo (#4578)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 11:33:29 +00:00
homarr-renovate[bot] b2c46d33d6 fix(deps): update dependency chroma-js to ^3.2.0 (#4585)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 11:28:54 +00:00
homarr-renovate[bot] ca01a31fe5 fix(deps): update dependency isomorphic-dompurify to ^2.33.0 (#4581)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:53:13 +00:00
homarr-renovate[bot] deb5e9d960 fix(deps): update dependency superjson to v2.2.6 (#4573)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:48:15 +00:00
homarr-renovate[bot] 16f12d98e6 fix(deps): update nextjs monorepo to v16.0.5 (#4577)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:45:55 +00:00
homarr-renovate[bot] 10bdd74b2b fix(deps): update testcontainers-node monorepo to ^11.9.0 (#4583)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:35:20 +00:00
Meier Lukas a91955a35b chore(docs): update sitemap 2025-12-03 11:31:46 +01:00
Meier Lukas 87deba417f chore: update bug-report template 2025-12-03 11:30:41 +01:00
homarr-renovate[bot] 220f68ee04 chore(deps): update pnpm to v10.24.0 (#4580)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:27:50 +00:00
homarr-renovate[bot] d6fc46df3b fix(deps): update dependency chroma-js to ^3.1.4 (#4570)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:24:55 +00:00
homarr-renovate[bot] 7a8c50fa4c fix(deps): update dependency sass to ^1.94.2 (#4572)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:24:23 +00:00
homarr-renovate[bot] 59eecaf842 chore(deps): update vitest monorepo to ^4.0.14 (#4568)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:12:54 +00:00
homarr-renovate[bot] 879a77ff2a fix(deps): update dependency zod to ^4.1.13 (#4575)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:10:53 +00:00
homarr-renovate[bot] b53bcb77e9 chore(deps): update dependency prettier-plugin-packagejson to ^2.5.20 (#4566)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:06:51 +00:00
homarr-renovate[bot] 3062ddafbe fix(deps): update dependency next-intl to v4.5.6 (#4571)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:06:32 +00:00
homarr-renovate[bot] 7f782220a1 chore(deps): update dependency vite@&gt;&#x3d;5.0.0 &lt;&#x3d;5.4.18 to >=7.2.4 (#4567)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:06:17 +00:00
homarr-renovate[bot] aa2ec5d221 chore(deps): update dependency hono@&lt;4.6.5 to >=4.10.7 (#4565)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 10:00:23 +00:00
homarr-renovate[bot] e6db47aaab chore(deps): update dependency @types/react to v19.2.7 (#4564)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-12-03 09:59:46 +00:00
homarr-crowdin[bot] f3d2026746 chore(lang): update translations from crowdin (#4560)
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-12-01 10:43:38 +01:00
homarr-crowdin[bot] ed31e32150 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-29 00:50:15 +00:00
Releases Homarr d07730b5f8 chore(release): 1.45.0 [skip ci] 2025-11-28 19:15:49 +00:00
homarr-releases[bot] 681236ec3b chore(release): automatic release v1.45.0 2025-11-28 19:14:48 +00:00
Meier Lukas 524e1a485b fix(security): restrict modification of entrypoint script (#4555) 2025-11-28 18:34:51 +01:00
homarr-renovate[bot] 2bc6964f7e fix(deps): update dependency next-intl to v4.5.5 (#4542)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-28 17:27:04 +00:00
Meier Lukas 21de817dba chore(deps): security hardening (#4551) 2025-11-28 18:09:10 +01:00
homarr-update-contributors[bot] b15d96e8dd chore: update contributors (#4554)
Co-authored-by: Homarr Update Contributors <210161987+homarr-update-contributors[bot]@users.noreply.github.com>
2025-11-28 12:36:13 +00:00
Noah Croghan 99949fe095 fix: Add fallback when no icon in Minecraft Server widget (#4544) (#4545) 2025-11-27 17:06:31 +01:00
homarr-crowdin[bot] 85d4931538 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-26 00:52:18 +00:00
homarr-renovate[bot] 77a86ead41 fix(deps): update dependency next-intl to v4.5.4 (#4540)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-24 13:02:10 +00:00
homarr-renovate[bot] 27ca124d2a chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.53.3 (#4537)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-24 09:51:55 +00:00
homarr-renovate[bot] 3ca6cb18eb chore(deps): update dependency @types/dockerode to ^3.3.47 (#4539)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-24 09:39:01 +00:00
homarr-crowdin[bot] 245bab7cdd chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-24 00:56:25 +00:00
homarr-renovate[bot] 18a6bfd69d fix(deps): update dependency glob to v12 (#4530)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-23 20:07:39 +01:00
homarr-renovate[bot] c4e6528e6c chore(deps): update dependency @types/react to v19.2.6 (#4532)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-23 04:47:11 +00:00
homarr-renovate[bot] 24c985424e fix(deps): update dependency glob to ^11.1.0 (#4529)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-23 04:06:56 +00:00
homarr-renovate[bot] 292e36fec5 fix(deps): update dependency sass to ^1.94.1 (#4531)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-23 02:19:13 +00:00
homarr-renovate[bot] 7eee48ae88 chore(deps): update vitest monorepo to ^4.0.10 (#4528)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-22 13:34:54 +00:00
homarr-renovate[bot] 1b09b588f3 chore(deps): update dependency form-data@&gt;&#x3d;4.0.0 &lt;4.0.4 to >=4.0.5 (#4525)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-22 10:42:15 +00:00
ManuelandCopilot Autofix powered by AI 22fb696f25 ci(security): missing permissions for workflow (#4474)
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-11-22 10:39:45 +00:00
generalmat82andMeier Lukas 60ab98ae36 feat(docker): hide containers with label homarr.hide (#4506)
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2025-11-22 11:32:31 +01:00
homarr-renovate[bot] 9a3feb404c fix(deps): update dependency zod-validation-error to v5 (#4437)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-22 10:35:43 +01:00
homarr-renovate[bot] 9c5c4f33ef chore(deps): update node.js to v24.11.1 (#4502)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-22 10:34:17 +01:00
homarr-crowdin[bot] 3ec0c4097a chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-22 00:49:38 +00:00
homarr-renovate[bot] e87170ae6e fix(deps): update dependency @tanstack/react-query to ^5.90.10 (#4523)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-21 21:29:15 +00:00
Meier Lukas 30fedcb6f1 chore: update bug-report template 2025-11-21 22:14:37 +01:00
Releases Homarr 6cc1209fc0 chore(release): 1.44.0 [skip ci] 2025-11-21 19:17:06 +00:00
homarr-releases[bot] 2b8fdc0281 chore(release): automatic release v1.44.0 2025-11-21 19:16:09 +00:00
Meier Lukas d9cc35b985 fix(media-requests): incorrect availability mapping (#4520) 2025-11-21 19:05:51 +01:00
Meier Lukas 5a418d73bd fix(iframe): allow clicking links within (#4521) 2025-11-21 19:05:24 +01:00
homarr-renovate[bot] ded4e72e54 fix(deps): update mantine monorepo to ^8.3.8 (#4516)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-20 11:30:16 +00:00
homarr-renovate[bot] de3602da84 chore(deps): update dependency @semantic-release/npm to ^13.1.2 (#4513)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 23:30:39 +00:00
homarr-renovate[bot] c80075f1c3 chore(deps): update dependency @types/react to v19.2.5 (#4515)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 22:32:13 +00:00
homarr-renovate[bot] be52cb82fd chore(deps): update vitest monorepo to ^4.0.9 (#4509)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 21:28:39 +00:00
homarr-renovate[bot] 9304d73054 chore(deps): update dependency hono@&lt;4.6.5 to >=4.10.6 (#4512)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 21:27:46 +00:00
homarr-renovate[bot] 912f9ff884 chore(deps): update dependency @types/dockerode to ^3.3.46 (#4514)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 20:33:11 +00:00
homarr-renovate[bot] 5e57a4906b fix(deps): update dependency fast-xml-parser to ^5.3.2 (#4510)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 09:36:42 +00:00
homarr-renovate[bot] b3db5d5f7b fix(deps): update dependency @tanstack/react-query to ^5.90.9 (#4508)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 08:41:31 +00:00
homarr-renovate[bot] ebc5bd170d chore(deps): update dependency glob to v11.1.0 [security] (#4500)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-19 03:19:15 +00:00
homarr-renovate[bot] b4f9fb8b46 fix(deps): update dependency drizzle-kit to ^0.31.7 (#4507)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-18 23:31:02 +00:00
homarr-renovate[bot] 7d0c1a14fd fix(deps): update nextjs monorepo to v16.0.3 (#4504)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-18 22:34:27 +00:00
Meier Lukas c89e35e13c feat(pi-hole): support no-auth (#4480) 2025-11-18 21:05:00 +01:00
homarr-renovate[bot] 8ea6cffb53 fix(deps): update dependency @tanstack/react-query-next-experimental to ^5.91.0 (#4505)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-18 17:39:07 +00:00
homarr-renovate[bot] 1bb96ce5cf chore(deps): update pnpm to v10.22.0 (#4495)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-18 17:38:36 +00:00
homarr-renovate[bot] 6da511bc2e chore(deps): update dependency @types/react to v19.2.4 (#4501)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-18 17:36:32 +00:00
homarr-renovate[bot] 064277373c fix(deps): update dependency next-intl to v4.5.3 (#4503)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-18 17:34:29 +00:00
homarr-crowdin[bot] 88fd0a63b6 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-18 00:51:48 +00:00
homarr-renovate[bot] 7fd5bf0699 chore(deps): update dependency jsdom to ^27.2.0 (#4492)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-17 14:35:27 +00:00
homarr-renovate[bot] 1bfa9d7158 chore(deps): update dependency @vitejs/plugin-react to ^5.1.1 (#4493)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-17 13:43:40 +00:00
homarr-renovate[bot] 57140f2c71 chore(deps): update dependency @types/react-dom to v19.2.3 (#4491)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-17 13:43:26 +00:00
homarr-renovate[bot] a5b6203be6 fix(deps): update dependency @tanstack/react-query to ^5.90.8 (#4494)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-17 13:00:35 +00:00
homarr-renovate[bot] aae81d3120 chore(deps): update dependency node to v24.11.1 (#4490)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-17 02:07:01 +00:00
homarr-crowdin[bot] 0fb01c90e9 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-17 00:53:59 +00:00
homarr-renovate[bot] 06942ecbcd fix(deps): update dependency next-intl to v4.5.1 (#4484)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-16 16:38:54 +00:00
homarr-renovate[bot] 006dee9e9b chore(deps): update node.js to v24.11.1 (#4481)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-16 16:37:12 +00:00
homarr-renovate[bot] f2df9839f1 chore(deps): update dependency @types/react to v19.2.3 (#4487)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-16 16:36:19 +00:00
homarr-renovate[bot] dcc23e721a chore(deps): update dependency hono@&lt;4.6.5 to >=4.10.5 (#4485)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-16 16:35:49 +00:00
homarr-renovate[bot] 64657d831c fix(deps): update testcontainers-node monorepo to ^11.8.1 (#4486)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-16 15:30:16 +00:00
homarr-renovate[bot] cd124d6e83 fix(deps): update turbo monorepo to ^2.6.1 (#4483)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-16 06:43:04 +00:00
homarr-renovate[bot] 19ecedea43 fix(deps): update dependency sass to ^1.94.0 (#4482)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-16 02:12:03 +00:00
homarr-renovate[bot] 5b55a4751b chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.53.2 (#4479)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-15 09:30:25 +00:00
homarr-renovate[bot] 266b9ffd1b chore(deps): update pnpm to v10.21.0 (#4478)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-15 02:01:31 +00:00
homarr-renovate[bot] 7a3a05b172 chore(deps): update dependency esbuild@&lt;&#x3d;0.24.2 to >=0.27.0 (#4477)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-14 20:36:02 +00:00
homarr-renovate[bot] a62c1385e3 chore(deps): update dependency esbuild to ^0.27.0 (#4476)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-14 19:28:44 +00:00
Releases Homarr 0bba7be8d5 chore(release): 1.43.3 [skip ci] 2025-11-14 19:16:15 +00:00
homarr-releases[bot] 96b556f558 chore(release): automatic release v1.43.3 2025-11-14 19:15:12 +00:00
Manuel aaa23f3732 Merge commit from fork
* fix: sanitize user-media svg api endpoint using isomorphic dompurify

* fix: add iframe sandbox to prevent priviledge escalation
2025-11-14 18:00:15 +01:00
homarr-update-contributors[bot] d33cfe211a chore: update contributors (#4473)
Co-authored-by: Homarr Update Contributors <210161987+homarr-update-contributors[bot]@users.noreply.github.com>
2025-11-14 12:36:49 +00:00
homarr-renovate[bot] e7071bf2bf fix(deps): update dependency fastify to ^5.6.2 (#4471)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-14 10:35:22 +00:00
homarr-renovate[bot] 8a87dbad59 fix(deps): update mantine monorepo to ^8.3.7 (#4472)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-14 09:35:28 +00:00
homarr-renovate[bot] 6a5f069383 chore(deps): update dependency esbuild@&lt;&#x3d;0.24.2 to >=0.26.0 (#4470)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-14 04:37:00 +00:00
homarr-renovate[bot] d8e4255733 chore(deps): update dependency esbuild to ^0.26.0 (#4469)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-14 03:25:59 +00:00
homarr-crowdin[bot] 1916eacb4d chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-14 00:52:23 +00:00
AartSchinkelandMeier Lukas c30c98b153 fix(stock-price): ignore missing data points in price history (#4429)
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2025-11-13 22:07:23 +01:00
homarr-renovate[bot] 89aed57645 chore(deps): update semantic-release monorepo (#4464)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-13 14:33:37 +00:00
homarr-renovate[bot] 251d1d0da3 chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.53.1 (#4465)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-12 22:31:40 +00:00
homarr-renovate[bot] 51ce5da45b fix(deps): update dependency next-intl to v4.5.0 (#4462)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-12 17:33:22 +00:00
homarr-renovate[bot] eff2202e92 chore(deps): update vitest monorepo to ^4.0.8 (#4459)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-12 17:32:42 +00:00
homarr-renovate[bot] bb25410a40 chore(deps): update dependency vite@&gt;&#x3d;5.0.0 &lt;&#x3d;5.4.18 to >=7.2.2 (#4457)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-12 17:31:53 +00:00
homarr-renovate[bot] 1a56a56989 chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.53.0 (#4463)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-12 16:42:50 +00:00
homarr-renovate[bot] ddfed18acf fix(deps): update dependency @ctrl/qbittorrent to ^9.11.0 (#4456)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-11 07:32:42 +00:00
homarr-renovate[bot] 7bc2f87f31 fix(deps): update dependency @tanstack/react-query to ^5.90.7 (#4451)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-11 05:33:17 +00:00
homarr-renovate[bot] 05a9d26138 chore(deps): update dependency vite@&gt;&#x3d;5.0.0 &lt;&#x3d;5.4.18 to >=7.2.1 (#4454)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-11 04:37:45 +00:00
homarr-renovate[bot] 4f96cdf9f7 chore(deps): update dependency vite@&gt;&#x3d;5.0.0 &lt;&#x3d;5.4.18 to >=7.2.0 (#4449)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-10 15:13:48 +00:00
ManuelandMeier Lukas 1c1f8a48d2 fix(users): next button in create form always disabled (#4443)
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2025-11-10 16:02:14 +01:00
homarr-renovate[bot] f648af0e2b fix(deps): update testcontainers-node monorepo to ^11.8.0 (#4450)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-10 10:36:35 +00:00
homarr-crowdin[bot] 35ca0571ad chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2025-11-10 00:55:24 +00:00
homarr-renovate[bot] 92a91329c9 chore(deps): update dependency axios@&gt;&#x3d;1.0.0 &lt;1.8.2 to >=1.13.2 (#4447)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-09 20:31:57 +00:00
homarr-renovate[bot] 23edb55c67 chore(deps): update dependency eslint to ^9.39.1 (#4440)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-09 16:34:41 +00:00
homarr-renovate[bot] 8449d606d7 chore(deps): update vitest monorepo to ^4.0.7 (#4444)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-09 15:28:38 +00:00
homarr-renovate[bot] d3edfcf3dc fix(deps): update dependency swagger-ui-react to ^5.30.2 (#4442)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-09 10:30:28 +00:00
homarr-renovate[bot] 65f2e825fd fix(deps): update dependency fast-xml-parser to ^5.3.1 (#4435)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-08 19:36:33 +00:00
homarr-renovate[bot] 286f4e764a chore(deps): update dependency @types/node to ^24.10.0 (#4434)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2025-11-08 01:57:46 +00:00
114 changed files with 2751 additions and 1773 deletions

No files matched your search

+3
View File
@@ -33,6 +33,9 @@ body:
options: options:
# The below comment is used to insert a new version with on-release.yml # The below comment is used to insert a new version with on-release.yml
#NEXT_VERSION# #NEXT_VERSION#
- 1.45.1
- 1.45.0
- 1.44.0
- 1.43.1 - 1.43.1
- 1.43.0 - 1.43.0
- 1.42.1 - 1.42.1
+15
View File
@@ -15,6 +15,21 @@
matchUpdateTypes: ["minor", "patch", "pin", "digest"], matchUpdateTypes: ["minor", "patch", "pin", "digest"],
automerge: true, automerge: true,
}, },
{
// disallow automerge for onlyBuiltDependencies
matchPackageNames: [
"@tree-sitter-grammars/tree-sitter-yaml",
"bcrypt",
"better-sqlite3",
"cpu-features",
"esbuild",
"sharp",
"ssh2",
"tree-sitter",
"tree-sitter-json",
],
automerge: false,
},
], ],
updateInternalDeps: true, updateInternalDeps: true,
rangeStrategy: "bump", rangeStrategy: "bump",
+2
View File
@@ -1,4 +1,6 @@
name: "[Quality] Code Analysis" name: "[Quality] Code Analysis"
permissions:
contents: read
on: on:
pull_request: pull_request:
+2
View File
@@ -1,4 +1,6 @@
name: "[Crowdin] Upload translations" name: "[Crowdin] Upload translations"
permissions:
contents: read
on: on:
workflow_dispatch: workflow_dispatch:
@@ -64,7 +64,7 @@ jobs:
- uses: actions/setup-node@v6 - uses: actions/setup-node@v6
if: env.SKIP_RELEASE == 'false' if: env.SKIP_RELEASE == 'false'
with: with:
node-version: 24.11.0 node-version: 24.11.1
cache: "pnpm" cache: "pnpm"
- run: npm i -g pnpm - run: npm i -g pnpm
if: env.SKIP_RELEASE == 'false' if: env.SKIP_RELEASE == 'false'
@@ -9,6 +9,8 @@ env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
CROWDIN_TOKEN: "${{ secrets.CROWDIN_UPDATE_CONTRIBUTORS_TOKEN }}" CROWDIN_TOKEN: "${{ secrets.CROWDIN_UPDATE_CONTRIBUTORS_TOKEN }}"
permissions:
contents: read
jobs: jobs:
update-contributors: update-contributors:
runs-on: ubuntu-latest runs-on: ubuntu-latest
+1
View File
@@ -3,3 +3,4 @@
# @link https://docs.expo.dev/guides/monorepos/#common-issues # @link https://docs.expo.dev/guides/monorepos/#common-issues
node-linker=hoisted node-linker=hoisted
strict-peer-dependencies=false strict-peer-dependencies=false
engine-strict=true
+1 -1
View File
@@ -1 +1 @@
24.11.0 24.11.1
+82
View File
@@ -1,3 +1,85 @@
## [1.45.2](https://github.com/homarr-labs/homarr/compare/v1.45.1...v1.45.2) (2025-12-05)
### Bug Fixes
* add ipv6 support for internal nginx proxy ([2c48b18](https://github.com/homarr-labs/homarr/commit/2c48b18968a74cb7150c246ebb2505d07764f109))
* disable react-compiler due to issue with mantine-react-table data updates ([#4593](https://github.com/homarr-labs/homarr/issues/4593)) ([10572ca](https://github.com/homarr-labs/homarr/commit/10572ca962081961fb63b3ad9f164c610edf35e4))
## [1.45.1](https://github.com/homarr-labs/homarr/compare/v1.45.0...v1.45.1) (2025-12-03)
### Bug Fixes
* **deps:** update dependency chroma-js to ^3.1.4 ([#4570](https://github.com/homarr-labs/homarr/issues/4570)) ([d6fc46d](https://github.com/homarr-labs/homarr/commit/d6fc46df3b5e2dd79ff6f9a3dd3a3e2050a0eeef))
* **deps:** update dependency chroma-js to ^3.2.0 ([#4585](https://github.com/homarr-labs/homarr/issues/4585)) ([b2c46d3](https://github.com/homarr-labs/homarr/commit/b2c46d33d6cc769e89e208fd29d3a1d143cf74c7))
* **deps:** update dependency isomorphic-dompurify to ^2.33.0 ([#4581](https://github.com/homarr-labs/homarr/issues/4581)) ([ca01a31](https://github.com/homarr-labs/homarr/commit/ca01a31fe5cbce53eb0e6bd1a943320c092161ef))
* **deps:** update dependency next-intl to v4.5.6 ([#4571](https://github.com/homarr-labs/homarr/issues/4571)) ([3062dda](https://github.com/homarr-labs/homarr/commit/3062ddafbe0bc1dbac9259af4036f0fa32d85237))
* **deps:** update dependency sass to ^1.94.2 ([#4572](https://github.com/homarr-labs/homarr/issues/4572)) ([7a8c50f](https://github.com/homarr-labs/homarr/commit/7a8c50fa4c5224dd74af3c17f56e2e5b8d6a4f43))
* **deps:** update dependency superjson to v2.2.6 ([#4573](https://github.com/homarr-labs/homarr/issues/4573)) ([deb5e9d](https://github.com/homarr-labs/homarr/commit/deb5e9d96092069e296ba473eaad58367b516f85))
* **deps:** update dependency swagger-ui-react to ^5.30.3 ([#4574](https://github.com/homarr-labs/homarr/issues/4574)) ([d2c1dc3](https://github.com/homarr-labs/homarr/commit/d2c1dc3cc1dd72fc9fc8ae9613467fa0b0b8d75a))
* **deps:** update dependency zod to ^4.1.13 ([#4575](https://github.com/homarr-labs/homarr/issues/4575)) ([879a77f](https://github.com/homarr-labs/homarr/commit/879a77ff2a81b0d0a17d1487eaf6d8539a955301))
* **deps:** update mantine monorepo to ^8.3.9 ([#4576](https://github.com/homarr-labs/homarr/issues/4576)) ([d5d59dd](https://github.com/homarr-labs/homarr/commit/d5d59dd2561f0be2f4f4c689f33c6a9a7840a21c))
* **deps:** update nextjs monorepo to v16.0.5 ([#4577](https://github.com/homarr-labs/homarr/issues/4577)) ([16f12d9](https://github.com/homarr-labs/homarr/commit/16f12d98e6cdae50fe2989db0911cb1350fcb93b))
* **deps:** update tanstack-query monorepo ([#4578](https://github.com/homarr-labs/homarr/issues/4578)) ([59bcbc8](https://github.com/homarr-labs/homarr/commit/59bcbc8b4de4a0a8cee8adf6336c7c10477c766a))
* **deps:** update testcontainers-node monorepo to ^11.9.0 ([#4583](https://github.com/homarr-labs/homarr/issues/4583)) ([10bdd74](https://github.com/homarr-labs/homarr/commit/10bdd74b2b287cb08ec0926147ac0e7fcfd492bb))
* **deps:** update trpc monorepo to ^11.7.2 ([#4579](https://github.com/homarr-labs/homarr/issues/4579)) ([3453482](https://github.com/homarr-labs/homarr/commit/3453482ed43644025c39dee8e20549e1beb86be0))
* **security:** rce vulnerability in nextjs ([b40deba](https://github.com/homarr-labs/homarr/commit/b40deba9ff1a3d629b6027565378d9f3ad2f1980))
## [1.45.0](https://github.com/homarr-labs/homarr/compare/v1.44.0...v1.45.0) (2025-11-28)
### Features
* **docker:** hide containers with label homarr.hide ([#4506](https://github.com/homarr-labs/homarr/issues/4506)) ([60ab98a](https://github.com/homarr-labs/homarr/commit/60ab98ae36abe712c825f7828394d3e3e98c888a))
### Bug Fixes
* Add fallback when no icon in Minecraft Server widget ([#4544](https://github.com/homarr-labs/homarr/issues/4544)) ([#4545](https://github.com/homarr-labs/homarr/issues/4545)) ([99949fe](https://github.com/homarr-labs/homarr/commit/99949fe095ac5a3616c8e9c1964d7eb253c9f826))
* **deps:** update dependency @tanstack/react-query to ^5.90.10 ([#4523](https://github.com/homarr-labs/homarr/issues/4523)) ([e87170a](https://github.com/homarr-labs/homarr/commit/e87170ae6e56cdbeef52e943353060329c39bdc9))
* **deps:** update dependency glob to ^11.1.0 ([#4529](https://github.com/homarr-labs/homarr/issues/4529)) ([24c9854](https://github.com/homarr-labs/homarr/commit/24c985424ecc795eb96b56881a9b00c0c37386c1))
* **deps:** update dependency glob to v12 ([#4530](https://github.com/homarr-labs/homarr/issues/4530)) ([18a6bfd](https://github.com/homarr-labs/homarr/commit/18a6bfd69d86de8c58dbfe6dc8b8fab78b2b5ee6))
* **deps:** update dependency next-intl to v4.5.4 ([#4540](https://github.com/homarr-labs/homarr/issues/4540)) ([77a86ea](https://github.com/homarr-labs/homarr/commit/77a86ead41c0d098987561249203667ac4d88177))
* **deps:** update dependency next-intl to v4.5.5 ([#4542](https://github.com/homarr-labs/homarr/issues/4542)) ([2bc6964](https://github.com/homarr-labs/homarr/commit/2bc6964f7efb5203f626d2f07b847dffd53191f0))
* **deps:** update dependency sass to ^1.94.1 ([#4531](https://github.com/homarr-labs/homarr/issues/4531)) ([292e36f](https://github.com/homarr-labs/homarr/commit/292e36fec5acff9b1d143f19e18ea170c87fa0d0))
* **deps:** update dependency zod-validation-error to v5 ([#4437](https://github.com/homarr-labs/homarr/issues/4437)) ([9a3feb4](https://github.com/homarr-labs/homarr/commit/9a3feb404c0c284b4f33fce12d87a469741a6ebd))
* **security:** restrict modification of entrypoint script ([#4555](https://github.com/homarr-labs/homarr/issues/4555)) ([524e1a4](https://github.com/homarr-labs/homarr/commit/524e1a485be56dbebf8f71d4546bc65672737f30))
## [1.44.0](https://github.com/homarr-labs/homarr/compare/v1.43.3...v1.44.0) (2025-11-21)
### Features
* **pi-hole:** support no-auth ([#4480](https://github.com/homarr-labs/homarr/issues/4480)) ([c89e35e](https://github.com/homarr-labs/homarr/commit/c89e35e13c794bbdf98748c00644b86f7f5dbe68))
### Bug Fixes
* **deps:** update dependency @tanstack/react-query to ^5.90.8 ([#4494](https://github.com/homarr-labs/homarr/issues/4494)) ([a5b6203](https://github.com/homarr-labs/homarr/commit/a5b6203be6ac3c2308614f10ef6a17590917e2c9))
* **deps:** update dependency @tanstack/react-query to ^5.90.9 ([#4508](https://github.com/homarr-labs/homarr/issues/4508)) ([b3db5d5](https://github.com/homarr-labs/homarr/commit/b3db5d5f7bc2d146f0b2c230a52e7bd4efad3bcb))
* **deps:** update dependency @tanstack/react-query-next-experimental to ^5.91.0 ([#4505](https://github.com/homarr-labs/homarr/issues/4505)) ([8ea6cff](https://github.com/homarr-labs/homarr/commit/8ea6cffb537ca54a413c583ab8b8fd24a52185be))
* **deps:** update dependency drizzle-kit to ^0.31.7 ([#4507](https://github.com/homarr-labs/homarr/issues/4507)) ([b4f9fb8](https://github.com/homarr-labs/homarr/commit/b4f9fb8b46a8f74e2d7896dfe98e80618cfbcde4))
* **deps:** update dependency fast-xml-parser to ^5.3.2 ([#4510](https://github.com/homarr-labs/homarr/issues/4510)) ([5e57a49](https://github.com/homarr-labs/homarr/commit/5e57a4906bcedc53d220e983827293f4a699c425))
* **deps:** update dependency next-intl to v4.5.1 ([#4484](https://github.com/homarr-labs/homarr/issues/4484)) ([06942ec](https://github.com/homarr-labs/homarr/commit/06942ecbcd245f5540f2960f437ca2955a5ed0c3))
* **deps:** update dependency next-intl to v4.5.3 ([#4503](https://github.com/homarr-labs/homarr/issues/4503)) ([0642773](https://github.com/homarr-labs/homarr/commit/064277373cacd3309d8da3779d5451d195da7f81))
* **deps:** update dependency sass to ^1.94.0 ([#4482](https://github.com/homarr-labs/homarr/issues/4482)) ([19ecede](https://github.com/homarr-labs/homarr/commit/19ecedea4370924d47545ca8d9d46a0b7c016cc9))
* **deps:** update mantine monorepo to ^8.3.8 ([#4516](https://github.com/homarr-labs/homarr/issues/4516)) ([ded4e72](https://github.com/homarr-labs/homarr/commit/ded4e72e5407b0076495a06111f3b04445f27276))
* **deps:** update nextjs monorepo to v16.0.3 ([#4504](https://github.com/homarr-labs/homarr/issues/4504)) ([7d0c1a1](https://github.com/homarr-labs/homarr/commit/7d0c1a14fdf1731ff44e3d00793cf4cd1c3e9b1f))
* **deps:** update testcontainers-node monorepo to ^11.8.1 ([#4486](https://github.com/homarr-labs/homarr/issues/4486)) ([64657d8](https://github.com/homarr-labs/homarr/commit/64657d831cbe28a59708b280b07889b9f0232743))
* **deps:** update turbo monorepo to ^2.6.1 ([#4483](https://github.com/homarr-labs/homarr/issues/4483)) ([cd124d6](https://github.com/homarr-labs/homarr/commit/cd124d6e8392eef5df0092481ec3cc26599f2902))
* **iframe:** allow clicking links within ([#4521](https://github.com/homarr-labs/homarr/issues/4521)) ([5a418d7](https://github.com/homarr-labs/homarr/commit/5a418d73bdb07cf3d3270983b6881f2de8d58ad7))
* **media-requests:** incorrect availability mapping ([#4520](https://github.com/homarr-labs/homarr/issues/4520)) ([d9cc35b](https://github.com/homarr-labs/homarr/commit/d9cc35b9859a14f44c4e4b13c6518287f8d18e54))
## [1.43.3](https://github.com/homarr-labs/homarr/compare/v1.43.2...v1.43.3) (2025-11-14)
### Bug Fixes
* **deps:** update dependency @ctrl/qbittorrent to ^9.11.0 ([#4456](https://github.com/homarr-labs/homarr/issues/4456)) ([ddfed18](https://github.com/homarr-labs/homarr/commit/ddfed18acf44596dba15ea0ef56233c4936f9775))
* **deps:** update dependency @tanstack/react-query to ^5.90.7 ([#4451](https://github.com/homarr-labs/homarr/issues/4451)) ([7bc2f87](https://github.com/homarr-labs/homarr/commit/7bc2f87f31f1babe691fa4a086a3897977f2d871))
* **deps:** update dependency fast-xml-parser to ^5.3.1 ([#4435](https://github.com/homarr-labs/homarr/issues/4435)) ([65f2e82](https://github.com/homarr-labs/homarr/commit/65f2e825fdb9e5e79b814c9b49f663d1afac784d))
* **deps:** update dependency fastify to ^5.6.2 ([#4471](https://github.com/homarr-labs/homarr/issues/4471)) ([e7071bf](https://github.com/homarr-labs/homarr/commit/e7071bf2bf6a45ff760cd3e7bd06382d2ed66cdc))
* **deps:** update dependency next-intl to v4.5.0 ([#4462](https://github.com/homarr-labs/homarr/issues/4462)) ([51ce5da](https://github.com/homarr-labs/homarr/commit/51ce5da45bdccf061e593097ed751cf09d663437))
* **deps:** update dependency swagger-ui-react to ^5.30.2 ([#4442](https://github.com/homarr-labs/homarr/issues/4442)) ([d3edfcf](https://github.com/homarr-labs/homarr/commit/d3edfcf3dca3d34afd5ef8ec21599cd08fde5092))
* **deps:** update mantine monorepo to ^8.3.7 ([#4472](https://github.com/homarr-labs/homarr/issues/4472)) ([8a87dba](https://github.com/homarr-labs/homarr/commit/8a87dbad59786fa9789dd3efb8d9424bb950e977))
* **deps:** update testcontainers-node monorepo to ^11.8.0 ([#4450](https://github.com/homarr-labs/homarr/issues/4450)) ([f648af0](https://github.com/homarr-labs/homarr/commit/f648af0e2b2b5d5f8180402c2734ea0c04559daa))
* **stock-price:** ignore missing data points in price history ([#4429](https://github.com/homarr-labs/homarr/issues/4429)) ([c30c98b](https://github.com/homarr-labs/homarr/commit/c30c98b153fbec21551e45aedf83e0ae29d6e773))
* **users:** next button in create form always disabled ([#4443](https://github.com/homarr-labs/homarr/issues/4443)) ([1c1f8a4](https://github.com/homarr-labs/homarr/commit/1c1f8a48d259c65ebeeec6856e1fe339defb4aaf))
## [1.43.2](https://github.com/homarr-labs/homarr/compare/v1.43.1...v1.43.2) (2025-11-07) ## [1.43.2](https://github.com/homarr-labs/homarr/compare/v1.43.1...v1.43.2) (2025-11-07)
### Bug Fixes ### Bug Fixes
+2 -2
View File
@@ -1,4 +1,4 @@
FROM node:24.11.0-alpine AS base FROM node:24.11.1-alpine AS base
FROM base AS builder FROM base AS builder
RUN apk add --no-cache libc6-compat RUN apk add --no-cache libc6-compat
@@ -55,7 +55,7 @@ COPY --from=builder /app/apps/nextjs/.next/standalone ./
COPY --from=builder /app/apps/nextjs/.next/static ./apps/nextjs/.next/static COPY --from=builder /app/apps/nextjs/.next/static ./apps/nextjs/.next/static
COPY --from=builder /app/apps/nextjs/public ./apps/nextjs/public COPY --from=builder /app/apps/nextjs/public ./apps/nextjs/public
COPY scripts/run.sh ./run.sh COPY scripts/run.sh ./run.sh
COPY --chmod=777 scripts/entrypoint.sh ./entrypoint.sh COPY --chmod=755 scripts/entrypoint.sh ./entrypoint.sh
COPY packages/redis/redis.conf /app/redis.conf COPY packages/redis/redis.conf /app/redis.conf
COPY nginx.conf /etc/nginx/templates/nginx.conf COPY nginx.conf /etc/nginx/templates/nginx.conf
+4 -2
View File
@@ -20,13 +20,15 @@ const withNextIntl = createNextIntlPlugin({
const nextConfig: NextConfig = { const nextConfig: NextConfig = {
output: "standalone", output: "standalone",
reactStrictMode: true, reactStrictMode: true,
reactCompiler: true, // react compiler breaks mantine-react-table, so disabled for now
//reactCompiler: true,
/** We already do typechecking as separate tasks in CI */ /** We already do typechecking as separate tasks in CI */
typescript: { ignoreBuildErrors: true }, typescript: { ignoreBuildErrors: true },
/** /**
* dockerode is required in the external server packages because of https://github.com/homarr-labs/homarr/issues/612 * dockerode is required in the external server packages because of https://github.com/homarr-labs/homarr/issues/612
* isomorphic-dompurify and jsdom are required, see https://github.com/kkomelin/isomorphic-dompurify/issues/356
*/ */
serverExternalPackages: ["dockerode"], serverExternalPackages: ["dockerode", "isomorphic-dompurify", "jsdom"],
experimental: { experimental: {
optimizePackageImports: ["@mantine/core", "@mantine/hooks", "@tabler/icons-react"], optimizePackageImports: ["@mantine/core", "@mantine/hooks", "@tabler/icons-react"],
turbopackFileSystemCacheForDev: true, turbopackFileSystemCacheForDev: true,
+25 -24
View File
@@ -50,58 +50,59 @@
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.3.6", "@mantine/colors-generator": "^8.3.9",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"@mantine/dropzone": "^8.3.6", "@mantine/dropzone": "^8.3.9",
"@mantine/hooks": "^8.3.6", "@mantine/hooks": "^8.3.9",
"@mantine/modals": "^8.3.6", "@mantine/modals": "^8.3.9",
"@mantine/tiptap": "^8.3.6", "@mantine/tiptap": "^8.3.9",
"@million/lint": "1.0.14", "@million/lint": "1.0.14",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"@tanstack/react-query": "^5.90.6", "@tanstack/react-query": "^5.90.11",
"@tanstack/react-query-devtools": "^5.90.2", "@tanstack/react-query-devtools": "^5.91.1",
"@tanstack/react-query-next-experimental": "^5.90.2", "@tanstack/react-query-next-experimental": "^5.91.0",
"@trpc/client": "^11.7.1", "@trpc/client": "^11.7.2",
"@trpc/next": "^11.7.1", "@trpc/next": "^11.7.2",
"@trpc/react-query": "^11.7.1", "@trpc/react-query": "^11.7.2",
"@trpc/server": "^11.7.1", "@trpc/server": "^11.7.2",
"@xterm/addon-canvas": "^0.7.0", "@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-fit": "0.10.0", "@xterm/addon-fit": "0.10.0",
"@xterm/xterm": "^5.5.0", "@xterm/xterm": "^5.5.0",
"babel-plugin-react-compiler": "^1.0.0", "babel-plugin-react-compiler": "^1.0.0",
"chroma-js": "^3.1.2", "chroma-js": "^3.2.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"dayjs": "^1.11.19", "dayjs": "^1.11.19",
"dotenv": "^17.2.3", "dotenv": "^17.2.3",
"flag-icons": "^7.5.0", "flag-icons": "^7.5.0",
"glob": "^11.0.3", "glob": "^12.0.0",
"isomorphic-dompurify": "^2.33.0",
"jotai": "^2.15.1", "jotai": "^2.15.1",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "16.0.1", "next": "16.0.7",
"postcss-preset-mantine": "^1.18.0", "postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0", "prismjs": "^1.30.0",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"react-error-boundary": "^6.0.0", "react-error-boundary": "^6.0.0",
"react-simple-code-editor": "^0.14.1", "react-simple-code-editor": "^0.14.1",
"sass": "^1.93.3", "sass": "^1.94.2",
"superjson": "2.2.5", "superjson": "2.2.6",
"swagger-ui-react": "^5.30.1", "swagger-ui-react": "^5.30.3",
"use-deep-compare-effect": "^1.8.1", "use-deep-compare-effect": "^1.8.1",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/chroma-js": "3.1.2", "@types/chroma-js": "3.1.2",
"@types/node": "^24.9.2", "@types/node": "^24.10.1",
"@types/prismjs": "^1.26.5", "@types/prismjs": "^1.26.5",
"@types/react": "19.2.2", "@types/react": "19.2.7",
"@types/react-dom": "19.2.2", "@types/react-dom": "19.2.3",
"@types/swagger-ui-react": "^5.18.0", "@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.2.1", "concurrently": "^9.2.1",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"node-loader": "^2.1.0", "node-loader": "^2.1.0",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.3" "typescript": "^5.9.3"
@@ -1,6 +1,6 @@
"use client"; "use client";
import { startTransition, useCallback, useMemo, useState } from "react"; import { startTransition, useCallback, useState } from "react";
import { import {
Badge, Badge,
Button, Button,
@@ -20,8 +20,9 @@ import { IconPlus, IconUserCheck } from "@tabler/icons-react";
import { z } from "zod/v4"; import { z } from "zod/v4";
import { clientApi } from "@homarr/api/client"; import { clientApi } from "@homarr/api/client";
import { everyoneGroup, groupPermissions } from "@homarr/definitions";
import type { GroupPermissionKey } from "@homarr/definitions"; import type { GroupPermissionKey } from "@homarr/definitions";
import { everyoneGroup, groupPermissions } from "@homarr/definitions";
import type { IsValid } from "@homarr/form";
import { useZodForm } from "@homarr/form"; import { useZodForm } from "@homarr/form";
import { useModalAction } from "@homarr/modals"; import { useModalAction } from "@homarr/modals";
import { showErrorNotification } from "@homarr/notifications"; import { showErrorNotification } from "@homarr/notifications";
@@ -113,11 +114,9 @@ export const UserCreateStepperComponent = ({ initialGroups }: UserCreateStepperC
}, },
); );
const allForms = useMemo(() => [generalForm, securityForm, groupsForm], [generalForm, securityForm, groupsForm]); const allForms = [generalForm, securityForm, groupsForm];
const isValidCallback: IsValid<unknown> | undefined = allForms[active]?.isValid;
const activeForm = allForms[active]; const currentFormValid = isValidCallback?.() ?? true;
const isCurrentFormValid = activeForm ? activeForm.isValid : () => true;
const canNavigateToNextStep = isCurrentFormValid();
const controlledGoToNextStep = useCallback(async () => { const controlledGoToNextStep = useCallback(async () => {
if (active + 1 === stepperMax) { if (active + 1 === stepperMax) {
@@ -218,7 +217,7 @@ export const UserCreateStepperComponent = ({ initialGroups }: UserCreateStepperC
</Stepper.Completed> </Stepper.Completed>
</Stepper> </Stepper>
<StepperNavigationComponent <StepperNavigationComponent
hasNext={hasNext && canNavigateToNextStep} hasNext={hasNext && currentFormValid}
hasPrevious={hasPrevious} hasPrevious={hasPrevious}
isComplete={active === stepperMax} isComplete={active === stepperMax}
isLoadingNextStep={isPending} isLoadingNextStep={isPending}
@@ -1,6 +1,7 @@
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import type { NextRequest } from "next/server"; import type { NextRequest } from "next/server";
import DOMPurify from "isomorphic-dompurify";
import { db, eq } from "@homarr/db"; import { db, eq } from "@homarr/db";
import { medias } from "@homarr/db/schema"; import { medias } from "@homarr/db/schema";
@@ -19,11 +20,24 @@ export async function GET(_req: NextRequest, props: { params: Promise<{ id: stri
notFound(); notFound();
} }
let content = new Uint8Array(image.content);
// Sanitize SVG content to prevent XSS attacks
if (image.contentType === "image/svg+xml" || image.contentType === "image/svg") {
const svgText = new TextDecoder().decode(content);
const sanitized = DOMPurify.sanitize(svgText, {
USE_PROFILES: { svg: true, svgFilters: true },
});
content = new TextEncoder().encode(sanitized);
}
const headers = new Headers(); const headers = new Headers();
headers.set("Content-Type", image.contentType); headers.set("Content-Type", image.contentType);
headers.set("Content-Length", image.content.length.toString()); headers.set("Content-Length", content.length.toString());
headers.set("Content-Security-Policy", "default-src 'none'; style-src 'unsafe-inline'; sandbox");
headers.set("X-Content-Type-Options", "nosniff");
return new NextResponse(new Uint8Array(image.content), { return new NextResponse(content, {
status: 200, status: 200,
headers, headers,
}); });
+5 -5
View File
@@ -39,18 +39,18 @@
"@homarr/widgets": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0",
"dayjs": "^1.11.19", "dayjs": "^1.11.19",
"dotenv": "^17.2.3", "dotenv": "^17.2.3",
"fastify": "^5.6.1", "fastify": "^5.6.2",
"superjson": "2.2.5", "superjson": "2.2.6",
"undici": "7.16.0" "undici": "7.16.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node": "^24.9.2", "@types/node": "^24.10.1",
"dotenv-cli": "^11.0.0", "dotenv-cli": "^11.0.0",
"esbuild": "^0.25.12", "esbuild": "^0.27.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"tsx": "4.20.4", "tsx": "4.20.4",
"typescript": "^5.9.3" "typescript": "^5.9.3"
+2 -2
View File
@@ -34,8 +34,8 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/ws": "^8.18.1", "@types/ws": "^8.18.1",
"esbuild": "^0.25.12", "esbuild": "^0.27.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
+2 -1
View File
@@ -5,6 +5,7 @@ events {
http { http {
server { server {
listen 7575; listen 7575;
listen [::]:7575;
# Route websockets traffic to port 3001 # Route websockets traffic to port 3001
location /websockets { location /websockets {
@@ -25,4 +26,4 @@ http {
client_max_body_size 32M; client_max_body_size 32M;
} }
} }
} }
+23 -21
View File
@@ -1,6 +1,6 @@
{ {
"name": "homarr", "name": "homarr",
"version": "1.43.2", "version": "1.45.2",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "cross-env CI=true turbo build", "build": "cross-env CI=true turbo build",
@@ -39,28 +39,30 @@
"@semantic-release/changelog": "^6.0.3", "@semantic-release/changelog": "^6.0.3",
"@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/commit-analyzer": "^13.0.1",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"@semantic-release/github": "^12.0.1", "@semantic-release/github": "^12.0.2",
"@semantic-release/npm": "^13.1.1", "@semantic-release/npm": "^13.1.2",
"@semantic-release/release-notes-generator": "^14.1.0", "@semantic-release/release-notes-generator": "^14.1.0",
"@testcontainers/redis": "^11.7.2", "@testcontainers/redis": "^11.9.0",
"@turbo/gen": "^2.6.0", "@turbo/gen": "^2.6.1",
"@vitejs/plugin-react": "^5.1.0", "@vitejs/plugin-react": "^5.1.1",
"@vitest/coverage-v8": "^4.0.6", "@vitest/coverage-v8": "^4.0.14",
"@vitest/ui": "^4.0.6", "@vitest/ui": "^4.0.14",
"conventional-changelog-conventionalcommits": "^9.1.0", "conventional-changelog-conventionalcommits": "^9.1.0",
"cross-env": "^10.1.0", "cross-env": "^10.1.0",
"jsdom": "^27.1.0", "jsdom": "^27.2.0",
"json5": "^2.2.3",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"semantic-release": "^25.0.1", "semantic-release": "^25.0.2",
"testcontainers": "^11.7.2", "testcontainers": "^11.9.0",
"turbo": "^2.6.0", "turbo": "^2.6.1",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",
"vitest": "^4.0.6" "vitest": "^4.0.14"
}, },
"packageManager": "pnpm@10.20.0", "packageManager": "pnpm@10.24.0",
"engines": { "engines": {
"node": ">=24.11.0" "node": ">=24.11.1",
"pnpm": ">=10.24.0"
}, },
"pnpm": { "pnpm": {
"onlyBuiltDependencies": [ "onlyBuiltDependencies": [
@@ -77,23 +79,23 @@
"overrides": { "overrides": {
"@babel/helpers@<7.26.10": ">=7.28.4", "@babel/helpers@<7.26.10": ">=7.28.4",
"@babel/runtime@<7.26.10": ">=7.28.4", "@babel/runtime@<7.26.10": ">=7.28.4",
"axios@>=1.0.0 <1.8.2": ">=1.13.1", "axios@>=1.0.0 <1.8.2": ">=1.13.2",
"brace-expansion@>=2.0.0 <=2.0.1": ">=4.0.1", "brace-expansion@>=2.0.0 <=2.0.1": ">=4.0.1",
"brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1", "brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1",
"esbuild@<=0.24.2": ">=0.25.12", "esbuild@<=0.24.2": ">=0.27.0",
"form-data@>=4.0.0 <4.0.4": ">=4.0.4", "form-data@>=4.0.0 <4.0.4": ">=4.0.5",
"hono@<4.6.5": ">=4.10.4", "hono@<4.6.5": ">=4.10.7",
"linkifyjs@<4.3.2": ">=4.3.2", "linkifyjs@<4.3.2": ">=4.3.2",
"nanoid@>=4.0.0 <5.0.9": ">=5.1.6", "nanoid@>=4.0.0 <5.0.9": ">=5.1.6",
"prismjs@<1.30.0": ">=1.30.0", "prismjs@<1.30.0": ">=1.30.0",
"proxmox-api>undici": "7.16.0", "proxmox-api>undici": "7.16.0",
"react-is": "^19.2.0", "react-is": "^19.2.0",
"rollup@>=4.0.0 <4.22.4": ">=4.52.5", "rollup@>=4.0.0 <4.22.4": ">=4.53.3",
"sha.js@<=2.4.11": ">=2.4.12", "sha.js@<=2.4.11": ">=2.4.12",
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.1", "tar-fs@>=3.0.0 <3.0.9": ">=3.1.1",
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.1", "tar-fs@>=2.0.0 <2.1.3": ">=3.1.1",
"tmp@<=0.2.3": ">=0.2.5", "tmp@<=0.2.3": ">=0.2.5",
"vite@>=5.0.0 <=5.4.18": ">=7.1.12" "vite@>=5.0.0 <=5.4.18": ">=7.2.4"
}, },
"patchedDependencies": { "patchedDependencies": {
"@types/node-unifi": "patches/@types__node-unifi.patch", "@types/node-unifi": "patches/@types__node-unifi.patch",
+2 -2
View File
@@ -26,13 +26,13 @@
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@umami/node": "^0.4.0", "@umami/node": "^0.4.0",
"superjson": "2.2.5" "superjson": "2.2.6"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+9 -9
View File
@@ -43,24 +43,24 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.4.0", "@kubernetes/client-node": "^1.4.0",
"@tanstack/react-query": "^5.90.6", "@tanstack/react-query": "^5.90.11",
"@trpc/client": "^11.7.1", "@trpc/client": "^11.7.2",
"@trpc/react-query": "^11.7.1", "@trpc/react-query": "^11.7.2",
"@trpc/server": "^11.7.1", "@trpc/server": "^11.7.2",
"@trpc/tanstack-react-query": "^11.7.1", "@trpc/tanstack-react-query": "^11.7.2",
"lodash.clonedeep": "^4.5.0", "lodash.clonedeep": "^4.5.0",
"next": "16.0.1", "next": "16.0.7",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"superjson": "2.2.5", "superjson": "2.2.6",
"trpc-to-openapi": "^3.1.0", "trpc-to-openapi": "^3.1.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
@@ -3,6 +3,7 @@ import { z } from "zod/v4";
import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { getIntegrationKindsByCategory } from "@homarr/definitions";
import { createIntegrationAsync } from "@homarr/integrations"; import { createIntegrationAsync } from "@homarr/integrations";
import { mediaRequestStatusConfiguration } from "@homarr/integrations/types";
import type { MediaRequest } from "@homarr/integrations/types"; import type { MediaRequest } from "@homarr/integrations/types";
import { mediaRequestListRequestHandler } from "@homarr/request-handler/media-request-list"; import { mediaRequestListRequestHandler } from "@homarr/request-handler/media-request-list";
import { mediaRequestStatsRequestHandler } from "@homarr/request-handler/media-request-stats"; import { mediaRequestStatsRequestHandler } from "@homarr/request-handler/media-request-stats";
@@ -35,7 +36,10 @@ export const mediaRequestsRouter = createTRPCRouter({
return dataB.createdAt.getTime() - dataA.createdAt.getTime(); return dataB.createdAt.getTime() - dataA.createdAt.getTime();
} }
return dataA.status - dataB.status; return (
mediaRequestStatusConfiguration[dataA.status].position -
mediaRequestStatusConfiguration[dataB.status].position
);
}); });
}), }),
subscribeToLatestRequests: publicProcedure subscribeToLatestRequests: publicProcedure
+3 -3
View File
@@ -35,11 +35,11 @@
"bcrypt": "^6.0.0", "bcrypt": "^6.0.0",
"cookies": "^0.9.1", "cookies": "^0.9.1",
"ldapts": "8.0.9", "ldapts": "8.0.9",
"next": "16.0.1", "next": "16.0.7",
"next-auth": "5.0.0-beta.30", "next-auth": "5.0.0-beta.30",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
@@ -47,7 +47,7 @@
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/bcrypt": "6.0.0", "@types/bcrypt": "6.0.0",
"@types/cookies": "0.9.2", "@types/cookies": "0.9.2",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
+1 -1
View File
@@ -32,7 +32,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -30,7 +30,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+2 -2
View File
@@ -34,8 +34,8 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"esbuild": "^0.25.12", "esbuild": "^0.27.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+4 -4
View File
@@ -32,19 +32,19 @@
"@paralleldrive/cuid2": "^3.1.0", "@paralleldrive/cuid2": "^3.1.0",
"dayjs": "^1.11.19", "dayjs": "^1.11.19",
"dns-caching": "^0.2.7", "dns-caching": "^0.2.7",
"next": "16.0.1", "next": "16.0.7",
"octokit": "^5.0.5", "octokit": "^5.0.5",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"undici": "7.16.0", "undici": "7.16.0",
"zod": "^4.1.12", "zod": "^4.1.13",
"zod-validation-error": "^4.0.2" "zod-validation-error": "^5.0.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+2 -2
View File
@@ -26,13 +26,13 @@
"dependencies": { "dependencies": {
"@t3-oss/env-nextjs": "^0.13.8", "@t3-oss/env-nextjs": "^0.13.8",
"ioredis": "5.8.2", "ioredis": "5.8.2",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+7 -7
View File
@@ -29,21 +29,21 @@
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@tanstack/react-query": "^5.90.6", "@tanstack/react-query": "^5.90.11",
"@trpc/client": "^11.7.1", "@trpc/client": "^11.7.2",
"@trpc/server": "^11.7.1", "@trpc/server": "^11.7.2",
"@trpc/tanstack-react-query": "^11.7.1", "@trpc/tanstack-react-query": "^11.7.2",
"node-cron": "^4.2.1", "node-cron": "^4.2.1",
"react": "19.2.0", "react": "19.2.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"@types/react": "19.2.2", "@types/react": "19.2.7",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -29,7 +29,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -33,7 +33,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -44,7 +44,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+7 -7
View File
@@ -49,18 +49,18 @@
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"@paralleldrive/cuid2": "^3.1.0", "@paralleldrive/cuid2": "^3.1.0",
"@testcontainers/mysql": "^11.7.2", "@testcontainers/mysql": "^11.9.0",
"@testcontainers/postgresql": "^11.7.2", "@testcontainers/postgresql": "^11.9.0",
"better-sqlite3": "^12.4.1", "better-sqlite3": "^12.4.1",
"dotenv": "^17.2.3", "dotenv": "^17.2.3",
"drizzle-kit": "^0.31.6", "drizzle-kit": "^0.31.7",
"drizzle-orm": "^0.44.7", "drizzle-orm": "^0.44.7",
"drizzle-zod": "^0.8.3", "drizzle-zod": "^0.8.3",
"mysql2": "3.15.3", "mysql2": "3.15.3",
"pg": "^8.16.3", "pg": "^8.16.3",
"superjson": "2.2.5" "superjson": "2.2.6"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
@@ -69,8 +69,8 @@
"@types/better-sqlite3": "7.6.13", "@types/better-sqlite3": "7.6.13",
"@types/pg": "^8.15.6", "@types/pg": "^8.15.6",
"dotenv-cli": "^11.0.0", "dotenv-cli": "^11.0.0",
"esbuild": "^0.25.12", "esbuild": "^0.27.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"tsx": "4.20.4", "tsx": "4.20.4",
"typescript": "^5.9.3" "typescript": "^5.9.3"
+3 -3
View File
@@ -24,14 +24,14 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"fast-xml-parser": "^5.3.0", "fast-xml-parser": "^5.3.2",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"tsx": "4.20.4", "tsx": "4.20.4",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
@@ -144,6 +144,7 @@ export type HomarrDocumentationPath =
| "/docs/getting-started/installation/proxmox" | "/docs/getting-started/installation/proxmox"
| "/docs/getting-started/installation/qnap" | "/docs/getting-started/installation/qnap"
| "/docs/getting-started/installation/railway" | "/docs/getting-started/installation/railway"
| "/docs/getting-started/installation/runtipi"
| "/docs/getting-started/installation/saltbox" | "/docs/getting-started/installation/saltbox"
| "/docs/getting-started/installation/source" | "/docs/getting-started/installation/source"
| "/docs/getting-started/installation/synology" | "/docs/getting-started/installation/synology"
+1 -1
View File
@@ -145,7 +145,7 @@ export const integrationDefs = {
}, },
piHole: { piHole: {
name: "Pi-hole", name: "Pi-hole",
secretKinds: [["apiKey"]], secretKinds: [["apiKey"], []],
iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/pi-hole.svg", iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/pi-hole.svg",
category: ["dnsHole"], category: ["dnsHole"],
documentationUrl: createDocumentationLink("/docs/integrations/pi-hole"), documentationUrl: createDocumentationLink("/docs/integrations/pi-hole"),
+2 -2
View File
@@ -32,8 +32,8 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/dockerode": "^3.3.45", "@types/dockerode": "^3.3.47",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1
View File
@@ -8,3 +8,4 @@ export type { Docker };
export const containerStates = ["created", "running", "paused", "restarting", "exited", "removing", "dead"] as const; export const containerStates = ["created", "running", "paused", "restarting", "exited", "removing", "dead"] as const;
export type ContainerState = (typeof containerStates)[number]; export type ContainerState = (typeof containerStates)[number];
export * from "./labels";
+4
View File
@@ -0,0 +1,4 @@
export const dockerLabels = {
// Label to hide a container from Homarrs docker integration
hide: "homarr.hide",
} as const;
+3 -3
View File
@@ -26,15 +26,15 @@
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.3.6", "@mantine/form": "^8.3.9",
"mantine-form-zod-resolver": "^1.3.0", "mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+3 -3
View File
@@ -30,15 +30,15 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"react": "19.2.0", "react": "19.2.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -31,7 +31,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -33,7 +33,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/bcrypt": "6.0.0", "@types/bcrypt": "6.0.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+3 -3
View File
@@ -26,7 +26,7 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@ctrl/deluge": "^7.5.0", "@ctrl/deluge": "^7.5.0",
"@ctrl/qbittorrent": "^9.10.0", "@ctrl/qbittorrent": "^9.11.0",
"@ctrl/transmission": "^7.4.0", "@ctrl/transmission": "^7.4.0",
"@gitbeaker/rest": "^43.8.0", "@gitbeaker/rest": "^43.8.0",
"@homarr/certificates": "workspace:^0.1.0", "@homarr/certificates": "workspace:^0.1.0",
@@ -49,7 +49,7 @@
"tsdav": "^2.1.6", "tsdav": "^2.1.6",
"undici": "7.16.0", "undici": "7.16.0",
"xml2js": "^0.6.2", "xml2js": "^0.6.2",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
@@ -57,7 +57,7 @@
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-unifi": "^2.5.1", "@types/node-unifi": "^2.5.1",
"@types/xml2js": "^0.4.14", "@types/xml2js": "^0.4.14",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -38,7 +38,7 @@ export type {
FirewallMemorySummary, FirewallMemorySummary,
} from "./interfaces/firewall-summary/firewall-summary-types"; } from "./interfaces/firewall-summary/firewall-summary-types";
export type { SystemHealthMonitoring } from "./interfaces/health-monitoring/health-monitoring-types"; export type { SystemHealthMonitoring } from "./interfaces/health-monitoring/health-monitoring-types";
export { MediaRequestStatus } from "./interfaces/media-requests/media-request-types"; export { UpstreamMediaRequestStatus } from "./interfaces/media-requests/media-request-types";
export type { MediaRequestList, MediaRequestStats } from "./interfaces/media-requests/media-request-types"; export type { MediaRequestList, MediaRequestStats } from "./interfaces/media-requests/media-request-types";
export type { StreamSession } from "./interfaces/media-server/media-server-types"; export type { StreamSession } from "./interfaces/media-server/media-server-types";
export type { export type {
@@ -1,3 +1,5 @@
import { objectKeys } from "@homarr/common";
interface SerieSeason { interface SerieSeason {
id: number; id: number;
seasonNumber: number; seasonNumber: number;
@@ -34,6 +36,64 @@ export interface MediaRequest {
requestedBy?: Omit<RequestUser, "requestCount">; requestedBy?: Omit<RequestUser, "requestCount">;
} }
export const mediaAvailabilityConfiguration = {
available: {
color: "green",
},
partiallyAvailable: {
color: "yellow",
},
processing: {
color: "blue",
},
requested: {
color: "violet",
},
pending: {
color: "violet",
},
unknown: {
color: "orange",
},
deleted: {
color: "red",
},
blacklisted: {
color: "gray",
},
} satisfies Record<string, { color: string }>;
export const mediaAvailabilities = objectKeys(mediaAvailabilityConfiguration);
export type MediaAvailability = (typeof mediaAvailabilities)[number];
export const mediaRequestStatusConfiguration = {
pending: {
color: "blue",
position: 1,
},
approved: {
color: "green",
position: 2,
},
declined: {
color: "red",
position: 3,
},
failed: {
color: "red",
position: 4,
},
completed: {
color: "green",
position: 5,
},
} satisfies Record<string, { color: string; position: number }>;
export const mediaRequestStatuses = objectKeys(mediaRequestStatusConfiguration);
export type MediaRequestStatus = (typeof mediaRequestStatuses)[number];
export interface MediaRequestList { export interface MediaRequestList {
integration: { integration: {
id: string; id: string;
@@ -66,7 +126,7 @@ export interface MediaRequestStats {
} }
// https://github.com/fallenbagel/jellyseerr/blob/0fd03f38480f853e7015ad9229ed98160e37602e/server/constants/media.ts#L1 // https://github.com/fallenbagel/jellyseerr/blob/0fd03f38480f853e7015ad9229ed98160e37602e/server/constants/media.ts#L1
export enum MediaRequestStatus { export enum UpstreamMediaRequestStatus {
PendingApproval = 1, PendingApproval = 1,
Approved = 2, Approved = 2,
Declined = 3, Declined = 3,
@@ -75,12 +135,12 @@ export enum MediaRequestStatus {
} }
// https://github.com/fallenbagel/jellyseerr/blob/0fd03f38480f853e7015ad9229ed98160e37602e/server/constants/media.ts#L14 // https://github.com/fallenbagel/jellyseerr/blob/0fd03f38480f853e7015ad9229ed98160e37602e/server/constants/media.ts#L14
export enum MediaAvailability { export enum UpstreamMediaAvailability {
Unknown = 1, Unknown = 1,
Pending = 2, Pending = 2,
Processing = 3, Processing = 3,
PartiallyAvailable = 4, PartiallyAvailable = 4,
Available = 5, Available = 5,
Blacklisted = 6, JellyseerrBlacklistedOrOverseerrDeleted = 6,
Deleted = 7, JellyseerrDeleted = 7,
} }
@@ -1,3 +1,12 @@
import type { MediaAvailability } from "../interfaces/media-requests/media-request-types";
import { UpstreamMediaAvailability } from "../interfaces/media-requests/media-request-types";
import { OverseerrIntegration } from "../overseerr/overseerr-integration"; import { OverseerrIntegration } from "../overseerr/overseerr-integration";
export class JellyseerrIntegration extends OverseerrIntegration {} export class JellyseerrIntegration extends OverseerrIntegration {
protected override mapAvailability(availability: UpstreamMediaAvailability, inProgress: boolean): MediaAvailability {
// Availability statuses are not exactly the same between Jellyseerr and Overseerr (Jellyseerr has "blacklisted" additionally (deleted is the same value in overseerr))
if (availability === UpstreamMediaAvailability.JellyseerrBlacklistedOrOverseerrDeleted) return "blacklisted";
if (availability === UpstreamMediaAvailability.JellyseerrDeleted) return "deleted";
return super.mapAvailability(availability, inProgress);
}
}
@@ -1,8 +1,13 @@
import { objectEntries } from "@homarr/common";
import type { IMediaRequestIntegration } from "../../interfaces/media-requests/media-request-integration"; import type { IMediaRequestIntegration } from "../../interfaces/media-requests/media-request-integration";
import type { MediaInformation, MediaRequest, RequestStats, RequestUser } from "../../types"; import type {
import { MediaAvailability, MediaRequestStatus } from "../../types"; MediaAvailability,
MediaInformation,
MediaRequest,
MediaRequestStatus,
RequestStats,
RequestUser,
} from "../../types";
import { mediaAvailabilities, mediaRequestStatuses } from "../../types";
export class MediaRequestMockService implements IMediaRequestIntegration { export class MediaRequestMockService implements IMediaRequestIntegration {
public async getSeriesInformationAsync(mediaType: "movie" | "tv", id: number): Promise<MediaInformation> { public async getSeriesInformationAsync(mediaType: "movie" | "tv", id: number): Promise<MediaInformation> {
@@ -86,12 +91,10 @@ export class MediaRequestMockService implements IMediaRequestIntegration {
} }
private static randomAvailability(): MediaAvailability { private static randomAvailability(): MediaAvailability {
const values = objectEntries(MediaAvailability).filter(([key]) => typeof key === "number"); return mediaAvailabilities.at(Math.floor(Math.random() * mediaAvailabilities.length)) ?? "unknown";
return values[Math.floor(Math.random() * values.length)]?.[1] ?? MediaAvailability.Available;
} }
private static randomStatus(): MediaRequestStatus { private static randomStatus(): MediaRequestStatus {
const values = objectEntries(MediaRequestStatus).filter(([key]) => typeof key === "number"); return mediaRequestStatuses.at(Math.floor(Math.random() * mediaRequestStatuses.length)) ?? "pending";
return values[Math.floor(Math.random() * values.length)]?.[1] ?? MediaRequestStatus.PendingApproval;
} }
} }
@@ -9,8 +9,17 @@ import type { ISearchableIntegration } from "../base/searchable-integration";
import { TestConnectionError } from "../base/test-connection/test-connection-error"; import { TestConnectionError } from "../base/test-connection/test-connection-error";
import type { TestingResult } from "../base/test-connection/test-connection-service"; import type { TestingResult } from "../base/test-connection/test-connection-service";
import type { IMediaRequestIntegration } from "../interfaces/media-requests/media-request-integration"; import type { IMediaRequestIntegration } from "../interfaces/media-requests/media-request-integration";
import type { MediaRequest, RequestStats, RequestUser } from "../interfaces/media-requests/media-request-types"; import type {
import { MediaAvailability, MediaRequestStatus } from "../interfaces/media-requests/media-request-types"; MediaAvailability,
MediaRequest,
MediaRequestStatus,
RequestStats,
RequestUser,
} from "../interfaces/media-requests/media-request-types";
import {
UpstreamMediaAvailability,
UpstreamMediaRequestStatus,
} from "../interfaces/media-requests/media-request-types";
interface OverseerrSearchResult { interface OverseerrSearchResult {
id: number; id: number;
@@ -128,7 +137,7 @@ export class OverseerrIntegration
if (pendingResults.length > 0 && allResults.length > 0) { if (pendingResults.length > 0 && allResults.length > 0) {
requests = pendingResults.concat( requests = pendingResults.concat(
allResults.filter(({ status }) => status !== MediaRequestStatus.PendingApproval), allResults.filter(({ status }) => status !== UpstreamMediaRequestStatus.PendingApproval),
); );
} else if (pendingResults.length > 0) requests = pendingResults; } else if (pendingResults.length > 0) requests = pendingResults;
else if (allResults.length > 0) requests = allResults; else if (allResults.length > 0) requests = allResults;
@@ -137,11 +146,15 @@ export class OverseerrIntegration
return await Promise.all( return await Promise.all(
requests.map(async (request): Promise<MediaRequest> => { requests.map(async (request): Promise<MediaRequest> => {
const information = await this.getItemInformationAsync(request.media.tmdbId, request.type); const information = await this.getItemInformationAsync(request.media.tmdbId, request.type);
// See https://github.com/seerr-team/seerr/blob/af083a3cd5c3e3d5d7917fdf4fdd67fe3f39c46b/src/components/StatusBadge/index.tsx#L40
const inProgress = (request.media.downloadStatus ?? []).length >= 1;
return { return {
id: request.id, id: request.id,
name: information.name, name: information.name,
status: request.status, status: this.mapRequestStatus(request.status),
availability: request.media.status, availability: this.mapAvailability(request.media.status, inProgress),
backdropImageUrl: `https://image.tmdb.org/t/p/original/${information.backdropPath}`, backdropImageUrl: `https://image.tmdb.org/t/p/original/${information.backdropPath}`,
posterImagePath: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${information.posterPath}`, posterImagePath: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${information.posterPath}`,
href: this.externalUrl(`/${request.type}/${request.media.tmdbId}`).toString(), href: this.externalUrl(`/${request.type}/${request.media.tmdbId}`).toString(),
@@ -161,6 +174,42 @@ export class OverseerrIntegration
); );
} }
protected mapRequestStatus(status: UpstreamMediaRequestStatus): MediaRequestStatus {
switch (status) {
case UpstreamMediaRequestStatus.PendingApproval:
return "pending";
case UpstreamMediaRequestStatus.Approved:
return "approved";
case UpstreamMediaRequestStatus.Declined:
return "declined";
case UpstreamMediaRequestStatus.Failed:
return "failed";
case UpstreamMediaRequestStatus.Completed:
return "completed";
default:
return "failed";
}
}
// See https://github.com/seerr-team/seerr/blob/af083a3cd5c3e3d5d7917fdf4fdd67fe3f39c46b/src/components/StatusBadge/index.tsx#L153-L387
protected mapAvailability(availability: UpstreamMediaAvailability, inProgress: boolean): MediaAvailability {
switch (availability) {
case UpstreamMediaAvailability.Available:
return inProgress ? "processing" : "available";
case UpstreamMediaAvailability.PartiallyAvailable:
return inProgress ? "processing" : "partiallyAvailable";
case UpstreamMediaAvailability.Processing:
return inProgress ? "processing" : "requested";
case UpstreamMediaAvailability.Pending:
return "pending";
case UpstreamMediaAvailability.JellyseerrBlacklistedOrOverseerrDeleted:
return "deleted";
case UpstreamMediaAvailability.Unknown:
default:
return inProgress ? "processing" : "unknown";
}
}
public async getStatsAsync(): Promise<RequestStats> { public async getStatsAsync(): Promise<RequestStats> {
const response = await fetchWithTrustedCertificatesAsync(this.url("/api/v1/request/count"), { const response = await fetchWithTrustedCertificatesAsync(this.url("/api/v1/request/count"), {
headers: { headers: {
@@ -339,11 +388,12 @@ const getRequestsSchema = z.object({
.array( .array(
z.object({ z.object({
id: z.number(), id: z.number(),
status: z.nativeEnum(MediaRequestStatus), status: z.enum(UpstreamMediaRequestStatus),
createdAt: z.string().transform((value) => new Date(value)), createdAt: z.string().transform((value) => new Date(value)),
media: z.object({ media: z.object({
status: z.nativeEnum(MediaAvailability), status: z.enum(UpstreamMediaAvailability),
tmdbId: z.number(), tmdbId: z.number(),
downloadStatus: z.array(z.unknown()).optional(),
}), }),
type: z.enum(["movie", "tv"]), type: z.enum(["movie", "tv"]),
requestedBy: z requestedBy: z
@@ -17,7 +17,7 @@ import { dnsBlockingGetSchema, sessionResponseSchema, statsSummaryGetSchema } fr
const localLogger = logger.child({ module: "PiHoleIntegrationV6" }); const localLogger = logger.child({ module: "PiHoleIntegrationV6" });
export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIntegration { export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIntegration {
private readonly sessionStore: SessionStore<string>; private readonly sessionStore: SessionStore<{ sid: string | null }>;
constructor(integration: IntegrationInput) { constructor(integration: IntegrationInput) {
super(integration); super(integration);
@@ -28,7 +28,7 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
const response = await this.withAuthAsync(async (sessionId) => { const response = await this.withAuthAsync(async (sessionId) => {
return await fetchWithTrustedCertificatesAsync(this.url("/api/dns/blocking"), { return await fetchWithTrustedCertificatesAsync(this.url("/api/dns/blocking"), {
headers: { headers: {
sid: sessionId, sid: sessionId ?? undefined,
}, },
}); });
}); });
@@ -46,7 +46,7 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
const response = await this.withAuthAsync(async (sessionId) => { const response = await this.withAuthAsync(async (sessionId) => {
return fetchWithTrustedCertificatesAsync(this.url("/api/stats/summary"), { return fetchWithTrustedCertificatesAsync(this.url("/api/stats/summary"), {
headers: { headers: {
sid: sessionId, sid: sessionId ?? undefined,
}, },
}); });
}); });
@@ -85,7 +85,7 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
const response = await this.withAuthAsync(async (sessionId) => { const response = await this.withAuthAsync(async (sessionId) => {
return await fetchWithTrustedCertificatesAsync(this.url("/api/dns/blocking"), { return await fetchWithTrustedCertificatesAsync(this.url("/api/dns/blocking"), {
headers: { headers: {
sid: sessionId, sid: sessionId ?? undefined,
}, },
body: JSON.stringify({ blocking: true }), body: JSON.stringify({ blocking: true }),
method: "POST", method: "POST",
@@ -101,7 +101,7 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
const response = await this.withAuthAsync(async (sessionId) => { const response = await this.withAuthAsync(async (sessionId) => {
return await fetchWithTrustedCertificatesAsync(this.url("/api/dns/blocking"), { return await fetchWithTrustedCertificatesAsync(this.url("/api/dns/blocking"), {
headers: { headers: {
sid: sessionId, sid: sessionId ?? undefined,
}, },
body: JSON.stringify({ blocking: false, timer: duration }), body: JSON.stringify({ blocking: false, timer: duration }),
method: "POST", method: "POST",
@@ -118,12 +118,16 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
* @param callback * @param callback
* @returns * @returns
*/ */
private async withAuthAsync(callback: (sessionId: string) => Promise<UndiciResponse>) { private async withAuthAsync(callback: (sessionId: string | null) => Promise<UndiciResponse>) {
if (!super.hasSecretValue("apiKey")) {
return await callback(null);
}
const storedSession = await this.sessionStore.getAsync(); const storedSession = await this.sessionStore.getAsync();
if (storedSession) { if (storedSession) {
localLogger.debug("Using stored session for request", { integrationId: this.integration.id }); localLogger.debug("Using stored session for request", { integrationId: this.integration.id });
const response = await callback(storedSession); const response = await callback(storedSession.sid);
if (response.status !== 401) { if (response.status !== 401) {
return response; return response;
} }
@@ -132,7 +136,7 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
} }
const sessionId = await this.getSessionAsync(); const sessionId = await this.getSessionAsync();
await this.sessionStore.setAsync(sessionId); await this.sessionStore.setAsync({ sid: sessionId });
const response = await callback(sessionId); const response = await callback(sessionId);
return response; return response;
} }
@@ -141,11 +145,13 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
* Get a session id from the Pi-hole server * Get a session id from the Pi-hole server
* @returns The session id * @returns The session id
*/ */
private async getSessionAsync(fetchAsync: typeof undiciFetch = fetchWithTrustedCertificatesAsync): Promise<string> { private async getSessionAsync(
const apiKey = super.getSecretValue("apiKey"); fetchAsync: typeof undiciFetch = fetchWithTrustedCertificatesAsync,
): Promise<string | null> {
const apiKey = super.hasSecretValue("apiKey") ? super.getSecretValue("apiKey") : null;
const response = await fetchAsync(this.url("/api/auth"), { const response = await fetchAsync(this.url("/api/auth"), {
method: "POST", method: "POST",
body: JSON.stringify({ password: apiKey }), body: JSON.stringify({ password: apiKey ?? "" }),
headers: { headers: {
"User-Agent": "Homarr", "User-Agent": "Homarr",
}, },
@@ -156,8 +162,13 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
const data = await response.json(); const data = await response.json();
const result = await sessionResponseSchema.parseAsync(data); const result = await sessionResponseSchema.parseAsync(data);
if (!result.session.sid) { if (!result.session.valid) {
throw new ResponseError({ status: 401, url: response.url }); throw new ResponseError(
{ status: 401, url: response.url },
{
cause: result.session.message ? new Error(result.session.message) : undefined,
},
);
} }
localLogger.info("Received session id successfully", { integrationId: this.integration.id }); localLogger.info("Received session id successfully", { integrationId: this.integration.id });
@@ -170,9 +181,14 @@ export class PiHoleIntegrationV6 extends Integration implements DnsHoleSummaryIn
* @param sessionId The session id to remove * @param sessionId The session id to remove
*/ */
private async clearSessionAsync( private async clearSessionAsync(
sessionId: string, sessionId: string | null,
fetchAsync: typeof undiciFetch = fetchWithTrustedCertificatesAsync, fetchAsync: typeof undiciFetch = fetchWithTrustedCertificatesAsync,
) { ) {
if (!sessionId) {
localLogger.debug("No session id to clear");
return;
}
const response = await fetchAsync(this.url("/api/auth"), { const response = await fetchAsync(this.url("/api/auth"), {
method: "DELETE", method: "DELETE",
headers: { headers: {
@@ -2,6 +2,7 @@ import { z } from "zod/v4";
export const sessionResponseSchema = z.object({ export const sessionResponseSchema = z.object({
session: z.object({ session: z.object({
valid: z.boolean(),
sid: z.string().nullable(), sid: z.string().nullable(),
message: z.string().nullable(), message: z.string().nullable(),
}), }),
+3 -3
View File
@@ -25,15 +25,15 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/core": "workspace:^0.1.0", "@homarr/core": "workspace:^0.1.0",
"superjson": "2.2.5", "superjson": "2.2.6",
"winston": "3.18.3", "winston": "3.18.3",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+4 -4
View File
@@ -33,19 +33,19 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"dayjs": "^1.11.19", "dayjs": "^1.11.19",
"next": "16.0.1", "next": "16.0.7",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+3 -3
View File
@@ -24,15 +24,15 @@
"dependencies": { "dependencies": {
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"@mantine/hooks": "^8.3.6", "@mantine/hooks": "^8.3.9",
"react": "19.2.0" "react": "19.2.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+2 -2
View File
@@ -24,14 +24,14 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/notifications": "^8.3.6", "@mantine/notifications": "^8.3.9",
"@tabler/icons-react": "^3.35.0" "@tabler/icons-react": "^3.35.0"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+6 -6
View File
@@ -37,14 +37,14 @@
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"@mantine/hooks": "^8.3.6", "@mantine/hooks": "^8.3.9",
"adm-zip": "0.5.16", "adm-zip": "0.5.16",
"next": "16.0.1", "next": "16.0.7",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"superjson": "2.2.5", "superjson": "2.2.6",
"zod": "^4.1.12", "zod": "^4.1.13",
"zod-form-data": "^3.0.1" "zod-form-data": "^3.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -52,7 +52,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/adm-zip": "0.5.7", "@types/adm-zip": "0.5.7",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+2 -2
View File
@@ -23,13 +23,13 @@
"prettier": "@homarr/prettier-config", "prettier": "@homarr/prettier-config",
"dependencies": { "dependencies": {
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1 -1
View File
@@ -30,7 +30,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+2 -2
View File
@@ -28,13 +28,13 @@
"@homarr/definitions": "workspace:^", "@homarr/definitions": "workspace:^",
"@homarr/log": "workspace:^", "@homarr/log": "workspace:^",
"ioredis": "5.8.2", "ioredis": "5.8.2",
"superjson": "2.2.5" "superjson": "2.2.6"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+4 -3
View File
@@ -26,20 +26,21 @@
"@homarr/common": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0",
"@homarr/definitions": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0",
"@homarr/docker": "workspace:^0.1.0",
"@homarr/integrations": "workspace:^0.1.0", "@homarr/integrations": "workspace:^0.1.0",
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/redis": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0",
"dayjs": "^1.11.19", "dayjs": "^1.11.19",
"octokit": "^5.0.5", "octokit": "^5.0.5",
"superjson": "2.2.5", "superjson": "2.2.6",
"undici": "7.16.0", "undici": "7.16.0",
"zod": "^4.1.12" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+5 -7
View File
@@ -3,9 +3,9 @@ import type { ContainerInfo, ContainerStats } from "dockerode";
import { db, like, or } from "@homarr/db"; import { db, like, or } from "@homarr/db";
import { icons } from "@homarr/db/schema"; import { icons } from "@homarr/db/schema";
import type { ContainerState } from "@homarr/docker";
import { dockerLabels, DockerSingleton } from "@homarr/docker";
import type { ContainerState } from "../../docker/src";
import { DockerSingleton } from "../../docker/src";
import { createCachedWidgetRequestHandler } from "./lib/cached-widget-request-handler"; import { createCachedWidgetRequestHandler } from "./lib/cached-widget-request-handler";
export const dockerContainersRequestHandler = createCachedWidgetRequestHandler({ export const dockerContainersRequestHandler = createCachedWidgetRequestHandler({
@@ -27,13 +27,11 @@ async function getContainersWithStatsAsync() {
const containers = await Promise.all( const containers = await Promise.all(
dockerInstances.map(async ({ instance, host }) => { dockerInstances.map(async ({ instance, host }) => {
const instanceContainers = await instance.listContainers({ all: true }); const instanceContainers = await instance.listContainers({ all: true });
return instanceContainers.map((container) => ({ return instanceContainers
...container, .filter((container) => dockerLabels.hide in container.Labels === false)
instance: host, .map((container) => ({ ...container, instance: host }));
}));
}), }),
).then((res) => res.flat()); ).then((res) => res.flat());
const likeQueries = containers.map((container) => like(icons.name, `%${extractImage(container)}%`)); const likeQueries = containers.map((container) => like(icons.name, `%${extractImage(container)}%`));
const dbIcons = const dbIcons =
+12 -4
View File
@@ -20,11 +20,19 @@ export const fetchStockPriceHandler = createCachedWidgetRequestHandler({
if (data.chart.result.length !== 1) { if (data.chart.result.length !== 1) {
throw new Error("Received multiple results"); throw new Error("Received multiple results");
} }
if (!data.chart.result[0]) { const firstResult = data.chart.result[0];
if (!firstResult) {
throw new Error("Received invalid data"); throw new Error("Received invalid data");
} }
return {
return data.chart.result[0]; priceHistory:
firstResult.indicators.quote[0]?.close.filter(
// Filter out null values from price arrays (Yahoo Finance returns null for missing data points)
(value) => value !== null && value !== undefined,
) ?? [],
symbol: firstResult.meta.symbol,
shortName: firstResult.meta.shortName,
};
}, },
cacheDuration: dayjs.duration(5, "minutes"), cacheDuration: dayjs.duration(5, "minutes"),
}); });
@@ -43,7 +51,7 @@ const dataSchema = z
indicators: z.object({ indicators: z.object({
quote: z.array( quote: z.array(
z.object({ z.object({
close: z.array(z.number()), close: z.array(z.number().nullish()),
}), }),
), ),
}), }),
+1 -1
View File
@@ -29,7 +29,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+3 -3
View File
@@ -26,8 +26,8 @@
"@homarr/api": "workspace:^0.1.0", "@homarr/api": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.3.6", "@mantine/dates": "^8.3.9",
"next": "16.0.1", "next": "16.0.7",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0" "react-dom": "19.2.0"
}, },
@@ -35,7 +35,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+5 -5
View File
@@ -33,12 +33,12 @@
"@homarr/settings": "workspace:^0.1.0", "@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"@mantine/hooks": "^8.3.6", "@mantine/hooks": "^8.3.9",
"@mantine/spotlight": "^8.3.6", "@mantine/spotlight": "^8.3.9",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"jotai": "^2.15.1", "jotai": "^2.15.1",
"next": "16.0.1", "next": "16.0.7",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"use-deep-compare-effect": "^1.8.1" "use-deep-compare-effect": "^1.8.1"
@@ -47,7 +47,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+3 -3
View File
@@ -32,8 +32,8 @@
"dayjs": "^1.11.19", "dayjs": "^1.11.19",
"deepmerge": "4.3.1", "deepmerge": "4.3.1",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "16.0.1", "next": "16.0.7",
"next-intl": "4.4.0", "next-intl": "4.5.6",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0" "react-dom": "19.2.0"
}, },
@@ -41,7 +41,7 @@
"@homarr/eslint-config": "workspace:^0.2.0", "@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "", "unknown": "",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "", "partiallyAvailable": "",
"available": "", "available": "",
"blacklisted": "", "blacklisted": "",
+11 -10
View File
@@ -649,14 +649,14 @@
"app": { "app": {
"option": { "option": {
"existing": { "existing": {
"title": "", "title": "现有",
"label": "" "label": "选择现有应用"
}, },
"new": { "new": {
"title": "", "title": "新建",
"url": { "url": {
"label": "", "label": "应用网址",
"description": "" "description": "当从面板访问时应用将打开的网址"
} }
} }
} }
@@ -676,9 +676,9 @@
}, },
"app": { "app": {
"action": { "action": {
"add": "", "add": "链接应用",
"remove": "", "remove": "取消连接",
"select": "" "select": "选择要链接的应用"
} }
} }
}, },
@@ -709,7 +709,7 @@
"description": "集成“{kind}”可以与搜索引擎一起使用。勾选此项可自动配置搜索引擎。" "description": "集成“{kind}”可以与搜索引擎一起使用。勾选此项可自动配置搜索引擎。"
}, },
"app": { "app": {
"sectionTitle": "" "sectionTitle": "关联的应用"
}, },
"createApp": { "createApp": {
"label": "创建应用", "label": "创建应用",
@@ -1051,7 +1051,7 @@
"add": "添加", "add": "添加",
"apply": "应用", "apply": "应用",
"backToOverview": "返回概览", "backToOverview": "返回概览",
"change": "", "change": "更改",
"create": "创建", "create": "创建",
"createAnother": "创建并重新开始", "createAnother": "创建并重新开始",
"edit": "编辑", "edit": "编辑",
@@ -2232,6 +2232,7 @@
"unknown": "未知", "unknown": "未知",
"pending": "等待处理", "pending": "等待处理",
"processing": "处理中", "processing": "处理中",
"requested": "",
"partiallyAvailable": "部分", "partiallyAvailable": "部分",
"available": "可用", "available": "可用",
"blacklisted": "已列入黑名单", "blacklisted": "已列入黑名单",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "crwdns1314:0crwdne1314:0", "unknown": "crwdns1314:0crwdne1314:0",
"pending": "crwdns1316:0crwdne1316:0", "pending": "crwdns1316:0crwdne1316:0",
"processing": "crwdns1318:0crwdne1318:0", "processing": "crwdns1318:0crwdne1318:0",
"requested": "crwdns3806:0crwdne3806:0",
"partiallyAvailable": "crwdns1320:0crwdne1320:0", "partiallyAvailable": "crwdns1320:0crwdne1320:0",
"available": "crwdns1322:0crwdne1322:0", "available": "crwdns1322:0crwdne1322:0",
"blacklisted": "crwdns3468:0crwdne3468:0", "blacklisted": "crwdns3468:0crwdne3468:0",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Neznámý", "unknown": "Neznámý",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Částečně dostupné", "partiallyAvailable": "Částečně dostupné",
"available": "K dispozici", "available": "K dispozici",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Ukendt", "unknown": "Ukendt",
"pending": "Afventende", "pending": "Afventende",
"processing": "Behandler", "processing": "Behandler",
"requested": "",
"partiallyAvailable": "Delvis", "partiallyAvailable": "Delvis",
"available": "Tilgængelig", "available": "Tilgængelig",
"blacklisted": "Blacklistet", "blacklisted": "Blacklistet",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Unbekannt", "unknown": "Unbekannt",
"pending": "Ausstehend", "pending": "Ausstehend",
"processing": "In Bearbeitung", "processing": "In Bearbeitung",
"requested": "",
"partiallyAvailable": "Teilweise", "partiallyAvailable": "Teilweise",
"available": "Verfügbar", "available": "Verfügbar",
"blacklisted": "", "blacklisted": "",
+22 -21
View File
@@ -649,14 +649,14 @@
"app": { "app": {
"option": { "option": {
"existing": { "existing": {
"title": "", "title": "Vorhanden",
"label": "" "label": "Vorhandene App auswählen"
}, },
"new": { "new": {
"title": "", "title": "Neu",
"url": { "url": {
"label": "", "label": "App URL",
"description": "" "description": "Die URL, welche die App öffnet, sobald sie vom Dashboard aus aufgerufen wird"
} }
} }
} }
@@ -676,9 +676,9 @@
}, },
"app": { "app": {
"action": { "action": {
"add": "", "add": "Eine App verknüpfen",
"remove": "", "remove": "Verknüpfung aufheben",
"select": "" "select": "Wählen Sie eine App zum Verknüpfen aus"
} }
} }
}, },
@@ -709,7 +709,7 @@
"description": "Integration \"{kind}\" kann mit den Suchmaschinen verwendet werden. Wählen Sie dies, um die Suchmaschine automatisch zu konfigurieren." "description": "Integration \"{kind}\" kann mit den Suchmaschinen verwendet werden. Wählen Sie dies, um die Suchmaschine automatisch zu konfigurieren."
}, },
"app": { "app": {
"sectionTitle": "" "sectionTitle": "Verknüpfte App"
}, },
"createApp": { "createApp": {
"label": "App erstellen", "label": "App erstellen",
@@ -1051,7 +1051,7 @@
"add": "Hinzufügen", "add": "Hinzufügen",
"apply": "Übernehmen", "apply": "Übernehmen",
"backToOverview": "Zurück zur Übersicht", "backToOverview": "Zurück zur Übersicht",
"change": "", "change": "Verändern",
"create": "Erstellen", "create": "Erstellen",
"createAnother": "Erstellen und neu starten", "createAnother": "Erstellen und neu starten",
"edit": "Bearbeiten", "edit": "Bearbeiten",
@@ -1174,8 +1174,8 @@
}, },
"unit": { "unit": {
"speed": { "speed": {
"kilometersPerHour": "", "kilometersPerHour": "km/h",
"milesPerHour": "" "milesPerHour": "mph"
} }
} }
}, },
@@ -1190,7 +1190,7 @@
"label": "Titel" "label": "Titel"
}, },
"customCssClasses": { "customCssClasses": {
"label": "" "label": "Benutzerdefinierte CSS Klassen"
}, },
"borderColor": { "borderColor": {
"label": "Rahmenfarbe" "label": "Rahmenfarbe"
@@ -1780,7 +1780,7 @@
"description": "Nur bei aktuellem Wetter" "description": "Nur bei aktuellem Wetter"
}, },
"useImperialSpeed": { "useImperialSpeed": {
"label": "" "label": "Verwende miles per hour für die Windgeschwindigkeit"
}, },
"location": { "location": {
"label": "Wetterstandort" "label": "Wetterstandort"
@@ -1800,12 +1800,12 @@
"description": "Wie das Datum aussehen sollte" "description": "Wie das Datum aussehen sollte"
} }
}, },
"currentWindSpeed": "{currentWindSpeed} km/h", "currentWindSpeed": "{currentWindSpeed} {unit}",
"dailyForecast": { "dailyForecast": {
"sunrise": "Sonnenaufgang", "sunrise": "Sonnenaufgang",
"sunset": "Sonnenuntergang", "sunset": "Sonnenuntergang",
"maxWindSpeed": "Maximale Windgeschwindigkeit: {maxWindSpeed} km/h", "maxWindSpeed": "Maximale Windgeschwindigkeit: {maxWindSpeed} {unit}",
"maxWindGusts": "Maximale Windböen: {maxWindGusts} km/h" "maxWindGusts": "Maximale Windböen: {maxWindGusts} {unit}"
}, },
"kind": { "kind": {
"clear": "Klar", "clear": "Klar",
@@ -2232,6 +2232,7 @@
"unknown": "Unbekannt", "unknown": "Unbekannt",
"pending": "Ausstehend", "pending": "Ausstehend",
"processing": "In Bearbeitung", "processing": "In Bearbeitung",
"requested": "",
"partiallyAvailable": "Teilweise", "partiallyAvailable": "Teilweise",
"available": "Verfügbar", "available": "Verfügbar",
"blacklisted": "Gesperrt", "blacklisted": "Gesperrt",
@@ -3013,8 +3014,8 @@
"integration": "Integrationen", "integration": "Integrationen",
"app": "Apps", "app": "Apps",
"group": "Gruppen", "group": "Gruppen",
"searchEngine": "", "searchEngine": "Suchmaschinen",
"media": "" "media": "Medien"
}, },
"statisticLabel": { "statisticLabel": {
"boards": "Boards", "boards": "Boards",
@@ -3023,8 +3024,8 @@
"authorization": "Autorisierung" "authorization": "Autorisierung"
}, },
"heroBanner": { "heroBanner": {
"title": "", "title": "Willkommen zurück zu Ihrem",
"subtitle": "" "subtitle": "{app} Board"
} }
}, },
"board": { "board": {
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Άγνωστο", "unknown": "Άγνωστο",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Μερικώς", "partiallyAvailable": "Μερικώς",
"available": "Διαθέσιμο", "available": "Διαθέσιμο",
"blacklisted": "", "blacklisted": "",
+57 -56
View File
@@ -754,86 +754,86 @@
"notFound": "Not found", "notFound": "Not found",
"tooManyRequests": "Too many requests", "tooManyRequests": "Too many requests",
"internalServerError": "Internal server error", "internalServerError": "Internal server error",
"serviceUnavailable": "", "serviceUnavailable": "Service unavailable",
"gatewayTimeout": "" "gatewayTimeout": "Gateway timeout"
} }
}, },
"certificate": { "certificate": {
"title": "", "title": "Certificate error",
"description": { "description": {
"expired": "", "expired": "The certificate has expired.",
"notYetValid": "", "notYetValid": "The certificate is not yet valid.",
"untrusted": "", "untrusted": "The certificate is not trusted.",
"hostnameMismatch": "" "hostnameMismatch": "The certificate hostname does not match the URL."
}, },
"alert": { "alert": {
"permission": { "permission": {
"title": "", "title": "Not enough permissions",
"message": "" "message": "You are not allowed to trust or upload certificates. Please contact your administrator to upload the necessary root certificate."
}, },
"hostnameMismatch": { "hostnameMismatch": {
"title": "", "title": "Hostname mismatch",
"message": "" "message": "The hostname in the certificate does not match the hostname you are connecting to. This could indicate a security risk, but you can still choose to trust this certificate."
}, },
"extract": { "extract": {
"title": "", "title": "CA certificate extraction failed",
"message": "" "message": "Only self-signed certificates without a chain can be fetched automatically. If you are using a self-signed certificate, please make sure to upload the CA certificate manually. You can find instructions on how to do this <docsLink></docsLink>."
} }
}, },
"action": { "action": {
"retry": { "retry": {
"label": "" "label": "Retry creation"
}, },
"trust": { "trust": {
"label": "" "label": "Trust certificate"
}, },
"upload": { "upload": {
"label": "" "label": "Upload certificate"
} }
}, },
"hostnameMismatch": { "hostnameMismatch": {
"confirm": { "confirm": {
"title": "", "title": "Trust hostname mismatch",
"message": "" "message": "Are you sure you want to trust the certificate with a hostname mismatch?"
}, },
"notification": { "notification": {
"success": { "success": {
"title": "", "title": "Trusted certificate",
"message": "" "message": "Added hostname to trusted certificate list"
}, },
"error": { "error": {
"title": "", "title": "Failed to trust certificate",
"message": "" "message": "The certificate with a hostname mismatch could not be trusted"
} }
} }
}, },
"selfSigned": { "selfSigned": {
"confirm": { "confirm": {
"title": "", "title": "Trust self-signed certificate",
"message": "" "message": "Are you sure you want to trust this self-signed certificate?"
}, },
"notification": { "notification": {
"success": { "success": {
"title": "", "title": "Trusted certificate",
"message": "" "message": "Added certificate to trusted certificate list"
}, },
"error": { "error": {
"title": "", "title": "Failed to trust certificate",
"message": "" "message": "Failed to add certificate to trusted certificate list"
} }
} }
}, },
"details": { "details": {
"title": "", "title": "Details",
"description": "", "description": "Review the certificate information before deciding to trust it.",
"content": { "content": {
"action": "", "action": "Show content",
"title": "" "title": "PEM Certificate"
} }
} }
}, },
"request": { "request": {
"title": "", "title": "Request error",
"description": { "description": {
"connection": { "connection": {
"hostUnreachable": "", "hostUnreachable": "",
@@ -2232,6 +2232,7 @@
"unknown": "", "unknown": "",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "", "partiallyAvailable": "",
"available": "", "available": "",
"blacklisted": "", "blacklisted": "",
@@ -4456,50 +4457,50 @@
"title": "", "title": "",
"description": "", "description": "",
"noResults": { "noResults": {
"title": "" "title": "There are no hostnames yet"
}, },
"toCertificates": "" "toCertificates": "Certificates"
} }
}, },
"action": { "action": {
"create": { "create": {
"label": "", "label": "Add certificate",
"notification": { "notification": {
"success": { "success": {
"title": "", "title": "Certificate added",
"message": "" "message": "The certificate was added successfully"
}, },
"error": { "error": {
"title": "", "title": "Failed to add certificate",
"message": "" "message": "The certificate could not be added"
} }
} }
}, },
"remove": { "remove": {
"label": "", "label": "Remove certificate",
"confirm": "", "confirm": "Are you sure you want to remove the certificate?",
"notification": { "notification": {
"success": { "success": {
"title": "", "title": "Certificate removed",
"message": "" "message": "The certificate was removed successfully"
}, },
"error": { "error": {
"title": "", "title": "Certificate not removed",
"message": "" "message": "The certificate could not be removed"
} }
} }
}, },
"removeHostname": { "removeHostname": {
"label": "", "label": "Remove trusted hostname",
"confirm": "", "confirm": "Are you sure you want to remove this trusted hostname? This can cause some integrations to stop working.",
"notification": { "notification": {
"success": { "success": {
"title": "", "title": "Hostname removed",
"message": "" "message": "The hostname was removed successfully"
}, },
"error": { "error": {
"title": "", "title": "Hostname not removed",
"message": "" "message": "The hostname could not be removed"
} }
} }
} }
@@ -4508,10 +4509,10 @@
"log": { "log": {
"level": { "level": {
"option": { "option": {
"debug": "", "debug": "Debug",
"info": "", "info": "Info",
"warn": "", "warn": "Warn",
"error": "" "error": "Error"
} }
} }
} }
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Unknown", "unknown": "Unknown",
"pending": "Pending", "pending": "Pending",
"processing": "Processing", "processing": "Processing",
"requested": "Requested",
"partiallyAvailable": "Partial", "partiallyAvailable": "Partial",
"available": "Available", "available": "Available",
"blacklisted": "Blacklisted", "blacklisted": "Blacklisted",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Desconocido", "unknown": "Desconocido",
"pending": "Pendiente", "pending": "Pendiente",
"processing": "Procesando", "processing": "Procesando",
"requested": "Solicitado",
"partiallyAvailable": "Parcial", "partiallyAvailable": "Parcial",
"available": "Disponible", "available": "Disponible",
"blacklisted": "Lista negra", "blacklisted": "Lista negra",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "", "unknown": "",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "", "partiallyAvailable": "",
"available": "", "available": "",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Inconnu", "unknown": "Inconnu",
"pending": "En attente", "pending": "En attente",
"processing": "Traitement en cours", "processing": "Traitement en cours",
"requested": "",
"partiallyAvailable": "Partiel", "partiallyAvailable": "Partiel",
"available": "Disponible", "available": "Disponible",
"blacklisted": "Sur la liste noire", "blacklisted": "Sur la liste noire",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "לא ידוע", "unknown": "לא ידוע",
"pending": "בהמתנה", "pending": "בהמתנה",
"processing": "מעבד", "processing": "מעבד",
"requested": "",
"partiallyAvailable": "חלקי", "partiallyAvailable": "חלקי",
"available": "זמין", "available": "זמין",
"blacklisted": "ברשימה השחורה", "blacklisted": "ברשימה השחורה",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Nepoznato", "unknown": "Nepoznato",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "", "partiallyAvailable": "",
"available": "", "available": "",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Ismeretlen", "unknown": "Ismeretlen",
"pending": "", "pending": "",
"processing": "Feldolgozás", "processing": "Feldolgozás",
"requested": "",
"partiallyAvailable": "Részleges", "partiallyAvailable": "Részleges",
"available": "Elérhető", "available": "Elérhető",
"blacklisted": "", "blacklisted": "",
+81 -80
View File
@@ -653,10 +653,10 @@
"label": "Seleziona app esistente" "label": "Seleziona app esistente"
}, },
"new": { "new": {
"title": "", "title": "Nuovo",
"url": { "url": {
"label": "Url app", "label": "Url app",
"description": "" "description": "L'Url che l'app aprirà quando vi si accede dalla dashboard"
} }
} }
} }
@@ -676,9 +676,9 @@
}, },
"app": { "app": {
"action": { "action": {
"add": "", "add": "Collega un'app",
"remove": "", "remove": "Scollega",
"select": "" "select": "Seleziona un'app da collegare"
} }
} }
}, },
@@ -709,7 +709,7 @@
"description": "Integrazione \"{kind}\" può essere utilizzato con i motori di ricerca. Selezionare questa opzione per configurare automaticamente il motore di ricerca." "description": "Integrazione \"{kind}\" può essere utilizzato con i motori di ricerca. Selezionare questa opzione per configurare automaticamente il motore di ricerca."
}, },
"app": { "app": {
"sectionTitle": "" "sectionTitle": "App Collegata"
}, },
"createApp": { "createApp": {
"label": "Crea app", "label": "Crea app",
@@ -730,7 +730,7 @@
"error": { "error": {
"common": { "common": {
"cause": { "cause": {
"title": "" "title": "Causa con più dettagli"
} }
}, },
"unknown": { "unknown": {
@@ -738,7 +738,7 @@
"description": "Si è verificato un errore sconosciuto, apri la causa sottostante per vedere maggiori dettagli" "description": "Si è verificato un errore sconosciuto, apri la causa sottostante per vedere maggiori dettagli"
}, },
"parse": { "parse": {
"title": "", "title": "Errore di analisi",
"description": "La risposta non può essere analizzata. Si prega di verificare che l'URL stia puntando all'URL di base del servizio." "description": "La risposta non può essere analizzata. Si prega di verificare che l'URL stia puntando all'URL di base del servizio."
}, },
"authorization": { "authorization": {
@@ -959,8 +959,8 @@
"newLabel": "Nuovo ID token" "newLabel": "Nuovo ID token"
}, },
"realm": { "realm": {
"label": "", "label": "Dominio",
"newLabel": "" "newLabel": "Nuovo dominio"
}, },
"personalAccessToken": { "personalAccessToken": {
"label": "Token d'Accesso Personale", "label": "Token d'Accesso Personale",
@@ -1051,9 +1051,9 @@
"add": "Aggiungi", "add": "Aggiungi",
"apply": "Applica", "apply": "Applica",
"backToOverview": "Torna alla panoramica", "backToOverview": "Torna alla panoramica",
"change": "", "change": "Cambia",
"create": "Crea", "create": "Crea",
"createAnother": "", "createAnother": "Crea e ricomincia",
"edit": "Modifica", "edit": "Modifica",
"import": "Importa", "import": "Importa",
"insert": "Inserisci", "insert": "Inserisci",
@@ -1389,8 +1389,8 @@
} }
}, },
"dnsHoleSummary": { "dnsHoleSummary": {
"name": "", "name": "Riepilogo del filtraggio DNS",
"description": "", "description": "Mostra il riepilogo del tuo filtro DNS",
"option": { "option": {
"layout": { "layout": {
"label": "Layout", "label": "Layout",
@@ -1411,7 +1411,7 @@
} }
}, },
"error": { "error": {
"internalServerError": "", "internalServerError": "Impossibile recuperare il riepilogo del filtro DNS",
"integrationsDisconnected": "Nessun dato disponibile, tutte le integrazioni disconnesse" "integrationsDisconnected": "Nessun dato disponibile, tutte le integrazioni disconnesse"
}, },
"data": { "data": {
@@ -1423,7 +1423,7 @@
"domainsTooltip": "A causa di più integrazioni, Homarr non può calcolare il numero esatto di domini bloccati" "domainsTooltip": "A causa di più integrazioni, Homarr non può calcolare il numero esatto di domini bloccati"
}, },
"dnsHoleControls": { "dnsHoleControls": {
"name": "", "name": "Controlli del filtro DNS",
"description": "Controlla PiHole o AdGuard dalla tua dashboard", "description": "Controlla PiHole o AdGuard dalla tua dashboard",
"option": { "option": {
"layout": { "layout": {
@@ -1445,7 +1445,7 @@
} }
}, },
"error": { "error": {
"internalServerError": "" "internalServerError": "Impossibile controllare il DNS Hole"
}, },
"controls": { "controls": {
"enableAll": "Abilita tutto", "enableAll": "Abilita tutto",
@@ -1514,7 +1514,7 @@
"label": "Indirizzo del server" "label": "Indirizzo del server"
}, },
"isBedrockServer": { "isBedrockServer": {
"label": "" "label": "Server Bedrock"
} }
}, },
"status": { "status": {
@@ -1625,7 +1625,7 @@
} }
}, },
"error": { "error": {
"noUrl": "", "noUrl": "Nessun URL iFrame fornito",
"unsupportedProtocol": "L'URL fornito sta usando un protocollo non supportato. Si prega di utilizzare uno di ({supportedProtocols})", "unsupportedProtocol": "L'URL fornito sta usando un protocollo non supportato. Si prega di utilizzare uno di ({supportedProtocols})",
"noBrowerSupport": "Il tuo browser non supporta iframes. Aggiorna il tuo browser." "noBrowerSupport": "Il tuo browser non supporta iframes. Aggiorna il tuo browser."
} }
@@ -1664,7 +1664,7 @@
} }
}, },
"stockPrice": { "stockPrice": {
"name": "", "name": "Prezzo delle azioni",
"description": "Visualizza il prezzo attuale delle azioni di una società", "description": "Visualizza il prezzo attuale delle azioni di una società",
"option": { "option": {
"stock": { "stock": {
@@ -1835,7 +1835,7 @@
"title": "Index manager", "title": "Index manager",
"testAll": "Prova tutto", "testAll": "Prova tutto",
"error": { "error": {
"internalServerError": "" "internalServerError": "Impossibile recuperare lo stato degli indicizzatori"
} }
}, },
"healthMonitoring": { "healthMonitoring": {
@@ -2020,7 +2020,7 @@
"name": "Nome", "name": "Nome",
"id": "Id", "id": "Id",
"metadata": { "metadata": {
"title": "", "title": "Statistiche per nerd",
"video": { "video": {
"title": "Video", "title": "Video",
"resolution": "Risoluzione" "resolution": "Risoluzione"
@@ -2034,7 +2034,7 @@
"title": "Transcodifica", "title": "Transcodifica",
"container": "Container", "container": "Container",
"resolution": "Risoluzione", "resolution": "Risoluzione",
"target": "" "target": "Codec di destinazione"
} }
} }
} }
@@ -2098,12 +2098,12 @@
"detailsTitle": "Categorie (Informazioni aggiuntive)" "detailsTitle": "Categorie (Informazioni aggiuntive)"
}, },
"downSpeed": { "downSpeed": {
"columnTitle": "", "columnTitle": "Giù",
"detailsTitle": "Velocità Di Download" "detailsTitle": "Velocità Di Download"
}, },
"index": { "index": {
"columnTitle": "#", "columnTitle": "#",
"detailsTitle": "" "detailsTitle": "Indice corrente all'interno del client"
}, },
"id": { "id": {
"columnTitle": "Id" "columnTitle": "Id"
@@ -2112,22 +2112,22 @@
"columnTitle": "Integrazione" "columnTitle": "Integrazione"
}, },
"name": { "name": {
"columnTitle": "" "columnTitle": "Nome del job"
}, },
"progress": { "progress": {
"columnTitle": "Avanzamento", "columnTitle": "Avanzamento",
"detailsTitle": "" "detailsTitle": "Avanzamento del download"
}, },
"ratio": { "ratio": {
"columnTitle": "Rapporto", "columnTitle": "Rapporto",
"detailsTitle": "Rapporto torrent (ricevuti/inviati)" "detailsTitle": "Rapporto torrent (ricevuti/inviati)"
}, },
"received": { "received": {
"columnTitle": "", "columnTitle": "Totale fuori servizio",
"detailsTitle": "Totale scaricati" "detailsTitle": "Totale scaricati"
}, },
"sent": { "sent": {
"columnTitle": "", "columnTitle": "Totale operativo",
"detailsTitle": "Totale Caricati" "detailsTitle": "Totale Caricati"
}, },
"size": { "size": {
@@ -2136,7 +2136,7 @@
}, },
"state": { "state": {
"columnTitle": "Stato", "columnTitle": "Stato",
"detailsTitle": "" "detailsTitle": "Stato job"
}, },
"time": { "time": {
"columnTitle": "Ora di fine", "columnTitle": "Ora di fine",
@@ -2158,7 +2158,7 @@
"completed": "Completato", "completed": "Completato",
"failed": "Non riuscito", "failed": "Non riuscito",
"processing": "In lavorazione", "processing": "In lavorazione",
"leeching": "", "leeching": "Leeching",
"stalled": "In stallo", "stalled": "In stallo",
"unknown": "Sconosciuto", "unknown": "Sconosciuto",
"seeding": "Seeding" "seeding": "Seeding"
@@ -2205,7 +2205,7 @@
"label": "Mostra suggerimento descrizione" "label": "Mostra suggerimento descrizione"
}, },
"showType": { "showType": {
"label": "" "label": "Mostra il badge del tipo di media"
}, },
"showSource": { "showSource": {
"label": "Mostra sorgente integrazione" "label": "Mostra sorgente integrazione"
@@ -2216,7 +2216,7 @@
} }
}, },
"mediaRequests-requestList": { "mediaRequests-requestList": {
"name": "", "name": "Elenco Richieste Media",
"description": "Visualizza un elenco di tutte le richieste media dalla tua istanza Overseerr o Jellyseerr", "description": "Visualizza un elenco di tutte le richieste media dalla tua istanza Overseerr o Jellyseerr",
"option": { "option": {
"linksTargetNewTab": { "linksTargetNewTab": {
@@ -2232,9 +2232,10 @@
"unknown": "Sconosciuto", "unknown": "Sconosciuto",
"pending": "In sospeso", "pending": "In sospeso",
"processing": "In lavorazione", "processing": "In lavorazione",
"requested": "Richiesto",
"partiallyAvailable": "Parziale", "partiallyAvailable": "Parziale",
"available": "Disponibile", "available": "Disponibile",
"blacklisted": "", "blacklisted": "In blacklist",
"deleted": "Eliminato" "deleted": "Eliminato"
}, },
"status": { "status": {
@@ -2247,7 +2248,7 @@
"toBeDetermined": "TBD" "toBeDetermined": "TBD"
}, },
"mediaRequests-requestStats": { "mediaRequests-requestStats": {
"name": "", "name": "Statistiche Richiesta Media",
"description": "Statistiche sulle richieste dei media", "description": "Statistiche sulle richieste dei media",
"option": {}, "option": {},
"titles": { "titles": {
@@ -2338,7 +2339,7 @@
"label": "Abilita RTL" "label": "Abilita RTL"
}, },
"textLinesClamp": { "textLinesClamp": {
"label": "" "label": "Limita le righe della descrizione"
}, },
"maximumAmountPosts": { "maximumAmountPosts": {
"label": "Limite di post" "label": "Limite di post"
@@ -2353,11 +2354,11 @@
"description": "Visualizza un elenco della versione corrente dei repository dati con la versione regex specificata.", "description": "Visualizza un elenco della versione corrente dei repository dati con la versione regex specificata.",
"option": { "option": {
"newReleaseWithin": { "newReleaseWithin": {
"label": "", "label": "Nuova versione entro",
"description": "Esempio di utilizzo: 1w (1 settimana), 10M (10 mesi). Tipi di unità accettati h (ore), d (giorni), w (settimane), M (mesi), y (anni). Lasciare vuoto per non evidenziare le nuove versioni." "description": "Esempio di utilizzo: 1w (1 settimana), 10M (10 mesi). Tipi di unità accettati h (ore), d (giorni), w (settimane), M (mesi), y (anni). Lasciare vuoto per non evidenziare le nuove versioni."
}, },
"staleReleaseWithin": { "staleReleaseWithin": {
"label": "", "label": "Rilascio obsoleto entro",
"description": "Esempio di utilizzo: 1w (1 settimana), 10M (10 mesi). Tipi di unità accettati h (ore), d (giorni), w (settimane), M (mesi), y (anni). Lasciare vuoto per non evidenziare le release obsolete." "description": "Esempio di utilizzo: 1w (1 settimana), 10M (10 mesi). Tipi di unità accettati h (ore), d (giorni), w (settimane), M (mesi), y (anni). Lasciare vuoto per non evidenziare le release obsolete."
}, },
"showOnlyHighlighted": { "showOnlyHighlighted": {
@@ -2702,7 +2703,7 @@
"label": "Titolo della pagina" "label": "Titolo della pagina"
}, },
"metaTitle": { "metaTitle": {
"label": "" "label": "Meta title"
}, },
"logoImageUrl": { "logoImageUrl": {
"label": "URL immagine del logo" "label": "URL immagine del logo"
@@ -2948,8 +2949,8 @@
"label": "Numero di colonne" "label": "Numero di colonne"
}, },
"breakpoint": { "breakpoint": {
"label": "", "label": "Breakpoint",
"description": "" "description": "Il layout verrà utilizzato su tutti gli schermi più grandi di questo breakpoint fino al breakpoint più grande successivo."
} }
} }
}, },
@@ -3013,7 +3014,7 @@
"integration": "Integrazioni", "integration": "Integrazioni",
"app": "Applicazioni", "app": "Applicazioni",
"group": "Gruppi", "group": "Gruppi",
"searchEngine": "", "searchEngine": "Motori di ricerca",
"media": "Media" "media": "Media"
}, },
"statisticLabel": { "statisticLabel": {
@@ -3023,8 +3024,8 @@
"authorization": "Autorizzazione" "authorization": "Autorizzazione"
}, },
"heroBanner": { "heroBanner": {
"title": "", "title": "Bentornato sulla tua",
"subtitle": "" "subtitle": "{app} Board"
} }
}, },
"board": { "board": {
@@ -3322,7 +3323,7 @@
"label": "Analytics" "label": "Analytics"
}, },
"smartHomeEntityState": { "smartHomeEntityState": {
"label": "" "label": "Stato dell'entità Smart Home"
}, },
"ping": { "ping": {
"label": "Ping" "label": "Ping"
@@ -3337,10 +3338,10 @@
"label": "Scaricamenti" "label": "Scaricamenti"
}, },
"mediaRequestStats": { "mediaRequestStats": {
"label": "" "label": "Statistiche richieste media"
}, },
"mediaRequestList": { "mediaRequestList": {
"label": "" "label": "Elenco richieste media"
}, },
"rssFeeds": { "rssFeeds": {
"label": "Feeds RSS" "label": "Feeds RSS"
@@ -3349,16 +3350,16 @@
"label": "Gestione Indicizzatori" "label": "Gestione Indicizzatori"
}, },
"healthMonitoring": { "healthMonitoring": {
"label": "" "label": "Monitoraggio integrità del sistema"
}, },
"dnsHole": { "dnsHole": {
"label": "" "label": "Dati di filtraggio DNS"
}, },
"updateChecker": { "updateChecker": {
"label": "Controllo aggiornamenti" "label": "Controllo aggiornamenti"
}, },
"mediaTranscoding": { "mediaTranscoding": {
"label": "" "label": "Transcodifica del media"
}, },
"networkController": { "networkController": {
"label": "Controller di rete" "label": "Controller di rete"
@@ -3435,10 +3436,10 @@
}, },
"trigger": { "trigger": {
"success": { "success": {
"message": "" "message": "Attività attivata con successo"
}, },
"error": { "error": {
"message": "" "message": "Impossibile attivare l'attività"
} }
}, },
"enable": { "enable": {
@@ -3453,7 +3454,7 @@
}, },
"toggle": { "toggle": {
"error": { "error": {
"message": "" "message": "Impossibile attivare lo stato dell'attività"
} }
} }
}, },
@@ -3510,19 +3511,19 @@
"subtitle": "{count} utilizzato nel Codice di Homarr" "subtitle": "{count} utilizzato nel Codice di Homarr"
}, },
"hotkeys": { "hotkeys": {
"title": "", "title": "Tasti di scelta rapida",
"subtitle": "Scorciatoie da tastiera per migliorare il flusso di lavoro", "subtitle": "Scorciatoie da tastiera per migliorare il flusso di lavoro",
"field": { "field": {
"shortcut": "Scorciatoia", "shortcut": "Scorciatoia",
"action": "Azione" "action": "Azione"
}, },
"action": { "action": {
"toggleBoardEdit": "", "toggleBoardEdit": "Attiva la modalità di modifica della board",
"toggleColorScheme": "", "toggleColorScheme": "Attiva tema chiaro/scuro",
"saveNotebook": "", "saveNotebook": "Salva notebook (solo nel widget notebook)",
"openSpotlight": "" "openSpotlight": "Apri ricerca"
}, },
"note": "" "note": "Suggerimento: 'Mod' si riferisce sia al tasto Ctrl che al tasto ⌘ su macOS"
} }
} }
} }
@@ -3534,7 +3535,7 @@
"updated": "Aggiornato {when}", "updated": "Aggiornato {when}",
"search": "Cerca {count} container", "search": "Cerca {count} container",
"selected": "{selectCount} di {totalCount} containers selezionati", "selected": "{selectCount} di {totalCount} containers selezionati",
"footer": "" "footer": "Totale container {count}"
}, },
"field": { "field": {
"name": { "name": {
@@ -3672,11 +3673,11 @@
"resources": { "resources": {
"title": "Risorse", "title": "Risorse",
"nodes": "Nodi", "nodes": "Nodi",
"namespaces": "", "namespaces": "Spazi dei nomi",
"ingresses": "Ingressi", "ingresses": "Ingressi",
"services": "Servizi", "services": "Servizi",
"pods": "Pods", "pods": "Pods",
"configmaps": "", "configmaps": "ConfigMaps",
"secrets": "Secrets", "secrets": "Secrets",
"volumes": "Volumi" "volumes": "Volumi"
} }
@@ -3721,7 +3722,7 @@
} }
}, },
"namespaces": { "namespaces": {
"label": "", "label": "Spazi dei nomi",
"field": { "field": {
"name": { "name": {
"label": "Nome" "label": "Nome"
@@ -3730,7 +3731,7 @@
"label": "Stato", "label": "Stato",
"option": { "option": {
"active": "Attivo", "active": "Attivo",
"terminating": "" "terminating": "Terminare"
} }
}, },
"creationTimestamp": { "creationTimestamp": {
@@ -3738,7 +3739,7 @@
} }
}, },
"table": { "table": {
"search": "" "search": "Cerca {count} spazi dei nomi"
} }
}, },
"ingresses": { "ingresses": {
@@ -3748,7 +3749,7 @@
"label": "Nome" "label": "Nome"
}, },
"namespace": { "namespace": {
"label": "" "label": "Spazio dei nomi"
}, },
"className": { "className": {
"label": "Nome classe" "label": "Nome classe"
@@ -3761,7 +3762,7 @@
} }
}, },
"table": { "table": {
"search": "" "search": "Cerca {count} ingresses"
} }
}, },
"services": { "services": {
@@ -3771,7 +3772,7 @@
"label": "Nome" "label": "Nome"
}, },
"namespace": { "namespace": {
"label": "" "label": "Spazio del nome"
}, },
"type": { "type": {
"label": "Tipo" "label": "Tipo"
@@ -3800,7 +3801,7 @@
"label": "Nome" "label": "Nome"
}, },
"namespace": { "namespace": {
"label": "" "label": "Spazio del nome"
}, },
"image": { "image": {
"label": "Immagine" "label": "Immagine"
@@ -3826,7 +3827,7 @@
"label": "Nome" "label": "Nome"
}, },
"namespace": { "namespace": {
"label": "" "label": "spazio del nome"
}, },
"type": { "type": {
"label": "tipo" "label": "tipo"
@@ -3836,24 +3837,24 @@
} }
}, },
"table": { "table": {
"search": "" "search": "Cerca {count} segreti"
} }
}, },
"configmaps": { "configmaps": {
"label": "", "label": "ConfigMaps",
"field": { "field": {
"name": { "name": {
"label": "Nome" "label": "Nome"
}, },
"namespace": { "namespace": {
"label": "" "label": "namespace"
}, },
"creationTimestamp": { "creationTimestamp": {
"label": "Creato" "label": "Creato"
} }
}, },
"table": { "table": {
"search": "" "search": "Cerca {count} ConfigMaps"
} }
}, },
"volumes": { "volumes": {
@@ -3863,7 +3864,7 @@
"label": "Nome" "label": "Nome"
}, },
"namespace": { "namespace": {
"label": "" "label": "Namespace"
}, },
"accessModes": { "accessModes": {
"label": "Modalità Di Accesso" "label": "Modalità Di Accesso"
@@ -3872,7 +3873,7 @@
"label": "Spazio di archiviazione" "label": "Spazio di archiviazione"
}, },
"storageClassName": { "storageClassName": {
"label": "" "label": "Nome Classe Archivio"
}, },
"volumeMode": { "volumeMode": {
"label": "Modalità Volume" "label": "Modalità Volume"
@@ -3888,7 +3889,7 @@
} }
}, },
"table": { "table": {
"search": "" "search": "Cerca {count} volumi"
} }
}, },
"error": { "error": {
@@ -3989,7 +3990,7 @@
"label": "Nodi" "label": "Nodi"
}, },
"namespaces": { "namespaces": {
"label": "" "label": "Namespaces"
}, },
"ingresses": { "ingresses": {
"label": "Ingressi" "label": "Ingressi"
@@ -4001,7 +4002,7 @@
"label": "pods" "label": "pods"
}, },
"configmaps": { "configmaps": {
"label": "" "label": "ConfigMaps"
}, },
"secrets": { "secrets": {
"label": "Secrets" "label": "Secrets"
@@ -4092,7 +4093,7 @@
"option": { "option": {
"colorScheme": { "colorScheme": {
"light": "Passa al tema chiaro", "light": "Passa al tema chiaro",
"dark": "Passa alla modalità scura" "dark": "Passa al tema scuro"
}, },
"language": { "language": {
"label": "Cambia lingua", "label": "Cambia lingua",
+22 -21
View File
@@ -649,14 +649,14 @@
"app": { "app": {
"option": { "option": {
"existing": { "existing": {
"title": "", "title": "既存",
"label": "" "label": "既存のアプリを選択"
}, },
"new": { "new": {
"title": "", "title": "新規作成",
"url": { "url": {
"label": "", "label": "アプリURL",
"description": "" "description": "ダッシュボードからアクセスしたときにアプリが開くURL"
} }
} }
} }
@@ -676,9 +676,9 @@
}, },
"app": { "app": {
"action": { "action": {
"add": "", "add": "アプリにリンクする",
"remove": "", "remove": "リンクを解除する",
"select": "" "select": "リンクするアプリを選択する"
} }
} }
}, },
@@ -709,7 +709,7 @@
"description": "連携機能 \"{kind}\" は、検索エンジンで使用できます。検索エンジンを自動的に設定するには、これにチェックを入れてください。" "description": "連携機能 \"{kind}\" は、検索エンジンで使用できます。検索エンジンを自動的に設定するには、これにチェックを入れてください。"
}, },
"app": { "app": {
"sectionTitle": "" "sectionTitle": "リンクされたアプリ"
}, },
"createApp": { "createApp": {
"label": "アプリの作成", "label": "アプリの作成",
@@ -1051,7 +1051,7 @@
"add": "追加", "add": "追加",
"apply": "適用", "apply": "適用",
"backToOverview": "概要に戻る", "backToOverview": "概要に戻る",
"change": "", "change": "変更する",
"create": "作成", "create": "作成",
"createAnother": "作成・新規入力", "createAnother": "作成・新規入力",
"edit": "編集", "edit": "編集",
@@ -1174,8 +1174,8 @@
}, },
"unit": { "unit": {
"speed": { "speed": {
"kilometersPerHour": "", "kilometersPerHour": "km/h",
"milesPerHour": "" "milesPerHour": "mph"
} }
} }
}, },
@@ -1190,7 +1190,7 @@
"label": "タイトル" "label": "タイトル"
}, },
"customCssClasses": { "customCssClasses": {
"label": "" "label": "カスタム css クラス"
}, },
"borderColor": { "borderColor": {
"label": "境界線の色" "label": "境界線の色"
@@ -1780,7 +1780,7 @@
"description": "現在の天気のみ表示" "description": "現在の天気のみ表示"
}, },
"useImperialSpeed": { "useImperialSpeed": {
"label": "" "label": "風速にmphを使用する"
}, },
"location": { "location": {
"label": "天候の場所" "label": "天候の場所"
@@ -1800,12 +1800,12 @@
"description": "日付がどのように見えるか" "description": "日付がどのように見えるか"
} }
}, },
"currentWindSpeed": "時速 {currentWindSpeed} km", "currentWindSpeed": "時速 {currentWindSpeed} {unit}",
"dailyForecast": { "dailyForecast": {
"sunrise": "日出", "sunrise": "日出",
"sunset": "日没", "sunset": "日没",
"maxWindSpeed": "最大風速: {maxWindSpeed} km/h", "maxWindSpeed": "最大風速: {maxWindSpeed} {unit}",
"maxWindGusts": "最大瞬間風速: {maxWindGusts} km/h" "maxWindGusts": "最大瞬間風速: {maxWindGusts} {unit}"
}, },
"kind": { "kind": {
"clear": "晴れ", "clear": "晴れ",
@@ -2232,6 +2232,7 @@
"unknown": "不明", "unknown": "不明",
"pending": "保留中", "pending": "保留中",
"processing": "処理中", "processing": "処理中",
"requested": "",
"partiallyAvailable": "一部", "partiallyAvailable": "一部",
"available": "利用可能", "available": "利用可能",
"blacklisted": "ブラックリスト", "blacklisted": "ブラックリスト",
@@ -3013,8 +3014,8 @@
"integration": "連携機能", "integration": "連携機能",
"app": "アプリ", "app": "アプリ",
"group": "グループ", "group": "グループ",
"searchEngine": "", "searchEngine": "検索エンジン",
"media": "" "media": "メディア"
}, },
"statisticLabel": { "statisticLabel": {
"boards": "ボード", "boards": "ボード",
@@ -3023,8 +3024,8 @@
"authorization": "認可" "authorization": "認可"
}, },
"heroBanner": { "heroBanner": {
"title": "", "title": "おかえりなさい",
"subtitle": "" "subtitle": "{app} ボード"
} }
}, },
"board": { "board": {
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "알 수 없음", "unknown": "알 수 없음",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "", "partiallyAvailable": "",
"available": "", "available": "",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Nežinoma", "unknown": "Nežinoma",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Dalis", "partiallyAvailable": "Dalis",
"available": "Galima", "available": "Galima",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Nezināms", "unknown": "Nezināms",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Daļējs", "partiallyAvailable": "Daļējs",
"available": "Pieejams", "available": "Pieejams",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Onbekend", "unknown": "Onbekend",
"pending": "In afwachting", "pending": "In afwachting",
"processing": "Verwerken", "processing": "Verwerken",
"requested": "",
"partiallyAvailable": "Gedeeltelijk", "partiallyAvailable": "Gedeeltelijk",
"available": "Beschikbaar", "available": "Beschikbaar",
"blacklisted": "Geblacklist", "blacklisted": "Geblacklist",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Ukjent", "unknown": "Ukjent",
"pending": "Pågår", "pending": "Pågår",
"processing": "Prosesserer", "processing": "Prosesserer",
"requested": "",
"partiallyAvailable": "Delvis", "partiallyAvailable": "Delvis",
"available": "Tilgjengelig", "available": "Tilgjengelig",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Nieznany", "unknown": "Nieznany",
"pending": "Oczekujący", "pending": "Oczekujący",
"processing": "Przetwarzanie", "processing": "Przetwarzanie",
"requested": "Żądanie",
"partiallyAvailable": "Częściowy", "partiallyAvailable": "Częściowy",
"available": "Dostępne", "available": "Dostępne",
"blacklisted": "Zablokowany", "blacklisted": "Zablokowany",
+38 -37
View File
@@ -7,7 +7,7 @@
"description": "Para começar, por favor selecione como você deseja configurar sua instância Homarr.", "description": "Para começar, por favor selecione como você deseja configurar sua instância Homarr.",
"action": { "action": {
"scratch": "Começar do zero", "scratch": "Começar do zero",
"importOldmarr": "Importe de uma instância Homarr anterior a 1,0" "importOldmarr": "Importe de uma instância Homarr anterior a 1.0"
} }
}, },
"import": { "import": {
@@ -307,12 +307,12 @@
"name": "Nome", "name": "Nome",
"members": "Membros", "members": "Membros",
"homeBoard": { "homeBoard": {
"label": "", "label": "Quadro inicial",
"description": "" "description": "Somente quadros acessíveis ao grupo podem ser selecionados"
}, },
"mobileBoard": { "mobileBoard": {
"label": "", "label": "Quadro para celular",
"description": "" "description": "Somente quadros acessíveis ao grupo podem ser selecionados"
} }
}, },
"permission": { "permission": {
@@ -320,8 +320,8 @@
"title": "Administrador", "title": "Administrador",
"item": { "item": {
"admin": { "admin": {
"label": "", "label": "Administrador",
"description": "" "description": "Membros com essa permissão têm acesso total a todos os recursos e configurações"
} }
} }
}, },
@@ -329,15 +329,15 @@
"title": "Aplicativos", "title": "Aplicativos",
"item": { "item": {
"create": { "create": {
"label": "", "label": "Criar aplicativo",
"description": "" "description": "Permitir que membros criem aplicativos"
}, },
"use-all": { "use-all": {
"label": "", "label": "Usar todas aplicações",
"description": "" "description": "Permitir que os membros adicionem qualquer aplicativo aos seus quadros"
}, },
"modify-all": { "modify-all": {
"label": "", "label": "Modificar todos os aplicativos",
"description": "" "description": ""
}, },
"full-all": { "full-all": {
@@ -410,7 +410,7 @@
"item": { "item": {
"view-logs": { "view-logs": {
"label": "", "label": "",
"description": "" "description": "Permitir que os membros visualizem os registros"
} }
} }
}, },
@@ -419,7 +419,7 @@
"item": { "item": {
"create": { "create": {
"label": "", "label": "",
"description": "" "description": "Permitir que os membros criem mecanismos de busca"
}, },
"modify-all": { "modify-all": {
"label": "", "label": "",
@@ -547,19 +547,19 @@
"title": "Aplicativos", "title": "Aplicativos",
"noResults": { "noResults": {
"title": "", "title": "",
"action": "" "action": "Crie seu primeiro aplicativo"
} }
}, },
"create": { "create": {
"title": "", "title": "Novo Aplicativo",
"notification": { "notification": {
"success": { "success": {
"title": "", "title": "Criado com sucesso",
"message": "" "message": "O aplicativo foi criado com sucesso"
}, },
"error": { "error": {
"title": "", "title": "Falha ao criar",
"message": "" "message": "Não foi possível criar o aplicativo"
} }
} }
}, },
@@ -618,9 +618,9 @@
"title": "" "title": ""
}, },
"create": { "create": {
"title": "", "title": "Criar aplicativo",
"description": "", "description": "Criar um aplicativo",
"action": "" "action": "Abrir criação de aplicativo"
}, },
"add": "" "add": ""
} }
@@ -649,14 +649,14 @@
"app": { "app": {
"option": { "option": {
"existing": { "existing": {
"title": "", "title": "Existente",
"label": "" "label": "Selecione um aplicativo existente"
}, },
"new": { "new": {
"title": "", "title": "Novo",
"url": { "url": {
"label": "", "label": "URL da aplicação",
"description": "" "description": "A URL do aplicativo será aberta quando acessada a partir do painel de controle"
} }
} }
} }
@@ -712,8 +712,8 @@
"sectionTitle": "" "sectionTitle": ""
}, },
"createApp": { "createApp": {
"label": "", "label": "Criar aplicativo",
"description": "" "description": "Crie um aplicativo com o mesmo nome e ícone da integração. Deixe o campo de entrada abaixo vazio para criar o aplicativo com a URL de integração."
}, },
"appHref": { "appHref": {
"placeholder": "" "placeholder": ""
@@ -1973,8 +1973,8 @@
}, },
"app": { "app": {
"noData": "", "noData": "",
"description": "", "description": "Clique <here></here> para criar um aplicativo",
"quickCreate": "" "quickCreate": "Criar aplicativo em tempo real"
}, },
"error": { "error": {
"noIntegration": "", "noIntegration": "",
@@ -2232,6 +2232,7 @@
"unknown": "Desconhecido", "unknown": "Desconhecido",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Parcial", "partiallyAvailable": "Parcial",
"available": "Disponível", "available": "Disponível",
"blacklisted": "", "blacklisted": "",
@@ -2659,7 +2660,7 @@
}, },
"onlyImportApps": { "onlyImportApps": {
"label": "", "label": "",
"description": "" "description": "Só adiciona os aplicativos, o quadro precisa ser recriado manualmente"
} }
}, },
"name": { "name": {
@@ -2692,8 +2693,8 @@
}, },
"quickCreateApp": { "quickCreateApp": {
"modal": { "modal": {
"title": "", "title": "Criar aplicativo em tempo real",
"createAndUse": "" "createAndUse": "Criar e utilizar"
} }
} }
}, },
@@ -2911,7 +2912,7 @@
"title": "", "title": "",
"description": "", "description": "",
"link": "", "link": "",
"notice": "" "notice": "Para fazer esta página desaparecer, crie um quadro e defina-o como quadro inicial"
}, },
"notFound": { "notFound": {
"title": "", "title": "",
@@ -4109,7 +4110,7 @@
"label": "" "label": ""
}, },
"newApp": { "newApp": {
"label": "" "label": "Criar aplicativo"
}, },
"newIntegration": { "newIntegration": {
"label": "", "label": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Necunoscut", "unknown": "Necunoscut",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Parțial", "partiallyAvailable": "Parțial",
"available": "Disponibil", "available": "Disponibil",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Неизвестно", "unknown": "Неизвестно",
"pending": "В ожидании", "pending": "В ожидании",
"processing": "Обработка", "processing": "Обработка",
"requested": "",
"partiallyAvailable": "Частично доступно", "partiallyAvailable": "Частично доступно",
"available": "Доступно", "available": "Доступно",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Neznámy", "unknown": "Neznámy",
"pending": "Čakajúce", "pending": "Čakajúce",
"processing": "Spracovanie", "processing": "Spracovanie",
"requested": "",
"partiallyAvailable": "Čiastočný", "partiallyAvailable": "Čiastočný",
"available": "K dispozícii", "available": "K dispozícii",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Neznano", "unknown": "Neznano",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "", "partiallyAvailable": "",
"available": "", "available": "",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Okänd", "unknown": "Okänd",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Delmängd", "partiallyAvailable": "Delmängd",
"available": "Tillgänglig", "available": "Tillgänglig",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Bilinmeyen", "unknown": "Bilinmeyen",
"pending": "Bekleyen", "pending": "Bekleyen",
"processing": "İşlemde", "processing": "İşlemde",
"requested": "",
"partiallyAvailable": "Kısmi", "partiallyAvailable": "Kısmi",
"available": "Mevcut", "available": "Mevcut",
"blacklisted": "Engellenenler", "blacklisted": "Engellenenler",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Невідомо", "unknown": "Невідомо",
"pending": "В очікуванні", "pending": "В очікуванні",
"processing": "В обробці", "processing": "В обробці",
"requested": "",
"partiallyAvailable": "Частково доступно", "partiallyAvailable": "Частково доступно",
"available": "Доступно", "available": "Доступно",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "Không rõ", "unknown": "Không rõ",
"pending": "", "pending": "",
"processing": "", "processing": "",
"requested": "",
"partiallyAvailable": "Một phần", "partiallyAvailable": "Một phần",
"available": "Khả dụng", "available": "Khả dụng",
"blacklisted": "", "blacklisted": "",
+1
View File
@@ -2232,6 +2232,7 @@
"unknown": "未知", "unknown": "未知",
"pending": "等待處理中", "pending": "等待處理中",
"processing": "處理中", "processing": "處理中",
"requested": "",
"partiallyAvailable": "部分", "partiallyAvailable": "部分",
"available": "待定", "available": "待定",
"blacklisted": "", "blacklisted": "",
+5 -5
View File
@@ -30,12 +30,12 @@
"@homarr/log": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.6", "@mantine/core": "^8.3.9",
"@mantine/dates": "^8.3.6", "@mantine/dates": "^8.3.9",
"@mantine/hooks": "^8.3.6", "@mantine/hooks": "^8.3.9",
"@tabler/icons-react": "^3.35.0", "@tabler/icons-react": "^3.35.0",
"mantine-react-table": "2.0.0-beta.9", "mantine-react-table": "2.0.0-beta.9",
"next": "16.0.1", "next": "16.0.7",
"react": "19.2.0", "react": "19.2.0",
"react-dom": "19.2.0", "react-dom": "19.2.0",
"svgson": "^5.3.1" "svgson": "^5.3.1"
@@ -45,7 +45,7 @@
"@homarr/prettier-config": "workspace:^0.1.0", "@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0",
"@types/css-modules": "^1.0.5", "@types/css-modules": "^1.0.5",
"eslint": "^9.39.0", "eslint": "^9.39.1",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
} }
Loaded 100 of 114 files, more files were not shown because too many files have changed in this diff. Show more