The most expensive moment in agentic development is the one nobody sees: the agent stopped ten minutes ago to ask for approval, and you were in another window. We built a small fix for that on a desk. Then we gave it a voice and a name.
Nova is a $40 round AMOLED board that shows what Claude Code is doing, says out loud when it needs you, and answers when you say "Hey Nova". This post covers how it's built, what we had to write ourselves, and the guardrails we kept. Everything is open source, so you can build one yourself.
What's Inside
- Why an ambient signal beats another notification
- The board, and why this one
- Agent Buddy: the status display, set up in ten minutes
- Making it speak, and the unmerged pull request that does it
- Giving it ears: a microphone driver the firmware didn't have
- "Hey Nova": a wake word without training a model
- How it compares to Anthropic's own desktop buddy
- The guardrails, and how to build your own
Why a desk companion
Coding agents now run for minutes at a time, and they pause for two reasons: they're done, or they need a human to approve something. Both are easy to miss in a terminal behind three other windows. Desktop notifications pile up and get dismissed.
A physical signal works differently. A character on your desk that tilts its head and shows a question mark when Claude Code is waiting is hard to ignore and easy to glance at. That is the idea behind Agent Buddy, the open-source project Nova is built on.
A shoutout first
None of this exists without Dan Wahlin. Agent Buddy is his project: the firmware, the character art, the desktop app, the hooks for six coding agents, and a polished setup wizard. He created the repository on 11 September 2026 and had shipped 32 releases by 18 October 2026, when we installed v0.14.16. Nova is a small layer on top of that work.
Brady Gaster and Ed Charbeneau wrote the speech code we build on, in two pull requests that are still open as we write. The fix that made audio work on our board at all is Ed's, merged on 15 October.
Thank you, all three. If you only want the status display, you don't need anything from us: install Agent Buddy and give the repo a star.
The board
We used the Waveshare ESP32-S3-Touch-AMOLED-1.75C, listed by Waveshare at $39.99 to $41.99 USD when we checked in October 2026. Agent Buddy targets this exact board, and its hardware covers everything a voice companion needs:
| Part | What it does for Nova |
|---|---|
| ESP32-S3, 8 MB PSRAM, 32 MB flash | Runs the character, Wi-Fi and audio together |
| 1.75" round AMOLED, 466 x 466 | Deep blacks, so the character looks like it floats |
| ES7210 with two microphones | Hears you, with echo cancellation hardware |
| ES8311 codec and speaker | Speaks the replies and alerts |
| Wi-Fi and Bluetooth LE | Runs off USB power anywhere on the desk |
| Aluminium case | A finished object, not a bare circuit board |
Before flashing anything, we read the full 32 MB of flash to a file, so the board's factory demo can always be restored. It took about two minutes. One warning worth repeating: a flash dump taken after Wi-Fi setup contains your Wi-Fi password, so never share one.
Step one: the status display
Agent Buddy ships as a desktop app that installs a background service, flashes the board and adds hooks to Claude Code. Its setup wizard does the work. You pick your agents, a character and where the character lives.

Before it flashes, the wizard names the serial port and warns that it replaces the existing firmware and partition table. This is why the backup comes first.

Flashing took about two minutes. Then the wizard showed Claude Code connected over USB:

