Metadata-Version: 2.4
Name: syspanel
Version: 0.1.9
Summary: A local Windows system dashboard: resource monitor, disk tree viewer, battery health, process manager, service watchlist, startup monitor and cleanup manager.
Project-URL: Repository, https://github.com/pandiyarajk/syspanel
Project-URL: Issues, https://github.com/pandiyarajk/syspanel/issues
Author-email: Pandiyaraj Karuppasamy <pandiyarajk@live.com>
License: MIT
License-File: LICENSE
Keywords: battery-health,dashboard,disk-usage,process-manager,system-monitor,windows
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: System :: Monitoring
Requires-Python: >=3.11
Requires-Dist: fastapi>=0.110
Requires-Dist: jinja2>=3.1
Requires-Dist: psutil>=6.0
Requires-Dist: pydantic-settings>=2.2
Requires-Dist: pydantic>=2.6
Requires-Dist: send2trash>=1.8
Requires-Dist: uvicorn[standard]>=0.29
Provides-Extra: dev
Requires-Dist: build>=1.0; extra == 'dev'
Requires-Dist: httpx>=0.27; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Requires-Dist: twine>=4.0; extra == 'dev'
Provides-Extra: windows
Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'windows'
Description-Content-Type: text/markdown

# 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.

## Install

```bash
pip install syspanel[windows]
```

## Run

```bash
syspanel
```

Serves at `http://127.0.0.1:8765/` (open it yourself, or pass `--open-browser`
to have it opened for you). Useful flags:

```bash
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`:

```bash
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.

`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:

```bash
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:

```bash
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

```bash
pip install -e .[dev,windows]
pytest -q
```

See `CLAUDE.md` for repo conventions.
