Inspiration
I run a lot of coding agents. Not one or two: a fleet, spread across dozens of repositories, all working at once. Claude Code in one terminal tab, Codex in another, three more in VS Code windows I forgot about.
Every one of them eventually stops and waits for a human. A permission prompt, a question, a finished task nobody noticed for forty minutes. The bottleneck was never the models. It was me, tab-hopping, trying to remember which window had the agent that needed an answer. And the moment I stood up from the desk, the whole fleet froze.
So I built the thing I wanted: one place that shows every agent session across every project, gives each agent its own voice so I can hear who needs me, and puts the fleet in my pocket so leaving the desk stops being the end of the working day.
What it does
Alpha Overmind is a macOS app plus a mobile companion that runs and displays all of your coding agent sessions, across every project, with voice.
On the Mac: every session from every repo on one stage, each with a status orb and what it is doing right now. An attention queue listing every agent blocked on you, oldest first. Five engines behind one interface (Claude Code, OpenAI Codex, GitHub Copilot CLI, Grok Build, and any ACP-speaking agent you add yourself), all normalized into the same event vocabulary so the transcript, permission cards, voice and phone work identically whichever one you started. Plus a code editor, terminals, a scheduler, MCP and skills management, and a concierge agent that answers "what is everyone doing?" by querying the other sessions.
And real voice. Each agent has a distinct voice, they speak their replies, and you talk back. You say "Atlas, ship it" and the right session gets the message.
On the phone: the same fleet, live, wherever you are. Answer permission prompts, steer an agent, interrupt one, start a new session. Push when an agent needs a human. Voice in and voice out, so you can run a code review from a walk. And, because a pair was sitting on my desk, Rokid display glasses: agent text on the lens, replies in your ear, prompts by voice, phone in your pocket.
The part I care about most: the phone talks only to your own Mac. Direct, end to end encrypted, over your LAN or your own VPN. Our backend never learns your Mac's address, never holds a key that reaches it, never sees a line of your code. A full breach of our servers lets an attacker send you a notification. That is the whole blast radius.
How I built it
Electron, React and Tailwind on the desktop, with a separate daemon process that owns everything real: session management, engine drivers, node-pty terminals, SQLite, repo discovery. The app is a client of that daemon, which is why the phone can be a second client of exactly the same protocol.
The rule that shaped everything: we drive only the officially installed vendor CLI, under the user's own login and subscription. No vendor SDK, no API calls, no API keys, no OAuth tokens. We spawn the unmodified claude binary in headless stream-json mode, and codex app-server over JSON-RPC, and scrub every vendor credential out of the child environment. Your subscription, your machine, your tokens. We are a GUI, the way a terminal is a GUI.
Voice is ElevenLabs Scribe and Flash with Silero VAD for turn taking, and a per-agent voice roster. Agents mark what they want said aloud in a <speak> block, so the spoken line is authored rather than a robot reading a wall of markdown. Keys are the user's own, in the macOS Keychain.
Mobile is Expo and React Native, TypeScript strict, 50-language runtime i18n, a custom OTA server. The link protocol is shared code on both ends: device keypairs, mutual handshake, QR and six-digit pairing, pinned devices, per-IP bans, a listener that disables itself after twenty failures. The AWS backend is deliberately the least interesting part of the system, and that is the point.
RevenueCat
Two products that do not unlock each other, billed on the platform that fits each one.
Mobile Pro runs on RevenueCat, entitlement pro, with four placement-specific paywalls. Free is a genuinely complete product: watch the fleet, read every transcript, approve, steer, interrupt, manage MCP servers and skills. Pro is voice in and voice out, pairing more than one computer, unlimited concurrent agents, and the glasses.
The entitlement is checked in three places, not one: at the paywall, in the feature gate, and again inside the glasses bridge, so a plan that lapses mid-session actually disconnects instead of coasting until the next launch. Settings has pull to refresh on it, because people buy, restore, cancel and get grants on other devices. The webhook writes the entitlement into the account, and that is the only path: no client-side trust, no receipt parsing of my own.
The desktop app is a separate Stripe subscription after a trial. Keeping them separate had a real cost (a combined price is the likeliest source of "why am I paying twice"), so free mobile stays fully usable and nobody is forced into both.
Challenges
App Review cannot test this app. The phone is free, but only useful against a Mac running the desktop app, which a reviewer does not have. Every core flow is unreachable: a Guideline 2.1 rejection on the first submission. The obvious fix, "when logged into the review account, connect to a mock", is exactly the pattern that gets developer accounts terminated under 2.3.1. So the demo is a real feature instead: a "See a demo" entry open to every user, a canned session with pre-rendered audio, same code path for reviewers and for anyone curious before they buy.
Every CLI has a different idea of what a permission prompt is. Claude Code needs an undocumented flag before prompts reach you at all. Codex speaks JSON-RPC with its own approval model and no session init event. ACP agents delegate file and terminal access to the client, or do not, depending on the vendor. Normalizing that into one permission card without ever weakening the gate was most of the engine work.
Glasses audio. The Rokid SDK turned out to be half duplex: microphone and playback cannot coexist, and every hand-over costs seconds of channel negotiation. Unusable for conversation. Voice moved to the Bluetooth headset link with the SDK driving only the display.
Never trusting my own diff. Every significant change goes through an adversarial review loop. It caught a lapsed entitlement that kept the glasses running, a phone's image attachments silently dropped before the agent saw them, and a hold-to-talk race that left the microphone open. None of those would have shown up in a demo.
What I learned
The boundary is the product. Every genuinely hard decision here was about what the servers are not allowed to know: no relay, no tunnel, no stored addresses, no transcripts, no keys, no model provider anywhere in the backend. It made several features harder and one or two impossible, and it is the only reason I would install this on my own machine.
Also that voice changes what an agent is. Reading an agent's output is supervision. Hearing eight agents with eight voices, one of them saying your name because it needs a decision, is closer to working with people.
Built With
- amazon-web-services
- aws-cdk
- aws-lambda
- claude
- cloudfront
- electron
- elevenlabs
- expo.io
- mongodb
- node.js
- openai
- react
- revenuecat
- sqlite
- stripe
- tailwind
- typescript
- vite
- websockets
Log in or sign up for Devpost to join the conversation.