Skip to content

PROBEd Widget

Displays live system metrics from one or more remote machines running the PROBEd daemon (Public Resource Overseeing and Broadcasting Endpoint Daemon). The widget opens a TCP connection to the daemon, reads the plain-text metric response, and renders the key/value pairs in a sortable grid. Multiple machines can be monitored in a single widget via tabs.

How it works

The PROBEd daemon listens on TCP port 555. When a client connects it runs a shell script (getinfo.sh) that samples CPU, memory, disk, network, and process data from /proc, then writes the results as key: value lines and closes the connection. The widget reads that response and parses it into a metric table.

The widget can also probe any plain HTTP/HTTPS endpoint — useful if you front the daemon with the included Flask proxy (stats_server.py), which exposes the same data at /raw.

Requirements

  • The PROBEd daemon running on each machine you want to monitor
  • Port 555 (or your chosen port) reachable from the Homepage server

Installing PROBEd on a remote machine

systemd (recommended)

bash
git clone https://github.com/oversea-suite/PROBEd
cd PROBEd
pip install -r requirements.txt
sudo cp probed.service /etc/systemd/system/
sudo systemctl enable --now probed

Docker

bash
docker compose up -d

Arch Linux

bash
makepkg -si   # from the cloned repo directory
sudo systemctl enable --now probed

The daemon listens on 0.0.0.0:555 by default. Adjust probed.conf if you need a different port or bind address.

Configuration

All configuration is done through the widget settings UI. The relevant stored keys are:

KeyTypeDefaultDescription
probeTargetsListArray<{ target: string; nickname: string }>Primary target list. Each entry has a target (address) and an optional nickname shown as the tab label.
probeRefreshIntervalnumber15How often to poll, in seconds. Minimum 5.

Targets are entered as:

  • hostname:port or 192.168.1.10:555 for a direct TCP probe
  • http://hostname:port/raw for an HTTP probe (e.g. via the Flask proxy)

Single machine

Enter the address in the Probe Target field in widget settings:

192.168.1.10:555

Give it a nickname (e.g. Home Server) and save.

Multiple machines

Click Add another probe target in the widget settings to add more entries. Each target gets its own nickname and appears as a tab in the widget. Targets are polled in a single batched request.

Example of what gets stored:

json
{
  "probeTargetsList": [
    { "target": "192.168.1.10:555", "nickname": "Home Server" },
    { "target": "192.168.1.20:555", "nickname": "NAS" },
    { "target": "http://192.168.1.30:8080/raw", "nickname": "Pi (HTTP)" }
  ],
  "probeRefreshInterval": 30
}

Metrics format

The daemon's getinfo.sh outputs one metric per line. Any of the following separator styles are recognised by the widget's parser:

key: value
key=value
key value

Numeric values are displayed as numbers; everything else is a string. Empty values are skipped. Example output from the default getinfo.sh:

uptime_s: 153379.72
load_avg: 0.13
cpu_temp_c: 20.0
cpu_pct: 3.0
ram_total_kb: 3855792
ram_used_kb: 2136300
ram_avail_kb: 1719492
swap_total_kb: 3855356
swap_used_kb: 87308
disk_total_kb: 58357760
disk_used_kb: 38972560
disk_read_kb_s: 0
disk_write_kb_s: 288
net_rx_kb_s: 0
net_tx_kb_s: 0

You can customise getinfo.sh to expose any metric your machine can produce — the widget will display whatever key/value pairs the server sends back.

Using the HTTP proxy

PROBEd includes a Flask app (stats_server.py) that proxies the TCP daemon over HTTP. By default it runs on port 8080 and exposes:

  • / — HTML table view
  • /raw — plain-text output (what the widget uses)

Point the widget at http://your-host:8080/raw to use HTTP instead of a direct TCP connection. This is useful when the machine is only reachable over HTTPS or sits behind a reverse proxy.

Troubleshooting

Widget shows "Failed to probe targets"

  • Confirm the PROBEd daemon is running: systemctl status probed
  • Check port 555 is open: nc -zv <host> 555
  • Ensure the Homepage server can reach the target (same network, no firewall blocking)

"URL must start with http:// or https://"

  • You entered an HTTP-style address without the scheme. Change example.com/raw to http://example.com/raw.

"No metrics returned from target"

  • The daemon connected but sent no data. Check getinfo.sh runs without errors on the remote machine: bash /path/to/getinfo.sh

Metrics look stale

  • Lower the refresh interval in widget settings (default 15 s).
  • The TCP connection is opened fresh each poll — if the daemon is slow to respond, increase the server-side timeout in probed.conf.

Personal Homepage Dashboard