I build voice AI agents that answer real phone calls.
My work sits where telephony meets language models: real calls over real carriers, real APIs, real video in the browser, built on the SignalWire AI Agents SDK. The phone network is a century of accumulated engineering discipline and it is unforgiving in the way good infrastructure should be. Teaching it to think is the most interesting problem I've been handed.
I came to it from the PBX side, after a decade of FusionPBX and FreeSWITCH, and that decides the order I build in: prove the thing end to end on real infrastructure first, then make it elegant. A demo that survives a live call has earned the right to look good.
Eleven years of open-source contribution, primarily across FusionPBX, FreeSWITCH and SignalWire.
| Year | FusionPBX | FreeSWITCH & SignalWire | Total |
|---|---|---|---|
| 2015 | 10 | 0 | 10 |
| 2016 | 100 | 0 | 100 |
| 2017 | 19 | 0 | 19 |
| 2018 | 425 | 0 | 425 |
| 2019 | 520 | 0 | 520 |
| 2020 | 231 | 0 | 231 |
| 2021 | 4 | 0 | 4 |
| 2022 | 2 | 17 | 19 |
| 2023 | 0 | 23 | 23 |
| 2024 | 0 | 22 | 22 |
| 2025 | 0 | 9 | 9 |
| 2026 | 0 | 4 | 4 |
| Public repository | Merged | Opened | Span |
|---|---|---|---|
| fusionpbx/fusionpbx | 1,012 | 1,031 | 2015–2021 |
| fusionpbx/fusionpbx-install.sh | 171 | 177 | 2016–2022 |
| fusionpbx/fusionpbx-docs | 120 | 127 | 2015–2020 |
| signalwire/freeswitch-docs | 27 | 28 | 2023–2026 |
| signalwire/WireStarter | 21 | 22 | 2022–2024 |
| signalwire/digital_employees | 13 | 13 | |
| signalwire/freeswitch | 4 | 4 |
Plus smaller sets in verto-client, freeswitch-sounds, libstirshaken and docs-legacy.
Chess is mine start to finish. Sidecar began as an earlier prototype from Brian; I did the bulk of the build.
Team projects I contributed to. Every one of them is live: call it, or click the video button and talk in the browser. They answer.
Maker challenges and stage tooling built for ClueCon, the annual FreeSWITCH and telephony developer conference. Once a year the industry gathers in one room, and I try to give it something hands-on to build.
An esports-style control room for the Vibe Coding Championship. A single container drives every screen in the house (stage, scoreboard, admin) and lets the entire audience vote from their phones three ways: on the web, by SMS, or by ringing a number and telling an AI agent who they are backing. The prototype challenges, five callable agents that contestants had to bend to their will, live in their own repo.
Live audience bingo for conference talks. Scan a QR, draw a card that locks to you, and blot buzzwords as the speaker says them. Positive buzz counts for sound engineering and responsible AI, negative for hype, and AI product names are a free-for-all. The room's collective sentiment updates on stage in real time, which speakers enjoy right up until the hype column starts filling in.
The SignalWire Maker Challenge for ClueCon Coder Games: an ESP32 whose LEDs answer to the phone network, one sketch driven by an inbound SMS and another by a voice call. It ships with the wiring diagram and a credentials scaffold, so entrants spend the hour on the idea rather than the boilerplate. Paired with an LED control agent that takes colour and on/off state by voice.
Brought the hands-on FreeSWITCH lab up to date for the conference: moved the image to Debian bookworm, took the IPv6 profiles out of the load path, and corrected the docker-compose and event-socket config, so the lab came up clean on the first try for everyone in the room.
Place a phone call from a button press. Five sketches that climb from "the board joined wifi, send an SMS" up to a physical button dialling out, with an optional temperature reading along for the ride. Parts list, wiring photos and a write-up for each one.
Small boards with something to say to the phone network. Most of them are well grounded.