← War Room
</> Technical Specification

Tech Spec

FastAPI + Postgres + Next.js. Full backend architecture, API endpoints, data model, integrations, and open decisions. Source: repo README.

Python + FastAPI
Postgres
Next.js
Clerk Auth
Telegram
Twilio
ElevenLabs
Docker

What's Built vs What's Left

Auth (Clerk) Done
Clerk JWT auth + dev fallback via X-Dev-User-Sub header. Lazy-create user on first authenticated request.
Onboarding Done
Session + answers upsert, voice note upload (stored locally), persona selection stored as onboarding answer.
Goals Done
Goal templates (weight_loss, get_fit) seeded. Create/list/update goals via API.
Commitments Done
Contract creation + signing, invite links (single-use, 7-day expiry), public accountability view via access_token.
Compliance Done
Compliance events + window-based score (30d). Used for public views + bet settlement.
Betting Done
Guests bet for/against commitment. Owner settles bets at contract end. Money rails via Stripe TODO.
Telegram Linking Only
Link code creation + webhook consumption works. Outbound nudges and scheduling TODO.
Wearables Manual
Store tokens for Oura/Whoop. Upsert/list daily summaries. OAuth flow and auto-sync TODO.
Voice Calls Scaffold
Twilio outbound endpoint + voice webhook + ElevenLabs TwiML helper. Needs env vars + public URL.
Payments Stub
Placeholder payment intent for commitment deposits. Full Stripe integration TODO.
Dashboard API Done
GET /dashboard returns today's summary + 7/30 day trends from wearable data.
WhatsApp TODO
Phase 2. Twilio WhatsApp number + webhook. 24h service window + template approval needed.

MVP Path

Onboarding
Questions + voice
Commitment
Sign + invite
Telegram
Link + nudges
Wearables
Oura / Whoop
Dashboard
Trends + plan

Onboarding Data Captured

Identity
Name, email/phone, locale, timezone, preferred language
Body Metrics
Height, weight, target weight, body fat% (optional)
Health Context
Injuries, conditions, medications, contraindications
Lifestyle
Schedule, sleep, work type, activity level, gym access, equipment
Preferences
Coaching style (supportive/strict/humor), profanity Y/N, persona choice
Commitment
Stake type (money/family/friends), sign contract, invite accountability

28 Endpoints Implemented

MethodPathDescription
GET/meCurrent user info
POST/onboarding/sessionsCreate onboarding session
POST/onboarding/sessions/{id}/answersUpsert answers
POST/onboarding/sessions/{id}/voiceUpload voice note
POST/onboarding/sessions/{id}/completeComplete onboarding
GET/goals/templatesList goal templates
POST/goalsCreate goal
GET/goalsList user goals
PATCH/goals/{id}Update goal
POST/commitments/contractsCreate contract
POST/commitments/contracts/{id}/signSign contract
POST/commitments/contracts/{id}/invite-linksCreate invite link
POST/commitments/invite-links/{token}/acceptAccept invite
GET/public/accountability/{token}Guest accountability view
GET/public/betting/{token}Guest betting view
POST/public/betting/{token}/betsPlace a bet
GET/bets/contracts/{id}List bets on contract
POST/bets/contracts/{id}/settleSettle bets
POST/compliance/eventsCreate compliance event
GET/compliance/window/30d30-day compliance score
POST/wearables/{provider}/connectStore wearable tokens
GET/wearables/connectionsList connections
POST/wearables/{provider}/daily-summariesUpsert daily data
GET/wearables/{provider}/daily-summariesGet daily data
GET/dashboardDashboard summary
POST/telegram/link-codeGenerate link code
POST/integrations/telegram/webhookTelegram webhook
POST/calls/outboundTrigger outbound call

Postgres Schema (14 Tables)

👤 users
id pk
timezone text
locale text
coaching_style enum
profanity_ok bool
🔑 auth_identities
id pk
user_id fk
provider text
provider_subject unique
📋 onboarding_sessions
id pk
user_id fk
status enum
completed_at ts
📄 onboarding_answers
id pk
session_id fk
question_key text
answer jsonb
🎤 voice_assets
id pk
session_id fk
storage_url text
transcript_text text
🎯 user_goals
id pk
user_id fk
template_id fk?
config jsonb
status enum
📜 commitment_contracts
id pk
user_id fk
stake_type enum
stake_config jsonb
effective_from/to ts
compliance_events
id pk
user_id fk
type text
data jsonb
💱 contract_bets
contract_id fk
viewer_id fk
side for/against
amount_cents int
status enum
wearable_connections
id pk
user_id fk
provider enum
tokens (enc) text
last_synced_at ts
📈 daily_summaries
id pk
user_id fk
provider enum
day date
data jsonb
💬 user_channels
id pk
user_id fk
type tg/wa/phone
address text
verified bool
🔔 nudge_attempts
id pk
user_id fk
reason text
status enum
sent_at ts
🚨 emergency_sessions
id pk
user_id fk
trigger_channel enum
context jsonb
outcome jsonb

