Introduction
Lyno is a multi-tenant PBX written in Go and shipped as a single binary. The whole phone system — listeners, carrier trunks, tenants, accounts, extensions and dialplans — is described in YAML files that are read once at startup.
Tenants share the SIP listeners and carrier trunks but are otherwise isolated: each has its own phones, extension numbers, dialplans and DIDs. Extension 100 of one tenant has nothing to do with extension 100 of another.
What it is
- Configuration is the source of truth. There is no database and no admin
API. What is in the files is what the PBX does, which makes a configuration
change reviewable in a diff and a rollback a
git revert. - Multi-tenant from the ground up. Endpoints are attributed to a tenant by the SIP domain they register with; inbound calls by the DID they arrive on. The digest realm is the tenant's own domain, so one tenant's credentials cannot be replayed against another.
- Operated from a terminal. A live dashboard shows calls, registrations, trunks and logs. A separate editor TUI walks the entire configuration and validates before it writes.
- One static binary. A distroless container image of roughly 19 MB, or a single binary on a host.
What it is not
- There is no hot reload. Configuration is read at startup; restart the PBX to apply a change.
- There is no transcoding. Both legs of a bridged call must agree on a codec, so Lyno offers the same list (G.711 alaw/ulaw) on both sides.
- There is no voicemail, IVR-with-DTMF-input, queue or call recording in the
dialplan today. The step types are
play,dial,mohandhangup. - It is not a session border controller. Put it behind a firewall you control and treat the trunk source addresses as the perimeter for inbound calls.
How a call is handled
A call enters through exactly one of two doors, and everything follows from which one:
| Door | Trigger | Authorisation | Tenant selected by |
|---|---|---|---|
| Trunk | the source IP matches a configured trunk | none — the source address is the authorisation | the DID that was called |
| Endpoint | anything else | digest auth against the tenant's accounts | the SIP domain in the request |
That fork is the single most important thing to understand about Lyno; it is covered in detail in How a call is routed.