Compare commits

..
36 Commits
Author SHA1 Message Date
Releases Homarr d2c075517f chore(release): 1.52.0 [skip ci] 2026-01-30 19:32:17 +00:00
homarr-releases[bot] fab80d5ab2 chore(release): automatic release v1.52.0 2026-01-30 19:31:27 +00:00
Meier Lukasandajnart 8811af5e6e Merge commit from fork
* fix(security): resolve ssrf issue with simple ping

* refactor: improve testability of app-access-control and fix tests

* fix: unnecessary space

Co-authored-by: ajnart <thomas@ajnart.fr>

---------

Co-authored-by: ajnart <thomas@ajnart.fr>
2026-01-30 18:31:13 +01:00
Meier Lukas 9ba82133da feat(installations): support docker secrets file for encryption key (#4946) 2026-01-30 17:28:08 +01:00
homarr-renovate[bot] 67e1b9bdc3 chore(deps): update dependency axios@&gt;&#x3d;1.0.0 &lt;1.8.2 to >=1.13.3 (#4950)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-30 14:52:11 +00:00
homarr-renovate[bot] 08711a551f chore(deps): update dependency hono@&lt;4.6.5 to >=4.11.7 [security] (#4930)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-30 14:01:18 +00:00
homarr-update-contributors[bot] ef1197b382 chore: update contributors (#4949)
Co-authored-by: Homarr Update Contributors <210161987+homarr-update-contributors[bot]@users.noreply.github.com>
2026-01-30 12:45:40 +00:00
homarr-crowdin[bot] 26144e22f4 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-01-30 01:05:18 +00:00
homarr-renovate[bot] e078237e31 fix(deps): update turbo monorepo to ^2.7.6 (#4947)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-29 22:36:34 +00:00
Meier Lukas 1a33d8ccee chore: ignore .turbo directory for docker build 2026-01-29 20:37:01 +01:00
homarr-renovate[bot] b354085c7a fix(deps): update tiptap monorepo to v3.17.1 (#4945)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-29 18:56:43 +00:00
homarr-crowdin[bot] a43429b351 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-01-29 18:49:45 +00:00
homarr-renovate[bot] 203ebbbd4e chore(deps): update dependency proxmox-api&gt;undici to v7.19.1 (#4944)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-29 15:44:22 +00:00
homarr-renovate[bot] 0bdc76cc23 chore(deps): update dependency vite-tsconfig-paths to ^6.0.5 (#4941)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-28 22:35:54 +00:00
homarr-renovate[bot] 840940bab6 fix(deps): update dependency @tanstack/react-query to ^5.90.20 (#4939)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-28 14:38:30 +00:00
homarr-renovate[bot] d03026187c fix(deps): update tiptap monorepo to v3.17.0 (#4940)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-28 13:58:20 +00:00
homarr-renovate[bot] aeb1df1229 fix(deps): update dependency next to v16.1.5 [security] (#4937)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-27 21:21:21 +00:00
homarr-renovate[bot] dea3f02e6f chore(deps): update vitest monorepo to ^4.0.18 (#4929)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-27 20:40:04 +01:00
homarr-renovate[bot] 6fd0fb5508 chore(deps): update dependency prettier-plugin-packagejson to v3 (#4910)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-27 17:16:26 +01:00
homarr-renovate[bot] ce72b21a04 chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.56.0 (#4928)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-27 06:43:47 +00:00
homarr-renovate[bot] b1658a5d01 fix(deps): update dependency sass to ^1.97.3 (#4927)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-27 03:55:45 +00:00
homarr-renovate[bot] 4df63eacc5 chore(deps): update dependency hono@&lt;4.6.5 to >=4.11.5 (#4926)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-27 02:02:21 +00:00
homarr-renovate[bot] 3cca339881 chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.55.3 (#4919)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-26 20:35:32 +00:00
homarr-renovate[bot] fd18cf79cc chore(deps): update dependency proxmox-api&gt;undici to v7.19.0 (#4922)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-26 19:31:50 +00:00
homarr-renovate[bot] a727b8e323 fix(deps): update dependency prettier to ^3.8.1 (#4925)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-26 18:45:54 +00:00
homarr-renovate[bot] 21c3882189 chore(deps): update dependency @types/dockerode to ^4.0.1 (#4918)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-26 04:08:39 +00:00
homarr-renovate[bot] d0c27b22ef chore(deps): update dependency @types/react to v19.2.9 (#4914)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-25 19:25:21 +00:00
homarr-renovate[bot] a50a29a778 fix(deps): update dependency pg to ^8.17.2 (#4916)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-25 18:39:14 +00:00
homarr-renovate[bot] 23545101b6 fix(deps): update tiptap monorepo to v3.16.0 (#4912)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-25 12:52:13 +00:00
homarr-renovate[bot] f2eec74849 fix(deps): update mantine monorepo to ^8.3.13 (#4911)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-25 07:29:50 +00:00
homarr-renovate[bot] 99a2574d80 fix(deps): update nextjs monorepo to v16.1.4 (#4909)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-25 02:08:32 +00:00
homarr-crowdin[bot] 66bde23667 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-01-25 01:02:57 +00:00
homarr-renovate[bot] c58da00957 fix(deps): update dependency typescript-eslint to ^8.53.1 (#4904)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-24 17:26:34 +00:00
homarr-renovate[bot] 6700124ccd chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.55.2 (#4902)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-24 13:37:13 +00:00
homarr-renovate[bot] f428abc0ce chore(deps): update pnpm to v10.28.1 (#4903)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-24 12:50:35 +00:00
homarr-crowdin[bot] 16e3e5b90b chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-01-24 00:55:54 +00:00
71 changed files with 3707 additions and 1440 deletions

No files matched your search

+1
View File
@@ -5,6 +5,7 @@ node_modules
npm-debug.log
README.md
.next
.turbo
.git
dev
.build
+21
View File
@@ -1,3 +1,24 @@
## [1.52.0](https://github.com/homarr-labs/homarr/compare/v1.51.0...v1.52.0) (2026-01-30)
### Features
* **installations:** support docker secrets file for encryption key ([#4946](https://github.com/homarr-labs/homarr/issues/4946)) ([9ba8213](https://github.com/homarr-labs/homarr/commit/9ba82133da2ae472952358f84d8ee1758c0f108a))
### Bug Fixes
* **deps:** update dependency @tanstack/react-query to ^5.90.20 ([#4939](https://github.com/homarr-labs/homarr/issues/4939)) ([840940b](https://github.com/homarr-labs/homarr/commit/840940bab663e728b8516ac48f913fef2b5c61b7))
* **deps:** update dependency next to v16.1.5 [security] ([#4937](https://github.com/homarr-labs/homarr/issues/4937)) ([aeb1df1](https://github.com/homarr-labs/homarr/commit/aeb1df122926c7bed71bea9b21f1c42c45cc9b3e))
* **deps:** update dependency pg to ^8.17.2 ([#4916](https://github.com/homarr-labs/homarr/issues/4916)) ([a50a29a](https://github.com/homarr-labs/homarr/commit/a50a29a778689efcca0afc2b640fdb497e6e7d98))
* **deps:** update dependency prettier to ^3.8.1 ([#4925](https://github.com/homarr-labs/homarr/issues/4925)) ([a727b8e](https://github.com/homarr-labs/homarr/commit/a727b8e323b9fb7cba536909a51fabde0a992a69))
* **deps:** update dependency sass to ^1.97.3 ([#4927](https://github.com/homarr-labs/homarr/issues/4927)) ([b1658a5](https://github.com/homarr-labs/homarr/commit/b1658a5d01b5c12f391af9d326ec98b3da000f9e))
* **deps:** update dependency typescript-eslint to ^8.53.1 ([#4904](https://github.com/homarr-labs/homarr/issues/4904)) ([c58da00](https://github.com/homarr-labs/homarr/commit/c58da0095738352515d6d8c5e81b3c34c8726ffe))
* **deps:** update mantine monorepo to ^8.3.13 ([#4911](https://github.com/homarr-labs/homarr/issues/4911)) ([f2eec74](https://github.com/homarr-labs/homarr/commit/f2eec748494480e773b45a309aa89ae3862e2b05))
* **deps:** update nextjs monorepo to v16.1.4 ([#4909](https://github.com/homarr-labs/homarr/issues/4909)) ([99a2574](https://github.com/homarr-labs/homarr/commit/99a2574d80ad5a7dfe3b9c92d43bd4b9423bf22d))
* **deps:** update tiptap monorepo to v3.16.0 ([#4912](https://github.com/homarr-labs/homarr/issues/4912)) ([2354510](https://github.com/homarr-labs/homarr/commit/23545101b61e456fd886eedb4b3d86b8cc606639))
* **deps:** update tiptap monorepo to v3.17.0 ([#4940](https://github.com/homarr-labs/homarr/issues/4940)) ([d030261](https://github.com/homarr-labs/homarr/commit/d03026187cb6451d727167b02ac138f9c7ccc754))
* **deps:** update tiptap monorepo to v3.17.1 ([#4945](https://github.com/homarr-labs/homarr/issues/4945)) ([b354085](https://github.com/homarr-labs/homarr/commit/b354085c7adfb6e5f3cad51b5b825426e072e874))
* **deps:** update turbo monorepo to ^2.7.6 ([#4947](https://github.com/homarr-labs/homarr/issues/4947)) ([e078237](https://github.com/homarr-labs/homarr/commit/e078237e31d11029987c6c4370fd8f65023b87bc))
## [1.51.0](https://github.com/homarr-labs/homarr/compare/v1.50.1...v1.51.0) (2026-01-23)
### Features
+11 -11
View File
@@ -48,15 +48,15 @@
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"@mantine/colors-generator": "^8.3.12",
"@mantine/core": "^8.3.12",
"@mantine/dropzone": "^8.3.12",
"@mantine/hooks": "^8.3.12",
"@mantine/modals": "^8.3.12",
"@mantine/tiptap": "^8.3.12",
"@mantine/colors-generator": "^8.3.13",
"@mantine/core": "^8.3.13",
"@mantine/dropzone": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/modals": "^8.3.13",
"@mantine/tiptap": "^8.3.13",
"@million/lint": "1.0.14",
"@tabler/icons-react": "^3.36.1",
"@tanstack/react-query": "^5.90.19",
"@tanstack/react-query": "^5.90.20",
"@tanstack/react-query-devtools": "^5.91.2",
"@tanstack/react-query-next-experimental": "^5.91.0",
"@trpc/client": "^11.8.1",
@@ -76,14 +76,14 @@
"isomorphic-dompurify": "^2.35.0",
"jotai": "^2.16.2",
"mantine-react-table": "2.0.0-beta.9",
"next": "16.1.3",
"next": "16.1.5",
"postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0",
"react": "19.2.3",
"react-dom": "19.2.3",
"react-error-boundary": "^6.1.0",
"react-simple-code-editor": "^0.14.1",
"sass": "^1.97.2",
"sass": "^1.97.3",
"superjson": "2.2.6",
"swagger-ui-react": "^5.31.0",
"use-deep-compare-effect": "^1.8.1",
@@ -96,13 +96,13 @@
"@types/chroma-js": "3.1.2",
"@types/node": "^24.10.9",
"@types/prismjs": "^1.26.5",
"@types/react": "19.2.8",
"@types/react": "19.2.9",
"@types/react-dom": "19.2.3",
"@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.2.1",
"eslint": "^9.39.2",
"node-loader": "^2.1.0",
"prettier": "^3.8.0",
"prettier": "^3.8.1",
"typescript": "^5.9.3"
}
}
+1 -1
View File
@@ -51,7 +51,7 @@
"dotenv-cli": "^11.0.0",
"esbuild": "^0.27.2",
"eslint": "^9.39.2",
"prettier": "^3.8.0",
"prettier": "^3.8.1",
"tsx": "4.20.4",
"typescript": "^5.9.3"
}
+1 -1
View File
@@ -36,7 +36,7 @@
"@types/ws": "^8.18.1",
"esbuild": "^0.27.2",
"eslint": "^9.39.2",
"prettier": "^3.8.0",
"prettier": "^3.8.1",
"typescript": "^5.9.3"
}
}
+2 -2
View File
@@ -4,10 +4,10 @@
"dependencies": {
"better-sqlite3": "^12.6.2"
},
"packageManager": "pnpm@10.28.0",
"packageManager": "pnpm@10.28.1",
"engines": {
"node": ">=24.13.0",
"pnpm": ">=10.28.0"
"pnpm": ">=10.28.1"
},
"pnpm": {
"onlyBuiltDependencies": [
+14 -14
View File
@@ -1,6 +1,6 @@
{
"name": "homarr",
"version": "1.51.0",
"version": "1.52.0",
"private": true,
"scripts": {
"build": "cross-env CI=true turbo build",
@@ -43,26 +43,26 @@
"@semantic-release/npm": "^13.1.3",
"@semantic-release/release-notes-generator": "^14.1.0",
"@testcontainers/redis": "^11.11.0",
"@turbo/gen": "^2.7.5",
"@turbo/gen": "^2.7.6",
"@vitejs/plugin-react": "^5.1.2",
"@vitest/coverage-v8": "^4.0.17",
"@vitest/ui": "^4.0.17",
"@vitest/coverage-v8": "^4.0.18",
"@vitest/ui": "^4.0.18",
"conventional-changelog-conventionalcommits": "^9.1.0",
"cross-env": "^10.1.0",
"jsdom": "^27.4.0",
"json5": "^2.2.3",
"prettier": "^3.8.0",
"prettier": "^3.8.1",
"semantic-release": "^25.0.2",
"testcontainers": "^11.11.0",
"turbo": "^2.7.5",
"turbo": "^2.7.6",
"typescript": "^5.9.3",
"vite-tsconfig-paths": "^6.0.4",
"vitest": "^4.0.17"
"vite-tsconfig-paths": "^6.0.5",
"vitest": "^4.0.18"
},
"packageManager": "pnpm@10.28.0",
"packageManager": "pnpm@10.28.1",
"engines": {
"node": ">=24.13.0",
"pnpm": ">=10.28.0"
"pnpm": ">=10.28.1"
},
"pnpm": {
"onlyBuiltDependencies": [
@@ -79,18 +79,18 @@
"overrides": {
"@babel/helpers@<7.26.10": ">=7.28.6",
"@babel/runtime@<7.26.10": ">=7.28.6",
"axios@>=1.0.0 <1.8.2": ">=1.13.2",
"axios@>=1.0.0 <1.8.2": ">=1.13.3",
"brace-expansion@>=2.0.0 <=2.0.1": ">=4.0.1",
"brace-expansion@>=1.0.0 <=1.1.11": ">=4.0.1",
"esbuild@<=0.24.2": ">=0.27.2",
"form-data@>=4.0.0 <4.0.4": ">=4.0.5",
"hono@<4.6.5": ">=4.11.4",
"hono@<4.6.5": ">=4.11.7",
"linkifyjs@<4.3.2": ">=4.3.2",
"nanoid@>=4.0.0 <5.0.9": ">=5.1.6",
"prismjs@<1.30.0": ">=1.30.0",
"proxmox-api>undici": "7.18.2",
"proxmox-api>undici": "7.19.1",
"react-is": "^19.2.3",
"rollup@>=4.0.0 <4.22.4": ">=4.55.1",
"rollup@>=4.0.0 <4.22.4": ">=4.56.0",
"sha.js@<=2.4.11": ">=2.4.12",
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.1",
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.1",
+3 -3
View File
@@ -41,13 +41,13 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.4.0",
"@tanstack/react-query": "^5.90.19",
"@tanstack/react-query": "^5.90.20",
"@trpc/client": "^11.8.1",
"@trpc/react-query": "^11.8.1",
"@trpc/server": "^11.8.1",
"@trpc/tanstack-react-query": "^11.8.1",
"lodash.clonedeep": "^4.5.0",
"next": "16.1.3",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"superjson": "2.2.6",
@@ -59,7 +59,7 @@
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"eslint": "^9.39.2",
"prettier": "^3.8.0",
"prettier": "^3.8.1",
"typescript": "^5.9.3"
}
}
+34 -15
View File
@@ -1,7 +1,9 @@
import { TRPCError } from "@trpc/server";
import { z } from "zod/v4";
import type { Session } from "@homarr/auth";
import { createId } from "@homarr/common";
import type { Database, InferSelectModel } from "@homarr/db";
import { asc, eq, inArray, like } from "@homarr/db";
import { apps } from "@homarr/db/schema";
import { selectAppSchema } from "@homarr/db/validationSchemas";
@@ -11,7 +13,7 @@ import { byIdSchema, paginatedSchema } from "@homarr/validation/common";
import { convertIntersectionToZodObject } from "../schema-merger";
import { createTRPCRouter, permissionRequiredProcedure, protectedProcedure, publicProcedure } from "../trpc";
import { canUserSeeAppAsync } from "./app/app-access-control";
import { AppAccessControl } from "./app/app-access-control";
const defaultIcon = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/homarr.svg";
@@ -89,9 +91,8 @@ export const appRouter = createTRPCRouter({
.output(selectAppSchema)
.meta({ openapi: { method: "GET", path: "/api/apps/{id}", tags: ["apps"], protect: true } })
.query(async ({ ctx, input }) => {
const app = await ctx.db.query.apps.findFirst({
where: eq(apps.id, input.id),
});
const repository = new AppRepository(ctx.db, ctx.session?.user ?? null);
const app = await repository.getByIdAsync(input.id);
if (!app) {
throw new TRPCError({
@@ -100,20 +101,11 @@ export const appRouter = createTRPCRouter({
});
}
const canUserSeeApp = await canUserSeeAppAsync(ctx.session?.user ?? null, app.id);
if (!canUserSeeApp) {
throw new TRPCError({
code: "NOT_FOUND",
message: "App not found",
});
}
return app;
}),
byIds: publicProcedure.input(z.array(z.string())).query(async ({ ctx, input }) => {
return await ctx.db.query.apps.findMany({
where: inArray(apps.id, input),
});
const repository = new AppRepository(ctx.db, ctx.session?.user ?? null);
return await repository.getByIdsAsync(input);
}),
create: permissionRequiredProcedure
.requiresPermission("app-create")
@@ -187,3 +179,30 @@ export const appRouter = createTRPCRouter({
await ctx.db.delete(apps).where(eq(apps.id, input.id));
}),
});
type App = InferSelectModel<typeof apps>;
export class AppRepository {
private readonly accessControl: AppAccessControl;
constructor(
private db: Database,
user: Session["user"] | null,
) {
this.accessControl = new AppAccessControl(db, user);
}
public async getByIdAsync(id: string): Promise<App | null> {
const apps = await this.getByIdsAsync([id]);
return apps[0] ?? null;
}
public async getByIdsAsync(ids: string[]): Promise<App[]> {
const canUserSeeApps = await this.accessControl.canUserSeeAppsAsync(ids);
const dbApps = await this.db.query.apps.findMany({
where: inArray(apps.id, ids),
});
return canUserSeeApps ? dbApps : [];
}
}
@@ -1,45 +1,52 @@
import SuperJSON from "superjson";
import type { Session } from "@homarr/auth";
import { db, eq, or } from "@homarr/db";
import type { Database } from "@homarr/db";
import { eq, or } from "@homarr/db";
import { items } from "@homarr/db/schema";
import type { WidgetComponentProps } from "../../../../widgets/src";
export const canUserSeeAppAsync = async (user: Session["user"] | null, appId: string) => {
return await canUserSeeAppsAsync(user, [appId]);
};
export class AppAccessControl {
constructor(
private db: Database,
private user: Session["user"] | null,
) {}
export const canUserSeeAppsAsync = async (user: Session["user"] | null, appIds: string[]) => {
if (user) return true;
async canUserSeeAppAsync(appId: string) {
return await this.canUserSeeAppsAsync([appId]);
}
const appIdsOnPublicBoards = await getAllAppIdsOnPublicBoardsAsync();
return appIds.every((appId) => appIdsOnPublicBoards.includes(appId));
};
async canUserSeeAppsAsync(appIds: string[]) {
// Currently any user can see all apps if they are logged in
if (this.user) return true;
const getAllAppIdsOnPublicBoardsAsync = async () => {
const itemsWithApps = await db.query.items.findMany({
where: or(eq(items.kind, "app"), eq(items.kind, "bookmarks")),
with: {
board: {
columns: {
isPublic: true,
const appIdsOnPublicBoards = await this.getAllAppIdsOnPublicBoardsAsync();
return appIds.every((appId) => appIdsOnPublicBoards.includes(appId));
}
private async getAllAppIdsOnPublicBoardsAsync() {
const itemsWithApps = await this.db.query.items.findMany({
where: or(eq(items.kind, "app"), eq(items.kind, "bookmarks")),
with: {
board: {
columns: {
isPublic: true,
},
},
},
},
});
});
return itemsWithApps
.filter((item) => item.board.isPublic)
.flatMap((item) => {
if (item.kind === "app") {
const parsedOptions = SuperJSON.parse<WidgetComponentProps<"app">["options"]>(item.options);
return [parsedOptions.appId];
}
return itemsWithApps
.filter((item) => item.board.isPublic)
.flatMap((item) => {
if (item.kind === "app") {
const parsedOptions = SuperJSON.parse<WidgetComponentProps<"app">["options"]>(item.options);
return [parsedOptions.appId];
} else if (item.kind === "bookmarks") {
const parsedOptions = SuperJSON.parse<WidgetComponentProps<"bookmarks">["options"]>(item.options);
return parsedOptions.items;
}
throw new Error("Failed to get app ids from board. Invalid item kind: 'test'");
});
};
});
}
}
+10 -2
View File
@@ -13,6 +13,14 @@ import * as appAccessControl from "../app/app-access-control";
// Mock the auth module to return an empty session
vi.mock("@homarr/auth", () => ({ auth: () => ({}) as Session }));
const createFakeAccessControl = (canAccess: boolean) =>
vi.fn(
class {
canUserSeeAppAsync = async (_: string) => await Promise.resolve(canAccess);
canUserSeeAppsAsync = async (_: string[]) => await Promise.resolve(canAccess);
} as unknown as typeof appAccessControl.AppAccessControl,
);
const createDefaultSession = (permissions: GroupPermissionKey[] = []): Session => ({
user: { id: createId(), permissions, colorScheme: "light" },
expires: new Date().toISOString(),
@@ -77,7 +85,7 @@ describe("byId should return an app by id", () => {
deviceType: undefined,
session: null,
});
vi.spyOn(appAccessControl, "canUserSeeAppAsync").mockReturnValue(Promise.resolve(true));
vi.spyOn(appAccessControl, "AppAccessControl").mockImplementation(createFakeAccessControl(true));
await db.insert(apps).values([
{
@@ -118,7 +126,7 @@ describe("byId should return an app by id", () => {
href: "https://mantine.dev",
},
]);
vi.spyOn(appAccessControl, "canUserSeeAppAsync").mockReturnValue(Promise.resolve(false));
vi.spyOn(appAccessControl, "AppAccessControl").mockImplementation(createFakeAccessControl(false));
// Act
const actAsync = async () => await caller.byId({ id: "2" });
@@ -1,6 +1,9 @@
import { describe, expect, test, vi } from "vitest";
import type { Session } from "@homarr/auth";
import { createId } from "@homarr/common";
import type { InferInsertModel } from "@homarr/db";
import { apps } from "@homarr/db/schema";
import { createDb } from "@homarr/db/test";
import * as ping from "@homarr/ping";
@@ -9,22 +12,31 @@ import { appRouter } from "../../widgets/app";
// Mock the auth module to return an empty session
vi.mock("@homarr/auth", () => ({ auth: () => ({}) as Session }));
vi.mock("@homarr/ping", () => ({ sendPingRequestAsync: async () => await Promise.resolve(null) }));
vi.mock("../../app/app-access-control", () => ({
AppAccessControl: vi.fn(
class {
canUserSeeAppAsync = async (_: string) => await Promise.resolve(true);
canUserSeeAppsAsync = async (_: string[]) => await Promise.resolve(true);
},
),
}));
describe("ping should call sendPingRequestAsync with url and return result", () => {
test("ping with error response should return error and url", async () => {
// Arrange
const spy = vi.spyOn(ping, "sendPingRequestAsync");
vi.spyOn(ping, "sendPingRequestAsync").mockImplementation(() => Promise.resolve({ error: "error" }));
const url = "http://localhost";
const db = createDb();
const app = createApp({ url });
await db.insert(apps).values(app);
const caller = appRouter.createCaller({
db,
deviceType: undefined,
session: null,
});
spy.mockImplementation(() => Promise.resolve({ error: "error" }));
// Act
const result = await caller.ping({ url });
const result = await caller.ping({ id: app.id });
// Assert
expect(result.url).toBe(url);
@@ -33,21 +45,32 @@ describe("ping should call sendPingRequestAsync with url and return result", ()
test("ping with success response should return statusCode and url", async () => {
// Arrange
const spy = vi.spyOn(ping, "sendPingRequestAsync");
vi.spyOn(ping, "sendPingRequestAsync").mockImplementation(() =>
Promise.resolve({ statusCode: 200, durationMs: 123 }),
);
const url = "http://localhost";
const db = createDb();
const app = createApp({ url });
await db.insert(apps).values(app);
const caller = appRouter.createCaller({
db,
deviceType: undefined,
session: null,
});
spy.mockImplementation(() => Promise.resolve({ statusCode: 200, durationMs: 123 }));
// Act
const result = await caller.ping({ url });
const result = await caller.ping({ id: app.id });
// Assert
expect(result.url).toBe(url);
expect("statusCode" in result).toBe(true);
});
});
const createApp = ({ url }: { url: string }) =>
({
id: createId(),
iconUrl: "",
name: "Test App",
href: url,
}) satisfies InferInsertModel<typeof apps>;
+64 -10
View File
@@ -1,43 +1,97 @@
import { TRPCError } from "@trpc/server";
import { observable } from "@trpc/server/observable";
import { z } from "zod/v4";
import { getServerSettingByKeyAsync } from "@homarr/db/queries";
import { sendPingRequestAsync } from "@homarr/ping";
import { pingChannel, pingUrlChannel } from "@homarr/redis";
import { createTRPCRouter, publicProcedure } from "../../trpc";
import { AppRepository } from "../app";
export const appRouter = createTRPCRouter({
ping: publicProcedure.input(z.object({ url: z.string() })).query(async ({ input }) => {
const pingResult = await sendPingRequestAsync(input.url);
ping: publicProcedure.input(z.object({ id: z.string() })).query(async ({ ctx, input }) => {
const boardSettings = await getServerSettingByKeyAsync(ctx.db, "board");
if (boardSettings.forceDisableStatus) {
throw new TRPCError({
code: "FORBIDDEN",
message: "Ping functionality is disabled by server settings",
});
}
const repository = new AppRepository(ctx.db, ctx.session?.user ?? null);
const app = await repository.getByIdAsync(input.id);
if (!app) {
throw new TRPCError({
code: "NOT_FOUND",
message: "App not found",
});
}
const pingUrl = app.pingUrl ?? app.href;
if (!pingUrl) {
throw new TRPCError({
code: "CONFLICT",
message: "No URL to ping configured for this app",
});
}
const pingResult = await sendPingRequestAsync(pingUrl);
return {
url: input.url,
url: pingUrl,
...pingResult,
};
}),
updatedPing: publicProcedure
.input(
z.object({
url: z.string(),
id: z.string(),
}),
)
.subscription(async ({ input }) => {
await pingUrlChannel.addAsync(input.url);
.subscription(async ({ ctx, input }) => {
const boardSettings = await getServerSettingByKeyAsync(ctx.db, "board");
if (boardSettings.forceDisableStatus) {
throw new TRPCError({
code: "FORBIDDEN",
message: "Ping functionality is disabled by server settings",
});
}
const pingResult = await sendPingRequestAsync(input.url);
const repository = new AppRepository(ctx.db, ctx.session?.user ?? null);
const app = await repository.getByIdAsync(input.id);
if (!app) {
throw new TRPCError({
code: "NOT_FOUND",
message: "App not found",
});
}
const pingUrl = app.pingUrl ?? app.href;
if (!pingUrl) {
throw new TRPCError({
code: "CONFLICT",
message: "No URL to ping configured for this app",
});
}
await pingUrlChannel.addAsync(pingUrl);
return observable<{ url: string; statusCode: number; durationMs: number } | { url: string; error: string }>(
(emit) => {
emit.next({ url: input.url, ...pingResult });
const unsubscribe = pingChannel.subscribe((message) => {
// Only emit if same url
if (message.url !== input.url) return;
if (message.url !== pingUrl) return;
emit.next(message);
});
return () => {
unsubscribe();
void pingUrlChannel.removeAsync(input.url);
void pingUrlChannel.removeAsync(pingUrl);
};
},
);
+2 -2
View File
@@ -34,7 +34,7 @@
"bcrypt": "^6.0.0",
"cookies": "^0.9.1",
"ldapts": "8.1.3",
"next": "16.1.3",
"next": "16.1.5",
"next-auth": "5.0.0-beta.30",
"react": "19.2.3",
"react-dom": "19.2.3",
@@ -47,7 +47,7 @@
"@types/bcrypt": "6.0.0",
"@types/cookies": "0.9.2",
"eslint": "^9.39.2",
"prettier": "^3.8.0",
"prettier": "^3.8.1",
"typescript": "^5.9.3"
}
}
+1 -1
View File
@@ -29,7 +29,7 @@
"@homarr/core": "workspace:^0.1.0",
"@paralleldrive/cuid2": "^3.1.0",
"dayjs": "^1.11.19",
"next": "16.1.3",
"next": "16.1.5",
"octokit": "^5.0.5",
"react": "19.2.3",
"react-dom": "19.2.3",
+1 -1
View File
@@ -43,7 +43,7 @@
"drizzle-orm": "^0.45.1",
"ioredis": "5.9.2",
"mysql2": "3.16.1",
"pg": "^8.17.1",
"pg": "^8.17.2",
"superjson": "2.2.6",
"winston": "3.19.0",
"zod": "^4.2.1"
+2 -2
View File
@@ -28,7 +28,7 @@
"@homarr/common": "workspace:^0.1.0",
"@homarr/core": "workspace:^0.1.0",
"@homarr/cron-jobs": "workspace:^0.1.0",
"@tanstack/react-query": "^5.90.19",
"@tanstack/react-query": "^5.90.20",
"@trpc/client": "^11.8.1",
"@trpc/server": "^11.8.1",
"@trpc/tanstack-react-query": "^11.8.1",
@@ -41,7 +41,7 @@
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/node-cron": "^3.0.11",
"@types/react": "19.2.8",
"@types/react": "19.2.9",
"eslint": "^9.39.2",
"typescript": "^5.9.3"
}
+3 -3
View File
@@ -47,7 +47,7 @@
"@homarr/core": "workspace:^0.1.0",
"@homarr/definitions": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.3.12",
"@mantine/core": "^8.3.13",
"@paralleldrive/cuid2": "^3.1.0",
"@testcontainers/mysql": "^11.11.0",
"@testcontainers/postgresql": "^11.11.0",
@@ -57,7 +57,7 @@
"drizzle-orm": "^0.45.1",
"drizzle-zod": "^0.8.3",
"mysql2": "3.16.1",
"pg": "^8.17.1",
"pg": "^8.17.2",
"superjson": "2.2.6"
},
"devDependencies": {
@@ -69,7 +69,7 @@
"dotenv-cli": "^11.0.0",
"esbuild": "^0.27.2",
"eslint": "^9.39.2",
"prettier": "^3.8.0",
"prettier": "^3.8.1",
"tsx": "4.20.4",
"typescript": "^5.9.3"
}
+1 -1
View File
@@ -32,7 +32,7 @@
"@homarr/eslint-config": "workspace:^0.2.0",
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/dockerode": "^4.0.0",
"@types/dockerode": "^4.0.1",
"eslint": "^9.39.2",
"typescript": "^5.9.3"
}
+1 -1
View File
@@ -26,7 +26,7 @@
"@homarr/common": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/form": "^8.3.12",
"@mantine/form": "^8.3.13",
"mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.2.1"
},
+1 -1
View File
@@ -30,7 +30,7 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.12",
"@mantine/core": "^8.3.13",
"react": "19.2.3",
"zod": "^4.2.1"
},
+2 -2
View File
@@ -33,10 +33,10 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.12",
"@mantine/core": "^8.3.13",
"@tabler/icons-react": "^3.36.1",
"dayjs": "^1.11.19",
"next": "16.1.3",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"zod": "^4.2.1"
+2 -2
View File
@@ -24,8 +24,8 @@
"dependencies": {
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.12",
"@mantine/hooks": "^8.3.12",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"react": "19.2.3"
},
"devDependencies": {
+1 -1
View File
@@ -24,7 +24,7 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/ui": "workspace:^0.1.0",
"@mantine/notifications": "^8.3.12",
"@mantine/notifications": "^8.3.13",
"@tabler/icons-react": "^3.36.1"
},
"devDependencies": {
+3 -3
View File
@@ -37,10 +37,10 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.12",
"@mantine/hooks": "^8.3.12",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"adm-zip": "0.5.16",
"next": "16.1.3",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"superjson": "2.2.6",
+2 -2
View File
@@ -25,8 +25,8 @@
"dependencies": {
"@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.3.12",
"next": "16.1.3",
"@mantine/dates": "^8.3.13",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3"
},
+4 -4
View File
@@ -33,12 +33,12 @@
"@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.12",
"@mantine/hooks": "^8.3.12",
"@mantine/spotlight": "^8.3.12",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/spotlight": "^8.3.13",
"@tabler/icons-react": "^3.36.1",
"jotai": "^2.16.2",
"next": "16.1.3",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"use-deep-compare-effect": "^1.8.1"
+1 -1
View File
@@ -32,7 +32,7 @@
"dayjs": "^1.11.19",
"deepmerge": "4.3.1",
"mantine-react-table": "2.0.0-beta.9",
"next": "16.1.3",
"next": "16.1.5",
"next-intl": "4.7.0",
"react": "19.2.3",
"react-dom": "19.2.3"
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "",
"noResults": "",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "危险",
"noResults": "未找到结果",
"unsavedChanges": "你有未保存的更改 !",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "显示预览",
"hide": "隐藏预览"
@@ -1960,6 +1963,39 @@
"internalServerError": "获取容器统计信息失败"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "城市/邮编",
@@ -2608,6 +2644,35 @@
"up": "上传",
"down": "下载"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "crwdns610:0crwdne610:0",
"noResults": "crwdns612:0crwdne612:0",
"unsavedChanges": "crwdns2784:0crwdne2784:0",
"servers": "crwdns3846:0crwdne3846:0",
"applications": "crwdns3848:0crwdne3848:0",
"services": "crwdns3850:0crwdne3850:0",
"preview": {
"show": "crwdns614:0crwdne614:0",
"hide": "crwdns616:0crwdne616:0"
@@ -1960,6 +1963,39 @@
"internalServerError": "crwdns3428:0crwdne3428:0"
}
},
"coolify": {
"name": "crwdns3852:0crwdne3852:0",
"description": "crwdns3854:0crwdne3854:0",
"option": {
"showServers": {
"label": "crwdns3856:0crwdne3856:0"
},
"showApplications": {
"label": "crwdns3858:0crwdne3858:0"
},
"showServices": {
"label": "crwdns3860:0crwdne3860:0"
}
},
"empty": {
"servers": "crwdns3862:0crwdne3862:0",
"applications": "crwdns3864:0crwdne3864:0",
"services": "crwdns3866:0crwdne3866:0"
},
"footer": {
"updated": "crwdns3868:0{when}crwdne3868:0"
},
"error": {
"noIntegration": "crwdns3870:0crwdne3870:0",
"internalServerError": "crwdns3872:0crwdne3872:0"
},
"server": {
"buildServer": "crwdns3874:0crwdne3874:0"
},
"instances": {
"title": "crwdns3876:0crwdne3876:0"
}
},
"common": {
"location": {
"query": "crwdns1110:0crwdne1110:0",
@@ -2608,6 +2644,35 @@
"up": "crwdns3610:0crwdne3610:0",
"down": "crwdns3612:0crwdne3612:0"
}
},
"systemDisks": {
"name": "crwdns3828:0crwdne3828:0",
"description": "crwdns3830:0crwdne3830:0",
"option": {
"showTemperatureIfAvailable": {
"label": "crwdns3832:0crwdne3832:0"
},
"displayMode": {
"label": "crwdns3834:0crwdne3834:0",
"option": {
"percentage": {
"label": "crwdns3836:0crwdne3836:0"
},
"absolute": {
"label": "crwdns3838:0crwdne3838:0"
},
"free": {
"label": "crwdns3840:0crwdne3840:0"
}
}
},
"showBackgroundBar": {
"label": "crwdns3842:0crwdne3842:0"
}
},
"status": {
"unhealthy": "crwdns3844:0crwdne3844:0"
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Nebezpečná zóna",
"noResults": "Nebyly nalezeny žádné výsledky",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Zobrazit náhled",
"hide": "Skrýt náhled"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Farezone",
"noResults": "Ingen resultater fundet",
"unsavedChanges": "Du har ikke gemte ændringer!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Vis forhåndsvisning",
"hide": "Skjul forhåndsvisning"
@@ -1960,6 +1963,39 @@
"internalServerError": "Kunne ikke hente containerstatistik"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "By / Postnummer",
@@ -2608,6 +2644,35 @@
"up": "OP",
"down": "NED"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Gefahrenbereich",
"noResults": "Die Suche ergab keine Treffer",
"unsavedChanges": "Sie haben ungespeicherte Änderungen!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Vorschau ansehen",
"hide": "Vorschau ausblenden"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Stadt / Postleitzahl",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Gefahrenbereich",
"noResults": "Die Suche ergab keine Treffer",
"unsavedChanges": "Sie haben ungespeicherte Änderungen!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Vorschau ansehen",
"hide": "Vorschau ausblenden"
@@ -1960,6 +1963,39 @@
"internalServerError": "Fehler beim Abrufen der Container Statistiken"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Stadt / Postleitzahl",
@@ -2608,6 +2644,35 @@
"up": "OBEN",
"down": "UNTEN"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Επικίνδυνη Περιοχή",
"noResults": "Δεν βρέθηκαν αποτελέσματα",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Danger zone",
"noResults": "No results have been found",
"unsavedChanges": "You have unsaved changes!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Show a preview",
"hide": "Hide the preview"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Zona de riesgo",
"noResults": "No se han encontrado resultados",
"unsavedChanges": "¡Tienes cambios sin guardar!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Mostrar vista previa",
"hide": "Ocultar vista previa"
@@ -1960,6 +1963,39 @@
"internalServerError": "No se pudo obtener las estadísticas de los contenedores"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Ciudad / Código postal",
@@ -2608,6 +2644,35 @@
"up": "ENCENDIDO",
"down": "APAGADO"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "",
"noResults": "",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Zone de danger",
"noResults": "Aucun résultat trouvé",
"unsavedChanges": "Vous avez des modifications non enregistrées !",
"servers": "Serveurs",
"applications": "Applications",
"services": "Services",
"preview": {
"show": "Afficher l’aperçu",
"hide": "Masquer l'aperçu"
@@ -1960,6 +1963,39 @@
"internalServerError": "Impossible de récupérer les statistiques des conteneurs"
}
},
"coolify": {
"name": "Coolify",
"description": "Aperçu de votre instance Coolify avec les serveurs et les applications",
"option": {
"showServers": {
"label": "Afficher les serveurs"
},
"showApplications": {
"label": "Afficher les applications"
},
"showServices": {
"label": "Afficher les services"
}
},
"empty": {
"servers": "Aucun serveur trouvé",
"applications": "Aucune application trouvée",
"services": "Aucun service trouvé"
},
"footer": {
"updated": "Mis à jour {when}"
},
"error": {
"noIntegration": "Aucune intégration de Coolify configurée",
"internalServerError": "Impossible de récupérer les données de Coolify"
},
"server": {
"buildServer": "Version"
},
"instances": {
"title": "Instances"
}
},
"common": {
"location": {
"query": "Ville / Code Postal",
@@ -2608,6 +2644,35 @@
"up": "UP",
"down": "HORS SERVICE"
}
},
"systemDisks": {
"name": "Disques système",
"description": "Utilisation du disque de votre système",
"option": {
"showTemperatureIfAvailable": {
"label": "Afficher la température si disponible"
},
"displayMode": {
"label": "Mode d'affichage",
"option": {
"percentage": {
"label": "Pourcentage (ex : 70%)"
},
"absolute": {
"label": "Valeurs absolues (ex. : 800 Go / 1 To)"
},
"free": {
"label": "Pourcentage d'espace libre (ex. : 24 % libre)"
}
}
},
"showBackgroundBar": {
"label": "Afficher la barre d'utilisation en arrière-plan"
}
},
"status": {
"unhealthy": "Dysfonctionnement"
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "אזור מסוכן",
"noResults": "לא נמצאו תוצאות",
"unsavedChanges": "ישנם שינויים שלא נשמרו!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "הצג תצוגה מקדימה",
"hide": "הסתר תצוגה המקדימה"
@@ -1960,6 +1963,39 @@
"internalServerError": "נכשל באחזור סטטיסטיקות המכולות"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "עיר / מיקוד",
@@ -2608,6 +2644,35 @@
"up": "העלאה",
"down": "הורדה"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Opasna zona",
"noResults": "Nije pronađen nijedan rezultat",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Veszélyzóna",
"noResults": "Nincs eredmény",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Zona pericolosa",
"noResults": "Nessun risultato trovato",
"unsavedChanges": "Ci sono modifiche non salvate!",
"servers": "Server",
"applications": "App",
"services": "Servizi",
"preview": {
"show": "Mostra anteprima",
"hide": "Nascondi anteprima"
@@ -1960,6 +1963,39 @@
"internalServerError": "Recupero statistiche container non riuscito"
}
},
"coolify": {
"name": "Coolify",
"description": "Panoramica della tua istanza Coolify con server e applicazioni",
"option": {
"showServers": {
"label": "Mostra server"
},
"showApplications": {
"label": "Mostra applicazioni"
},
"showServices": {
"label": "Mostra servizi"
}
},
"empty": {
"servers": "Nessun server trovato",
"applications": "Nessuna applicazione trovata",
"services": "Nessun servizio trovato"
},
"footer": {
"updated": "Aggiornato {when}"
},
"error": {
"noIntegration": "Nessuna integrazione di Coolify configurata",
"internalServerError": "Impossibile recuperare i dati Coolify"
},
"server": {
"buildServer": "Build"
},
"instances": {
"title": "Istanze"
}
},
"common": {
"location": {
"query": "Città / Codice postale",
@@ -2608,6 +2644,35 @@
"up": "SU",
"down": "DOWN"
}
},
"systemDisks": {
"name": "Dischi di sistema",
"description": "Uso del disco del sistema",
"option": {
"showTemperatureIfAvailable": {
"label": "Mostra temperatura se disponibile"
},
"displayMode": {
"label": "Modalità di visualizzazione",
"option": {
"percentage": {
"label": "Percentuale (es. 76%)"
},
"absolute": {
"label": "Valori assoluti (ad es. 800GB / 1TB)"
},
"free": {
"label": "Percentuale di spazio libero (ad es. 24% libero)"
}
}
},
"showBackgroundBar": {
"label": "Mostra barra di utilizzo in background"
}
},
"status": {
"unhealthy": "Compromesso"
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "危険な操作",
"noResults": "結果が見つかりません",
"unsavedChanges": "保存していない変更があります!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "プレビューを表示",
"hide": "プレビューを閉じる"
@@ -1960,6 +1963,39 @@
"internalServerError": "コンテナステータスの取得に失敗しました"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "都市/郵便番号",
@@ -2608,6 +2644,35 @@
"up": "UP",
"down": "DOWN"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "위험한 설정",
"noResults": "결과를 찾을 수 없습니다.",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "",
"noResults": "Rezultatų nerasta",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Bīstamā zona",
"noResults": "Nav atrasts neviens rezultāts",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Gevarenzone",
"noResults": "Geen resultaten gevonden",
"unsavedChanges": "Er zijn niet-opgeslagen wijzigingen!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Voorbeeld weergeven",
"hide": "Voorbeeld verbergen"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Stad / postcode",
@@ -2608,6 +2644,35 @@
"up": "OMHOOG",
"down": "OMLAAG"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Faresonen",
"noResults": "Ingen resultater funnet",
"unsavedChanges": "Du har ulagrede endringer!",
"servers": "Servere",
"applications": "Apper",
"services": "Tjenester",
"preview": {
"show": "Vis forhåndsvisning",
"hide": "Skjul forhåndsvisning"
@@ -1960,6 +1963,39 @@
"internalServerError": "Kunne ikke hente containerstatistikk"
}
},
"coolify": {
"name": "Coolify",
"description": "Oversikt over din Coolify-instans med servere og apper",
"option": {
"showServers": {
"label": "Vis servere"
},
"showApplications": {
"label": "Vis applikasjoner"
},
"showServices": {
"label": "Vis tjenester"
}
},
"empty": {
"servers": "Ingen server funnet",
"applications": "Ingen applikasjoner funnet",
"services": "Ingen tjenester funnet"
},
"footer": {
"updated": "Oppdatert {when}"
},
"error": {
"noIntegration": "Ingen Coolify integrasjon konfigurert",
"internalServerError": "Kunne ikke hente Coolify data"
},
"server": {
"buildServer": "Bygg"
},
"instances": {
"title": "Instanser"
}
},
"common": {
"location": {
"query": "By / Postnummer",
@@ -2608,6 +2644,35 @@
"up": "OPP",
"down": "NED"
}
},
"systemDisks": {
"name": "Systemdisker",
"description": "Disk bruk av systemet",
"option": {
"showTemperatureIfAvailable": {
"label": "Vis temperatur hvis tilgjengelig"
},
"displayMode": {
"label": "Visningsmodus",
"option": {
"percentage": {
"label": "Prosentandel (f.eks. 76%)"
},
"absolute": {
"label": "Absolutte verdier (f.eks. 800GB / 1TB)"
},
"free": {
"label": "Prosentandel ledig plass (f.eks. 24% ledig)"
}
}
},
"showBackgroundBar": {
"label": "Vis bakgrunnsbrukslinje"
}
},
"status": {
"unhealthy": "Usunn"
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Strefa zagrożenia",
"noResults": "Nie znaleziono żadnych wyników",
"unsavedChanges": "Masz niezapisane zmiany!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Pokaż podgląd",
"hide": "Ukryj podgląd"
@@ -1960,6 +1963,39 @@
"internalServerError": "Nie udało się pobrać statystyk kontenerów"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Miasto / kod pocztowy",
@@ -2608,6 +2644,35 @@
"up": "Aktywny",
"down": "Nieaktywny"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
File diff suppressed because it is too large. Load diff
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Zonă periculoasă",
"noResults": "Nici un rezultat găsit",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Опасная зона",
"noResults": "Ничего не найдено",
"unsavedChanges": "У вас есть несохранённые изменения!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Показать предпросмотр",
"hide": "Скрыть предпросмотр"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Город / Почтовый индекс",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Nebezpečná zóna",
"noResults": "Nenašli sa žiadne výsledky",
"unsavedChanges": "Máš neuložené zmeny!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Zobraziť náhľad",
"hide": "Skryť náhľad"
@@ -1960,6 +1963,39 @@
"internalServerError": "Nepodarilo sa načítať štatistiky kontajnerov"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Mesto / PSČ",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Nevarno območje",
"noResults": "Ni rezultatov",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Kritiska inställningar",
"noResults": "Hittade inga resultat",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Förhandsgranska",
"hide": "Dölj förhandsgranskning"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Tehlikeli Bölge",
"noResults": "Sonuç bulunamadı",
"unsavedChanges": "Kaydedilmemiş değişiklikleriniz var!",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Ara Renkleri Göster",
"hide": "Ara Renkleri Gizle"
@@ -1960,6 +1963,39 @@
"internalServerError": "Konteyner istatistikleri alınamadı"
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Şehir / Posta kodu",
@@ -2608,6 +2644,35 @@
"up": "YÜKLEME",
"down": "İNDİRME"
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Небезпечна зона",
"noResults": "Результатів не знайдено",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "Показати попередній перегляд",
"hide": "Приховати попередній перегляд"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "Місто / Поштовий індекс",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "Khu vực nguy hiểm",
"noResults": "Không có kết quả",
"unsavedChanges": "",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "",
"hide": ""
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+65
View File
@@ -1138,6 +1138,9 @@
"dangerZone": "危險區域",
"noResults": "未找到結果",
"unsavedChanges": "尚未儲存變更",
"servers": "",
"applications": "",
"services": "",
"preview": {
"show": "顯示預覽",
"hide": "隱藏預覽"
@@ -1960,6 +1963,39 @@
"internalServerError": ""
}
},
"coolify": {
"name": "",
"description": "",
"option": {
"showServers": {
"label": ""
},
"showApplications": {
"label": ""
},
"showServices": {
"label": ""
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
},
"footer": {
"updated": ""
},
"error": {
"noIntegration": "",
"internalServerError": ""
},
"server": {
"buildServer": ""
},
"instances": {
"title": ""
}
},
"common": {
"location": {
"query": "城市 / 郵遞區號",
@@ -2608,6 +2644,35 @@
"up": "",
"down": ""
}
},
"systemDisks": {
"name": "",
"description": "",
"option": {
"showTemperatureIfAvailable": {
"label": ""
},
"displayMode": {
"label": "",
"option": {
"percentage": {
"label": ""
},
"absolute": {
"label": ""
},
"free": {
"label": ""
}
}
},
"showBackgroundBar": {
"label": ""
}
},
"status": {
"unhealthy": ""
}
}
},
"widgetPreview": {
+4 -4
View File
@@ -30,13 +30,13 @@
"@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.12",
"@mantine/dates": "^8.3.12",
"@mantine/hooks": "^8.3.12",
"@mantine/core": "^8.3.13",
"@mantine/dates": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@tabler/icons-react": "^3.36.1",
"crypto-js": "^4.2.0",
"mantine-react-table": "2.0.0-beta.9",
"next": "16.1.3",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"svgson": "^5.3.1"
+20 -20
View File
@@ -48,31 +48,31 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/charts": "^8.3.12",
"@mantine/core": "^8.3.12",
"@mantine/hooks": "^8.3.12",
"@mantine/charts": "^8.3.13",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@tabler/icons-react": "^3.36.1",
"@tiptap/extension-color": "3.15.3",
"@tiptap/extension-highlight": "3.15.3",
"@tiptap/extension-image": "3.15.3",
"@tiptap/extension-link": "^3.15.3",
"@tiptap/extension-placeholder": "^3.15.3",
"@tiptap/extension-table": "3.15.3",
"@tiptap/extension-table-cell": "3.15.3",
"@tiptap/extension-table-header": "3.15.3",
"@tiptap/extension-table-row": "3.15.3",
"@tiptap/extension-task-item": "3.15.3",
"@tiptap/extension-task-list": "3.15.3",
"@tiptap/extension-text-align": "3.15.3",
"@tiptap/extension-text-style": "3.15.3",
"@tiptap/extension-underline": "3.15.3",
"@tiptap/react": "^3.15.3",
"@tiptap/starter-kit": "^3.15.3",
"@tiptap/extension-color": "3.17.1",
"@tiptap/extension-highlight": "3.17.1",
"@tiptap/extension-image": "3.17.1",
"@tiptap/extension-link": "^3.17.1",
"@tiptap/extension-placeholder": "^3.17.1",
"@tiptap/extension-table": "3.17.1",
"@tiptap/extension-table-cell": "3.17.1",
"@tiptap/extension-table-header": "3.17.1",
"@tiptap/extension-table-row": "3.17.1",
"@tiptap/extension-task-item": "3.17.1",
"@tiptap/extension-task-list": "3.17.1",
"@tiptap/extension-text-align": "3.17.1",
"@tiptap/extension-text-style": "3.17.1",
"@tiptap/extension-underline": "3.17.1",
"@tiptap/react": "^3.17.1",
"@tiptap/starter-kit": "^3.17.1",
"clsx": "^2.1.1",
"dayjs": "^1.11.19",
"mantine-form-zod-resolver": "^1.3.0",
"mantine-react-table": "2.0.0-beta.9",
"next": "16.1.3",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"react-markdown": "^10.1.0",
+1 -1
View File
@@ -131,7 +131,7 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
</Tooltip.Floating>
{options.pingEnabled && !settings.forceDisableStatus && !board.disableStatus && app.href ? (
<Suspense fallback={<PingDot icon={IconLoader} color="blue" tooltip={`${t("common.action.loading")}…`} />}>
<PingIndicator href={app.pingUrl ?? app.href} />
<PingIndicator appId={app.id} />
</Suspense>
) : null}
</AppLink>
@@ -7,13 +7,13 @@ import { clientApi } from "@homarr/api/client";
import { PingDot } from "./ping-dot";
interface PingIndicatorProps {
href: string;
appId: string;
}
export const PingIndicator = ({ href }: PingIndicatorProps) => {
export const PingIndicator = ({ appId }: PingIndicatorProps) => {
const [ping] = clientApi.widget.app.ping.useSuspenseQuery(
{
url: href,
id: appId,
},
{
refetchOnMount: false,
@@ -24,7 +24,7 @@ export const PingIndicator = ({ href }: PingIndicatorProps) => {
const [pingResult, setPingResult] = useState<RouterOutputs["widget"]["app"]["ping"]>(ping);
clientApi.widget.app.updatedPing.useSubscription(
{ url: href },
{ id: appId },
{
onData(data) {
setPingResult(data);
+849 -865
View File
File diff suppressed because it is too large. Load diff
+5
View File
@@ -19,6 +19,11 @@ export AUTH_SECRET=$(openssl rand -base64 32)
# Cron job API key is generated every time the container starts as it is required for communication between nextjs-api and tasks-api
export CRON_JOB_API_KEY=$(openssl rand -base64 32)
# Support secret file for encryption key (is not empty and file exists)
if [ -n "$SECRET_ENCRYPTION_KEY_FILE" ] && [ -f "$SECRET_ENCRYPTION_KEY_FILE" ]; then
export SECRET_ENCRYPTION_KEY=$(cat $SECRET_ENCRYPTION_KEY_FILE)
fi
# Start nginx proxy
# 1. Replace the HOSTNAME in the nginx template file
# 2. Create the nginx configuration file from the template
+1 -1
View File
@@ -1 +1 @@
[{"login":"ajnart","avatar_url":"https://avatars.githubusercontent.com/u/49837342?v=4"},{"login":"manuel-rw","avatar_url":"https://avatars.githubusercontent.com/u/30572287?v=4"},{"login":"Meierschlumpf","avatar_url":"https://avatars.githubusercontent.com/u/63781622?v=4"},{"login":"SeDemal","avatar_url":"https://avatars.githubusercontent.com/u/26098587?v=4"},{"login":"lammersbjorn","avatar_url":"https://avatars.githubusercontent.com/u/71191962?v=4"},{"login":"LarveyOfficial","avatar_url":"https://avatars.githubusercontent.com/u/39219859?v=4"},{"login":"c00ldude1oo","avatar_url":"https://avatars.githubusercontent.com/u/15677803?v=4"},{"login":"InterN0te","avatar_url":"https://avatars.githubusercontent.com/u/10882916?v=4"},{"login":"Aimsucks","avatar_url":"https://avatars.githubusercontent.com/u/1828486?v=4"},{"login":"JannesV","avatar_url":"https://avatars.githubusercontent.com/u/5984244?v=4"},{"login":"MauriceNino","avatar_url":"https://avatars.githubusercontent.com/u/18658092?v=4"},{"login":"hillaliy","avatar_url":"https://avatars.githubusercontent.com/u/950010?v=4"},{"login":"Skeeww","avatar_url":"https://avatars.githubusercontent.com/u/9639992?v=4"},{"login":"RichyHBM","avatar_url":"https://avatars.githubusercontent.com/u/5472275?v=4"},{"login":"Bonfire","avatar_url":"https://avatars.githubusercontent.com/u/5704760?v=4"},{"login":"wieli99","avatar_url":"https://avatars.githubusercontent.com/u/46794825?v=4"},{"login":"ishaanparlikar","avatar_url":"https://avatars.githubusercontent.com/u/43013132?v=4"},{"login":"Zareix","avatar_url":"https://avatars.githubusercontent.com/u/29818713?v=4"},{"login":"tuggan","avatar_url":"https://avatars.githubusercontent.com/u/4325608?v=4"},{"login":"Spillebulle","avatar_url":"https://avatars.githubusercontent.com/u/46653946?v=4"},{"login":"tancak","avatar_url":"https://avatars.githubusercontent.com/u/11760749?v=4"},{"login":"spkesDE","avatar_url":"https://avatars.githubusercontent.com/u/1682314?v=4"},{"login":"j3lte","avatar_url":"https://avatars.githubusercontent.com/u/2557568?v=4"},{"login":"dslatt","avatar_url":"https://avatars.githubusercontent.com/u/5211001?v=4"},{"login":"Malong11-007","avatar_url":"https://avatars.githubusercontent.com/u/40298510?v=4"},{"login":"StefanB7","avatar_url":"https://avatars.githubusercontent.com/u/22056509?v=4"},{"login":"souravghosh01","avatar_url":"https://avatars.githubusercontent.com/u/37548139?v=4"},{"login":"SR3u","avatar_url":"https://avatars.githubusercontent.com/u/2380522?v=4"},{"login":"Rikpat","avatar_url":"https://avatars.githubusercontent.com/u/33869814?v=4"},{"login":"NormanJS","avatar_url":"https://avatars.githubusercontent.com/u/83409549?v=4"},{"login":"No-Maines-Land","avatar_url":"https://avatars.githubusercontent.com/u/20687725?v=4"},{"login":"stark1tty","avatar_url":"https://avatars.githubusercontent.com/u/69326376?v=4"},{"login":"Momcilo42","avatar_url":"https://avatars.githubusercontent.com/u/10118137?v=4"},{"login":"marius-arch","avatar_url":"https://avatars.githubusercontent.com/u/72494359?v=4"},{"login":"Lumilias","avatar_url":"https://avatars.githubusercontent.com/u/10852161?v=4"},{"login":"Havock94","avatar_url":"https://avatars.githubusercontent.com/u/7635248?v=4"},{"login":"Lollyde","avatar_url":"https://avatars.githubusercontent.com/u/11347524?v=4"},{"login":"krishnamuppaneni","avatar_url":"https://avatars.githubusercontent.com/u/4703366?v=4"},{"login":"devtobi","avatar_url":"https://avatars.githubusercontent.com/u/28538704?v=4"},{"login":"TyxTang","avatar_url":"https://avatars.githubusercontent.com/u/90897955?v=4"},{"login":"alotlikebeans","avatar_url":"https://avatars.githubusercontent.com/u/19630511?v=4"},{"login":"WillyJL","avatar_url":"https://avatars.githubusercontent.com/u/49810075?v=4"},{"login":"anonysoul","avatar_url":"https://avatars.githubusercontent.com/u/105715150?v=4"},{"login":"cospeedster","avatar_url":"https://avatars.githubusercontent.com/u/52749645?v=4"},{"login":"diederbert","avatar_url":"https://avatars.githubusercontent.com/u/162878798?v=4"},{"login":"digdilem","avatar_url":"https://avatars.githubusercontent.com/u/4052275?v=4"},{"login":"dinghino","avatar_url":"https://avatars.githubusercontent.com/u/14729459?v=4"},{"login":"gfomichev","avatar_url":"https://avatars.githubusercontent.com/u/1596146?v=4"},{"login":"gnattu","avatar_url":"https://avatars.githubusercontent.com/u/12995396?v=4"},{"login":"tuxpizza","avatar_url":"https://avatars.githubusercontent.com/u/84710786?v=4"},{"login":"xmarkurion","avatar_url":"https://avatars.githubusercontent.com/u/46654687?v=4"},{"login":"huanga","avatar_url":"https://avatars.githubusercontent.com/u/732970?v=4"},{"login":"taos15","avatar_url":"https://avatars.githubusercontent.com/u/122130728?v=4"},{"login":"arghyadipchak","avatar_url":"https://avatars.githubusercontent.com/u/32430374?v=4"},{"login":"AuthorShin","avatar_url":"https://avatars.githubusercontent.com/u/4959043?v=4"},{"login":"benniblot","avatar_url":"https://avatars.githubusercontent.com/uLine truncated
[{"login":"ajnart","avatar_url":"https://avatars.githubusercontent.com/u/49837342?v=4"},{"login":"manuel-rw","avatar_url":"https://avatars.githubusercontent.com/u/30572287?v=4"},{"login":"Meierschlumpf","avatar_url":"https://avatars.githubusercontent.com/u/63781622?v=4"},{"login":"SeDemal","avatar_url":"https://avatars.githubusercontent.com/u/26098587?v=4"},{"login":"lammersbjorn","avatar_url":"https://avatars.githubusercontent.com/u/71191962?v=4"},{"login":"LarveyOfficial","avatar_url":"https://avatars.githubusercontent.com/u/39219859?v=4"},{"login":"c00ldude1oo","avatar_url":"https://avatars.githubusercontent.com/u/15677803?v=4"},{"login":"InterN0te","avatar_url":"https://avatars.githubusercontent.com/u/10882916?v=4"},{"login":"Aimsucks","avatar_url":"https://avatars.githubusercontent.com/u/1828486?v=4"},{"login":"JannesV","avatar_url":"https://avatars.githubusercontent.com/u/5984244?v=4"},{"login":"MauriceNino","avatar_url":"https://avatars.githubusercontent.com/u/18658092?v=4"},{"login":"hillaliy","avatar_url":"https://avatars.githubusercontent.com/u/950010?v=4"},{"login":"Skeeww","avatar_url":"https://avatars.githubusercontent.com/u/9639992?v=4"},{"login":"RichyHBM","avatar_url":"https://avatars.githubusercontent.com/u/5472275?v=4"},{"login":"Bonfire","avatar_url":"https://avatars.githubusercontent.com/u/5704760?v=4"},{"login":"wieli99","avatar_url":"https://avatars.githubusercontent.com/u/46794825?v=4"},{"login":"ishaanparlikar","avatar_url":"https://avatars.githubusercontent.com/u/43013132?v=4"},{"login":"Zareix","avatar_url":"https://avatars.githubusercontent.com/u/29818713?v=4"},{"login":"tuggan","avatar_url":"https://avatars.githubusercontent.com/u/4325608?v=4"},{"login":"Spillebulle","avatar_url":"https://avatars.githubusercontent.com/u/46653946?v=4"},{"login":"tancak","avatar_url":"https://avatars.githubusercontent.com/u/11760749?v=4"},{"login":"spkesDE","avatar_url":"https://avatars.githubusercontent.com/u/1682314?v=4"},{"login":"j3lte","avatar_url":"https://avatars.githubusercontent.com/u/2557568?v=4"},{"login":"dslatt","avatar_url":"https://avatars.githubusercontent.com/u/5211001?v=4"},{"login":"Malong11-007","avatar_url":"https://avatars.githubusercontent.com/u/40298510?v=4"},{"login":"StefanB7","avatar_url":"https://avatars.githubusercontent.com/u/22056509?v=4"},{"login":"souravghosh01","avatar_url":"https://avatars.githubusercontent.com/u/37548139?v=4"},{"login":"SR3u","avatar_url":"https://avatars.githubusercontent.com/u/2380522?v=4"},{"login":"Rikpat","avatar_url":"https://avatars.githubusercontent.com/u/33869814?v=4"},{"login":"NormanJS","avatar_url":"https://avatars.githubusercontent.com/u/83409549?v=4"},{"login":"No-Maines-Land","avatar_url":"https://avatars.githubusercontent.com/u/20687725?v=4"},{"login":"stark1tty","avatar_url":"https://avatars.githubusercontent.com/u/69326376?v=4"},{"login":"Momcilo42","avatar_url":"https://avatars.githubusercontent.com/u/10118137?v=4"},{"login":"marius-arch","avatar_url":"https://avatars.githubusercontent.com/u/72494359?v=4"},{"login":"Lumilias","avatar_url":"https://avatars.githubusercontent.com/u/10852161?v=4"},{"login":"Havock94","avatar_url":"https://avatars.githubusercontent.com/u/7635248?v=4"},{"login":"Lollyde","avatar_url":"https://avatars.githubusercontent.com/u/11347524?v=4"},{"login":"krishnamuppaneni","avatar_url":"https://avatars.githubusercontent.com/u/4703366?v=4"},{"login":"devtobi","avatar_url":"https://avatars.githubusercontent.com/u/28538704?v=4"},{"login":"TyxTang","avatar_url":"https://avatars.githubusercontent.com/u/90897955?v=4"},{"login":"alotlikebeans","avatar_url":"https://avatars.githubusercontent.com/u/19630511?v=4"},{"login":"WillyJL","avatar_url":"https://avatars.githubusercontent.com/u/49810075?v=4"},{"login":"anonysoul","avatar_url":"https://avatars.githubusercontent.com/u/105715150?v=4"},{"login":"cospeedster","avatar_url":"https://avatars.githubusercontent.com/u/52749645?v=4"},{"login":"diederbert","avatar_url":"https://avatars.githubusercontent.com/u/162878798?v=4"},{"login":"digdilem","avatar_url":"https://avatars.githubusercontent.com/u/4052275?v=4"},{"login":"dinghino","avatar_url":"https://avatars.githubusercontent.com/u/14729459?v=4"},{"login":"gfomichev","avatar_url":"https://avatars.githubusercontent.com/u/1596146?v=4"},{"login":"gnattu","avatar_url":"https://avatars.githubusercontent.com/u/12995396?v=4"},{"login":"tuxpizza","avatar_url":"https://avatars.githubusercontent.com/u/84710786?v=4"},{"login":"xmarkurion","avatar_url":"https://avatars.githubusercontent.com/u/46654687?v=4"},{"login":"huanga","avatar_url":"https://avatars.githubusercontent.com/u/732970?v=4"},{"login":"taos15","avatar_url":"https://avatars.githubusercontent.com/u/122130728?v=4"},{"login":"arghyadipchak","avatar_url":"https://avatars.githubusercontent.com/u/32430374?v=4"},{"login":"AuthorShin","avatar_url":"https://avatars.githubusercontent.com/u/4959043?v=4"},{"login":"benniblot","avatar_url":"https://avatars.githubusercontent.com/uLine truncated
+1 -1
View File
@@ -1 +1 @@
[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"httpsLine truncated
[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"httpsLine truncated
+3 -3
View File
@@ -17,14 +17,14 @@
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@next/eslint-plugin-next": "16.1.3",
"@next/eslint-plugin-next": "16.1.4",
"eslint-config-prettier": "^10.1.8",
"eslint-config-turbo": "^2.7.5",
"eslint-config-turbo": "^2.7.6",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^6.1.1",
"typescript-eslint": "^8.53.0"
"typescript-eslint": "^8.53.1"
},
"devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0",
+2 -2
View File
@@ -11,11 +11,11 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@ianvs/prettier-plugin-sort-imports": "^4.7.0",
"prettier": "^3.8.0"
"prettier": "^3.8.1"
},
"devDependencies": {
"@homarr/tsconfig": "workspace:^0.1.0",
"prettier-plugin-packagejson": "^2.5.22",
"prettier-plugin-packagejson": "^3.0.0",
"typescript": "^5.9.3"
}
}