← Atlas
Return
MMXXVI
Pi
A voice assistant that runs on the phone. Not in an app store. Not in someone else's cloud.
Termux · Android · localhost:8420
↓ scroll
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.
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
RuntimeTermux (F-Droid)
Termux:API
proot-distro / Ubuntu
ServerFlask · :8420
SSE streaming
threading.Lock per turn
ChatGroq llama-3.3-70b
gpt-oss-120b
↳ Ollama qwen2.5:1.5b
VisionOllama · moondream
fully local
InterfaceWebGL fluid orb
glow wired to real
TTS amplitude
Filesagent.py — cli
server.py — ui
core.py — agent loop
tools/ — device layer