Voice-first email assistant with real-time audio conversation, inbox search, message analysis, and reply workflows.
- Lets users talk naturally to manage inbox tasks.
- Supports accurate counting and filtering across large email sets.
- Classifies email breakdowns (spam, important, personal, automated, work, other).
- Reads and summarizes message content.
- Processes common attachment types (PDF, image, Word, Excel, text).
- Supports safety controls (permissions, exclusions, limits).
- Supports user profile credential configuration from the UI.
Browser (React + Vite)
- UI state, transcript rendering, conversation history
- WebSocket audio client
- Settings/Profile UI (safety + credentials)
|
| WebSocket (/ws/audio) + REST (/api/*)
v
Backend (FastAPI + Pipecat pipeline)
- STT (speech-to-text)
- LLM orchestration + tool calling
- TTS (text-to-speech)
- Tool execution (email + attachments)
- Conversation/state APIs
- Profile and safety settings APIs
|
+--> Nylas API (email access)
+--> SQLite (conversations + settings + profile)
- Frontend connects to
/ws/audio. - User speech is streamed as PCM audio.
- Backend transcribes speech and sends text to the LLM context.
- LLM calls tools when needed (
search_emails,count_emails,get_email_breakdown, etc.). - Tool results are sent back through the same conversation turn.
- Assistant response is synthesized to audio and streamed to client.
- Transcript, tool activity, ETA, and email card payloads update in real time.
search_emails: filtered search with sampled result payload + optional exact total count.count_emails: exact count with pagination across full matching dataset.get_email_breakdown: exact categorized breakdown across full matching dataset.get_email_details: full content for a selected message.list_unread: unread list for quick triage.send_reply: create draft or send reply.mark_as_read: update message read state.read_attachment: analyze supported attachments.
- Permission toggles for sending, reading, marking, deleting, archiving.
- Exclusion lists for senders/folders/subject keywords.
- Max emails-per-search control.
- Sensitive-content handling toggle.
- Display name management.
- Provider credential status (configured + source).
- Credential updates via UI (
Settingsmodal). - Runtime resolves credentials profile-first, then environment fallback.
- Conversation:
GET /api/conversationsPOST /api/conversationsGET /api/conversations/{id}GET /api/conversations/{id}/messagesPOST /api/conversations/{id}/messagesDELETE /api/conversations/{id}
- Settings:
GET /api/settingsPUT /api/settings
- Profile:
GET /api/profilePUT /api/profilePUT /api/profile/credentials
- Health:
GET /GET /health
- Audio:
WS /ws/audio
- Python 3.10+
- Node.js 18+
- API credentials for:
- Anthropic
- Nylas
- Deepgram
- Cartesia
From repo root:
- Windows (PowerShell):
.\bootstrap.ps1- macOS/Linux:
bash ./bootstrap.shThis command creates the backend virtual environment, installs backend/frontend dependencies, and creates backend/.env from .env.example if missing.
It then prompts for any missing API keys, starts backend + frontend, waits for readiness, and opens http://localhost:5173.
Setup-only mode (skip starting services):
- Windows:
.\bootstrap.ps1 -SetupOnly - macOS/Linux:
bash ./bootstrap.sh --setup-only
cd backend
python -m venv venv
# Windows:
venv\Scripts\activate
# macOS/Linux:
# source venv/bin/activate
pip install -e .Copy env template and configure:
cp .env.example backend/.envRequired backend env values:
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=
NYLAS_API_KEY=
NYLAS_CLIENT_ID=
NYLAS_CLIENT_SECRET=
NYLAS_GRANT_ID=
NYLAS_SID=
DEEPGRAM_API_KEY=
CARTESIA_API_KEY=
HOST=0.0.0.0
PORT=8000
FRONTEND_URL=http://localhost:5173NYLAS_GRANT_ID is primary. NYLAS_SID is accepted as a compatibility alias.
Run backend:
cd backend
python -m app.maincd frontend
npm install
npm run devOpen http://localhost:5173.
- Terraform implementation is under
terraform/. - Step-by-step rollout plan is in
terraform_plan.md.
backend/
app/
main.py
config.py
models/
services/
pipecat_bot/
frontend/
src/
components/
hooks/
services/
store/
terraform/
*.tf