← 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.

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
Chat
Groq llama-3.3-70b
gpt-oss-120b
↳ Ollama qwen2.5:1.5b
Vision
Ollama · moondream
fully local
Interface
WebGL fluid orb
glow wired to real
TTS amplitude
Files
agent.py — cli
server.py — ui
core.py — agent loop
tools/ — device layer