* only who is invoked, for a users count.
hostname, uptime, logged-in users
1 / 5 / 15 min, colour-coded thresholds
total · running · sleeping · stopped · zombie
us / sy / ni / id / wa / hi / si / st bar chart
total / free / used / buff·cache / avail
optional, via ?show_swap=1
PID, USER, PR, NI, VIRT, RES, SHR, S, %CPU, %MEM, TIME+, CMD — sortable
LXD / Incus aggregation via cgroup parsing
1 s … 60 s, remembered per browser
Everything above is read from /proc on every tick.
$ lxdtop -d 2
CONTAINER PROCS %CPU %MEM RES
confoo 16 260.0 14.7 6.9g
local machine 57 12.0 1.7 1.2g
ebpf (vm) 1 4.0 2.8 1.3g
bgp 10 2.0 0.0 73.5m
grafana 12 2.0 0.7 401.6m
uptrace 9 0.0 0.4 264.0m
devops 21 0.0 0.7 498.8m
pihole 11 0.0 0.3 226.6m
vpn 10 0.0 0.0 72.1m
─────────────────────────────────────────────
q quit p pause space refresh d/s delay
M %MEM P %CPU N name T procs R reverse
GET /cgi-bin/picard.cgi?show_swap=1 → JSON
{
"hostname": "stargazer",
"timestamp": "Fri Jul 03 12:00:00 2026",
"uptime": { "seconds": 1710191, "text": "19 days, 19:03" },
"users": 2,
"loadavg": { "one": 0.49, "five": 0.54, "fifteen": 0.56 },
"tasks": { "total": 533, "running": 1, "sleeping": 532, "stopped": 0, "zombie": 0 },
"cpu": { "us": 3.3, "sy": 1.1, "ni": 0.0, "id": 94.8, "wa": 0.0, "hi": 0.0, "si": 0.7, "st": 0.0 },
"memory": {
"ram": { "total": 31317.5, "free": 1419.3, "used": 25650.8, "buff_cache": 4247.4, "available": 4120.7 },
"swap": { "total": 8192.0, "free": 8127.5, "used": 64.5 }
},
"processes": [
{ "pid": 922184, "user": "hackman", "pr": 20, "ni": 0,
"virt": 21370265600, "res": 910475264, "shr": 150278144,
"state": "S", "cpu": 9.5, "mem": 2.8, "time": "217:04.36",
"command": "librewolf", "container": "local machine" }
],
"containers": [
{ "name": "confoo", "cpu": 260.0, "mem": 14.7, "procs": 16, "res": 7409336320 }
]
}
lines of Perl in picard.cgi
lines of Perl in server.pl
lines of Perl in lxdtop
runtime dependency: JSON::XS
build steps · 0 bundlers · 0 lockfiles
theme combinations, one CSS file
cache TTL — coalesces bursts, feels live
deployment modes supported out of the box
concurrent tabs, still one /proc walk per second
$ git clone https://github.com/hackman/picard
$ cd picard
$ perl server.pl 8080
$ xdg-open http://localhost:8080