gmad-phone · shared infrastructure

Phone / Dialer — diagnostic

A phone-first <gmad-phone> element. The user experiences a plain address book — Recents · Contacts · Keypad · Voicemail — but underneath the contact list is a SELF-circle phone-AID list, and a CallRouter picks the rail invisibly: a member (DID, reachable JNY endpoint) rings in-app over WebRTC; a raw number (E.164 AID) dials out over PSTN. This build is a UI shell with mock data — no live media.

Try it

  • Recents — tap any call to re-dial; missed calls show in red with a badge on the tab.
  • Contacts — members show a presence dot and “call in app”; raw numbers show “dial out.” Search filters live.
  • Keypad — type a number; the hint shows which rail it routes to (always PSTN for raw numbers). Big green Call.
  • Voicemail — unheard items are dotted (badge on the tab); Play marks heard; Call back dials the sender.
  • In-call — the overlay color + label shows the chosen rail (indigo = WebRTC, green = PSTN), a live timer, and mock controls. End logs a new Recent.

Two swappable seams, both mocked here (see ADAPTERS.md):
PhoneProvider (data): contacts() / recents() / voicemails() — later rest (cids / self-circle) + sparql.
CallRouter (rail): route() is real; place() is mock — later webrtc → Element Call/MatrixRTC (LiveKit), pstn → Asterisk/Telnyx.

Event stream