WebSocket
Stats Topic
Real-time system performance metrics via WebSocket
The stats topic provides real-time system performance data including CPU, memory, GPU, disks, and network metrics.
Subscribe
Full Stats
Subscribe to all system metrics:
{ "op": "subscribe", "data": { "topics": ["stats"] } }This automatically includes: cpu, memory, gpu, disks, network.
Granular Stats
Subscribe to specific metrics only:
{ "op": "subscribe", "data": { "topics": ["stats.cpu", "stats.memory"] } }Backward Compatible
Legacy topic names (cpu, memory, gpu, disks, network) still work.
Available Sub-Topics
| Topic | Alias | Description |
|---|---|---|
stats.cpu | cpu | CPU load, temperature, speed |
stats.memory | memory | RAM usage (used, free, percent) |
stats.gpu | gpu | GPU load, temperature, VRAM |
stats.disks | disks | Disk space per mount point |
stats.network | network | Total bytes sent/received |
Event: system_stats
Broadcasts at the configured interval (default: 1000ms).
{
"type": "system_stats",
"data": {
"timestamp": 1706140800,
"uptime": 86400,
"cpu": {
"current_load": 23.5,
"current_temp": 0.0,
"current_speed": 3.6
},
"memory": {
"used": 8589934592,
"free": 8589934592,
"used_percent": 50.0
},
"gpu": {
"current_load": 15.2,
"current_temp": 45.0,
"current_memory": 2048
},
"disks": [
{
"fs": "C:",
"used": 107374182400,
"available": 107374182400,
"used_percent": 50.0
}
],
"network": {
"bytes_sent": 1073741824,
"bytes_recv": 2147483648
}
}
}Filtered Data
Only fields you subscribed to will be populated. Unsubscribed fields are null or
omitted.
Field Reference
CPU
| Field | Type | Description |
|---|---|---|
current_load | float | CPU usage percentage (0-100) |
current_temp | float | Temperature in Celsius (if available) |
current_speed | float | Current clock speed in GHz |
Memory
| Field | Type | Description |
|---|---|---|
used | int | Used memory in bytes |
free | int | Free memory in bytes |
used_percent | float | Usage percentage (0-100) |
GPU
| Field | Type | Description |
|---|---|---|
current_load | float | GPU usage percentage (0-100) |
current_temp | float | Temperature in Celsius |
current_memory | int | Used VRAM in MB |
Disks (Array)
| Field | Type | Description |
|---|---|---|
fs | string | Mount point (e.g., "C:", "/home") |
used | int | Used space in bytes |
available | int | Available space in bytes |
used_percent | float | Usage percentage (0-100) |
Network
| Field | Type | Description |
|---|---|---|
bytes_sent | int | Total bytes transmitted |
bytes_recv | int | Total bytes received |
Configuration
In config.json:
{
"websocket": {
"stats": {
"enabled": true,
"interval_ms": 1000
}
}
}Example Use Cases
1. System Monitor Dashboard
Build a real-time dashboard showing CPU, memory, and GPU usage.
const ws = new WebSocket("ws://localhost:9990/api/ws");
ws.onopen = () => {
ws.send(
JSON.stringify({
op: "subscribe",
data: { topics: ["stats"] },
}),
);
};
ws.onmessage = (event) => {
const { type, data } = JSON.parse(event.data);
if (type === "system_stats") {
updateCpuGauge(data.cpu?.current_load);
updateMemoryBar(data.memory?.used_percent);
updateGpuGauge(data.gpu?.current_load);
}
};2. Low-Bandwidth Mode
Only subscribe to what you need for a minimal widget:
// Only CPU and memory - no GPU, disks, or network
ws.send(
JSON.stringify({
op: "subscribe",
data: { topics: ["stats.cpu", "stats.memory"] },
}),
);3. Disk Space Alert
Monitor disk usage and alert when running low:
ws.send(
JSON.stringify({
op: "subscribe",
data: { topics: ["stats.disks"] },
}),
);
ws.onmessage = (event) => {
const { type, data } = JSON.parse(event.data);
if (type === "system_stats" && data.disks) {
for (const disk of data.disks) {
if (disk.used_percent > 90) {
alert(`${disk.fs} is ${disk.used_percent.toFixed(1)}% full!`);
}
}
}
};4. Network Traffic Graph
Track bandwidth over time:
const history = [];
ws.onmessage = (event) => {
const { type, data } = JSON.parse(event.data);
if (type === "system_stats" && data.network) {
history.push({
time: data.timestamp,
sent: data.network.bytes_sent,
recv: data.network.bytes_recv,
});
renderGraph(history);
}
};