← all projects

HardwareToad

Windows hardware monitor with native DX12 GPU stress, AVX2/FMA CPU burners, and a hardened sensor bridge.

beta
Python 3.11+TkinterC# / .NETC++ / HLSLDirectX 12LibreHardwareMonitorAVX2 / FMAObfuscarPyInstallerInno Setup

Overview

HardwareToad is a Windows hardware monitor with a Python/Tkinter UI and a self-contained .NET sensor bridge built on LibreHardwareMonitor. It shows real-time CPU / GPU / RAM / storage telemetry with live graphs, runs AVX2/FMA and Linpack-grade CPU stress, has a native DirectX 12 GPU stress engine (compute + VRAM + rasterizer), and a 15-pattern RAM stability test — all behind a token-authenticated local bridge with SHA256 integrity and Obfuscar symbol protection. Ships as a one-click Inno Setup installer; end users need no compiler, no .NET runtime, no Python.

Highlights

  • Live CPU / GPU / RAM / storage telemetry with ring gauges and temperature graphs.
  • CPU stress: single-core AVX2/FMA, multi-core FMA, Memory/IMC, combined, Linpack DGEMM.
  • Native DX12 GPU stress engine: 16M FMA compute threads + 256MB VRAM transfers + rasterizer, with feature-level fallback (12.1 → 11.0).
  • 15-pattern RAM stability test with exact error reporting — reveals unstable XMP / EXPO.
  • Hardened local bridge: 256-bit token per launch, SHA256 binary check, Obfuscar-protected symbols, 127.0.0.1-only CORS.
  • 11 built-in themes, per-color overrides, any installed system font, custom window sizes — all autosaved.
  • Self-contained installer — end users need no compiler, .NET, or Python; auto-elevates on every launch.

Context

I wanted a hardware monitor that actually fit how I work: dark, dense, no nagware, no cloud, no account. And I wanted to understand the stack — sensors, GPU compute, stress workloads — end to end instead of gluing existing tools together. HardwareToad is the result: a Python UI I actually enjoy looking at, backed by a .NET bridge that talks to real low-level sensors and a C++/HLSL stress engine I wrote on top of DirectX 12.

Architecture

A two-process design splits responsibilities cleanly. The Python/Tkinter UI handles rendering and interaction; a self-contained .NET sensor bridge (LHMBridge) runs as a privileged child process and exposes local HTTP endpoints for sensor reads and stress orchestration. A standalone DirectX 12 executable (GPUStress.exe, C++/HLSL) handles GPU workloads — zero dependencies for end users.

  • main.py — application entry point.
  • core/app.py — all UI: tabs, cards, ring gauges, graphs, settings.
  • core/bridge.py — HTTP client for LHMBridge (token attached, retries, typed responses).
  • core/stress_manager.py — dispatches stress commands over the bridge.
  • core/constants.py — single source of truth for version, colors, port.
  • LHMBridge/LHMBridge.cs — C# sensor bridge (LibreHardwareMonitor + local HTTP).
  • GPUStress/ — native DX12 engine: C++ source, pre-built GPUStress.exe, HLSL shaders.
  • vendor/ — checked-in LibreHardwareMonitor runtime files.
  • dev.bat — fast local run, auto-elevates, rebuilds the bridge when needed.
  • build_all.bat — full clean release build: bridge → PyInstaller → Inno Setup installer.

Security model

The local bridge holds privileged access to low-level sensors, so it is treated as a security boundary, not a friendly helper.

  • Token auth — 256-bit token generated at startup, required on every request via X-HardwareToad-Token. Rotates every launch.
  • Token transport — passed via per-process env var (or temp file for elevated launches), never via CLI args visible to other local processes.
  • SHA256 integrity — the bridge binary is hashed on first run; any modification blocks startup.
  • Obfuscar — LHMBridge.dll symbols renamed at build time to slow down decompilation.
  • Restricted CORS — origin is reflected only for 127.0.0.1 / localhost; no wildcard.

Stress engine

All CPU/memory workloads run natively in the .NET bridge — no Python GIL, no subprocesses. Threads are pinned to cores with one core reserved for UI/system responsiveness. GPU workloads run in a separate native DX12 executable.

  • CPU Single Core — 1 thread, 12 independent AVX2 FMA chains, maxes single-core boost clock.
  • CPU Multi Core — same FMA engine on every logical core; ~Prime95 Small FFT thermal output.
  • Memory / IMC — 256MB/thread, AVX2 sequential + stride-127 + reverse passes; defeats the prefetcher.
  • Linpack DGEMM — tiled 3072²3072 FP64 matmul (~58B FMAs/pass); reveals instability smaller workloads miss.
  • Combined — every thread runs FMA + memory pass simultaneously for max package power.
  • RAM Stability — 15 write/read patterns with exact error reporting, reveals unstable XMP/EXPO profiles.
  • GPU Core — DX12 compute shader dispatching 16M FMA threads; saturates shader cores.
  • GPU VRAM — continuous 256MB transfers; saturates memory bandwidth.
  • GPU Combined — Compute + VRAM + Rasterizer simultaneously; maximum GPU thermal load.

UX polish

Little things that add up when you stare at this for hours while tuning a build.

  • 11 built-in themes (MSI Dragon, Cyberpunk, Matrix Green, and more), each with a complete palette for cards, accents, and graph lines.
  • Per-color overrides — click any colour to customise it independently of the theme.
  • Any installed system font; custom window size (presets or exact W×H).
  • Every setting autosaves and restores next launch.
  • Raw Sensors viewer — shows every value the bridge sees. The exact names to use when adding custom sensor labels for edge-case hardware.
  • Auto-elevation — UAC prompt every launch is the price of direct sensor access; no silent re-launch tricks.

Build & distribution

  • dev.bat — the only command needed during development.
  • build_all.bat — full release pipeline: compile LHMBridge, freeze UI with PyInstaller, package with Inno Setup.
  • Version bump is one line in core/constants.py — installer version follows automatically.
  • Installer registers the app to launch as Administrator by default and optionally drops a desktop shortcut.

Requirements

  • Windows 10+ (64-bit).
  • Python 3.11+ (source builds only).
  • .NET SDK (to build LHMBridge from source).
  • Inno Setup 6 (to produce the installer).
  • Administrator rights at runtime (mandatory for sensor access).

Recent releases

v0.8.1 Beta

  • · CPU temperature now works on previously unsupported CPUs (i7-8700, R5-5800X, others).
  • · GPU sensor polling now reads correctly via dedicated bridge methods.
  • · GPU stress shaders ~10× heavier per dispatch (transcendental ops, 4K render target, 30k tris).

v0.8.0 Beta

  • · Native DX12 GPU stress engine (Core / VRAM / Combined).
  • · Universal GPU support via feature-level fallback (12.1 → 11.0).
  • · GPUStress.exe bundled in installer — zero setup for end users.

v0.7.5 Beta

  • · Token authentication and SHA256 integrity check for the local bridge.
  • · Obfuscar integration in the build pipeline.
  • · Heavier AVX2/FMA, larger memory buffer, 4-pass scatter-write memory burn.
toad mascot