{
"$schema": "homarr-custom-widget-v3",
"name": "Beszel systems studio",
"description": "Systems overview, configurable columns, selected-system history and live details using your existing Beszel integration. No HTTP source or copied API token required.",
"sources": {},
"requests": {},
"options": {
"beszel": {
"label": "Beszel integration",
"control": "integration",
"integrationKinds": ["beszel"],
"default": ""
}
},
"extensions": {
"stylesheet": ".metric { padding: 14px; border-radius: 12px; background: var(--mantine-color-default-hover); } .system-table { font-variant-numeric: tabular-nums; }",
"preferences": {
"system": {
"type": "string",
"defaultValue": ""
},
"period": {
"type": "string",
"defaultValue": "1h"
},
"columns": {
"type": "string[]",
"defaultValue": ["cpu", "memory", "disk"]
}
},
"fragments": {
"metric": "{props.label}{Number(props.value ?? 0).toFixed(1)}{props.suffix ?? \"%\"}",
"containers": "\n {props.items.length} containers \u00b7 {Date.toLocaleTimeString(props.updatedAt)}\n {!props.items.length && No containers reported.}\n {props.items.length > 0 && \n ContainerCPUMemorySentReceived\n {props.items.map((row) => \n {row.n}\n {Number(row.c ?? 0).toFixed(1)}%\n {Number(row.m ?? 0).toFixed(1)} MiB\n {Number((row.b?.[0] ?? (row.ns ?? 0) * 1048576) / 1024).toFixed(1)} KiB/s\n {Number((row.b?.[1] ?? (row.nr ?? 0) * 1048576) / 1024).toFixed(1)} KiB/s\n )}\n
}\n"
},
"native": {
"systems": {
"capability": "beszel.systems",
"integrationOption": "beszel",
"kind": "query",
"permission": "view",
"trigger": "load",
"input": {}
},
"history": {
"capability": "beszel.history",
"integrationOption": "beszel",
"kind": "query",
"permission": "view",
"trigger": "manual",
"input": {
"systemId": {
"$param": "systemId"
},
"timePeriod": {
"$param": "period"
},
"includeDocker": true
}
},
"live": {
"capability": "beszel.live",
"integrationOption": "beszel",
"kind": "query",
"permission": "view",
"trigger": "manual",
"input": {
"systemId": {
"$param": "systemId"
}
}
}
}
},
"template": "{(services) => (\n \n Systems{services.flatMap((service) => service.systems).length} hosts\n \n \n \n {services.map((service) => \n {service.integrationName}Updated {Date.toLocaleTimeString(service.updatedAt)}\n {service.error && {service.error}}\n \n SystemStatus{preferences.columns.includes(\"cpu\") && CPU}{preferences.columns.includes(\"memory\") && Memory}{preferences.columns.includes(\"disk\") && Disk}\n {service.systems.filter((system) => !inputs.filter || system.name.toLowerCase().includes(inputs.filter.toLowerCase())).map((system) => \n {system.name}{system.hostname}\n {system.status}\n {preferences.columns.includes(\"cpu\") && {Number(system.cpu ?? 0).toFixed(1)}%}\n {preferences.columns.includes(\"memory\") && {Number(system.memory ?? 0).toFixed(1)}%}\n {preferences.columns.includes(\"disk\") && {Number(system.disk ?? 0).toFixed(1)}%}\n )}\n
\n {!service.systems.length && !service.error && No systems reported.}\n )}\n {!preferences.system && Select a system to open historical and live details.}\n {preferences.system && \n \n {services.flatMap((service) => service.systems).filter((system) => system.id === preferences.system).map((system) => \n {system.name}{system.osName} \u00b7 {system.cpuModel} \u00b7 {system.cores} cores\n \n )}\n \n {(history) => \n Resource history\n {!history.systemStats.length && No history in this period.}\n {history.systemStats.length > 0 && a.created.localeCompare(b.created)).map((point) => ({time:Date.toLocaleTimeString(point.created),cpu:point.stats.cpu,memory:point.stats.mp,disk:point.stats.dp}))} dataKey=\"time\" series={[{name:\"cpu\",color:\"blue.6\"},{name:\"memory\",color:\"violet.6\"},{name:\"disk\",color:\"teal.6\"}]} withLegend unit=\"%\" />}\n Latest container statistics\n {!history.containerStats.length && No container history in this period.}\n {history.containerStats.slice().sort((a,b) => b.created.localeCompare(a.created)).slice(0,1).map((record) => )}\n }\n {(event,meta) => \n Live event{meta.stale && Last received data}\n {event.type} \u00b7 {Date.toLocaleTimeString(event.record.created)}\n {event.type === \"system_stats\" && }\n {event.type === \"container_stats\" && }\n }\n \n }\n \n)}"
}