Free & Open Source · GPL v3

Your homelab,
beautifully managed.

KuruDash is a fully local homelab dashboard with built-in SSH terminal. No backend. No database. No tracking. One HTML file.

Open Dashboard Download Star on GitHub
KuruDash screenshot
100% local storage
Live stat widgets
Built-in SSH terminal
12 themes + Custom
CPU · RAM · Disk · Temp
Live status checks
Auto favicon fetch
JSON backup & restore
Drag & drop reorder
Custom backgrounds
KuruAgent included
Netdata / Prometheus
Zero dependencies
GPL v3
Why KuruDash

Everything you need.
Nothing you don't.

Built for homelabbers who want a clean overview without spinning up yet another container.

100% Private

All data lives in your browser's localStorage. Nothing is ever sent anywhere. Not even analytics.

One File

The entire app is a single HTML file. No Node.js, no Docker, no build step. Open it and go.

Live Stat Widgets

CPU, RAM, disk, network, temp, uptime — pull live data from KuruAgent, Netdata, Prometheus, or any JSON API.

12 Themes + Custom

Aero, Dark, Mocha, Nord, Solarized, Sakura, Terminal, Flat, and more — or build your own with the color picker.

Live Status Checks

Green dot means up, red means down. Polled every 60s with debounced renders — zero jank.

Auto Icons

KuruDash automatically fetches the favicon for each service URL. Falls back to clean SVG icons.

Portable Backup

Export everything as JSON. Paste it on any device to restore your full setup in seconds.

SSH Terminal

Full in-browser terminal via WebSocket relay. Multi-tab, split pane, command snippets, xterm.js powered.

Folder Organization

Group services into collapsible folders with up/down count summaries at root view.

Power Tracking

Add a Power Draw widget pointed at your smart plug or UPS API. Real-time wattage alongside your services.

KuruAgent

Included zero-dependency Python metrics server. Drop one file, run one command — widgets live in seconds.

Included with KuruDash

KuruAgent — instant widget data.

A zero-dependency Python metrics server. Runs on any Linux, macOS, or Windows machine. No pip, no config, no Docker — drop one file and run one command.

Endpoints
/cpu
/ram
/disk
/temp
/load
/uptime
/net
/docker
/all

JSON path: value  ·  Refreshes every 2s  ·  CORS enabled out of the box

kuruagent.py
# drop alongside dashboard.html, then:
python3 kuruagent.py
 
✓ KuruAgent is running!
http://0.0.0.0:9977
 
# paste in KuruDash → Widgets:
http://192.168.1.10:9977/cpu → {"value": 23.4}
http://192.168.1.10:9977/ram → {"value": 61.2}
http://192.168.1.10:9977/disk → {"value": 55.0}
http://192.168.1.10:9977/temp → {"value": 48.5}
 
python3 kuruagent.py --port 8080
Download kuruagent.py

Built-in SSH terminal.
No backend needed.

Connects directly to a WebSocket relay on your server — no proxy, no middleware, just your browser and your machine.

1
Run ttyd -p 7681 bash on your server
2
Add your server in KuruDash, set connection type to SSH, enter ws://host:7681
3
Click Open SSH Terminal — full xterm.js session in the panel
root@homeserver — bash
root@homeserver:~$ docker ps --format "table {{.Names}}\t{{.Status}}"
NAMES          STATUS
jellyfin      Up 3 days
nextcloud    Up 3 days
pihole       Up 3 days
portainer    Up 3 days
 
root@homeserver:~$
Live stat tiles

Widgets — connect your servers.

Widgets pull live data from any JSON endpoint. Use KuruAgent for zero-config instant setup, or connect Netdata, Prometheus, or any custom API.

How to set up
1
Run python3 kuruagent.py on your server — starts on port 9977, no pip installs needed.
2
In KuruDash click the bar chart icon (or press W), pick a preset, paste the URL.
3
Hit Test to verify the connection — it shows exactly what value was found at the JSON path.
4
Set warn and alert thresholds. Bar turns yellow at warn, red at alert. Auto-refreshes every 8s.

⚠ CORS note

KuruAgent handles CORS automatically. For Netdata, add access control allow origin = * under [web] in netdata.conf. For any other API, one Access-Control-Allow-Origin: * header in nginx or Caddy does it.

Netdata URL reference
Widgetchart= value
CPU %system.cpu
RAM %system.ram
Disk %disk_space._
Network insystem.net
Temperaturesensors.coretemp
Load avgsystem.load

Base URL: http://SERVER:19999/api/v1/data?chart=CHART&points=1&after=-1
JSON path: data.0.0

Other sources

Shelly smart plug

URL: http://PLUG_IP/rpc/Switch.GetStatus?id=0
Path: apower · Unit: W

Docker containers

URL: http://SERVER:2375/v1/info
Path: ContainersRunning

Custom / any JSON

Pick the Custom preset. Any URL that returns JSON works. Use dot notation: stats.temperature

UPS / NUT

Expose a JSON endpoint via NUT web. Path: ups.load or battery.charge

Screenshots

See it in action

Drop your own screenshots in docs/ to replace these placeholders.

Aero theme
Frutiger Aero — the default
Dark theme
Dark theme
Mocha theme
Catppuccin Mocha
SSH terminal
Built-in SSH Terminal
Get started in 10 seconds

Just download and open.

No install. No config. No server.

git clone https://github.com/xf86-kurumi/KuruDash copy
python3 kuruagent.py → widgets live at :9977 copy
Open Dashboard dashboard.html kuruagent.py