- Python 100%
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. |
||
|---|---|---|
| LICENSE | ||
| README.md | ||
| server_dash.py | ||
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 viapipx) nvidia-smionPATHfor GPU telemetry (CPU/memory panels work without it — GPU panel degrades gracefully to zero rather than crashing ifnvidia-smiis 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 sameread_gpu_stats()interface — contributions welcome. - Colour thresholds (
TEMP_THRESHOLDS,UTIL_THRESHOLDSin-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
chvtwrapper, 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.