Project Tango adapts the forked AURA LiveKit voice interface into a Schubert-hosted, persona-driven AI companion. The frontend keeps the orb-style WebRTC session UI, while the backend routes all LLM traffic through the existing LiteLLM proxy on Schubert.
The canonical deployment repo is the private theonlygeranium/Project-Tango repository.
This public theonlygeranium/AURA repo is retained as the fork baseline and historical
adaptation source.
frontend/- Next.js 15 LiveKit client on port3006.backend/- FastAPI token/session API plus persona-aware LiveKit voice worker on port8030.deploy/- systemd units plus the API-only Caddy append block.docs/- Codex agent constraints and bootstrap plan.
Project Tango assumes these Schubert services already exist:
polyglot-litellm.serviceathttp://localhost:4000ollama.servicewithqwen3.6:latestpostgresql@18-main.servicecaddy.servicecloudflared.service
Do not deploy new LiteLLM or Ollama services for this repo. LLM calls go through
http://localhost:4000 only, authenticated with LITELLM_MASTER_KEY.
project-tango.schubert.lifealready proxies to frontend port3006; do not create a second frontend Caddy block.deploy/Caddyfile.tango-apiis the only new Caddy append block and routestango-api.schubert.lifeto backend port8030.- Live inspection on 2026-06-22 showed
127.0.0.1:8010is permanently owned by Docker containerasr-gateway; Tango uses8030, which must remain free for the backend. Rundeploy/schubert-preflight.shbefore installing. - Do not add
WRITER_API_KEYorPALMYRA_API_KEYto Tango env files. LiteLLM already owns downstream provider credentials. - Runtime credentials stay in
/opt/Project-Tango/.envon Schubert and are not tracked in Git.
| Persona | Display Name | Voice ID | LiteLLM Alias |
|---|---|---|---|
| Therapy | Damian | QF9HJC7XWnue5c9W3LkY |
local/qwen3-fast |
| General Info | Chris (British) | HfRP3cIhYLmeNHeTvkWK |
writer/palmyra-x5-voice |
| Meditation | Nathaniel | pFQStpMdprGFILRDrWR2 |
local/qwen3-fast |
| Pinoy Pride | Tita | smYFzUb4yrSqprnml7n5 |
local/qwen3-fast |
The frontend sends the selected persona to /api/connection-details. The backend encodes
that selection into LiveKit token metadata and room naming so the worker can load the
correct system prompt, ElevenLabs voice, and LiteLLM model.
Backend:
cd backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn main:app --host 127.0.0.1 --port 8030 --reloadFrontend:
cd frontend
npm install
cp .env.example .env.local
npm run dev -- --port 3006Open http://localhost:3006.
cd backend && uvicorn main:app --host 127.0.0.1 --port 8030 --reloadcd frontend && npm run dev -- --port 3006- Confirm the persona selector shows all four personas.
- Select Damian and connect.
- Confirm Deepgram Nova-3 interim captions are visible.
- Confirm ElevenLabs Flash v2.5 playback and speaking animation.
- Confirm backend logs show
http://localhost:4000, notapi.openai.com. - Confirm Therapy uses
local/qwen3-fast. - Switch to Chris and confirm model routing changes to
writer/palmyra-x5-voice. - Confirm deploy artifacts exist in
deploy/. - Run
bash -n deploy/schubert-preflight.sh.
Read docs/AGENTS.md before making further changes.