Open source · ESP32-S3

A voice agent the size of a pocketwatch.

Microphone to Deepgram to speaker, over one WebSocket, held open by the board itself. No phone in the loop. No laptop. No bridge process on your desk pretending to be the device.

Apache-2.0 Talk over it and it stops Waveshare ESP32-S3-Touch-AMOLED-1.75C Flashes in 13 seconds
The round device on a black surface, its display showing a sphere of blue dots labelled speaking

456 dots · 18 rings · drawn on-device

The whole loop, one board

Tiny hardware with personality.

A 466 × 466 round AMOLED, unmodified and out of the box. The face is drawn on-device, every frame, its behaviour driven by the session state — connecting, thinking, speaking, idle.

ES7210

It listens

16 kHz capture in 80 ms chunks. The microphone stays open while the agent speaks, so you can cut in mid sentence and it stops.

agent.deepgram.com

Deepgram thinks

Speech-to-text, the model, and text-to-speech on one authenticated socket. Flux speech stack, 13 voices offered by name.

ES8311

It answers

Replies land faster than they play, so a 384 kB ring buffer absorbs the turn and the speaker drains it.

Tools wired to its own hardware

Ask it to change, and it changes.

Not settings. The agent holds tools that reach the codec, the display and the session, so the way you reconfigure this device is to mention it out loud.

“Turn it down a bit.”

One touch free UI, just ask for a volume change and it happens hands free.

“Call yourself Ada.”

Saved to flash and folded into the system prompt as its own name.

“Show me the spectrum.”

Two interchangeable faces: a vibrant spectrum analyzer or an intuitive, stylish orb.

“Make the orb teal.”

A simple ask customizes the color to fit your vibe.

“Use a different voice.”

Thirteen Flux voices are offered by name, each with its own accent and temperament.

“Goodbye.”

When the conversation is over, the device drops into low power mode conserving battery and tokens.

Specifications

What is in it.

BoardWaveshare ESP32-S3-Touch-AMOLED-1.75C
Display466 × 466 round AMOLED, QSPI, capacitive touch
Audio inES7210 · 16 kHz · 80 ms chunks · 4-channel TDM
DuplexFull · on-device echo cancellation · interrupt by talking
Audio outES8311 · shared duplex I2S
Memory8 MB PSRAM · 32 MB flash
FacesOrb (456 dots) · Spectrum (48 bars)
Voices36 in the catalog · 13 offered by voice
Endpointwss://agent.deepgram.com/v1/agent/converse
Firmware1.71 MB · ESP-IDF 5.5.5
SetupWPA2 access point, captive portal, QR to join

Four steps, no toolchain

Get one running.

The published image carries no API key and no network, so it comes up asking for both.

Get your free API key

A Deepgram API key, it comes preloaded with $200 to use, no credit card required.

Download the image

One file: bootloader, partition table and app together, so flashing needs to know nothing about the layout.

Write it to the board

With esptool and the board in download mode.

esptool.py -c esp32s3 -p /dev/YOUR-PORT \
  write_flash 0x0 deepgram_agent-merged.bin

Scan the QR on the panel

It raises its own encrypted access point and shows the code. Your phone joins, a page asks for your network and your Deepgram API key, and it reboots talking.

A phone showing the device's captive portal: a form asking for a Wi-Fi network and a Deepgram API key
A captive portal logs you into your device using a mobile phone.