Len

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.

Pittsburgh, PA

Upstream

Eleven years of open-source contribution, primarily across FusionPBX, FreeSWITCH and SignalWire.

1,426 pull requests merged
96%of the 1,478 opened
372issues opened
94%of those closed
Merged pull requests by year
FusionPBX FreeSWITCH & SignalWire
0 200 400 600 15 16 17 18 520 19 20 21 22 23 24 25 26 2015: 10 merged 2016: 100 merged 2017: 19 merged 2018: 425 merged 2019: 520 merged 2020: 231 merged 2021: 4 merged 2022: 19 merged 2023: 23 merged 2024: 22 merged 2025: 9 merged 2026: 4 merged
Table view
YearFusionPBXFreeSWITCH & SignalWireTotal
201510010
20161000100
201719019
20184250425
20195200520
20202310231
2021404
202221719
202302323
202402222
2025099
2026044
1,390 merged in public repos 97% 36 in private 3%
Public repositoryMergedOpenedSpan
fusionpbx/fusionpbx 1,0121,0312015–2021
fusionpbx/fusionpbx-install.sh 1711772016–2022
fusionpbx/fusionpbx-docs 1201272015–2020
signalwire/freeswitch-docs 27282023–2026
signalwire/WireStarter 21222022–2024
signalwire/digital_employees 1313
signalwire/freeswitch 44

Plus smaller sets in verto-client, freeswitch-sounds, libstirshaken and docs-legacy.

Built and maintained by me

Chess is mine start to finish. Sidecar began as an earlier prototype from Brian; I did the bulk of the build.

Chess Play live chess against an agent over a realtime connection signalwire-demos/chess Sidecar AI assisting a human rep on a live call, rather than replacing them signalwire-demos/sidecar

Things you can actually talk to

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.

Holy Guacamole Drive-thru ordering holyguacamole.signalwire.io CineBot Movie and TV discovery, with trailers, over video cinebot.signalwire.io Blackjack Play 21 against an AI dealer over WebRTC video blackjack.signalwire.io Bobby's Table Restaurant reservations, start to finish bobbystable.ai After Hours After-hours HVAC intake and dispatch afterhours.signalwire.io Santa Seasonal, and a hit with the under-10 crowd santa.signalwire.io Tech Tarot Exactly what it sounds like techtarot.signalwire.io Cabby Taxi booking cabby.signalwire.io GoAir Airline agent doing real work against real APIs goair.signalwire.io

ClueCon

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.

2026

The Prompt Pitsole author

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.

Node.jsDockerSMS votingvoice agent
2026

Buzzword Bingosole author

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.

Node.jsDockerQR + phone playlive sentiment
2025

Coder Games, Maker Challengesole author

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.

ESP32Arduino C++SMSvoice agent
2024

FreeSWITCH ClueCon Labcontributor

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.

FreeSWITCHDockerDebian
2023

Maker Challenge, ESP32-S3sole author

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.

ESP32-S3 WROOMArduino C++DHT11

Microcontrollers

Small boards with something to say to the phone network. Most of them are well grounded.

ESP32-S3 call button Button press places a real phone call; wifi-connect and SMS variants, optional DHT11 Arduino C++ Phone-controlled LEDs ESP32 LEDs driven by an inbound SMS or a voice call, with wiring diagram Arduino C++ ESP32 / AHT10 / OLED Temperature and humidity on a little OLED, reporting over HTTP Arduino C++ Sensor AI ESP8266 and DHT11 into ThingSpeak, read back to callers by a voice agent Perl

Side projects