External Services

💬
Telegram Phase 1
Bot via BotFather. Webhook at /integrations/telegram/webhook. User links via one-time code. Nudges (scheduled + reactive) TODO.
📲
WhatsApp Phase 2
Twilio WhatsApp number. 24h service window constraint. Needs pre-approved templates for outbound. Same linking flow as Telegram.
📞
Voice Calls Scaffold
Twilio telephony + ElevenLabs voice agents. Outbound call endpoint + voice webhook implemented. Needs env vars + public URL to activate.
Wearables Manual
Oura + Whoop. Manual token connect works. OAuth flow, auto-sync, and webhook listeners TODO. Daily summaries stored as JSONB.
💰
Payments (Stripe) Stub
Placeholder payment intent for commitment deposits. Full checkout flow, refund logic, and payout rails TODO.

Key Architecture Decision

Option A: Twilio + Custom Agent
Twilio handles calls, audio streamed via WebSockets (Media Streams). Your server runs STT + agent + TTS. Max control, swap vendors freely. More engineering.
Option B: Realtime Speech-to-Speech
Twilio for PSTN edge, realtime model handles conversation. Fewer moving parts, more natural. Vendor dependency, careful interruption handling.
Option C: Voice Notes Only (MVP)
User uploads voice note, backend stores + transcribes. Simplest path. No telephony complexity. Great for onboarding depth but not a "call".
Current implementation: Twilio outbound + ElevenLabs register-call for TwiML. This is Option B with ElevenLabs as the voice agent. Needs env vars to go live.

All Required Config

🔑 Auth (Clerk)
CLERK_JWKS_URLJWKs endpoint for JWT verification
CLERK_ISSUERToken issuer
CLERK_AUDIENCEOptional audience enforcement
🗃 Database
DATABASE_URLPostgres connection string
💬 Telegram
TELEGRAM_BOT_TOKENFrom BotFather
TELEGRAM_WEBHOOK_SECRETOptional, recommended
⏱ Wearables
OURA_CLIENT_ID
OURA_CLIENT_SECRET
WHOOP_CLIENT_ID
WHOOP_CLIENT_SECRET
📞 Voice (Twilio + ElevenLabs)
TWILIO_ACCOUNT_SID
TWILIO_AUTH_TOKEN
TWILIO_FROM_NUMBERE.164 format
TWILIO_VOICE_WEBHOOK_URLPublic URL
ELEVENLABS_API_KEY
ELEVENLABS_DEFAULT_AGENT_ID
💰 Payments (Stripe)
STRIPE_SECRET_KEY
STRIPE_WEBHOOK_SECRET
STRIPE_SUCCESS_URL
STRIPE_CANCEL_URL

Questions to Resolve

MVP path priority?
Onboarding → Telegram nudges, OR onboarding → wearables dashboard, OR emergency button first?
Product
Wearables optional?
Can users use the app without Oura/Whoop (manual mode)?
Product
Voice stack selection
Twilio + custom agent vs realtime speech-to-speech vs voice notes only for MVP?
Tech
Job runner
Celery+beat vs ARQ vs APScheduler vs cron hitting endpoints?
Tech
Agent orchestration
Tool calling inside app vs MCP servers for integrations?
Tech
Languages day-1?
English + French? Turkish? Vietnamese? Affects voice personas and content.
Product
Commitment model
Pick one stake (money/family/friends) or combine? Failure payout rules?
Product
Medical vs wellness
Stay wellness to avoid regulated medical advice claims? Affects compliance path.
Voice personas & rights
Original voices only (no celebrity impersonation). Explicit opt-in for harsh/profane style.
Data retention
Voice recordings: 7 days, 30 days, or forever? "Delete my data" self-serve day-1?
WhatsApp provider
Twilio vs Meta Cloud API direct? Template approval flow needed.
Tech
Compliance scoring
Exact thresholds: workouts/week + nutrition check-ins + sleep targets for pass/fail?
Product

Priority TODO

Voice: Configure Twilio + ElevenLabs
Create API keys, configure agent IDs, expose webhook publicly (ngrok/prod), trigger test outbound call.
Telegram: Implement nudge scheduling
Outbound nudges (daily check-in, missed workout, low recovery). Job runner decision needed first.
Wearables: OAuth flow
Replace manual token connect with proper OAuth for Oura and Whoop. Auto-sync periodic pulls.
Payments: Stripe integration
Commitment deposit capture, refund flow on success, payout rails for accountability buddies.
DB Migrations: Alembic
Replace create_all() with proper Alembic migrations for production readiness.
Voice transcription
Transcribe + summarize uploaded voice notes. Provider decision: OpenAI Whisper vs Deepgram.
Dev Quickstart
docker compose up --build
# API: http://localhost:8000/docs
# Web: http://localhost:3000

# Generate frontend types:
cd frontend && npm run gen:types