Behind the scenes, the wizard registered 13 Claude Code lifecycle hooks, including PreToolUse, PermissionRequest and Stop. Each one tells the service what the agent is doing. The service picked up the session we were working in straight away, with no restart.
Two practical notes. The macOS app is ad-hoc signed, so if you download it in a browser, macOS blocks the first launch until you allow it in Privacy & Security. And a plain npm run setup from the repository installs hooks for every agent it detects, including ones you didn't choose. The app's own installer respects your choices.
Step two: making it speak
The released Agent Buddy plays short sound cues, but it doesn't talk. Speech lives in two open pull requests: Brady's #12 streams macOS text-to-speech to the board, and Ed's #29 builds on it. We built #29 because it also carries the audio fix for our board revision. The 1.75C wires the audio master clock to a different pin from the 1.75-B, so without that fix every sound plays silently.
Building from source on an Apple Silicon Mac hit one snag: Arduino's bundled ctags tool is Intel-only, and the Mac had no Rosetta. We compiled it natively instead, which needed a one-line fix for a macro name that clashes with a macOS system header. The build script in our repository does this for you.
The first words, through the board's own speaker:
npm run speak "Hello Kevin, I'm alive"
With speech working, Agent Buddy's voice alerts can say when Claude needs approval and when it has finished. Its "contextual" mode also gives Claude Code a narrate tool, so the agent can say a short line about what it's doing, such as "running the tests now".
Step three: giving it ears
Nothing in Agent Buddy listens, and the firmware had no driver for the board's microphone chip. This is the part we wrote:
- A microphone driver. We ported Espressif's open-source ES7210 driver (Apache 2.0) to the Arduino I2C library that Agent Buddy already uses.
- One missing clock setting. The speaker runs at 24 kHz with a 6.144 MHz master clock, a combination Espressif's driver table doesn't list. The table's other entries at the same ratio share one pattern, so the new entry follows it.
- Listening and speaking at once. The microphones share the speaker's clock lines, so the audio bus now runs in both directions.
- Streaming with a lease. The Mac asks the board to stream, and the board sends 20 ms packets of audio over the local network for 30 seconds. The Mac renews the request every 10 seconds, so if it goes away, the board stops by itself.
The first test streamed three seconds of audio with no lost packets, with both microphones live.
Step four: "Hey Nova"
A wake word that runs on the board itself needs a custom-trained model, which is days of work. So the wake word runs on the Mac, where the audio already arrives. The bridge is one Python script:
- It splits the audio stream into phrases with a simple loudness detector.
- It transcribes each phrase on the Mac with Whisper (
mlx-whisper, the small English model). - If the phrase starts with "Hey Nova", it sends the rest to Claude Code with
claude -p, and resumes the same session so follow-up questions keep their context. - It speaks the reply through the board, in clips short enough for the board's 15 second limit.
Here is the first real conversation, from the bridge's log:
16:41:30 heard: 'Hey Nova!'
16:41:30 awake, listening for the request
16:41:30 heard: "what's in this repo?"
16:41:30 asking Claude Code: what's in this repo?
16:41:39 Nova: This repo is your desk companion project, which turns the
Waveshare round AMOLED ESP32 board into an AI agent buddy. ...
About nine seconds from question to spoken answer. Saying "Hey Nova" on its own wakes it: the character shows its question mark, and the next phrase is the request.
How this compares to Anthropic's desktop buddy
Anthropic publishes its own maker project, claude-desktop-buddy, created on 9 April 2026. The Claude desktop app for macOS and Windows can connect Claude Cowork and Claude Code Desktop to a device over Bluetooth LE. The device can show permission prompts and recent messages, and approve or deny prompts with its buttons. The reference firmware targets an M5StickC Plus.
The two solve different halves of the problem:
| Anthropic's desktop buddy | Nova (Agent Buddy + our voice layer) | |
|---|---|---|
| Connects to | The Claude desktop app, over Bluetooth LE | Claude Code in the terminal (and other agents), through hooks, over USB or Wi-Fi |
| Shows | Permission prompts and recent messages | Working, needs attention and complete states, with token usage |
| Acts | Approve or deny from the device | Spoken alerts, and "Hey Nova" voice requests to Claude Code |
| Board | M5StickC Plus reference | Waveshare ESP32-S3-Touch-AMOLED-1.75 |
Approving from the device is on our list for Nova next.
The guardrails we kept
A device that listens on your desk and drives an agent that can change files needs limits:
- Nothing is installed globally. The build tools live inside the project folder, and the Python tools run through
uv. - Audio stays on the network. The board streams only to the Mac, only while the lease is renewed. Whisper runs locally, and only the text of a "Hey Nova" request reaches Claude.
- Room speech isn't logged. Our first version wrote every transcribed phrase to a log file, which meant room conversation ended up on disk. We caught it on day one. Now only requests to Nova are logged, unless you turn on debug mode.
- Edits need a deliberate opt-in. By default, Nova runs Claude Code in its normal permission mode, where edits and commands that need approval are refused. Turning on voice-driven edits takes a flag.
- Only approved agents get hooks. The installer adds Claude Code's hooks and nothing else.
- The Mac's Local Network privacy setting applies. Started at login, the bridge first failed with "No route to host" until Python was allowed to reach devices on the LAN. It's a good default, and we left it in place.
What it says about agentic DevOps
Nova is a desk toy, but the problem it solves is a real one: agents work faster than people notice them. The more autonomous the agent, the more the human checkpoints matter, and the more it costs when one sits unnoticed. A signal you can see and hear from across the room is one cheap way to close that gap. Teams running agents at scale need the same thing in their platforms: clear points where a person approves, and a fast way to know one is waiting.
Build your own
The code, the firmware patch, the build scripts and the full build log are in codetocloudorg/nova-desk-companion. With the board on USB and Agent Buddy's app set up:
make backup # keep your factory firmware first
make nova-firmware # Agent Buddy, PR #29 and our microphone patch
make nova-flash # asks you to type FLASH
make nova-service
make nova # then say: "Hey Nova, what's in this repo?"
It needs an Apple Silicon Mac, Claude Code and 2.4 GHz Wi-Fi. It's provided as is, with no warranty. Flashing firmware can leave a board unusable, so read the README before you start.
Frequently Asked Questions
What is Agent Buddy?
Agent Buddy is an open-source desk companion by Dan Wahlin. Hooks in coding agents such as Claude Code and GitHub Copilot report when the agent is working, needs approval or has finished, and an animated character on a Waveshare ESP32-S3 AMOLED board or a desktop window shows it. The code is MIT licensed, and the name and logo are Dan Wahlin's trademarks.
Can you talk to Claude Code by voice with Nova?
Yes. The board streams its two microphones over your local network to a small bridge on the Mac. The bridge transcribes each phrase locally with Whisper, sends anything that starts with Hey Nova to Claude Code in print mode, and plays the reply through the board's speaker. In our tests a question took about nine seconds from asking to hearing the answer.
Does Nova send audio to the cloud?
No audio leaves your network. The board streams only to the Mac on your LAN, only while the bridge renews a 30 second lease, and Whisper runs on the Mac. Only the text of a request that starts with Hey Nova goes to Claude Code, the same as typing it.
How is Nova different from Anthropic's Claude desktop buddy?
Anthropic's claude-desktop-buddy connects the Claude desktop app to a maker device over Bluetooth LE, so the device can show permission prompts and approve or deny them. Nova is built on Agent Buddy, which uses hooks in Claude Code in the terminal and other agents, and adds spoken alerts and Hey Nova voice requests. Approving from the device is on our list for Nova next.
Sources
- DanWahlin/agent-buddy: README, releases and TRADEMARKS.md, checked 18 October 2026 (created 11 September 2026, 32 releases, v0.14.16 latest, MIT licence)
- Agent Buddy pull requests #12 and #29 (open on 18 October 2026) and #30 (merged 15 October 2026)
- Waveshare ESP32-S3-Touch-AMOLED-1.75C documentation and AMOLED product listing, checked 18 October 2026
- anthropics/claude-desktop-buddy: README, checked 18 October 2026 (created 9 April 2026)
- Espressif ES7210 driver, Apache 2.0
- codetocloudorg/nova-desk-companion: our build log, firmware patch and bridge
Screenshots and the photo are our own, taken 18 October 2026. Timings are from our own board and Mac, and will vary.
Where to go next
- Running coding agents across a team? Take the free Agentic AI Readiness Scorecard. It takes a few minutes and needs no email.
- Want the governance side? Read Running Agentic AI at Enterprise Scale.
- Want help putting agents into your delivery pipeline? Bring your score to a Discovery Call.
Kevin Evans
Founder, Code To Cloud Inc.
Kevin Evans leads agentic DevOps and application modernization engagements for enterprise and mid-market teams, and offers fractional CTO advisory to growing businesses. He spent nearly five years at Microsoft, rising to Senior Solutions Engineer, and is a CNCF Ambassador and Calgary chapter lead, based in Calgary, Alberta. More about Kevin

