A lightweight Windows 10 GUI utility that queries Win32_WinSAT via PowerShell and displays Windows Experience Index component scores in a dark, animated desktop interface.
- Dark, GitHub-inspired theme with a teal / amber accent palette
- Animated circular arc gauge for the WinSPR base score
- Animated, glowing component score bars (CPU, Memory, Disk, Graphics, D3D)
- Live status pill (Ready / Working / etc.) in the header
- Assessment state and last-run timestamp display
- Auto-refreshes scores on launch
- Trigger
winsat formalfrom the UI - Colour-coded output log (success, warnings, errors, raw JSON)
- Copy raw JSON to clipboard
- Single-file portable EXE support
Windows 10 still maintains WinSAT performance metrics internally via WMI/CIM, but Microsoft removed the graphical Windows Experience Index UI years ago.
This project restores that visibility through a modern Python GUI.
- Windows 10
- PowerShell (default on Windows 10)
- Python 3.10+ (for source version)
No external Python dependencies required — the UI is built entirely on the standard library (tkinter).
The application:
- Resolves the absolute path to
powershell.exe - Executes:
Get-CimInstance -ClassName Win32_WinSAT -Namespace root\cimv2- Converts output to JSON
- Displays the structured scores in the UI — an animated circular gauge for the base score, animated glowing bars for each component, and a meta panel with assessment state and last-run time
- Automatically runs a refresh on startup, and can be re-triggered anytime via the Refresh Scores button
- Optionally runs:
winsat formalto refresh the system assessment (via the Run Assessment button), then automatically re-queries and updates the UI
PowerShell path resolution handles:
- Standard 64-bit path
- Sysnative fallback (for 32-bit Python on 64-bit Windows)
- PATH fallback
- Header — app title and a status pill showing the current state (Ready, Querying…, Running assessment…, etc.)
- Base Score Gauge — a circular animated arc showing the WinSPR base score (the lowest of the component scores)
- Meta Panel — assessment state (e.g. Valid / Completed) and the timestamp of the last WinSAT run
- Component Scores — animated bars for CPU, Memory (RAM), Disk (SSD), Graphics, and D3D Gaming, each easing into place with a soft glow
- Action Buttons:
- ⟳ Refresh Scores — re-queries
Win32_WinSATand updates the display - ▶ Run Assessment — runs
winsat formal, then auto-refreshes - ⎘ Copy JSON — copies the raw JSON response to the clipboard
- ⟳ Refresh Scores — re-queries
- Output Log — a colour-coded panel on the right showing query status, raw JSON, warnings, and errors as they happen
python WinSAT_Viewer.pyInstall PyInstaller:
python -m pip install pyinstallerBuild:
pyinstaller --onefile --windowed --clean --name WinSATViewer WinSAT_Viewer.pyOutput:
dist/WinSATViewer.exe
The resulting EXE is portable and does not require Python installed.
CPUScore : 8.9
MemoryScore : 8.9
DiskScore : 8.2
GraphicsScore : 6.6
D3DScore : 9.9
WinSPRLevel : 6.6
WinSATAssessmentState : Valid / Completed
The base score equals the lowest subscore.
The Run Assessment button executes winsat formal.
This may require Administrator privileges. If it fails, run the EXE from an elevated (Admin) terminal.
PowerShell Not Found
The application resolves the absolute PowerShell path automatically. If it still fails, verify that this exists:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
No Win32_WinSAT Data Returned
Run winsat formal manually from an elevated terminal, then click Refresh.
Antivirus Flags the EXE
Some AV engines flag PyInstaller single-file builds. If this occurs:
- Build with
--onedirinstead of--onefile - Or sign the executable
WinSAT_Viewer.py
README.md
After build:
dist/
WinSATViewer.exe
- Automatic bottleneck detection (lowest score highlight)
- CSV / JSON export
- System hardware snapshot panel
- Direct WMI querying via
pywin32(remove PowerShell dependency) - Score history tracking with trend graphs
- Signed enterprise build pipeline
Copyright 2024 Leon Priest
GitHub: 7h3v01d
Licensed under the Apache License, Version 2.0.