Compare commits

...
34 Commits
Author SHA1 Message Date
Releases Homarr 6dd13f6dea chore(release): 1.53.0 [skip ci] 2026-02-06 19:37:59 +00:00
homarr-releases[bot] 129d96f607 chore(release): automatic release v1.53.0 2026-02-06 19:37:00 +00:00
homarr-renovate[bot] 0fafa505ac fix(deps): update mantine monorepo to ^8.3.14 (#4998)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-06 13:10:10 +00:00
homarr-crowdin[bot] 5e085b0da0 chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-02-06 01:04:58 +00:00
homarr-renovate[bot] c2d9f18e4e fix(deps): update dependency ldapts to v8.1.4 (#4993)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-05 14:50:32 +00:00
homarr-renovate[bot] 4209f7c70e fix(deps): update dependency video.js to ^8.23.6 (#4992)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-05 11:43:25 +00:00
ajnart 10848db595 feat(analytics): consolidate server analytics into single comprehensive Umami event (#4938)
* feat(analytics): consolidate server analytics into single Umami event

- Replace multiple separate events with single 'server-analytics' event
- Add comprehensive metrics: Homarr version, database type, Docker/K8s status
- Add auth providers status (credentials, OIDC, LDAP)
- Add counts for users, boards, groups, apps, widgets, sections, integrations
- Add counts for search engines, icon repos, icons, API keys, invites, media
- Add counts for layouts, item layouts, section layouts, cron job configs
- Include per-integration-kind breakdown (integration_sonarr, etc.)
- Add required dependencies: @homarr/auth, @homarr/common, @homarr/docker

* refactor(ui): simplify analytics settings to single toggle

- Remove individual toggles for widget/integration/user data
- Keep only the main 'Enable analytics' toggle
- All data is now collected when analytics are enabled
- Update both init settings and manage settings pages

* docs(i18n): update analytics description with collected data details

- Explain all data points collected when analytics are enabled
- List: version, DB type, Docker/K8s, auth methods, counts
- Clarify that no personal info, URLs, or names are collected

* chore(deps): update pnpm-lock.yaml for analytics package dependencies
2026-02-05 09:54:41 +01:00
homarr-renovate[bot] 43b6246876 fix(deps): update turbo monorepo to ^2.8.1 (#4991)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 22:37:10 +00:00
homarr-renovate[bot] bd07570c8d chore(deps): update semantic-release monorepo (#4990)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 21:41:31 +00:00
homarr-renovate[bot] 62b6939b92 fix(deps): update dependency next-intl to v4.8.1 (#4986)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 19:46:39 +00:00
homarr-renovate[bot] c3071a3c95 fix(deps): update dependency pg to ^8.18.0 (#4989)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 19:00:45 +00:00
homarr-renovate[bot] 1115ad1364 fix(deps): update dependency @tanstack/react-query-devtools to ^5.91.3 (#4985)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 09:51:43 +00:00
homarr-renovate[bot] 4cfd2aca94 chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.57.1 (#4984)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 08:49:28 +00:00
homarr-renovate[bot] 460d53cafa fix(deps): update dependency fast-xml-parser to ^5.3.4 (#4982)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-04 04:47:35 +00:00
homarr-crowdin[bot] 0b88d5703e chore(lang): updated translations from crowdin
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-02-03 01:09:22 +00:00
homarr-renovate[bot] 054ca57188 fix(deps): update turbo monorepo to ^2.8.0 (#4978)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-02 18:54:38 +00:00
homarr-renovate[bot] c3a7ab52ee fix(deps): update dependency next-intl to v4.8.0 (#4977)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-02 17:46:05 +00:00
homarr-crowdin[bot] 8ee1e32e83 chore(lang): update translations from crowdin (#4954)
Co-authored-by: Crowdin Homarr <190541745+homarr-crowdin[bot]@users.noreply.github.com>
2026-02-02 17:24:22 +01:00
homarr-renovate[bot] 24e24dc634 fix(deps): update tiptap monorepo to v3.18.0 (#4975)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-02 13:09:45 +00:00
homarr-renovate[bot] 6303aec209 chore(deps): update dependency fast-xml-parser to v5.3.4 [security] (#4974)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-02 07:53:26 +00:00
homarr-renovate[bot] 7c3fe3d6d4 fix(deps): update nextjs monorepo to v16.1.6 (#4969)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-02 05:05:02 +00:00
homarr-renovate[bot] e67483fea5 fix(deps): update dependency jotai to ^2.17.0 (#4972)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-02 02:29:58 +00:00
homarr-renovate[bot] d1f7e04a2a chore(deps): update dependency proxmox-api&gt;undici to v7.19.2 (#4967)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-02 02:28:37 +00:00
homarr-renovate[bot] 0a2f71bd31 chore(deps): update dependency rollup@&gt;&#x3d;4.0.0 &lt;4.22.4 to >=4.57.0 (#4963)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-01 23:34:08 +00:00
homarr-renovate[bot] aeb6e0f406 fix(deps): update trpc monorepo to ^11.9.0 (#4970)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-01 22:34:19 +00:00
homarr-renovate[bot] df264f58d0 chore(deps): update dependency @types/react to v19.2.10 (#4964)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-01 19:31:41 +00:00
homarr-renovate[bot] 71aa5b660b chore(deps): update dependency axios@&gt;&#x3d;1.0.0 &lt;1.8.2 to >=1.13.4 (#4966)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-02-01 18:42:55 +00:00
homarr-renovate[bot] 5c6eafb272 fix(deps): update dependency mysql2 to v3.16.2 (#4961)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-31 21:30:15 +00:00
homarr-renovate[bot] e88d126355 fix(deps): update dependency typescript-eslint to ^8.54.0 (#4958)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-31 19:28:39 +00:00
homarr-renovate[bot] d3e0b47875 fix(deps): update react monorepo to v19.2.4 (#4960)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-31 18:42:46 +00:00
homarr-renovate[bot] ec40309cde fix(deps): update dependency @next/eslint-plugin-next to v16.1.5 (#4959)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-31 18:42:21 +00:00
homarr-renovate[bot] a3ba70177b chore(deps): update pnpm to v10.28.2 (#4956)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-31 15:32:24 +00:00
homarr-renovate[bot] 0eab26cdac fix(deps): update dependency fastify to ^5.7.2 (#4955)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-31 11:27:34 +00:00
homarr-renovate[bot] a9db68bd3e fix(deps): update dependency @paralleldrive/cuid2 to ^3.3.0 (#4952)
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
2026-01-30 21:36:03 +00:00
34 changed files with 1994 additions and 1997 deletions

No files matched your search

+29
View File
@@ -1,3 +1,32 @@
## [1.53.0](https://github.com/homarr-labs/homarr/compare/v1.52.0...v1.53.0) (2026-02-06)
### Features
* **analytics:** consolidate server analytics into single comprehensive Umami event ([#4938](https://github.com/homarr-labs/homarr/issues/4938)) ([10848db](https://github.com/homarr-labs/homarr/commit/10848db595b2254b1485ea168d1c327b907d9ff8))
### Bug Fixes
* **deps:** update dependency @next/eslint-plugin-next to v16.1.5 ([#4959](https://github.com/homarr-labs/homarr/issues/4959)) ([ec40309](https://github.com/homarr-labs/homarr/commit/ec40309cde2280cf689856d4f78fb1500b583130))
* **deps:** update dependency @paralleldrive/cuid2 to ^3.3.0 ([#4952](https://github.com/homarr-labs/homarr/issues/4952)) ([a9db68b](https://github.com/homarr-labs/homarr/commit/a9db68bd3eaea6a4564cd6842054ea60cc45e3a3))
* **deps:** update dependency @tanstack/react-query-devtools to ^5.91.3 ([#4985](https://github.com/homarr-labs/homarr/issues/4985)) ([1115ad1](https://github.com/homarr-labs/homarr/commit/1115ad1364bca84dee33aa42499c986bdad2c528))
* **deps:** update dependency fast-xml-parser to ^5.3.4 ([#4982](https://github.com/homarr-labs/homarr/issues/4982)) ([460d53c](https://github.com/homarr-labs/homarr/commit/460d53cafa1abeebf4dea7b1bb1e920267c2f9fe))
* **deps:** update dependency fastify to ^5.7.2 ([#4955](https://github.com/homarr-labs/homarr/issues/4955)) ([0eab26c](https://github.com/homarr-labs/homarr/commit/0eab26cdace47c0b19519372a3daa6998e0c8207))
* **deps:** update dependency jotai to ^2.17.0 ([#4972](https://github.com/homarr-labs/homarr/issues/4972)) ([e67483f](https://github.com/homarr-labs/homarr/commit/e67483fea56f0b06fa54e68b8dd62fd0b5dedadd))
* **deps:** update dependency ldapts to v8.1.4 ([#4993](https://github.com/homarr-labs/homarr/issues/4993)) ([c2d9f18](https://github.com/homarr-labs/homarr/commit/c2d9f18e4ef28f063e4abf1175cd90ba746410b7))
* **deps:** update dependency mysql2 to v3.16.2 ([#4961](https://github.com/homarr-labs/homarr/issues/4961)) ([5c6eafb](https://github.com/homarr-labs/homarr/commit/5c6eafb272436b78d4668d562d50001bca48e6d3))
* **deps:** update dependency next-intl to v4.8.0 ([#4977](https://github.com/homarr-labs/homarr/issues/4977)) ([c3a7ab5](https://github.com/homarr-labs/homarr/commit/c3a7ab52ee3acbcf47255d5813317c3cf67ea49f))
* **deps:** update dependency next-intl to v4.8.1 ([#4986](https://github.com/homarr-labs/homarr/issues/4986)) ([62b6939](https://github.com/homarr-labs/homarr/commit/62b6939b92f29618cc6d13a189b65df1922779ba))
* **deps:** update dependency pg to ^8.18.0 ([#4989](https://github.com/homarr-labs/homarr/issues/4989)) ([c3071a3](https://github.com/homarr-labs/homarr/commit/c3071a3c95f3a30438050aa37c65950cccabf681))
* **deps:** update dependency typescript-eslint to ^8.54.0 ([#4958](https://github.com/homarr-labs/homarr/issues/4958)) ([e88d126](https://github.com/homarr-labs/homarr/commit/e88d126355b96ac5060b552047c191f8b284461c))
* **deps:** update dependency video.js to ^8.23.6 ([#4992](https://github.com/homarr-labs/homarr/issues/4992)) ([4209f7c](https://github.com/homarr-labs/homarr/commit/4209f7c70e75870f56b93a97f3b6053962ee3ff7))
* **deps:** update mantine monorepo to ^8.3.14 ([#4998](https://github.com/homarr-labs/homarr/issues/4998)) ([0fafa50](https://github.com/homarr-labs/homarr/commit/0fafa505ac1c7f4ddb33ee5e8dedca9a883164ba))
* **deps:** update nextjs monorepo to v16.1.6 ([#4969](https://github.com/homarr-labs/homarr/issues/4969)) ([7c3fe3d](https://github.com/homarr-labs/homarr/commit/7c3fe3d6d47879c67950b3dc4d7e39adbc06c146))
* **deps:** update react monorepo to v19.2.4 ([#4960](https://github.com/homarr-labs/homarr/issues/4960)) ([d3e0b47](https://github.com/homarr-labs/homarr/commit/d3e0b47875998fc766e1c5f0481244fc659b0c49))
* **deps:** update tiptap monorepo to v3.18.0 ([#4975](https://github.com/homarr-labs/homarr/issues/4975)) ([24e24dc](https://github.com/homarr-labs/homarr/commit/24e24dc634a9e5a25ab934541225996e62ac31be))
* **deps:** update trpc monorepo to ^11.9.0 ([#4970](https://github.com/homarr-labs/homarr/issues/4970)) ([aeb6e0f](https://github.com/homarr-labs/homarr/commit/aeb6e0f40659bf1c514380a6c96858afdaf7e6db))
* **deps:** update turbo monorepo to ^2.8.0 ([#4978](https://github.com/homarr-labs/homarr/issues/4978)) ([054ca57](https://github.com/homarr-labs/homarr/commit/054ca57188656ddac7aaa16f792269eaa2ef319b))
* **deps:** update turbo monorepo to ^2.8.1 ([#4991](https://github.com/homarr-labs/homarr/issues/4991)) ([43b6246](https://github.com/homarr-labs/homarr/commit/43b6246876debccbe7239c8ee67753e17527e469))
## [1.52.0](https://github.com/homarr-labs/homarr/compare/v1.51.0...v1.52.0) (2026-01-30)
### Features
+16 -16
View File
@@ -48,21 +48,21 @@
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@homarr/widgets": "workspace:^0.1.0",
"@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",
"@mantine/colors-generator": "^8.3.14",
"@mantine/core": "^8.3.14",
"@mantine/dropzone": "^8.3.14",
"@mantine/hooks": "^8.3.14",
"@mantine/modals": "^8.3.14",
"@mantine/tiptap": "^8.3.14",
"@million/lint": "1.0.14",
"@tabler/icons-react": "^3.36.1",
"@tanstack/react-query": "^5.90.20",
"@tanstack/react-query-devtools": "^5.91.2",
"@tanstack/react-query-devtools": "^5.91.3",
"@tanstack/react-query-next-experimental": "^5.91.0",
"@trpc/client": "^11.8.1",
"@trpc/next": "^11.8.1",
"@trpc/react-query": "^11.8.1",
"@trpc/server": "^11.8.1",
"@trpc/client": "^11.9.0",
"@trpc/next": "^11.9.0",
"@trpc/react-query": "^11.9.0",
"@trpc/server": "^11.9.0",
"@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-fit": "0.11.0",
"@xterm/xterm": "^6.0.0",
@@ -74,13 +74,13 @@
"flag-icons": "^7.5.0",
"glob": "^13.0.0",
"isomorphic-dompurify": "^2.35.0",
"jotai": "^2.16.2",
"jotai": "^2.17.0",
"mantine-react-table": "2.0.0-beta.9",
"next": "16.1.5",
"next": "16.1.6",
"postcss-preset-mantine": "^1.18.0",
"prismjs": "^1.30.0",
"react": "19.2.3",
"react-dom": "19.2.3",
"react": "19.2.4",
"react-dom": "19.2.4",
"react-error-boundary": "^6.1.0",
"react-simple-code-editor": "^0.14.1",
"sass": "^1.97.3",
@@ -96,7 +96,7 @@
"@types/chroma-js": "3.1.2",
"@types/node": "^24.10.9",
"@types/prismjs": "^1.26.5",
"@types/react": "19.2.9",
"@types/react": "19.2.10",
"@types/react-dom": "19.2.3",
"@types/swagger-ui-react": "^5.18.0",
"concurrently": "^9.2.1",
@@ -1,6 +1,5 @@
"use client";
import { startTransition } from "react";
import { Button, Card, Group, Stack, Switch, Text } from "@mantine/core";
import { IconArrowRight } from "@tabler/icons-react";
import type { z } from "zod/v4";
@@ -24,16 +23,6 @@ export const InitSettings = () => {
});
const form = useZodForm(settingsInitSchema, { initialValues: defaultServerSettings });
form.watch("analytics.enableGeneral", ({ value }) => {
if (!value) {
startTransition(() => {
form.setFieldValue("analytics.enableWidgetData", false);
form.setFieldValue("analytics.enableIntegrationData", false);
form.setFieldValue("analytics.enableUserData", false);
});
}
});
const handleSubmitAsync = async (values: z.infer<typeof settingsInitSchema>) => {
await mutateAsync(values);
};
@@ -47,24 +36,6 @@ export const InitSettings = () => {
<Stack gap="xs">
<AnalyticsRow kind="general" {...form.getInputProps("analytics.enableGeneral", { type: "checkbox" })} />
<Stack gap="xs" ps="md" w="100%">
<AnalyticsRow
kind="integrationData"
disabled={!form.values.analytics.enableGeneral}
{...form.getInputProps("analytics.enableWidgetData", { type: "checkbox" })}
/>
<AnalyticsRow
kind="widgetData"
disabled={!form.values.analytics.enableGeneral}
{...form.getInputProps("analytics.enableIntegrationData", { type: "checkbox" })}
/>
<AnalyticsRow
kind="usersData"
disabled={!form.values.analytics.enableGeneral}
{...form.getInputProps("analytics.enableUserData", { type: "checkbox" })}
/>
</Stack>
</Stack>
</Stack>
</Card>
@@ -24,15 +24,6 @@ export const AnalyticsSettings = ({ initialData }: AnalyticsSettingsProps) => {
return;
}
if (
!updatedValues.enableGeneral &&
(updatedValues.enableWidgetData || updatedValues.enableIntegrationData || updatedValues.enableUserData)
) {
updatedValues.enableIntegrationData = false;
updatedValues.enableUserData = false;
updatedValues.enableWidgetData = false;
}
void mutateAsync({
settingsKey: "analytics",
value: updatedValues,
@@ -54,30 +45,6 @@ export const AnalyticsSettings = ({ initialData }: AnalyticsSettingsProps) => {
<LoadingOverlay visible={isPending} zIndex={1000} overlayProps={{ radius: "sm", blur: 2 }} />
<Stack>
<SwitchSetting form={form} formKey="enableGeneral" title={t("general.title")} text={t("general.text")} />
<SwitchSetting
form={form}
formKey="enableIntegrationData"
ms="xl"
title={t("integrationData.title")}
text={t("integrationData.text")}
disabled={!form.values.enableGeneral}
/>
<SwitchSetting
form={form}
formKey="enableWidgetData"
ms="xl"
title={t("widgetData.title")}
text={t("widgetData.text")}
disabled={!form.values.enableGeneral}
/>
<SwitchSetting
form={form}
formKey="enableUserData"
ms="xl"
title={t("usersData.title")}
text={t("usersData.text")}
disabled={!form.values.enableGeneral}
/>
</Stack>
</Card>
</>
+1 -1
View File
@@ -39,7 +39,7 @@
"@homarr/widgets": "workspace:^0.1.0",
"dayjs": "^1.11.19",
"dotenv": "^17.2.3",
"fastify": "^5.7.1",
"fastify": "^5.7.2",
"superjson": "2.2.6",
"undici": "7.18.2"
},
+2 -2
View File
@@ -4,10 +4,10 @@
"dependencies": {
"better-sqlite3": "^12.6.2"
},
"packageManager": "pnpm@10.28.1",
"packageManager": "pnpm@10.28.2",
"engines": {
"node": ">=24.13.0",
"pnpm": ">=10.28.1"
"pnpm": ">=10.28.2"
},
"pnpm": {
"onlyBuiltDependencies": [
+11 -11
View File
@@ -1,6 +1,6 @@
{
"name": "homarr",
"version": "1.52.0",
"version": "1.53.0",
"private": true,
"scripts": {
"build": "cross-env CI=true turbo build",
@@ -39,11 +39,11 @@
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/commit-analyzer": "^13.0.1",
"@semantic-release/git": "^10.0.1",
"@semantic-release/github": "^12.0.2",
"@semantic-release/github": "^12.0.3",
"@semantic-release/npm": "^13.1.3",
"@semantic-release/release-notes-generator": "^14.1.0",
"@testcontainers/redis": "^11.11.0",
"@turbo/gen": "^2.7.6",
"@turbo/gen": "^2.8.1",
"@vitejs/plugin-react": "^5.1.2",
"@vitest/coverage-v8": "^4.0.18",
"@vitest/ui": "^4.0.18",
@@ -52,17 +52,17 @@
"jsdom": "^27.4.0",
"json5": "^2.2.3",
"prettier": "^3.8.1",
"semantic-release": "^25.0.2",
"semantic-release": "^25.0.3",
"testcontainers": "^11.11.0",
"turbo": "^2.7.6",
"turbo": "^2.8.1",
"typescript": "^5.9.3",
"vite-tsconfig-paths": "^6.0.5",
"vitest": "^4.0.18"
},
"packageManager": "pnpm@10.28.1",
"packageManager": "pnpm@10.28.2",
"engines": {
"node": ">=24.13.0",
"pnpm": ">=10.28.1"
"pnpm": ">=10.28.2"
},
"pnpm": {
"onlyBuiltDependencies": [
@@ -79,7 +79,7 @@
"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.3",
"axios@>=1.0.0 <1.8.2": ">=1.13.4",
"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",
@@ -88,9 +88,9 @@
"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.19.1",
"react-is": "^19.2.3",
"rollup@>=4.0.0 <4.22.4": ">=4.56.0",
"proxmox-api>undici": "7.19.2",
"react-is": "^19.2.4",
"rollup@>=4.0.0 <4.22.4": ">=4.57.1",
"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
View File
@@ -22,8 +22,11 @@
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/auth": "workspace:^0.1.0",
"@homarr/common": "workspace:^0.1.0",
"@homarr/core": "workspace:^0.1.0",
"@homarr/db": "workspace:^0.1.0",
"@homarr/docker": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@umami/node": "^0.4.0",
"superjson": "2.2.6"
+70 -54
View File
@@ -1,17 +1,52 @@
import type { UmamiEventData } from "@umami/node";
import { Umami } from "@umami/node";
import { isProviderEnabled } from "@homarr/auth/server";
import { Stopwatch } from "@homarr/common";
import { createLogger } from "@homarr/core/infrastructure/logs";
import { count, db } from "@homarr/db";
import { isMysql, isPostgresql } from "@homarr/db/collection";
import { getServerSettingByKeyAsync } from "@homarr/db/queries";
import { integrations, items, users } from "@homarr/db/schema";
import type { defaultServerSettings } from "@homarr/server-settings";
import {
apiKeys,
apps,
boards,
cronJobConfigurations,
groups,
iconRepositories,
icons,
integrations,
invites,
itemLayouts,
items,
layouts,
medias,
searchEngines,
sectionLayouts,
sections,
users,
} from "@homarr/db/schema";
import { env as dockerEnv } from "@homarr/docker/env";
import { Stopwatch } from "../../common/src";
import packageJson from "../../../package.json";
import { UMAMI_HOST_URL, UMAMI_WEBSITE_ID } from "./constants";
const logger = createLogger({ module: "analytics" });
const getDatabaseType = (): "mysql" | "postgresql" | "sqlite" => {
if (isMysql()) return "mysql";
if (isPostgresql()) return "postgresql";
return "sqlite";
};
const getEnabledAuthProviders = (): string[] => {
const providers: string[] = [];
if (isProviderEnabled("credentials")) providers.push("credentials");
if (isProviderEnabled("oidc")) providers.push("oidc");
if (isProviderEnabled("ldap")) providers.push("ldap");
return providers;
};
export const sendServerAnalyticsAsync = async () => {
const stopWatch = new Stopwatch();
const analyticsSettings = await getServerSettingByKeyAsync(db, "analytics");
@@ -27,67 +62,48 @@ export const sendServerAnalyticsAsync = async () => {
websiteId: UMAMI_WEBSITE_ID,
});
await sendIntegrationDataAsync(umamiInstance, analyticsSettings);
await sendWidgetDataAsync(umamiInstance, analyticsSettings);
await sendUserDataAsync(umamiInstance, analyticsSettings);
const enabledAuthProviders = getEnabledAuthProviders();
logger.info(`Sent all analytics in ${stopWatch.getElapsedInHumanWords()}`);
};
const analyticsData: UmamiEventData = {
homarrVersion: packageJson.version,
databaseType: getDatabaseType(),
dockerEnabled: dockerEnv.ENABLE_DOCKER ? 1 : 0,
kubernetesEnabled: dockerEnv.ENABLE_KUBERNETES ? 1 : 0,
authCredentials: enabledAuthProviders.includes("credentials") ? 1 : 0,
authOidc: enabledAuthProviders.includes("oidc") ? 1 : 0,
authLdap: enabledAuthProviders.includes("ldap") ? 1 : 0,
countUsers: await db.$count(users),
countBoards: await db.$count(boards),
countGroups: await db.$count(groups),
countApps: await db.$count(apps),
countWidgets: await db.$count(items),
countSections: await db.$count(sections),
countIntegrations: await db.$count(integrations),
countSearchEngines: await db.$count(searchEngines),
countIconRepositories: await db.$count(iconRepositories),
countIcons: await db.$count(icons),
countApiKeys: await db.$count(apiKeys),
countInvites: await db.$count(invites),
countMedias: await db.$count(medias),
countLayouts: await db.$count(layouts),
countItemLayouts: await db.$count(itemLayouts),
countSectionLayouts: await db.$count(sectionLayouts),
countCronJobConfigs: await db.$count(cronJobConfigurations),
};
const sendWidgetDataAsync = async (umamiInstance: Umami, analyticsSettings: typeof defaultServerSettings.analytics) => {
if (!analyticsSettings.enableWidgetData) {
return;
}
const widgetCount = await db.$count(items);
const response = await umamiInstance.track("server-widget-data", {
countWidgets: widgetCount,
});
if (response.ok) {
return;
}
logger.warn("Unable to send track event data to Umami instance");
};
const sendUserDataAsync = async (umamiInstance: Umami, analyticsSettings: typeof defaultServerSettings.analytics) => {
if (!analyticsSettings.enableUserData) {
return;
}
const userCount = await db.$count(users);
const response = await umamiInstance.track("server-user-data", {
countUsers: userCount,
});
if (response.ok) {
return;
}
logger.warn("Unable to send track event data to Umami instance");
};
const sendIntegrationDataAsync = async (
umamiInstance: Umami,
analyticsSettings: typeof defaultServerSettings.analytics,
) => {
if (!analyticsSettings.enableIntegrationData) {
return;
}
const integrationKinds = await db
.select({ kind: integrations.kind, count: count(integrations.id) })
.from(integrations)
.groupBy(integrations.kind);
const map: UmamiEventData = {};
integrationKinds.forEach((integrationKind) => {
map[integrationKind.kind] = integrationKind.count;
analyticsData[`integration_${integrationKind.kind}`] = integrationKind.count;
});
const response = await umamiInstance.track("server-integration-data-kind", map);
if (response.ok) {
return;
const response = await umamiInstance.track("server-analytics-v2", analyticsData);
if (!response.ok) {
logger.warn("Unable to send analytics to Umami instance");
}
logger.warn("Unable to send track event data to Umami instance");
logger.info(`Sent analytics in ${stopWatch.getElapsedInHumanWords()}`);
};
+7 -7
View File
@@ -42,14 +42,14 @@
"@homarr/validation": "workspace:^0.1.0",
"@kubernetes/client-node": "^1.4.0",
"@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",
"@trpc/client": "^11.9.0",
"@trpc/react-query": "^11.9.0",
"@trpc/server": "^11.9.0",
"@trpc/tanstack-react-query": "^11.9.0",
"lodash.clonedeep": "^4.5.0",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"superjson": "2.2.6",
"trpc-to-openapi": "^3.1.0",
"zod": "^4.2.1"
+4 -4
View File
@@ -33,11 +33,11 @@
"@homarr/validation": "workspace:^0.1.0",
"bcrypt": "^6.0.0",
"cookies": "^0.9.1",
"ldapts": "8.1.3",
"next": "16.1.5",
"ldapts": "8.1.4",
"next": "16.1.6",
"next-auth": "5.0.0-beta.30",
"react": "19.2.3",
"react-dom": "19.2.3",
"react": "19.2.4",
"react-dom": "19.2.4",
"zod": "^4.2.1"
},
"devDependencies": {
+2 -2
View File
@@ -25,8 +25,8 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/api": "workspace:^0.1.0",
"react": "19.2.3",
"react-dom": "19.2.3"
"react": "19.2.4",
"react-dom": "19.2.4"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
+4 -4
View File
@@ -27,12 +27,12 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/core": "workspace:^0.1.0",
"@paralleldrive/cuid2": "^3.1.0",
"@paralleldrive/cuid2": "^3.3.0",
"dayjs": "^1.11.19",
"next": "16.1.5",
"next": "16.1.6",
"octokit": "^5.0.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"react": "19.2.4",
"react-dom": "19.2.4",
"undici": "7.18.2",
"zod": "^4.2.1",
"zod-validation-error": "^5.0.0"
+2 -2
View File
@@ -42,8 +42,8 @@
"dns-caching": "^0.2.9",
"drizzle-orm": "^0.45.1",
"ioredis": "5.9.2",
"mysql2": "3.16.1",
"pg": "^8.17.2",
"mysql2": "3.16.2",
"pg": "^8.18.0",
"superjson": "2.2.6",
"winston": "3.19.0",
"zod": "^4.2.1"
+5 -5
View File
@@ -29,11 +29,11 @@
"@homarr/core": "workspace:^0.1.0",
"@homarr/cron-jobs": "workspace:^0.1.0",
"@tanstack/react-query": "^5.90.20",
"@trpc/client": "^11.8.1",
"@trpc/server": "^11.8.1",
"@trpc/tanstack-react-query": "^11.8.1",
"@trpc/client": "^11.9.0",
"@trpc/server": "^11.9.0",
"@trpc/tanstack-react-query": "^11.9.0",
"node-cron": "^4.2.1",
"react": "19.2.3",
"react": "19.2.4",
"zod": "^4.2.1"
},
"devDependencies": {
@@ -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.9",
"@types/react": "19.2.10",
"eslint": "^9.39.2",
"typescript": "^5.9.3"
}
+4 -4
View File
@@ -47,8 +47,8 @@
"@homarr/core": "workspace:^0.1.0",
"@homarr/definitions": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/core": "^8.3.13",
"@paralleldrive/cuid2": "^3.1.0",
"@mantine/core": "^8.3.14",
"@paralleldrive/cuid2": "^3.3.0",
"@testcontainers/mysql": "^11.11.0",
"@testcontainers/postgresql": "^11.11.0",
"better-sqlite3": "^12.6.2",
@@ -56,8 +56,8 @@
"drizzle-kit": "^0.31.8",
"drizzle-orm": "^0.45.1",
"drizzle-zod": "^0.8.3",
"mysql2": "3.16.1",
"pg": "^8.17.2",
"mysql2": "3.16.2",
"pg": "^8.18.0",
"superjson": "2.2.6"
},
"devDependencies": {
+1 -1
View File
@@ -24,7 +24,7 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/common": "workspace:^0.1.0",
"fast-xml-parser": "^5.3.3",
"fast-xml-parser": "^5.3.4",
"zod": "^4.2.1"
},
"devDependencies": {
+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.13",
"@mantine/form": "^8.3.14",
"mantine-form-zod-resolver": "^1.3.0",
"zod": "^4.2.1"
},
+2 -2
View File
@@ -30,8 +30,8 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.13",
"react": "19.2.3",
"@mantine/core": "^8.3.14",
"react": "19.2.4",
"zod": "^4.2.1"
},
"devDependencies": {
+4 -4
View File
@@ -33,12 +33,12 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.13",
"@mantine/core": "^8.3.14",
"@tabler/icons-react": "^3.36.1",
"dayjs": "^1.11.19",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"zod": "^4.2.1"
},
"devDependencies": {
+3 -3
View File
@@ -24,9 +24,9 @@
"dependencies": {
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"react": "19.2.3"
"@mantine/core": "^8.3.14",
"@mantine/hooks": "^8.3.14",
"react": "19.2.4"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
+1 -1
View File
@@ -24,7 +24,7 @@
"prettier": "@homarr/prettier-config",
"dependencies": {
"@homarr/ui": "workspace:^0.1.0",
"@mantine/notifications": "^8.3.13",
"@mantine/notifications": "^8.3.14",
"@tabler/icons-react": "^3.36.1"
},
"devDependencies": {
+5 -5
View File
@@ -37,12 +37,12 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/core": "^8.3.14",
"@mantine/hooks": "^8.3.14",
"adm-zip": "0.5.16",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"superjson": "2.2.6",
"zod": "^4.2.1",
"zod-form-data": "^3.0.1"
+4 -4
View File
@@ -25,10 +25,10 @@
"dependencies": {
"@homarr/db": "workspace:^0.1.0",
"@homarr/server-settings": "workspace:^0.1.0",
"@mantine/dates": "^8.3.13",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3"
"@mantine/dates": "^8.3.14",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
+7 -7
View File
@@ -33,14 +33,14 @@
"@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/spotlight": "^8.3.13",
"@mantine/core": "^8.3.14",
"@mantine/hooks": "^8.3.14",
"@mantine/spotlight": "^8.3.14",
"@tabler/icons-react": "^3.36.1",
"jotai": "^2.16.2",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"jotai": "^2.17.0",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"use-deep-compare-effect": "^1.8.1"
},
"devDependencies": {
+4 -4
View File
@@ -32,10 +32,10 @@
"dayjs": "^1.11.19",
"deepmerge": "4.3.1",
"mantine-react-table": "2.0.0-beta.9",
"next": "16.1.5",
"next-intl": "4.7.0",
"react": "19.2.3",
"react-dom": "19.2.3"
"next": "16.1.6",
"next-intl": "4.8.1",
"react": "19.2.4",
"react-dom": "19.2.4"
},
"devDependencies": {
"@homarr/eslint-config": "workspace:^0.2.0",
+1 -1
View File
@@ -3305,7 +3305,7 @@
"title": "crwdns1764:0crwdne1764:0",
"general": {
"title": "crwdns1766:0crwdne1766:0",
"text": "crwdns1768:0crwdne1768:0"
"text": "crwdns3878:0crwdne3878:0"
},
"widgetData": {
"title": "crwdns1770:0crwdne1770:0",
+1 -1
View File
@@ -3305,7 +3305,7 @@
"title": "Analytics",
"general": {
"title": "Send anonymous analytics",
"text": "Homarr will send anonymized analytics using the open source software Umami. It never collects any personal information and is therefore fully GDPR & CCPA compliant. We encourage you to enable analytics because it helps our open source team to identify issues and prioritize our backlog."
"text": "Homarr will send anonymized analytics using the open source software Umami. When enabled, we collect: Homarr version, database type (MySQL/PostgreSQL/SQLite), Docker/Kubernetes status, authentication methods enabled, and the number of each feature. All data is anonymous and aggregated - no personal information, URLs, names, or identifiable data is ever collected. This helps our open source team understand usage patterns and prioritize development."
},
"widgetData": {
"title": "Widget data",
+25 -25
View File
@@ -1138,9 +1138,9 @@
"dangerZone": "Zona de riesgo",
"noResults": "No se han encontrado resultados",
"unsavedChanges": "¡Tienes cambios sin guardar!",
"servers": "",
"applications": "",
"services": "",
"servers": "Servidores",
"applications": "Aplicaciones",
"services": "Servicios",
"preview": {
"show": "Mostrar vista previa",
"hide": "Ocultar vista previa"
@@ -1964,36 +1964,36 @@
}
},
"coolify": {
"name": "",
"description": "",
"name": "Coolify",
"description": "Resumen de su instancia de Coolify con servidores y aplicaciones",
"option": {
"showServers": {
"label": ""
"label": "Mostrar servidores"
},
"showApplications": {
"label": ""
"label": "Mostrar aplicaciones"
},
"showServices": {
"label": ""
"label": "Mostrar servicios"
}
},
"empty": {
"servers": "",
"applications": "",
"services": ""
"servers": "No se encontraron servidores",
"applications": "No se encontraron aplicaciones",
"services": "No se encontraron servicios"
},
"footer": {
"updated": ""
"updated": "Actualizado {when}"
},
"error": {
"noIntegration": "",
"internalServerError": ""
"noIntegration": "No hay integración de Coolify configurada",
"internalServerError": "No se pudieron obtener los datos de Coolify"
},
"server": {
"buildServer": ""
"buildServer": "Construir"
},
"instances": {
"title": ""
"title": "Instancias"
}
},
"common": {
@@ -2646,32 +2646,32 @@
}
},
"systemDisks": {
"name": "",
"description": "",
"name": "Discos del sistema",
"description": "Uso del disco de su sistema",
"option": {
"showTemperatureIfAvailable": {
"label": ""
"label": "Mostrar la temperatura si está disponible"
},
"displayMode": {
"label": "",
"label": "Modo de visualización",
"option": {
"percentage": {
"label": ""
"label": "Porcentaje (e.g., 76 %)"
},
"absolute": {
"label": ""
"label": "Valores absolutos (e.g., 800 GB / 1 TB)"
},
"free": {
"label": ""
"label": "Porcentaje de espacio libre (e.g., 24 % libre)"
}
}
},
"showBackgroundBar": {
"label": ""
"label": "Mostrar la barra de uso en segundo plano"
}
},
"status": {
"unhealthy": ""
"unhealthy": "Poco sano"
}
}
},
File diff suppressed because it is too large. Load diff
+6 -6
View File
@@ -30,15 +30,15 @@
"@homarr/settings": "workspace:^0.1.0",
"@homarr/translation": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/core": "^8.3.13",
"@mantine/dates": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/core": "^8.3.14",
"@mantine/dates": "^8.3.14",
"@mantine/hooks": "^8.3.14",
"@tabler/icons-react": "^3.36.1",
"crypto-js": "^4.2.0",
"mantine-react-table": "2.0.0-beta.9",
"next": "16.1.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"svgson": "^5.3.1"
},
"devDependencies": {
+23 -23
View File
@@ -48,36 +48,36 @@
"@homarr/translation": "workspace:^0.1.0",
"@homarr/ui": "workspace:^0.1.0",
"@homarr/validation": "workspace:^0.1.0",
"@mantine/charts": "^8.3.13",
"@mantine/core": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/charts": "^8.3.14",
"@mantine/core": "^8.3.14",
"@mantine/hooks": "^8.3.14",
"@tabler/icons-react": "^3.36.1",
"@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",
"@tiptap/extension-color": "3.18.0",
"@tiptap/extension-highlight": "3.18.0",
"@tiptap/extension-image": "3.18.0",
"@tiptap/extension-link": "^3.18.0",
"@tiptap/extension-placeholder": "^3.18.0",
"@tiptap/extension-table": "3.18.0",
"@tiptap/extension-table-cell": "3.18.0",
"@tiptap/extension-table-header": "3.18.0",
"@tiptap/extension-table-row": "3.18.0",
"@tiptap/extension-task-item": "3.18.0",
"@tiptap/extension-task-list": "3.18.0",
"@tiptap/extension-text-align": "3.18.0",
"@tiptap/extension-text-style": "3.18.0",
"@tiptap/extension-underline": "3.18.0",
"@tiptap/react": "^3.18.0",
"@tiptap/starter-kit": "^3.18.0",
"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.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4",
"react-markdown": "^10.1.0",
"recharts": "^2.15.4",
"video.js": "^8.23.4",
"video.js": "^8.23.6",
"zod": "^4.2.1"
},
"devDependencies": {
+1241 -1230
View File
File diff suppressed because it is too large. Load diff
+3 -3
View File
@@ -17,14 +17,14 @@
},
"prettier": "@homarr/prettier-config",
"dependencies": {
"@next/eslint-plugin-next": "16.1.4",
"@next/eslint-plugin-next": "16.1.6",
"eslint-config-prettier": "^10.1.8",
"eslint-config-turbo": "^2.7.6",
"eslint-config-turbo": "^2.8.1",
"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.1"
"typescript-eslint": "^8.54.0"
},
"devDependencies": {
"@homarr/prettier-config": "workspace:^0.1.0",