No description
Find a file
giovannino 4f8c4fa4b0 Replace tabbed layout with touch-bar + scroll-section navigation (v0.0.2)
Navigation redesign, driven by testing against the actual target
hardware (Waveshare 5" resistive touchscreen) and the intended client
base (small factories — many users will not have a full set of
fingers/thumbs on either hand):

- Replace TabbedContent/TabPane with a VerticalScroll containing three
  min-height:100vh sections (Dashboard, Request Assistance, Switch to
  X), navigated via a fixed-width touch-bar sidebar rather than raw
  swipe, since touch-swipe fidelity on this hardware was never verified
  and button-triggered navigation removes the dependency entirely.
- Touch-bar zones are deliberately oversized (roughly thumb-width,
  half-screen-height) with a forgiving click margin that extends past
  the visible coloured bar — a touch landing near, but not precisely
  on, the visible target still registers. Verified in testing that
  this margin works correctly in the fully assembled app, not just in
  isolation.
- Drop Screen subclassing for Dashboard/Request Assistance/Switch to X;
  they're now plain Containers composed directly into the scroll stack.
  Screen is reserved for BlankScreen, which is the only one that
  actually uses the app's real push/pop screen stack.
- Navigation index is tracked explicitly rather than inferred from
  scroll pixel offset — the offset-inference approach proved fragile
  in testing.

Fixes from the v0.0.1 review:
- Remove unused `time` import (flake8 F401)
- Rename app class away from the BigBoy-specific name
- Apply UTIL_THRESHOLDS consistently to the GPU util bar, per-core CPU
  bars, and memory bar (previously only the GPU temp digits were
  colour-coded)
- Wire up the GPU-util sparkline (previously tracked but dead/unused)

Still a prototype: no test gates or cleanup trap yet (not CE OS
scripting style guide-compliant), and Request Assistance / Switch to X
remain stubs pending the outbound-email and VT-switch wrapper work.
2026-07-21 04:06:55 +02:00
LICENSE Initial commit 2026-07-21 02:04:48 +02:00
README.md Update README.md 2026-07-21 02:11:49 +02:00
server_dash.py Replace tabbed layout with touch-bar + scroll-section navigation (v0.0.2) 2026-07-21 04:06:55 +02:00

server-monitor-dash

A case-mounted touchscreen monitoring dashboard for self-hosted AI/inference servers, built with Textual. CPU, GPU, and memory telemetry rendered "supercar dash" style — dense, glanceable, colour thresholded — rather than a plain systems-monitoring readout.

Runs directly under a TTY autologin session. No X, no display server, and no GPU vendor lock-in for the interface itself (though GPU telemetry currently assumes nvidia-smi — see Status below).


Why

Most server monitoring tools are built for a terminal you're SSH'd into, not a small screen physically mounted in a case that someone actually looks at. This project is the opposite bet: build something that's genuinely nice to glance at from across a room, on a 5" panel, on hardware that's otherwise running unattended.

Features

  • Live telemetry: per-core CPU utilization, memory usage, GPU temperature/utilization/power/fan speed
  • Threshold-driven colour (green → amber → red) on key gauges, rather than flat, undifferentiated numbers
  • Rolling history sparkline for GPU temperature trend
  • Idle-blank behaviour: screen goes solid black after 15 minutes with no touch/key input, to protect the physical panel from always-on burn-in over years of continuous operation — any input wakes it immediately
  • Tabbed layout: Dashboard (functional), Request Assistance and Switch to X (stubs — see Roadmap)

Requirements

  • Python 3.9+
  • Textual (pip install textual --break-system-packages, or via pipx)
  • nvidia-smi on PATH for GPU telemetry (CPU/memory panels work without it — GPU panel degrades gracefully to zero rather than crashing if nvidia-smi is unavailable or fails)

Running

python3 server_dash.py

Intended to run under a dedicated, unprivileged monitoring user's autologin TTY session — not as root, and not as the account used for anything else on the box.

Status

This is an early, working prototype — the CPU/memory/GPU telemetry panel is functional and tested; the two additional tabs are placeholders, not yet implemented:

Tab Status
Dashboard Working — live CPU/mem/GPU telemetry
Request Assistance Stub — will send a scripted notification email
Switch to X Stub — will invoke a narrowly-scoped, sudoers-gated VT switch to a separate login, for on-demand GPU tuning access via a real X session

Not yet fully compliant with CE OS script conventions (no test gates, no cleanup trap) — this is explicitly a prototype for iterating the interface design, not a hardened production deployment. See the script's own header comment for current detail.

Design notes

  • GPU vendor: currently NVIDIA-only via nvidia-smi. AMD/Intel GPU support would need an equivalent backend behind the same read_gpu_stats() interface — contributions welcome.
  • Colour thresholds (TEMP_THRESHOLDS, UTIL_THRESHOLDS in-script) are currently fixed defaults, not yet configurable per-deployment. Worth externalizing to a config file if this is deployed across multiple machines with different thermal profiles.
  • No hard dependency on a specific display size — built for a 5" case-mounted touchscreen, but Textual's layout should adapt reasonably to other terminal sizes; untested on anything else so far.

Roadmap

  • Wire up Request Assistance (scripted outbound email, hostname in body)
  • Wire up Switch to X (sudoers-scoped chvt wrapper, see script comment)
  • Externalize colour thresholds to a config file
  • Bring up to full CE OS script compliance (test gates, cleanup trap)
  • Consider a non-NVIDIA GPU backend

License

See LICENSE.


Built standing on the shoulders of billions of dwarves. Created by John A. Hoeven with the ethical assistance of Claude AI.