Lingvo
Two products on one backend: realtime speech translation and AI meeting notes.
01 Problem
Live cross-language conversation and meeting intelligence share a backend but have very different latency profiles: one needs realtime STT → MT → TTS on the audio path, the other needs structured summaries, action items and decisions extracted after the call. Both had to run on the same Django core with shared billing and identity.
02 What I built
A single Django + DRF + Celery backend serving two Next.js frontends (Translator and Meetings). WebRTC media runs through a LiveKit SFU; a separate Pipecat agent on a GPU box joins each room over WSS and runs the realtime pipeline, dispatched via Redis pub/sub and reporting usage back to the backend. Meetings add a note-taker pipeline plus Celery tasks that generate summaries and extract action items / decisions, and a Beat task that builds a pre-meeting brief via RAG over recent meetings (pgvector embeddings). Payments sit behind Cryptomus and YooKassa adapters with idempotent, monotone webhook processing.
- One Django backend serves two Next.js products (translator + meetings) with shared identity and billing
- Realtime STT → MT → TTS via a Pipecat GPU agent over a LiveKit SFU, dispatched through Redis pub/sub
- Meeting summaries, action items and decisions extracted by Celery; pre-meeting briefs via RAG over pgvector
- Idempotent, monotone payment webhooks behind Cryptomus / YooKassa adapters
03 Result
One backend cleanly carries two products with different realtime constraints; the audio path stays on LiveKit while control runs over a Tailscale mesh, and meeting knowledge is searchable via vector embeddings. Decisions are recorded as ADRs.