Architecture¶
La Suite Meet is a multi-service application. Understanding its components helps you deploy it correctly and debug issues when they arise.
Components overview¶
┌─────────────────────────────────────────────────────────┐
│ Browser │
│ React Frontend (Vite.js / TypeScript) │
└────────────┬──────────────────────────┬─────────────────┘
│ REST API │ WebRTC (LiveKit SDK)
▼ ▼
┌────────────────────┐ ┌─────────────────────────────┐
│ Django Backend │ │ LiveKit Server │
│ (Python / DRF) │◄────►│ (WebRTC SFU / media) │
└────────┬───────────┘ └──────────┬──────────────────┘
│ │
│ ┌──────────▼──────────┐
│ │ LiveKit Egress │
│ │ (recording/streaming)│
│ └──────────┬──────────┘
│ │
┌────────▼────────┐ ┌───────────▼──────────┐
│ PostgreSQL │ │ Garage / S3 │
│ (rooms, users, │ │ (recordings, uploads)│
│ recordings) │ └──────────┬────────────┘
└─────────────────┘ │
┌──────────▼──────────┐
┌────────────────┐ │ Summary Service │
│ Redis │◄───────►│ (FastAPI + Celery) │
│ (cache/broker) │ │ transcription & AI │
└────────────────┘ └─────────────────────┘
Services¶
React Frontend¶
- Technology: TypeScript, React, Vite.js, React Aria (Adobe)
- Role: The browser-based UI. Connects to the Django backend via REST for authentication, room management, and recording state. Connects directly to LiveKit using the LiveKit JavaScript SDK for all real-time media (video, audio, screen sharing, chat).
- Port: 3000 (dev) / 8080 (production container)
Django Backend¶
- Technology: Python 3.13+, Django 5.x, Django REST Framework, Celery
- Role: Central API server. Handles:
- User authentication (OIDC/OAuth2)
- Room creation and access control
- Issuing LiveKit JWT tokens to clients
- Recording lifecycle management (start/stop/webhook)
- S3 webhook processing from Garage/S3
- Port: 8000
LiveKit Server¶
- Technology: Go (open source, by LiveKit Inc.)
- Role: The WebRTC Selective Forwarding Unit (SFU). Receives media streams from participants and selectively forwards them. Handles all real-time signaling, simulcast, codec negotiation, and TURN/STUN.
- Ports: 7880 (HTTP/WebSocket), 7881 (TCP), 7882/UDP (RTP/RTCP)
LiveKit Egress¶
- Technology: Go (open source, by LiveKit Inc.)
- Role: Records rooms or individual tracks to files. Saves output to Garage/S3. Triggered by the Django backend via LiveKit's Egress API.
- Dependency: Requires Redis (shared with LiveKit server)
Summary Service¶
- Technology: Python, FastAPI, Celery
- Role: Optional AI service for transcription and meeting summarization. Uses Whisper (or compatible STT engines) for speech-to-text, and an LLM API for summarization. Runs two separate Celery queues:
transcribe-queueandsummarize-queue. - Port: 8000 (internal)
Metadata Collector Agent¶
- Technology: Python (LiveKit Agents SDK)
- Role: Connects to LiveKit rooms and collects metadata events: Voice Activity Detection (VAD), participant connection/disconnection events, chat messages. Stores metadata in Garage/S3 for later processing by the summary service.
Backing services¶
| Service | Purpose | Default port |
|---|---|---|
| PostgreSQL 16 | Relational data (users, rooms, recordings) | 5432 |
| Redis 5+ | Celery broker, LiveKit state, session cache | 6379 |
| Garage / S3-compatible | Object storage for recordings and uploads | 3900 |
Authentication flow¶
- User visits the Meet frontend
- Frontend redirects unauthenticated users to the configured OIDC provider (e.g., Keycloak, ProConnect)
- After login, the OIDC provider issues tokens back to the frontend
- The frontend exchanges these tokens with the Django backend
- Django validates the token, creates/updates the user record, and returns a LiveKit JWT
- The frontend uses the LiveKit JWT to connect to the LiveKit server
Recording flow¶
- A room owner triggers recording from the UI
- Frontend calls
POST /api/v1.0/recordings/on the Django backend - Django calls the LiveKit Egress API to start room composite recording
- Egress writes the recording file to Garage/S3
- Garage fires a webhook to
POST /api/v1.0/recordings/storage-hook/when the file arrives - Django processes the webhook, updates the recording record, and makes the file downloadable
Transcription flow (beta)¶
- Recording completes (or transcription is started independently)
- Django backend triggers the Summary service with the audio/video file location
- Summary service downloads the file from Garage
- Celery worker on
transcribe-queueruns Whisper STT - Celery worker on
summarize-queuecalls the configured LLM API - Results are stored and made available for download via the Django API