Bash β’ JSON Telemetry β Live Dashboard β Printable Report
A lightweight, cross-platform (best-effort) system monitor that collects host telemetry with a Bash script and serves a modern HTML/CSS/JS dashboard + a printable report page. Designed to run locally, inside Docker, or on lab machines with minimal setup.
- π§Ύ Overview
- β¨ Features
- π§± Core Components
- π Getting Started
- π§ Command Reference
- π Data & Runtime Flow
- π¦ Output Files
- βοΈ Configuration
- π³ Docker Usage
- π Report & Charts
- π οΈ Dependencies
- ποΈ Project Structure
- π Notes & Limitations
- π§― Troubleshooting
SysDash is a small βcollector + web UIβ toolkit:
- A Bash collector gathers system information (CPU/RAM/storage/network/load/temps/GPU/SMART when possible)
- Writes
latest.json(current snapshot) and appends tohistory.jsonl(true JSONL: one JSON per line) - A local HTTP server serves the dashboard and report from a
public/directory
Itβs meant to be portable and βbest effortβ: on some platforms (especially Docker Desktop on macOS/Windows), temperature telemetry may not be exposed.
-
Live Dashboard (auto refresh) reading from
GET /latest.json -
Printable Report Page reading from
GET /history.jsonland rendering simple charts (CPU/RAM/Storage/GPU) -
True JSONL History (safe for streaming and plotting)
-
Cross-Platform Best-Effort Support
- Linux: best results (hwmon, procfs, iproute2, etc.)
- macOS: basic CPU/RAM/load (temps typically limited)
- Docker/WSL: depends on host exposure of
/sysand vendor tools
-
GPU Telemetry (best-effort)
- NVIDIA via
nvidia-smi(requires GPU-enabled container/runtime) - AMD via
rocm-smi(if available) - Fallback via
/sys/class/drm/.../hwmontemps
- NVIDIA via
-
SMART Health Snapshot (if
smartctlis available and permitted) -
Team Metadata (team name + members included in JSON and UI)
- Snapshot: writes to
data/latest.json - History: appends compact single-line JSON to
data/history.jsonl - Interval loop: runs every N seconds
-
index.htmlshows:- Host info, CPU details + temp badge, RAM & storage bars
- GPU list (if detected)
- Filesystem snapshot from
df - SMART status list (if accessible)
- Network interfaces and IPs
- System uptime/load/process count
-
report.html:-
Loads
history.jsonllive from the server -
Draws charts for:
- CPU temp (Β°C)
- RAM used (%)
- Root storage used (%)
- GPU temps (up to first 3 GPUs)
-
Has Print / Save PDF button (browser print dialog)
-
Make sure the script is executable:
chmod +x sysdash.sh./sysdash.sh once./sysdash.sh start 3./sysdash.sh serve 8765./sysdash.sh open 8765Then visit:
- Dashboard:
http://localhost:8765/ - Report:
http://localhost:8765/report.html
./sysdash.sh start [intervalSeconds] # start collector loop
./sysdash.sh stop # stop collector loop
./sysdash.sh serve [port] # start local web server
./sysdash.sh unserve # stop local web server
./sysdash.sh open [port] # open dashboard in browser
./sysdash.sh once # collect one snapshot (latest.json + history append)
./sysdash.sh report # ensure report.html is in place (loads history live)
./sysdash.sh status # show collector/server status
./sysdash.sh dockerfiles # generate Dockerfile + docker-compose.yml
./sysdash.sh help # show helpββββββββββββββββββββ
β sysdash.sh once β β writes data/latest.json
βββββββββββ¬βββββββββ appends data/history.jsonl (1 JSON per line)
β
βΌ
ββββββββββββββββββββ
β sysdash.sh start β β background collector loop every N seconds
βββββββββββ¬βββββββββ
β
βΌ
ββββββββββββββββββββ
β sysdash.sh serve β β serves /public over HTTP (python http.server)
βββββββββββ¬βββββββββ
β
ββββββββββ GET /latest.json β dashboard live tiles
β
ββββββββββ GET /history.jsonl β report charts (canvas)
Default paths (relative to the script folder):
Data
data/latest.jsonβ latest snapshot (pretty JSON)data/history.jsonlβ rolling telemetry history (true JSONL)
Runtime
data/collector.pidβ background collector PIDdata/server.pidβ server PIDdata/server.portβ chosen port
Web
web/index.html,web/styles.css,web/app.jsβ dashboardweb/report.htmlβ report page
Logs
logs/collector.loglogs/server.log
The server serves a public/ folder that symlinks (or copies) the latest JSON and web files:
/latest.json/history.jsonl/index.html,/styles.css,/app.js,/report.html
You can customize SysDash with environment variables:
# Directories
export SYSDASH_DATA_DIR="/path/to/data"
export SYSDASH_WEB_DIR="/path/to/web"
export SYSDASH_LOG_DIR="/path/to/logs"
# Runtime defaults
export SYSDASH_PORT=8765
export SYSDASH_INTERVAL=3
# Team info (shown in UI + JSON)
export SYSDASH_TEAM_NAME="Team"
export SYSDASH_TEAM_MEMBERS="Alice,Bob,Charlie"Then run normally:
./sysdash.sh start
./sysdash.sh serveSysDash can generate Docker files for you:
./sysdash.sh dockerfilesdocker compose up --buildThis exposes port 8765 by default.
Important: The provided compose config uses
privileged: trueand mounts/dev,/sys, and/procto maximize telemetry. Review security implications before using on shared or production systems.
- Requires a GPU-enabled Docker runtime (e.g.,
--gpus all) andnvidia-smiavailability inside the container. - Docker Desktop on macOS/Windows often limits access to host sensors; results vary.
The report is always available as report.html and loads history live from the server:
- Open:
http://localhost:8765/report.html - Print: click Print / Save PDF (browser print dialog)
The report reads up to the last ~600 lines from history.jsonl and plots:
- CPU temp (Β°C) β if available
- RAM usage (%)
- Root storage usage (%)
- GPU temps (up to first 3 GPUs) β if available
SysDash runs with βbest effortβ even when some tools are missing, but youβll get better telemetry if you have:
-
bash,python3(forhttp.server) -
df,ps,awk,sed,tr -
Linux extras (optional but helpful):
ip(iproute2) for network JSON outputlm-sensors(sensors) for CPU temp readssmartctl(smartmontools) for SMART healthnvidia-smifor NVIDIA GPU temp/util
Installs:
- bash, python3, coreutils, util-linux, pciutils, iproute2, procps, smartmontools, lm-sensors
.
βββ sysdash.sh
βββ data/
β βββ latest.json
β βββ history.jsonl
β βββ collector.pid
β βββ server.pid
β βββ server.port
βββ web/
β βββ index.html
β βββ styles.css
β βββ app.js
β βββ report.html
βββ public/ # served folder (symlinks/copies)
βββ logs/
βββ collector.log
βββ server.log
-
Temperatures are best-effort.
- Docker Desktop (macOS/Windows): CPU temps are commonly not exposed to containers
- WSL: CPU temps often unavailable; NVIDIA GPU temps may work with proper setup
-
SMART status may require elevated permissions (e.g.,
sudo, privileged container, or device access) -
Network interface details depend on
ip(Linux) orifconfig(macOS) -
This is a local telemetry toolβnot hardened for multi-user / internet exposure.
-
Make sure the server is running:
./sysdash.sh status
-
Re-run:
./sysdash.sh serve 8765
Common reasons:
- Running in Docker Desktop (macOS/Windows): host sensors not passed through
- No access to
/syshwmon/thermal entries lm-sensorsnot installed / not configured
Try on Linux host directly, or ensure /sys is mounted read-only into the container if youβre using Docker.
- NVIDIA: ensure GPU runtime is enabled (
--gpus all) andnvidia-smiworks inside container - AMD: requires
rocm-smiavailability - Otherwise SysDash falls back to sysfs hwmon GPU temps when available
-
On Linux host, try:
sudo smartctl -H /dev/sda
-
In Docker, you may need
privileged: trueand/devmounted (already present in the generated compose), but some systems still restrict SMART passthrough.