Ownership rules

The platform is five repos. Each has a clean primary job, so most bugs become easier once you place them in the right repo.
ProblemStart in
Call audio, STT/LLM/TTS, tool execution, transfer tool, voicemail, dead air, post-call packagingvoxcore
Bot config, API auth, calls table, campaigns API, CRM fetch/push, fleet selection, recordings, API keysvoxbridge
Form behavior, dashboard display, filters, campaign wizard, bot builder, agent consolevoxui
Campaign pacing, SIP dial attempts, AMD screening, retry scheduling, attach-to-worker failuresvoxdialler
Browser call widget, web token fetch, in-page call UIvohci-widget

VoxCore

Primary files:
FileWhy it matters
src/voxcore/app.pyFastAPI app, lifespan, call tracker, result outbox, Agent Desk outbox.
src/voxcore/pipeline/factory.pyMain Pipecat pipeline assembly. Start here for call behavior.
src/voxcore/pipeline/live_prompt_cache.pyLive prompt cache registry: Gemini CachedContent create/refresh, bounded LRU, version-based invalidation.
src/voxcore/pipeline/tool_runtime.pyCustom HTTP tool execution and telemetry.
src/voxcore/routes/ws.pyiCallMate WebSocket inbound.
src/voxcore/routes/livekit.pyLiveKit SIP inbound.
src/voxcore/routes/dialout.pyLiveKit SIP outbound.
src/voxcore/routes/exotel.pyExotel Voicebot applet WebSocket inbound.
src/voxcore/routes/_post_call.pyShared post-call finalization, auto dispositions, analysis, QC, webhook dispatch.
src/voxcore/processors/post_call.pyLLM post-call analysis and QC. Caches genai.Client; do not create one per call.
src/voxcore/models/config.pyRuntime config contract from VoxBridge to VoxCore.
VoxCore should not own durable customer/business state. It may write temporary outbox files and upload recordings, but VoxBridge remains the source of truth.

VoxBridge

Primary files:
FileWhy it matters
src/voxbridge/app.pyFastAPI app, Mongo/Redis startup, indexes, routes, trunk health loop.
src/voxbridge/routes/config.pyRuntime config endpoint consumed by VoxCore.
src/voxbridge/services/config_service.pyBuilds bot runtime config and call skeletons.
src/voxbridge/routes/results.pyReceives VoxCore call results.
src/voxbridge/services/call_service.pyStores calls and pushes CRM post-call payloads.
src/voxbridge/routes/sip.pyCRM/admin dialout endpoint and VoxCore SIP lookup helpers.
src/voxbridge/services/fleet_service.pyCurrent outbound fleet selection.
src/voxbridge/routes/campaigns.pyCampaign CRUD, upload, lifecycle actions, attempt report.
src/voxbridge/services/knowledge_*KB upload, chunking, embedding, Qdrant search.
VoxBridge should not run live media pipelines. It should issue config, store state, coordinate actions, and expose APIs.

VoxUI

Primary files:
FileWhy it matters
src/App.tsxRoute map and role-based layouts.
src/pages/BotCreate.tsx / src/pages/BotDetail.tsxBot builder and edit workflow.
src/hooks/useBotForm.tsBot form state, defaults, serialization, validation.
src/pages/CampaignCreate.tsx / src/pages/CampaignDetail.tsxCampaign setup and monitoring.
src/pages/Settings.tsxSystem settings, API keys, fleet URLs, provider keys, MinIO, Agent Assist.
src/components/bot/IntegrationTab.tsxBot-specific CRM integration guide.
src/pages/KnowledgeBases.tsxKB management.
VoxUI should not hard-code client-specific logic. Client/brand differences belong in brand config and build-time assets.

VoxDialler

Primary files:
FileWhy it matters
src/voxdialler/main.pyProcess entrypoint, health server, graceful shutdown.
src/voxdialler/loop.pyCampaign scheduling loop and state machine.
src/voxdialler/fleet.pyPolls VoxCore fleet capacity and reserves best worker.
src/voxdialler/sip_dialler.pyCreates LiveKit rooms and dials SIP participants.
src/voxdialler/attacher.pyAttaches answered LiveKit rooms to VoxCore workers.
src/voxdialler/amd.pyAnswering machine detection screening.
src/voxdialler/pacing.pyPredictive pacing formula and abandon-rate brake.
src/voxdialler/metrics.pyPer-campaign rolling-window answer_rate, AHT, and abandon_rate.
src/voxdialler/rate_limiter.pyPer-carrier CPS token bucket (GCRA-style) keyed by carrier/trunk.
src/voxdialler/trunks.pyOutboundTrunkResolver + TrunkResolution; VoxBridge trunk lookup and per-carrier CPS/burst/channels.
src/voxdialler/circuit_breaker.pyPer-dependency async circuit breaker (closed/open/half-open) for fleet/SIP/Bridge calls.
src/voxdialler/health.pyLiveness (tick staleness → 503) and /metrics endpoints.
VoxDialler is intentionally separate from VoxBridge so campaign dispatch can evolve independently from the API server.

vohci-widget

The fifth repo is an embeddable browser call widget (React 19 + LiveKit client, built with Vite). It is mounted on a host page via window.Vohci.init({ botId, apiKey, label }), fetches a LiveKit access token, and opens a WebRTC call into a LiveKit room. VoxCore handles the room as a bot call through the /livekit/widget route and the same pipeline/post-call path as other transports. Primary files:
FileWhy it matters
src/index.tsxGlobal Vohci.init entry; mounts the widget on a host page.
src/Widget.tsxCall state machine, LiveKit Room lifecycle, mic track, agent state.
src/token.tsFetches the LiveKit access token used to join the room.
src/CallCard.tsx / src/Controls.tsx / src/AuraVisualizer.tsxCall UI, controls, and audio visualizer.
The widget owns no business state; it is a thin client that authenticates and joins a room. Bot config, auth, and results stay in VoxBridge/VoxCore.