Goal
The OVERVIEW page (web/src/cockpit/OverviewView.tsx) lists colonies grouped by org but says nothing about the machine they run on or what that machine is doing. Each colony should show its host and that host's live stats — CPU, memory, microVM (MiniKVM) count, disk — plus the other facts an operator needs at a glance.
Evidence
web/src/cockpit/OverviewView.tsx (main): org card grid at line 71; a colony row renders only a status dot (106), session.issue_title || short (108), repo#issue (109) and a status label (113). No host, no resource figures.
- The API has no host entity.
crates/colonizer/src/runtime.rs Runtime (line 39) exposes only platform (linux-x86_64 | darwin-arm64 | other, from telemetry::platform()), kvm {ok, error} (a /dev/kvm permission probe, probe_kvm() line 220), git, gh, host_claude_bin. Route table: crates/colonizer/src/main.rs (~844–892).
GET /api/status also returns sandbox {provider, image, cpus, memory, max_parallel, msb_version, claude_bin} — the microVM spec, not measurements.
- The only resource figure on a colony is
Session.host_disk_bytes (web/src/types.ts line 57), a one-shot footprint measurement.
- Nothing collects CPU %, memory used/total, load average, uptime or disk free anywhere in
crates/.
- Colonies are KVM microVMs named
colonizer-<id> (main.rs ~1088); the concurrency ceiling is max_parallel, admitted in crates/colonizer/src/queue.rs.
Why that hurts
An operator cannot tell from the overview whether the box is saturated, how many microVMs are up against the ceiling, or whether a colony is slow because the host is thrashing. Answering that today means SSH and top.
Requested shape
- Host facts. Extend
runtime.rs with a host section: hostname, CPU cores, memory total/used, load average, uptime, disk total/used/free for the data dir. Cache it exactly as Runtime is cached today (10s TTL, ?fresh=1 honoured) so the overview's 4s poll never shells out per request.
- microVM count. Report live microVMs against the
max_parallel ceiling (e.g. 7/12), derived from live sessions — not a new inventory.
- Per-colony stats. Add to
Session with #[serde(default)] so existing sessions.json still loads: the cpus/memory the microVM actually booted with, and guest CPU%/RSS if microsandbox exposes them. If guest stats are unobtainable, say so in a code comment and ship host-level only — never fake numbers.
- UI. A compact stats strip on each colony row / org card using existing tokens (
text-faint, font-mono text-[11px]) and existing icons (IconCpu, IconMemory, IconServer in web/src/components/icons.tsx). Also cheap and already available: colony age, boot_timing total, agent, sandbox image, mesh IP, attention.reason.
- Keep it scannable — numbers, not sentences. No new dependencies (React 19 + Vite + Tailwind v4, zero runtime deps).
Done when
Credited to @colonizer-settlers as co-author on this issue.
Goal
The OVERVIEW page (
web/src/cockpit/OverviewView.tsx) lists colonies grouped by org but says nothing about the machine they run on or what that machine is doing. Each colony should show its host and that host's live stats — CPU, memory, microVM (MiniKVM) count, disk — plus the other facts an operator needs at a glance.Evidence
web/src/cockpit/OverviewView.tsx(main): org card grid at line 71; a colony row renders only a status dot (106),session.issue_title || short(108),repo#issue(109) and a status label (113). No host, no resource figures.crates/colonizer/src/runtime.rsRuntime(line 39) exposes onlyplatform(linux-x86_64|darwin-arm64|other, fromtelemetry::platform()),kvm {ok, error}(a/dev/kvmpermission probe,probe_kvm()line 220),git,gh,host_claude_bin. Route table:crates/colonizer/src/main.rs(~844–892).GET /api/statusalso returnssandbox {provider, image, cpus, memory, max_parallel, msb_version, claude_bin}— the microVM spec, not measurements.Session.host_disk_bytes(web/src/types.tsline 57), a one-shot footprint measurement.crates/.colonizer-<id>(main.rs~1088); the concurrency ceiling ismax_parallel, admitted incrates/colonizer/src/queue.rs.Why that hurts
An operator cannot tell from the overview whether the box is saturated, how many microVMs are up against the ceiling, or whether a colony is slow because the host is thrashing. Answering that today means SSH and
top.Requested shape
runtime.rswith ahostsection: hostname, CPU cores, memory total/used, load average, uptime, disk total/used/free for the data dir. Cache it exactly asRuntimeis cached today (10s TTL,?fresh=1honoured) so the overview's 4s poll never shells out per request.max_parallelceiling (e.g.7/12), derived from live sessions — not a new inventory.Sessionwith#[serde(default)]so existingsessions.jsonstill loads: the cpus/memory the microVM actually booted with, and guest CPU%/RSS if microsandbox exposes them. If guest stats are unobtainable, say so in a code comment and ship host-level only — never fake numbers.text-faint,font-mono text-[11px]) and existing icons (IconCpu,IconMemory,IconServerinweb/src/components/icons.tsx). Also cheap and already available: colony age,boot_timingtotal, agent, sandbox image, mesh IP,attention.reason.Done when
GET /api/statusreturns ahostobject: hostname, cpu cores, memory total/used, load, uptime, disk total/used/free, microVMs live/ceiling.web/src/types.tsdocuments the new shape;cargo testandnpm test(inweb/) pass.Credited to @colonizer-settlers as co-author on this issue.