Metadata-Version: 2.4
Name: syspanel
Version: 0.1.2
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.

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

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

## Development

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

See `CLAUDE.md` for repo conventions.
