+ {latest.disk.map(d => (
+
+
+ {d.mountpoint}
+ {d.usagePercent}% · {formatBytes(d.usedBytes)} / {formatBytes(d.totalBytes)}
+
+
+
= 90 ? 'bg-red-500' : d.usagePercent >= 75 ? 'bg-amber-500' : 'bg-blue-500'
+ }`}
+ style={{ width: `${d.usagePercent}%` }}
+ />
+
+
+ ))}
+
+ )}
+
+
+ {/* GPU */}
+
+
+
GPU
+ {latest.gpu && latest.gpu[0] && (
+ {latest.gpu[0].usagePercent}%
+ )}
+
+ {!latest.gpu ? (
+
+ No GPU detected
+
+ ) : (
+ <>
+
+ {latest.gpu[0].name}
+ {latest.gpu[0].memoryTotalMB > 0 && (
+ <> · {latest.gpu[0].memoryUsedMB} MB / {latest.gpu[0].memoryTotalMB} MB>
+ )}
+
+ {latest.gpu[0].memoryTotalMB > 0 && latest.gpu[0].memoryUsedMB > 0 ? (
+
+
+
+
+
+ `${v}%`} />
+ [`${v ?? 0}%`, 'GPU Memory']}
+ />
+
+
+
+
+ ) : (
+
+ GPU detected but live memory usage unavailable
+
+ )}
+ >
+ )}
+
+ {/* Processes */}
+
+
+
Top Processes
+ {latest.processes.length} shown
+
+ {latest.processes.length === 0 ? (
+
+ No process data available
+
+ ) : (
+
+ {/* Header */}
+
+ Process
+ CPU
+ Mem
+ RSS
+
+ {latest.processes.map(p => (
+
+
+ {p.name}
+
+ = 50 ? 'text-red-400' : p.cpuPercent >= 10 ? 'text-amber-400' : ''}`}>
+ {p.cpuPercent.toFixed(1)}%
+
+ = 50 ? 'text-red-400' : p.memPercent >= 10 ? 'text-amber-400' : ''}`}>
+ {p.memPercent.toFixed(1)}%
+
+
+ {formatBytes(p.memBytes)}
+
+
+ ))}
+
+ )}
+
+
+ {/* Network I/O */}
+
+
+
Network I/O
+ {history.length > 0 && (
+
+
+ RX {formatRate(history[history.length - 1].netRxRate)} / TX {formatRate(history[history.length - 1].netTxRate)}
+
+
+ )}
+
+ {latest.network.length === 0 ? (
+
+ No network data available
+
+ ) : (
+ <>
+
+ {latest.network.map(n => n.interface).join(', ')}
+
+
+
+
+
+
+ formatRate(v)} />
+ [
+ formatRate(v ?? 0),
+ name === 'netRxRate' ? 'Download' : 'Upload',
+ ]}
+ />
+
+
+
+
+
+ >
+ )}
+
+
+