Dashboard and module detail
Dashboard
The Dashboard (/) is the per-host operational control surface – a sortable table of
every module list_modules() finds in PYOBS_CONFIG_DIR, refreshed on a 10 second
poll:
Status – a colour-coded dot (running / stopped / deactivated), derived from
psutil-checking the PID stored in that module’s PID file.RAM / CPU / uptime – read live via
psutilon every poll; blank for a stopped module.Warning/error log counts – per-module count of WARNING+ messages in the last 24h, highlighted in colour if non-zero. See journald-backed logging for how these counts are computed without reading a whole log file.
XMPP indicator (only if
EJABBERD_ENABLED) – a small connected/not-connected icon per module row, and a summary tile alongside the Total/Running/Stopped/RAM/CPU tiles. See Read-only status integration.Sorting by any column header groups rows under Running / Stopped / Deactivated headings; a reset icon restores the default (config-file) order.
Quick actions per row – start, restart, stop, activate/deactivate – plus bulk Start All, Restart All, Stop All across every non-deactivated module. Modules whose config filename starts with
_(i.e. deactivated) are excluded from the bulk actions.Responsive: on a narrow viewport the table collapses to status dot + name + log counts + actions, wrapped in a horizontally-scrolling container rather than overflowing the page.
Module detail
Clicking a module opens its detail page, with four tabs:
Overview
Current status, PID, uptime, CPU and memory usage, per-level (DEBUG/INFO/WARNING/ERROR/
CRITICAL) message counts for the last 24h, and the start/restart/stop/activate/deactivate
controls. If EJABBERD_ENABLED and the module has a comm.user, a session block shows
connected-since/IP/connection type (live) or last-seen (not connected) – see
Read-only status integration.
Logs
A live log tail with a free-text filter and a time-range filter (clicking a line sets the range), colour-coded by severity, auto-refreshing. Reads from either flat log files or the systemd journal depending on the effective log backend – see journald-backed logging; the viewer behaves identically either way.
Config
A YAML editor (CodeMirror, syntax-highlighted) for the module’s own config file, with
{include ...} lines rendered as clickable links to the referenced shared fragment (see
“Shared configs” below). Saves write the raw text back as-is – this app never round-trips
a whole config file through a generic YAML parser, since a config can contain bare
{include ...} lines that aren’t valid standalone YAML on their own.
ACL
A point-and-click editor for the module’s acl: block – see ACL matrix and per-module ACL editing for the full
picture, including the fleet-wide matrix view this tab is one of two editing surfaces for.
New module
A “+” icon next to the sidebar’s Modules heading opens /modules/new/ – a single name
field. On submit, it writes a minimal starter <name>.yaml (just a class: key) and
navigates straight to that module’s own Config tab to fill in the rest. PYOBS_CONFIG_DIR
is created automatically if it doesn’t exist yet. Creating a module under a name that
already exists is rejected rather than overwriting the existing file.
Fleet-wide Overview page
/overview/ is a separate page from the per-host Dashboard: one row per host configured
in HUB_HOSTS (plus the local host), each showing whether it’s reachable, its
running/stopped/total module counts, and aggregate CPU/RAM – with the host’s name linking
into that host’s own Dashboard. An unreachable host is shown as a warning banner and
excluded from the aggregate numbers, rather than silently hidden. This page deliberately has
no bulk or per-module actions of its own – a fleet-wide “Stop All” button one click away
from a summary view is a real footgun; anything you want to do to a module happens on that
host’s own Dashboard, one click further in. See Hub mode for how the underlying
cross-host querying works.