syspanel
A local, self-contained Windows system dashboard: resource monitor, disk tree viewer, battery health, process manager, service watchlist, startup monitor, cleanup manager, and restart control: one web app, no cloud, no build step.
Read this first
syspanel is provided AS IS, with no warranty of any kind, express or implied. Use it entirely at your own risk.
This is not a read-only viewer. It can kill processes, delete files, stop and reconfigure Windows services, change what runs at startup, and restart or shut down the machine. Any of that can cause data loss, corruption, an unbootable system, hardware damage, business interruption or consequential damages, and no liability is accepted for any of it.
You are responsible for verifying the target of every destructive action, for keeping tested backups, and for being authorised to administer the machine and to expose it on whatever network you expose it on.
Not certified for regulated, forensic, safety-critical or other high-assurance use.
LICENSE(MIT) is the governing text and prevails where the two differ; see DISCLAIMER.md for the full version.
Install
pip install syspanel[windows]
Run
syspanel
Serves at http://127.0.0.1:8765/ (open it yourself, or pass --open-browser
to have it opened for you). Useful flags:
syspanel --open-browser # open a browser tab on startup
syspanel --read-only # disable every mutating route
syspanel --allow-remote # bind 0.0.0.0 and print a bearer token required on every mutating route
--host always wins if you pass it explicitly (e.g. to bind a specific LAN
IP instead of all interfaces), but any non-loopback host requires
--allow-remote. The server refuses to start otherwise, so it can never
be exposed beyond localhost without authentication by accident.
Fleet: seeing every syspanel instance on your LAN
Any instance can announce itself over UDP broadcast so a companion dashboard
elsewhere on the network can find it. Off by default, opt in with
--broadcast:
syspanel --broadcast # announce every 15s on UDP :7005
syspanel --broadcast --broadcast-interval 30 # slower cadence
syspanel --broadcast --broadcast-port 7100 # non-default port
Each broadcast is one small (~200 byte) self-contained UDP packet (hostname, IP, dashboard port, CPU/mem/battery, admin state, timestamp) sent on a repeating timer, not fragmented or batched across packets. A dropped packet just means one missed tick, never a partial update.
One beacon goes to each up interface's own subnet broadcast address, not to
255.255.255.255. That single limited-broadcast send is not scoped to an
interface, so the routing table picks one, and on a host with Hyper-V, WSL,
Docker or a VPN the winner is routinely a virtual adapter: the beacon then
reaches a virtual switch with nothing behind it and the machine is
undiscoverable from the LAN indefinitely. Pin the announcement to one subnet
with --broadcast-address 192.168.1.255 if you would rather choose yourself.
A client does not have to wait for the next tick. A broadcasting instance also
answers a discovery probe on the same port immediately, so a phone or fleet
dashboard that has just started finds it in milliseconds instead of up to one
--broadcast-interval. Replies go only to the host that asked and are
throttled per asker; turn the whole behaviour off with --no-discovery-reply.
syspanel-fleet is the companion tool that listens for these and shows every
host it's heard from as a live card grid, each linking straight to that
host's own dashboard:
syspanel-fleet # listen on :7005, dashboard at 127.0.0.1:8766
syspanel-fleet --listen-port 7100 # match a non-default --broadcast-port
syspanel-fleet --allow-remote # let others on the LAN view the fleet dashboard
The same tool doubles as a lightweight standalone beacon, useful for testing a receiver or announcing a machine that isn't running the full dashboard:
syspanel-fleet --mode transmit --interval 15
Modules
| Module | What it shows |
|---|---|
| Resources | Live CPU / RAM / network / disk I/O, 1s push over WebSocket |
| Disk Tree | Drive-picker dropdown, squarified treemap + sortable/clickable table, background scan with progress that survives navigating away and back |
| Battery | Design vs. current capacity, cycle count, wear verdict (via powercfg) |
| Processes | Sortable/searchable process table; kill with denylist protection |
| Services | Full service list, a persisted watchlist with alerts, start/stop/restart |
| Startup | Registry Run/RunOnce, Startup folder, and logon scheduled tasks; enable/disable/delete |
| Cleanup | Declarative target catalog (Temp, crash dumps, Windows Update cache, Recycle Bin, custom age/retention rules); dry-run preview before every delete |
| Power | Schedule a restart with a cancellable countdown; requires typing a confirm phrase |
| Dev Tools | Detected versions of Python, Git, Node/npm, .NET SDK, Java, PowerShell 7, Docker, VS Code, Cursor, TestComplete, TestExecute, SQL Server (per instance), Hirsch Velocity, Chrome, Edge, Firefox, VMware Workstation, IIS, Hyper-V |
Admin-only actions (Windows\Temp, service control, killing other users' processes) show a lock badge when unelevated; use the Relaunch as Administrator button in the header to UAC-elevate in place.
Pages cache their data across navigation (instant reload, background refresh every 5 minutes, plus a manual Refresh button), and Startup/Battery/ Cleanup are pre-warmed in the background while you're on another page.
Safety model
Every mutating action goes through one chokepoint (core/safety.py):
a denylist blocks system-critical paths/PIDs, and destructive operations
require a preview → confirm token → execute round trip so exactly what
was shown is what gets acted on. Every attempt is appended to an audit log
at %LOCALAPPDATA%\syspanel\audit.jsonl.
Any connection from beyond localhost (relevant once --allow-remote is in
use) - HTTP or WebSocket, mutating or not - is logged with its IP, method,
path, user-agent, and whether it carried a valid bearer token, both to the
console and to %LOCALAPPDATA%\syspanel\remote_access.jsonl.
Development
pip install -e .[dev,windows]
pytest -q
See CLAUDE.md for repo conventions.
Metadata
Release files for syspanel 0.1.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| syspanel-0.1.11.tar.gz | 77.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| syspanel-0.1.11-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 192.0 kB
Release files / syspanel-0.1.11.tar.gz
| Download URL | syspanel-0.1.11.tar.gz |
|---|---|
| Size | 77.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dfc676487ad7f04003aafa66c462955ec16a8e0737731171c11edfa3bf7a4768
|
|
BLAKE2b-256 checksum How to use checksums |
0e2865953e3b9ef120860f7c10d149af0f0ac281f60b5647af90ac0725d0274b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Release files / syspanel-0.1.11-py3-none-any.whl
| Download URL | syspanel-0.1.11-py3-none-any.whl |
|---|---|
| Size | 114.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
065ad2d6404d74ce9e91c858c538b15ea76a0334a4d7d44ba10e3ff5d64fc320
|
|
BLAKE2b-256 checksum How to use checksums |
66324502c563727a9176edd3e1eb691ebac32afc396c8af94e4271afda57db49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Security for syspanel 0.1.11
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.