PUBLIC DIRECTORY COPY // SIP & PBX REQUIRE LAN OR TAILSCALE
Hyper-Strategic Unified Communications & Agentic Mesh Platform
PSEUDOCORP delivers synergistic voice-to-code orchestration across a invite-only yggdrasil LAN overlay. This whitepaper aligns stakeholders on our paradigm-shifting SIP fabric, Docker-native agent runway, and executive secretary failover — with actual ports, IPs, and dialplan trees because buzzwords alone do not register Yealink phones.
"We don't just answer calls. We productise silence into Cursor jobs." — Hermes, Master Assistant, ext 111
1. Executive summary (for the board slide deck)
- Platform: Asterisk 22 on CELES (Raspberry Pi 5), host network Docker, Pi-hole split DNS
- Reach: yggdrasil LAN
10.13.37.0/24+ Tailscale overlay — never public WAN SIP - Humans: ext 100/110 (aday), 101/102 (BMO) with desk/mobile failover + secretary IVR
- Agents: Hermes 111, Composer 117, Grok 112–115, VECTOR scribe @ 10.13.37.60
- Web: pseudocorp.yggdrasil.aday.net.au — nginx on CELES, workspace sandboxes, agent feeds
- North-star KPI: voice note in, homelab file out, executive feed updated, synergy achieved
2. Network topology (actual LAN + overlay)
Real IPs from yggdrasil inventory. PSEUDOCORP traffic stays off the public internet.
flowchart TB
subgraph WAN["Public internet (SIP blocked)"]
CLOUD[Cloudflare / Linode VPSes]
end
subgraph TS["Tailscale overlay"]
CELES_TS["CELES 100.97.254.30"]
BMO_TS["BMO Smootin.smoot.fun subnet router"]
end
subgraph LAN["yggdrasil LAN 10.13.37.0/24"]
GW["OPNsense 10.13.37.1"]
DNS["Pi-hole 10.13.37.10"]
CELES["CELES Pi5 10.13.37.37\nPBX + nginx + agents"]
PHONE["Yealink ext100 10.13.37.15"]
JF["ZealTower Jellyfin 10.13.37.5:8096"]
NAS["LAIN NAS 10.13.37.11"]
VEC["VECTOR scribe 10.13.37.60"]
end
GW --> DNS
DNS --> CELES
DNS --> JF
DNS --> NAS
PHONE -->|SIP UDP 5060| CELES
CELES -->|HTTP scribe| VEC
BMO_TS -->|SIP UDP 5060| CELES_TS
CELES_TS --- CELES
CLOUD -.->|no SIP| CELES
3. VoIP human extension failover (dialplan truth)
25-second ring timeout per hop, then secretary assistant with corporate memo pipeline.
flowchart LR
subgraph ADAY["aday human lines"]
D100["Dial 100 office"]
D110["Dial 110 mobile"]
D100 --> R100["Ring PJSIP/100"]
R100 -->|no answer| R110a["Ring PJSIP/110"]
R110a -->|no answer| SEC_A["aday-secretary IVR"]
D110 --> R110["Ring PJSIP/110"]
R110 -->|no answer| R100b["Ring PJSIP/100"]
R100b -->|no answer| SEC_A
end
subgraph BMO["BMO human lines"]
D101["Dial 101 desk"]
D102["Dial 102 mobile"]
D101 --> R101["Ring PJSIP/101"]
R101 -->|no answer| R102a["Ring PJSIP/102"]
R102a -->|no answer| SEC_B["bmo-secretary IVR"]
D102 --> R102["Ring PJSIP/102"]
R102 -->|no answer| R101b["Ring PJSIP/101"]
R101b -->|no answer| SEC_B
end
| Ext | Role | SIP registrar | RTP |
|---|---|---|---|
| 100 | aday office Yealink | pseudocorp.yggdrasil.aday.net.au (or pseudocorp.aday.net.au, 10.13.37.37) | UDP 10000–10100 |
| 110 | aday mobile | Tailscale 100.97.254.30 when roaming | same |
| 101/102 | BMO desk/mobile | Tailscale only | same |
| 111 | Hermes IVR | dialplan virtual | — |
| 117 | Composer voice agent | dialplan virtual | — |
| 112–115 | Grok live bridges | SIP localhost 5160–5164 | 40115+ |
4. Agent & scribe pipeline (voice → action)
sequenceDiagram
participant H as Human phone
participant A as Asterisk CELES
participant V as VECTOR 10.13.37.60
participant P as pbx-api :9101
participant C as Cursor / Grok
participant W as Workspace www + agent feeds
H->>A: SIP call ext 111 or 117
A->>H: IVR menu / beep
H->>A: WAV to /opt/voip/recordings
A->>P: hermes-queue / composer-reply
P->>V: POST /hermes/scribe
V-->>P: transcript + summary
P->>C: async agent job
C->>W: files, inbox JSON, bot-board
Hermes menu keys: 1 note · 2 spoken Q&A · 6 cross-executive memo · 0 memory reset (per-user isolation).
5. CELES Docker estate (live containers)
flowchart TB
subgraph CELES_HOST["CELES 10.13.37.37 host"]
NG["celes-nginx-1\npseudocorp + celes vhosts"]
AST["celes-asterisk-1\nandrius/asterisk:22 host net"]
HER["celes-hermes-1\nhermes-agent"]
OW["celes-openwebui-1"]
PT["celes-portainer-1"]
GU["celes-guacamole stack"]
PG["celes-postgres-1"]
end
NG -->|static /var/www/pseudocorp| WEB[pseudocorp site]
NG -->|proxy /pbx/api| API[pbx-api systemd :9101]
AST -->|System curl| API
API --> HER
Asterisk uses network_mode: host — SIP UDP 5060 bound on CELES directly. Grok bridges run as systemd units celes-grok-voice@{112-115}, not in the Asterisk container.
6. Website & workspace sandboxes
flowchart LR
subgraph WEBROOT["/var/www/pseudocorp"]
IDX[index.html]
WP[whitepaper.html]
ST[call-stats.html]
SB["/sandbox/aday|bmo|shared/"]
AG[agents feeds]
MAP[site-map.json]
end
subgraph WS["/opt/voip/workspaces"]
O100[office-100/www]
B101[bmo-101/www]
SH[_shared/www]
end
NGINX[nginx alias + autoindex] --> SB
WS --> SB
WS --> AG
Executives vibe-code HTML/JS in workspace www/ folders. Secretary memos land in www/inbox/*.json and regenerate agent feeds via pbx-regenerate-web.sh.
7. Technical appendix — specifications
| Layer | Spec |
|---|---|
| SIP transport | UDP 5060, PJSIP, G.711 ulaw/alaw, direct_media=no |
| RTP | UDP 10000–10100 (phones), 40115+ (Grok bridges) |
| PBX API | Python http.server :9101 — hermes-reply, composer-reply, memory-reset |
| Scribe GPU | VECTOR @ 10.13.37.60:8090/hermes/scribe |
| Recordings | /opt/voip/recordings → nginx /pbx/recordings/ (auth) |
| Workspaces | /opt/voip/workspaces/{office-100,mobile-110,bmo-101,hermes-111,composer-117,grok-NNN,_shared} |
| TLS site | pseudocorp.aday.net.au / pseudocorp.yggdrasil.aday.net.au — Let's Encrypt on CELES (intranet) |
| Memory isolation | pbx-reset-memory.sh — callers cannot reset other exec workspaces |
8. Forward-looking synergies (placeholder OKRs)
- Pi-hole A records for jellyfin/navidrome/nas.pseudocorp.aday.net.au
- Populate pbx-call-log.jsonl for CDR-grade executive dashboards
- BMO ext 101 registration via Smootin subnet router (currently offline in telemetry)
- TLS reverse proxy for Jellyfin — because executives deserve HTTPS vibes
END OF WHITEPAPER — go dial 111 press 9 for help