I’m building Scowld, an open-source AI voice companion for iPhone and iPad. Here’s a small recording of the kind of everyday conversation I want it to handle.
I asked Bella for an easy meal with a decent amount of protein. She suggested a tofu stir-fry, so I changed the constraint: no soy. She switched to a different idea and we carried on talking.
The demo
I asked Bella for an easy protein-rich meal, then ruled out soy. She kept up. A real iPad conversation with Scowld, my open-source AI voice companion. Try it on iPhone/iPad: https://scowld.xyz #BuildInPublic #AI
— Apoorv Darshan (@apoorvdarshan.com) 2026-11-04T07:15:00.295329Z
This is a real iPad recording with background-noise cleanup. The desktop meme at the end is intentional.
What’s in the app
Scowld combines a native iOS interface with an animated VRM companion. The character has idle animations and audio-driven lip sync, while the conversation uses a live voice connection.
A few details from the current implementation:
- Bring your own Google Gemini Live, OpenAI Realtime, or xAI Grok Voice key, or use optional Scowld Premium without an API key.
- Enable hands-free wake mode to listen for Bella’s name using Apple’s on-device speech recognition while the app is open and idle.
- Keep transcripts on the device and use the selected saved chat as context for later conversations.
- Enable the optional camera when you want visual context in a conversation.
With your own key, the live connection goes directly to the selected provider. Scowld Premium uses Scowld’s relay. The README explains the data flow and implementation in more detail.
I’m sharing an ordinary conversation here because that’s the experience I’m working on: asking a question, changing a constraint, and continuing out loud.
Download Scowld on the App Store · Website · MIT-licensed source code · Instagram @scowldapp
If you try it, I’d love to hear what makes a voice companion feel natural to you.
Top comments (1)
Changing a constraint mid-way ("no soy") and having it carried forward is a good demo choice, it's the first thing that breaks in most voice apps.
To your question, one thing that made a big difference for us: the voice has to stay the same person. We generate speech sentence by sentence, and without a fixed direction two sentences of the same session could come out with a slightly different timbre. People noticed. We now send the same short voice instruction with every sentence ("same tone, pitch and pace throughout") and put its version in the cache key, so audio made under an older instruction is never replayed.
The other one is the gap before the reply. We start downloading the next sentence while the current one plays, and playback joins that download instead of starting a second one.
Realtime APIs give you less control over this, so I'm curious: does Bella's voice stay stable over a long chat, and when the user switches provider?