Skip to main content

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.

FieldMeaning
host:portThe address the PBX is listening on.
n/m onlineEndpoints with a live registration, out of all configured accounts.
n/m trunks upTrunks that are reachable and, where configured, registered.
uptimeTime since the process started.

The five views

#ViewShows
1OverviewTiles, a per-tenant summary and recent calls.
2CallsCalls in progress.
3EndpointsEvery account, its registration state, contact and user agent.
4TrunksTrunk state, registration and the addresses inbound calls are accepted from.
5LogsThe 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

KeyAction
tab / shift+tabNext or previous view
/ h lSame as tab / shift+tab
15Jump straight to a view
/ k jScroll the log
tCycle the tenant filter
/Filter by text — enter applies
LRaise the log level floor
escClear all filters
?Help
q / ctrl+cQuit, 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.