A retro-styled, green-on-black system dashboard / inspired by the Fallout Pip-Boy.
Runs on Windows/Designed for a 5″ portrait display (480×800) and just as happy on a laptop.
It shows:
- Three gauges (top): CPU Load, GPU Load, RAM Usage (0–100%)
- Disk usage bars (middle): one per drive
- Network graph (bottom): upload spikes up, download spikes down, autoscaled
- Scrolling ticker (very bottom): recent Windows System log events (last 2 hours) via pywin32 Any ERROR or CRITICAL system events in the last 1 hour will activate RED ALERT mode.
ANY RELEASE IS A DOWNLOADABLE SELF CONTAINED .EXE APPLICATION, NO CODING OR ASSEMBLY REQUIRED
- Features
- Quick Start
- Requirements
- Installation
- Run
- Command-Line Options
- Data Sources
- Windows System Log Ticker
- Layout & Styling Knobs
- Design Notes
- Raspberry Pi & Case-Mod Ideas
- Troubleshooting
- Roadmap
- License
- Fallout-style UI: scanlines, glow text, mono font, gauge needles tapered to a point.
- Centered network graph: zero line in the middle; ↑ upload above, ↓ download below.
- Event ticker: pulls last 2 hours of important System events (Errors, Warnings & Critical Events) For Errors and Critical, red alerts display for 1 hour and scrolls them.
- Smooth gauges: optional throttling/EMA smoothing to avoid jitter.
- Portrait-first: defaults to
480×800window for 5″ screens; easy to resize.
IF DOWNLOADING SOURCE CODE
# 1) Install Python 3.10+
# 2) Install deps
pip install pygame psutil
# Optional: NVIDIA metrics
pip install pynvml
# Optional (Windows only): Event Viewer ticker
pip install pywin32
# 3) Run
python pipboy_ui_events_bidir_net_needles.py # real stats (best effort)
# Or: simulated data for development
python pipboy_ui_events_bidir_net_needles.py --demoEscape (
Esc) quits. Touch/click starts from the START screen.
- Python: 3.10 or newer
- OS: Windows 10/11, macOS, or Linux
- Libraries:
- Required:
pygame,psutil - Optional:
pynvml(NVIDIA GPUs),pywin32(Windows Event Log ticker)
- Required:
Fonts: the app requests
"Courier New"; if unavailable, Pygame falls back to a system monospace.
pip install pygame psutil
pip install pynvml # optional for NVIDIA GPU load/VRAM
pip install pywin32 # optional, Windows System log tickerWindows PowerShell equivalent:
py -m pip install pygame psutil
py -m pip install pynvml
py -m pip install pywin32python pipboy_ui_events_bidir_net_needles.py # window 480×800 portrait
python pipboy_ui_events_bidir_net_needles.py --demo # fake data to design UIIf you’re on a small display and want true fullscreen:
# change the window creation line if you want fullscreen later:
# screen = pygame.display.set_mode((WIDTH, HEIGHT), pygame.FULLSCREEN)--demo Use simulated stats (works everywhere; great for UI iteration)
--icon PATH Use a custom window icon (.ico). Defaults to 'pippy.ico' if found.
Planned: ``> --fullscreen Fullscreen kiosk mode --scale 1.25 UI scale factor (fonts, spacing) for larger panels
---
## Data Sources
- **CPU Load / RAM** / **Disk usage** / **Network throughput** → `psutil` (cross-platform)
- **GPU Load / VRAM** (optional) → `pynvml` (NVIDIA)
- **System Events** (optional, Windows) → `pywin32` (Event Viewer API)
> CPU temperature is intentionally out of scope on Windows without a sensor driver. This project opts to avoid a resident helper app and focuses on stats available from the OS + optional vendor SDKs.
### Smoothing & Sample Rate
Two simple controls (add/adjust near the top if you want calmer needles):
```python
STATS_INTERVAL = 1.0 # seconds between snapshots (global throttle)
CPU_SAMPLE_SEC = 0.5 # CPU % sampling cadence
CPU_SMOOTH_ALPHA = 0.35 # EMA smoothing; lower = smoother
Exponential moving average and 1 Hz sampling keep CPU % from “hummingbird jitter.”
The ticker shows ALL INFO & CRITICAL/ERROR/WARNING from the System log in the last hour for these sources:
Kernel-Power(unexpected shutdowns)Disk/Ntfs(I/O anomalies)WHEA-Logger(hardware corrected errors)- Common NIC sources (Intel/Realtek/Killer; resets/timeouts)
Service Control Manager(service start failures)
Install pywin32 and run on Windows:
pip install pywin32
python pipboy_ui_events_bidir_net_needles.pyIf pywin32 isn’t available (or non-Windows), the ticker will display a friendly hint and the rest of the dashboard keeps working.
You can add more sources by editing EVENT_SOURCE_PATTERNS (regex list) in the code.
Window size (portrait default):
WIDTH, HEIGHT = 480, 800Header & gauges:
# Header divider line Y
pygame.draw.line(surface, GREEN, (12, 58), (WIDTH - 12, 58), 1)
# Gauge row Y
gy = 150
centers = [(80, gy), (240, gy), (400, gy)]
# Gauge size
GAUGE_RADIUS = 85Bars (disks only):
TOP_BAND_H = 230 # height of top section (affects where bars start)
MID_BAND_Y = TOP_BAND_H + 10
MID_BAND_H = 360 # total bar section height
BAR_H = 28
BAR_GAP = 22Network graph & ticker:
TICKER_H = 40
BOT_BAND_H = HEIGHT - (TOP_BAND_H + MID_BAND_H) - TICKER_H
GRAPH_Y = HEIGHT - TICKER_H - BOT_BAND_H + 6
GRAPH_H = BOT_BAND_H - 18Needle styling:
NEEDLE_BASE_W = 14
NEEDLE_BASE_BACK = 10
NEEDLE_TIP_MARGIN = 16Colors & CRT vibe:
GREEN = (0, 255, 70)
DIM_GREEN = (0, 120, 30)
SCANLINE_STEP = 4
FONT_NAME = "Courier New"Tip: enable a quick layout debug overlay (boxes around bands) while tuning.
- Gauges are semicircular with tapered needles (filled triangles) and a small hub ring.
- Disk bars show % used with labels below the bars for readability.
- The network graph draws a midline (0 Mb/s); upload (solid) is above, download (dashed) below.
- The ticker scrolls left to right continuously; events refresh every ~5 seconds.
This app was designed with a 5″ 800×480 portrait touch in mind—perfect for mounting inside a custom PC case as a Pip-Boy-style status screen.
- Pi model: Pi Zero 2 W (easy USB gadget mode) or Pi 3/4 (HDMI display).
- Display: 5″ 800×480 HDMI or DSI panel; set portrait orientation.
- Power: tap the PC PSU 5V rail (SATA/Molex → buck/USB module) to power the Pi + screen; keep USB header for data only if tethering.
- X11 desktop:
xrandr -o leftfor portrait. - Console/framebuffer: set rotation in
/boot/config.txt(varies by driver; e.g.,display_hdmi_rotate=1).
On Raspberry Pi OS Lite, create a systemd service to launch the app on boot (in a virtual framebuffer or with SDL on the console), or run the full desktop and autostart the script.
- USB Serial Gadget (Pi Zero 2 W): Pi appears as a COM device to the PC; feed JSON lines from a tiny PC helper (optional); or run the app standalone with local stats if the Pi is the host.
- USB Ethernet Gadget: Pi exposes a virtual NIC; talk HTTP/REST if you later add a producer.
- LAN/Wi-Fi: Fetch from a local API if you set one up; not required for this repo.
This repo does not require any helper app. It displays host stats (the machine it runs on). If you embed a Pi as a remote display for a different PC, you’ll need a small bridge program to send that PC’s stats across USB/network.
- 3D-print a bezel with faux rivets; keep airflow clear of GPU fans.
- Add GPIO buttons to the Pi to flip pages or toggle views.
- Boot splash: show a Vault-Tec logo while the app starts.
- Easter eggs: flash “RAD DETECTED” when RAM>90% or CPU/GPU load>95%.
AttributeError: module 'serial' has no attribute 'Serial'
You installed serial instead of pyserial, or shadowed it with a local serial.py.
Fix:
pip uninstall -y serial pyserial
pip install pyserialRemove/rename any local serial.py file/folder.
GPU numbers are --
- Install NVIDIA drivers +
pynvml. - AMD/Intel GPUs aren’t covered by NVML; the app will just show N/A for GPU load.
No events in ticker
- Install
pywin32and run on Windows. - Some systems require Administrator to read all sources.
- If nothing is in the last hour, the ticker will say so.
Fonts look different
- The app requests
Courier New; on non-Windows it may fall back to another monospace. AdjustFONT_NAMEto taste.
CPU needle is jumpy
- Use the
STATS_INTERVALglobal or theCPU_SAMPLE_SEC/CPU_SMOOTH_ALPHAEMA to calm it down.
- Toggle pages (Process Top-Talkers, I/O rates per disk, Wi-Fi SSID/signal).
- Config file for colors/thresholds/layout.
- Optional log details page (scrollable last 50 events, color-coded).
- On-screen buttons for brightness/theme.
- Packaged Windows EXE (PyInstaller) and Pi image recipe.
MIT — see LICENSE (or add one to your repo).
(Add PNGs or GIFs here once you have them.)
docs/
screenshot_start.png
screenshot_dashboard.png
screenshot_ticker.png