- {metadataItems.map((metadataItem) => (
-
- {metadataItem.label}
- {metadataItem.value}
-
- ))}
-
- )}
);
diff --git a/packages/definitions/src/docs/homarr-docs-sitemap.ts b/packages/definitions/src/docs/homarr-docs-sitemap.ts
index 89ed05435..39ee81c08 100644
--- a/packages/definitions/src/docs/homarr-docs-sitemap.ts
+++ b/packages/definitions/src/docs/homarr-docs-sitemap.ts
@@ -2,6 +2,7 @@
// it uses the sitemap.xml to generate the HomarrDocumentationPath type
export type HomarrDocumentationPath =
| "/about-us"
+ | "/api-reference"
| "/blog"
| "/blog/2023/01/11/version0.11"
| "/blog/2023/04/16/version0.12-more-widgets"
@@ -42,9 +43,11 @@ export type HomarrDocumentationPath =
| "/docs/tags/active-directory"
| "/docs/tags/administration"
| "/docs/tags/advanced"
+ | "/docs/tags/ai"
| "/docs/tags/analytics"
| "/docs/tags/api"
| "/docs/tags/apps"
+ | "/docs/tags/automation"
| "/docs/tags/background"
| "/docs/tags/backup"
| "/docs/tags/boards"
@@ -55,9 +58,10 @@ export type HomarrDocumentationPath =
| "/docs/tags/community"
| "/docs/tags/configuration"
| "/docs/tags/connections"
- | "/docs/tags/custom"
+ | "/docs/tags/custom-widgets"
| "/docs/tags/customization"
| "/docs/tags/data-sources"
+ | "/docs/tags/data"
| "/docs/tags/database"
| "/docs/tags/developer"
| "/docs/tags/development"
@@ -78,9 +82,11 @@ export type HomarrDocumentationPath =
| "/docs/tags/integrations"
| "/docs/tags/interface"
| "/docs/tags/jobs"
+ | "/docs/tags/jsx"
| "/docs/tags/layout"
| "/docs/tags/ldap"
| "/docs/tags/management"
+ | "/docs/tags/mcp"
| "/docs/tags/media"
| "/docs/tags/oidc"
| "/docs/tags/open-collective"
@@ -217,10 +223,12 @@ export type HomarrDocumentationPath =
| "/docs/integrations/uptime-kuma"
| "/docs/management/api"
| "/docs/management/apps"
+ | "/docs/management/backup"
| "/docs/management/boards"
| "/docs/management/certificates"
| "/docs/management/custom-widgets"
| "/docs/management/integrations"
+ | "/docs/management/mcp"
| "/docs/management/media"
| "/docs/management/search-engines"
| "/docs/management/settings"
diff --git a/packages/integrations/src/beszel/beszel-types.ts b/packages/integrations/src/beszel/beszel-types.ts
index 52643c701..e5c6566a5 100644
--- a/packages/integrations/src/beszel/beszel-types.ts
+++ b/packages/integrations/src/beszel/beszel-types.ts
@@ -94,8 +94,8 @@ export interface BeszelSystemDetails {
*
* Units:
* - CPU/GPU/memory/disk percentages: 0–100
- * - Memory/disk absolute values (mu, du, etc.): bytes
- * - Disk I/O (dr, dw): bytes/s
+ * - Memory/disk absolute values (mu, du, m, d, etc.): GB
+ * - Disk I/O (dr, dw): MB/s
* - Network (ns, nr): bytes/s — all interfaces (including loopback, docker bridges)
* - Bandwidth (b): bytes/s [sent, recv] — public interfaces only. Prefer b over ns/nr for user-facing charts
*/
@@ -110,35 +110,35 @@ export interface BeszelSystemStats {
cpus?: number[];
/** load average [1m, 5m, 15m] */
la?: [number, number, number];
- /** total memory (bytes) */
+ /** total memory (GB) */
m: number;
- /** memory used (bytes) */
+ /** memory used (GB) */
mu: number;
/** memory usage (%) */
mp: number;
- /** memory buffer/cache (bytes) */
+ /** memory buffer/cache (GB) */
mb: number;
- /** memory max used (bytes) */
+ /** memory max used (GB) */
mm?: number;
- /** memory zfs arc (bytes) */
+ /** memory zfs arc (GB) */
mz?: number;
- /** total swap (bytes) */
+ /** total swap (GB) */
s: number;
- /** swap used (bytes) */
+ /** swap used (GB) */
su: number;
- /** total disk (bytes) */
+ /** total disk (GB) */
d: number;
- /** disk used (bytes) */
+ /** disk used (GB) */
du: number;
/** disk usage (%) */
dp: number;
- /** disk read (bytes/s) */
+ /** disk read (MB/s) */
dr: number;
- /** disk write (bytes/s) */
+ /** disk write (MB/s) */
dw: number;
- /** disk read max (bytes/s) */
+ /** disk read max (MB/s) */
drm?: number;
- /** disk write max (bytes/s) */
+ /** disk write max (MB/s) */
dwm?: number;
/** disk IOPS [read, write] */
dio?: [number, number];
@@ -236,13 +236,14 @@ export interface BeszelContainer {
* One entry per container in a BeszelContainerStatsRecord.
*
* Network fields: b (bandwidth) is preferred when available; fall back to ns/nr.
+ * Units: m = MB, c = %, b/ns/nr = bytes/s
*/
export interface BeszelContainerStats {
/** container name */
n: string;
/** CPU usage (%) */
c: number;
- /** memory usage (bytes) */
+ /** memory usage (MB) */
m: number;
/** network sent (bytes/s) — legacy, use b when available */
ns?: number;
diff --git a/packages/integrations/src/mock/data/beszel.ts b/packages/integrations/src/mock/data/beszel.ts
index 8788cf136..40acc78be 100644
--- a/packages/integrations/src/mock/data/beszel.ts
+++ b/packages/integrations/src/mock/data/beszel.ts
@@ -10,7 +10,6 @@ import type {
} from "../../beszel/beszel-types";
const GB = 1024 * 1024 * 1024;
-const MB = 1024 * 1024;
const KB = 1024;
interface MockSystemDef {
@@ -144,26 +143,27 @@ function generateSystemStatsSeries(count: number, sys: MockSystemDef): BeszelSys
const netSendWalk = smoothWalk(500, 200, count, 10, 8000);
const netRecvWalk = smoothWalk(800, 300, count, 10, 12000);
- const memTotal = sys.mem;
const diskTotal = rand(200, 2000) * GB;
return cpuWalk.map((cpu, i) => {
const memPct = memPctWalk[i] ?? sys.baseMem;
const diskPct = diskPctWalk[i] ?? sys.baseDisk;
+ const memTotalGB = sys.mem / GB;
+ const diskTotalGB = diskTotal / GB;
return {
cpu,
la: [cpu / 20 + rand(0, 0.5), cpu / 25 + rand(0, 0.3), cpu / 30 + rand(0, 0.2)] as [number, number, number],
- m: memTotal,
- mu: (memTotal * memPct) / 100,
+ m: memTotalGB,
+ mu: (memTotalGB * memPct) / 100,
mp: memPct,
- mb: rand(0.5, 4) * GB,
- s: 4 * GB,
- su: rand(0, 2) * GB,
- d: diskTotal,
- du: (diskTotal * diskPct) / 100,
+ mb: rand(0.5, 4),
+ s: 4,
+ su: rand(0, 2),
+ d: diskTotalGB,
+ du: (diskTotalGB * diskPct) / 100,
dp: diskPct,
- dr: (diskReadWalk[i] ?? 5) * MB,
- dw: (diskWriteWalk[i] ?? 3) * MB,
+ dr: diskReadWalk[i] ?? 5,
+ dw: diskWriteWalk[i] ?? 3,
ns: (netSendWalk[i] ?? 500) * KB,
nr: (netRecvWalk[i] ?? 800) * KB,
b: [(netSendWalk[i] ?? 500) * KB * 0.7, (netRecvWalk[i] ?? 800) * KB * 0.7] as [number, number],
@@ -183,7 +183,7 @@ function generateContainerStatsSeries(count: number, profiles: typeof containerP
walks.map(({ profile, cpuWalk, memWalk, netWalk }) => ({
n: profile.name,
c: cpuWalk[i] ?? profile.cpuBase,
- m: (memWalk[i] ?? profile.memMB) * MB,
+ m: memWalk[i] ?? profile.memMB,
b: [(netWalk[i] ?? profile.netKB) * KB * 0.4, (netWalk[i] ?? profile.netKB) * KB * 0.6] as [number, number],
})),
);
@@ -264,13 +264,15 @@ export class BeszelMockService {
const sys = resolveSystem(systemId);
const intervalMinutes = typeToMinutes[type] ?? 1;
const statsSeries = generateSystemStatsSeries(perPage, sys);
- return buildTimeSeries(
+ const result = buildTimeSeries(
systemId,
perPage,
intervalMinutes,
type,
statsSeries.map((stats) => ({ stats })),
);
+
+ return result;
}
public async getContainerStatsAsync(
@@ -284,13 +286,15 @@ export class BeszelMockService {
.map((i) => containerProfiles[i])
.filter(Boolean) as typeof containerProfiles;
const series = generateContainerStatsSeries(perPage, selectedProfiles);
- return buildTimeSeries(
+ const result = buildTimeSeries(
systemId,
perPage,
intervalMinutes,
type,
series.map((stats) => ({ stats })),
);
+
+ return result;
}
public async getAlertsAsync(): Promise