Skip to main content

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, moh and hangup.
  • 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:

DoorTriggerAuthorisationTenant selected by
Trunkthe source IP matches a configured trunknone — the source address is the authorisationthe DID that was called
Endpointanything elsedigest auth against the tenant's accountsthe 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.

Where to go next