A voice assistant that runs on the phone. Not in an app store. Not in someone else's cloud.
Termux · Android · localhost:8420
↓ scroll
on desktop and phone
Talk to it
Say something
A real turn, played back — tool call, gate, reply. The orb rides the amplitude envelope, same as the running build.
pick a line above · tap the orb to interrupt
The split
What leaves the phone
Chat text goes to Groq because a 70B model won't fit in your pocket. Everything else stays put — including every photo, because vision runs locally on moondream.
◦ Never leaves the device
Camera frames + vision inference
GPS coordinates
Clipboard contents
Contacts and call log
Every device action
→ Goes over the wire
Conversation text → Groq
Reply text → Orpheus TTS
Search queries → Groq Compound
Voice
It degrades. It doesn't go quiet.
Three engines, tried in order. Drop the signal and watch it fall through — Pi keeps talking instead of dying silent.
tier 1Orpheus / Troystandby
Groq neural TTS. Real prosody and breathing. Ships wav only, 200 characters per request — so replies get chunked and re-stitched gapless through WebAudio scheduling.
tier 2speechSynthesisstandby
The phone's own voices, handled client-side. Free, instant, noticeably worse. No network required.
tier 3termux-tts-speakstandby
Android's built-in engine. Robotic, but it works headless with no browser open at all.
All six of Groq's English voices are American. ElevenLabs sits alongside as a fourth engine — the only way to get a British voice out of this stack.
22 device tools
It can actually touch the phone
Termux:API from the F-Droid build — the Play Store build silently lacks camera capture, which cost an entire debugging session to find. Tap one to fire it.
Anything destructive sits behind a confirmation gate keyed to a token ID, so a stray "no" in the next sentence can't be misread as denying something you already approved. Waiting on you doesn't count against the turn deadline.
The prompt
Nobody is home. That's the design.
Every version of assistant-voice got cut, one session at a time. Drag the slider to strip it back.
AssistantPoliteTersePi
You are Pi, running locally on the user's phone.
Answer. Be brief. Don't apologize.
Don't ask what they meant. Don't offer more help.
Use tools for device data.
The contrast with Weaver is the whole point. Weaver's identity layer is load-bearing — its prompt opens with "You exist. You are running." Pi got the inverse: no self, only capability.
Stack
Under it
Runtime
Termux (F-Droid) Termux:API proot-distro / Ubuntu
Server
Flask · :8420 SSE streaming threading.Lock per turn