A retro terminal-style web dashboard for monitoring Linux servers, Hermes Agent instances, and trading bots. Zero dependencies beyond Python β no Node.js build step, no external database.
Built for homelab setups, designed to be cloned, configured, and extended in minutes.
- System Overview β CPU, RAM, disk, swap, temperatures, network with live sparklines
- Service Management β Monitor and restart systemd services from the browser
- Hermes Agent β Live status of model, provider, platforms, cron jobs, sessions, kanban board
- Trading Bot β Binance bot integration with live P&L, regime, indicators, decision log
- Time-Series Charts β Embedded SQLite TSDB with Chart.js visualization (no Prometheus needed)
- Log Viewer β Real-time journalctl log viewer with filtering
- Operations Panel β Switch AI models, create config backups, quick actions
- Network Scanner β Discover devices on your LAN with vendor detection and auto-refresh
- Health Panel β Click the health badge for system resources + connectivity status
- Plugin System β Extend with custom tabs, API endpoints, and metric collectors
- Feature Flags β Sections auto-hide when integrations aren't configured (bot, miner, etc.)
- π Network Scanner Plugin β Discover LAN devices via nmap, shows vendor/type/IP/MAC
- π₯ Health Panel β Click the HEALTHY/WARNING badge for detailed system health
- π§© Feature Flags API β
/api/featuresauto-hides bot/miner sections when not configured - π‘ Manual Scan Button β Force a network scan with β³ SCAN NOW
- π― Favicon β Proper Hermes logo favicon in browser tab
- π Full-width Network Widget β Network Scanner spans full width in Operations tab
- π·οΈ Dynamic Hostname β No more hardcoded hostnames, adapts to any machine
The dashboard exposes a comprehensive REST API for system metrics, service management, and Hermes Agent integration.
Interactive Documentation:
- Swagger UI (ReDoc) β Interactive API explorer with "Try it out" functionality
- ReDoc β Clean, reference-style documentation
Replace localhost:18791 with your actual host and port if configured differently.
- Endpoint | Method | Description
/docs| GET | Swagger UI interactive documentation/redoc| GET | ReDoc reference documentation/api/metrics| GET | All system metrics + sparklines + services + hermes status/api/health| GET | Health status (system resources + connections)/api/features| GET | Feature flags (which integrations are enabled)/api/kanban| GET | Active kanban tasks from Hermes/api/hermes| GET | Hermes agent status, cron jobs, sessions/api/hermes/models| GET | Available AI models/api/hermes/model| POST | Switch AI model/api/services| GET | Monitored services status/api/service/{name}/restart| POST | Restart a service/api/logs/{service}| GET | Journalctl logs/api/docker| GET | Docker containers/api/connections| GET | Network connectivity checks/api/backup| POST | Create config backup/api/graficos/dashboard| GET | All TSDB chart data/api/graficos/series| GET | Single metric time-series/api/network-scanner/devices| GET | Discovered LAN devices/api/network-scanner/scan| POST | Force network scan/api/plugins| GET | List loaded plugins/api/settings| GET/POST | Dashboard settings/bot-api/*| GET | Proxy to trading bot API
- Linux (systemd-based)
- Python 3.10+
- Hermes Agent (optional β dashboard reads
~/.hermes/for agent data) - nmap (optional β for network scanner plugin)
# Clone
git clone https://github.com/pantojinho/server-dashboard.git
cd server-dashboard
# Run installer (creates venv, installs deps, sets up systemd service)
chmod +x install.sh
./install.shThe installer will:
- Create a Python virtual environment
- Install dependencies from
requirements.txt - Generate
config.yamlfromconfig.example.yaml - Set up a systemd service (system, user, or manual)
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp config.example.yaml config.yaml
# Edit config.yaml for your setup
.venv/bin/python3 server.pyEdit config.yaml (created from config.example.yaml):
- Setting | Default | Description
server.port|18791| HTTP portserver.host|0.0.0.0| Bind addresssudo_mode|"none"| How to restart system servicesservices| β | List of systemd services to monitormetrics.scrape_interval|30| Seconds between metric collectionsmetrics.retention_days|35| Days of TSDB data to keepintegrations.bot_api_url| β | Trading bot API URL (empty = hidden)integrations.bitsy_url| β | BitsyMiner ESP32 API URL (empty = hidden)hermes.home|~/.hermes| Hermes config/state directoryhermes.gateway_service|hermes-gateway.service| Gateway systemd service namehermes.gateway_scope|user| Gateway service scope (userorsystem)
- Variable | Purpose
DASHBOARD_USERNAME| Basic Auth username (default:admin)DASHBOARD_PASSWORD| If set, enables Basic Auth on all endpointsSUDO_PASSWORD| Password for sudo (ifsudo_mode: sudo_password)TELEGRAM_BOT_TOKEN| For alert notificationsTELEGRAM_CHAT_ID| For alert notificationsHERMES_HOME| Path to Hermes config dir (default:~/.hermes)HERMES_GATEWAY_SERVICE| Override Hermes gateway systemd unitHERMES_GATEWAY_SCOPE| Override gateway systemd scope (userorsystem)
noneβ Restart buttons won't work for system servicessudo_nopasswdβ Requires passwordless sudo configuredsudo_passwordβ Pipe password to sudo (setSUDO_PASSWORDenv var)systemd_userβ All services are user services, no sudo needed
The dashboard supports plugins that add custom tabs, API endpoints, and metric collectors without modifying core files.
- Create a
.pyfile in theplugins/directory - Subclass
DashboardPlugin - Override the hooks you need
# plugins/my_plugin.py
from plugins.base import DashboardPlugin
class MyPlugin(DashboardPlugin):
@property
def name(self) -> str:
return "my-plugin"
@property
def display_name(self) -> str:
return "MY PLUGIN"
def tab_html(self) -> str:
return '<div class="panel"><div class="panel-header">My Plugin</div>' \
'<div class="panel-body">Hello from my plugin!</div></div>'
def register_routes(self, app):
@app.get("/api/plugin/my-plugin/data")
async def my_data():
return {"status": "ok"}Plugins are auto-discovered on server start.
- Method | Purpose
name| Machine name (used in URLs)display_name| Tab labeltab_html()| HTML content for the tab panelscripts_html()| JavaScript to includestyles_html()| Additional CSSregister_routes(app)| Register FastAPI endpointscollect_metrics()| Return metrics for TSDB (called every 30s)on_load()| Initialization hook
server.py # FastAPI backend β API routes + metric collectors
metrics_tsdb.py # SQLite time-series database with background collector
plugins/
__init__.py # Plugin system exports
base.py # DashboardPlugin base class
loader.py # Plugin discovery and registration
network_scanner.py # Network device discovery plugin
config.yaml # User configuration (not committed to git)
config.example.yaml # Template config (committed, safe defaults)
static/
index.html # Single-page dashboard (HTML + CSS + JS, no build step)
hermes-logo.png # Logo asset
favicon.ico # Browser tab icon
See docs/HERMES_MONITORING.md for the recommended Hermes service configuration, health-check rules, and troubleshooting commands.
For AI agent work, see AGENTS.md.
The dashboard uses CSS custom properties for theming:
:root {
--bg: #060610; /* Main background */
--bg-panel: #0a0a16; /* Panel background */
--text: #c8c0d0; /* Primary text */
--green: #00ff88; /* Healthy/success */
--red: #ff4444; /* Error/critical */
--cyan: #00d4ff; /* Info/interactive */
--yellow: #ffcc00; /* Warning */
--gold: #FFD700; /* Highlight */
}PRs welcome! The codebase is a single-page app with no build step β just edit and refresh.
MIT
