Metadata-Version: 2.4
Name: pm2-dash
Version: 0.1.0
Summary: A readable web dashboard for pm2 — services, memory, restarts, and live log tailing in one page.
Project-URL: Homepage, https://github.com/AlexlaGuardia/pm2-dash
Project-URL: Repository, https://github.com/AlexlaGuardia/pm2-dash
Author-email: Alex LaGuardia <alex@alexlaguardia.dev>
License: MIT
License-File: LICENSE
Keywords: dashboard,devops,monitoring,pm2,process-manager
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: System :: Monitoring
Requires-Python: >=3.9
Requires-Dist: fastapi>=0.110
Requires-Dist: uvicorn>=0.27
Description-Content-Type: text/markdown

# pm2-dash

A readable web dashboard for [pm2](https://pm2.keymetrics.io/). Services, memory, CPU, restart counts, and live log tailing in one page. Auto-refreshing, no setup.

I run 57 pm2 services on one box. `pm2 monit` is a terminal grid that shows a handful at a time and `pm2 logs` floods every service at once. I wanted the one view pm2 doesn't ship: every service in a sortable table, restart counts I can scan for the one that's flapping, and click-to-tail logs without grepping for a log path. So I built it.

![pm2-dash](docs/screenshot.png)

## Install

```bash
pip install pm2-dash
```

## Run

```bash
pm2-dash                 # http://127.0.0.1:9777
pm2-dash --port 8080
pm2-dash --host 0.0.0.0  # expose on the network (put auth in front of it)
```

It shells out to `pm2 jlist` for state and reads each service's log files straight off disk. No pm2 stream stays open, and tailing a multi-GB log reads only the tail, not the whole file.

## What it shows

- Every service: id, status, CPU, memory, restart count, uptime, exec mode, pid
- Errored and stopped services surfaced in the header; unstable restarts flagged with a ⚠
- Sorted so anything not `online` floats to the top
- Click any row to tail its stdout + stderr (last 80 lines)
- The whole thing repolls every 2 seconds

## Honest scope

Read-only. It does not start, stop, or restart anything, by design, so it's safe to leave open on a shared box. It reads what pm2 reports; if pm2 can't see a process, neither can this. One CDN script tag ([htmx](https://htmx.org/)) for the polling; no build step, no `node_modules`. View source is the entire frontend.

If you bind to `0.0.0.0`, put a reverse proxy with auth in front of it. It ships no auth of its own.

## License

MIT
