The dashboard
Running lyno in an interactive terminal without -headless opens a live view
of the system. It is the primary operational interface: there is no web UI.
┌─ Lyno PBX by Telqo ──────────── 0.0.0.0:5060 · 4/5 online · 1/1 trunks up · uptime 6h12m ─┐
│ Overview Calls 2 Endpoints 5 Trunks 1 Logs tenant acme │
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│ active calls endpoints trunks calls since start │
│ 2 4/5 1/1 148 │
│ in progress registered reachable 131 answered · 15 missed · 2 live│
│ │
│ Tenants │
│ TENANT DOMAIN ONLINE CALLS DIDS │
│ acme acme.pbx.example.com 3/3 2 2 active │
│ globex globex.pbx.example.com 1/2 0 1 idle │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
tab switch · t tenant · / filter · ? help · q quit
The header
Always visible, and always describing what is currently on screen rather than the whole system — see filters below.
| Field | Meaning |
|---|---|
host:port | The address the PBX is listening on. |
n/m online | Endpoints with a live registration, out of all configured accounts. |
n/m trunks up | Trunks that are reachable and, where configured, registered. |
uptime | Time since the process started. |
The five views
| # | View | Shows |
|---|---|---|
| 1 | Overview | Tiles, a per-tenant summary and recent calls. |
| 2 | Calls | Calls in progress. |
| 3 | Endpoints | Every account, its registration state, contact and user agent. |
| 4 | Trunks | Trunk state, registration and the addresses inbound calls are accepted from. |
| 5 | Logs | The live log, scrollable, with a level floor. |
The tab bar carries a count badge per view, so Calls 2 means two calls are
visible under the current filters.
Overview
Four tiles, then a tenant table, then recent calls.
The calls since start tile breaks down as answered · missed · live, and the
breakdown adds up to the total — a glance never leaves you wondering where the
missing calls went.
The tenant table answers the two questions an operator asks first: is anyone online, and is anything happening.
Calls
Calls currently in progress, with tenant, direction, from, to, state and duration. State colours are consistent everywhere: a colour means the same thing on every screen.
Endpoints
One row per configured account. An account that never registered still appears, which is how you tell "the phone is off" from "the account does not exist". Includes the contact address actually being used — the source address seen at REGISTER, not the advertised Contact.
Trunks
Per trunk: reachability, registration state and expiry, and the discovered INBOUND FROM addresses. This is the first place to look when inbound calls are rejected while outbound works.
Logs
The live log, newest at the bottom. Scrolling back with ↑ pauses following;
the footer says so and ↓ resumes. L raises the level floor when info is too
noisy.
Keys
| Key | Action |
|---|---|
tab / shift+tab | Next or previous view |
← → / h l | Same as tab / shift+tab |
1 … 5 | Jump straight to a view |
↑ ↓ / k j | Scroll the log |
t | Cycle the tenant filter |
/ | Filter by text — enter applies |
L | Raise the log level floor |
esc | Clear all filters |
? | Help |
q / ctrl+c | Quit, stopping the PBX |
Filters are global
This is the design decision worth internalising: the tenant filter and the
text filter narrow every view at once. Pressing t until the badge reads
tenant acme means the header counts, the tiles, the call list, the endpoints
and the logs all describe acme only.
Active filters are shown as badges next to the tab bar precisely because they
change what every number on screen means. esc clears both.
Finished calls are kept
The event bus reports state changes; the dashboard turns them into history and counters. That is why a call that failed thirty seconds ago is still on the Overview under "Recent calls" — without it, a failed call vanished the moment it ended, which made the dashboard useless for finding out what just happened.
Counters and history live in memory and reset when the process restarts.
Quitting
q cancels the PBX context and exits. There is no way to detach the dashboard
and leave the PBX running — for a long-lived service, run with -headless under
systemd or Docker and read the logs there.