Files
infra/modules/clan/phonebox
kurogeek d623ef8470 clanService/phonebox: global decentralized number directory over yggdrasil
Replace the static prefix+extension numbering with random 6 digit box
numbers (100000-999999) signed by the machine's yggdrasil key. A serf
gossip cluster on yggdrasil port 7946 exchanges the signed records;
phonebox-sync verifies key -> address derivation and the signature and
writes the number -> address map to /run/phonebox/numbers for the
asterisk dialplan. Any yggdrasil node running the service can reach any
other; clan-core's ygg-input filter is opened for SIP, RTP and gossip.

Drop the server-prefix-number and ata-local-number vars, add a two-node
VM test that proves directory convergence and a call over yggdrasil.
2026-09-17 06:34:27 +00:00
..

A peer to peer phone relay network built on top of yggdrasil.

Every box is reachable from any yggdrasil node running this service, not only from members of the same clan.

Numbers

Each box gets a random 6 digit number (100000-999999) when its vars are generated. The number is signed with the box's yggdrasil private key, so a number is cryptographically bound to the yggdrasil address it belongs to; nobody can claim a number for an address they do not own. Regenerate the phonebox vars to get a new number.

Dialing from a phone plugged into the ATA:

dialed reaches
NNNNNN the phone on box NNNNNN (line 00)
NNNNNNXX line XX on box NNNNNN
00, 01... local lines on this box
888 fax of the current number directory
000 fax echo test
999 hello world

Caller ID on the callee is the caller's box number followed by its line, so calling it back works.

Directory

There is no central registry. Each box runs a serf agent on yggdrasil port 7946 that gossips its signed number record (number, key, sig, owner tags) to every other box it knows about. On every membership change the phonebox-sync handler verifies all records and writes the resulting number -> yggdrasil address map to /run/phonebox/numbers/, which the asterisk dialplan reads at call time.

Bootstrapping: boxes of the same clan join each other automatically. To connect to boxes outside the clan add one of their yggdrasil addresses to extraPeers; after the first successful join the agent remembers the whole membership in /var/lib/phonebox/serf.snapshot and rejoins on its own.

serf members -rpc-addr 127.0.0.1:7373 shows the live directory.