Architecture¶
LaSuite Meet is a multi-service application. Understanding its components helps you deploy it correctly and debug issues when they arise.
Components overview¶
graph TB
Browser["Browser\nReact / TypeScript"]
OIDC["OIDC Provider\nKeycloak · Authentik · Google…"]
subgraph backend_layer["Application"]
Backend["Django Backend"]
Celery["Celery Worker"]
end
subgraph media_layer["Media"]
LiveKit["LiveKit Server"]
Egress["LiveKit Egress"]
Summary["Summary Service\n(optional - transcription & AI)"]
end
subgraph storage_layer["Storage"]
PostgreSQL["PostgreSQL"]
Redis["Redis"]
ObjectStore["S3"]
end
Browser -->|REST API| Backend
Browser -->|WebRTC| LiveKit
Browser -->|OIDC login| OIDC
OIDC -->|tokens| Backend
Backend --> PostgreSQL
Backend --> Redis
Backend -->|Egress API| LiveKit
Backend --> ObjcectStore
Celery --> Redis
LiveKit --> Redis
Egress -->|writes recording| ObjectStore
ObjectStore -->|storage webhook| Backend
Summary -->|downloads from| ObjectStore
Summary -->|reports results| Backend
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 ObjectStore
- 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 ObjectStore. 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 object storage 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 |
| ObjectStore / S3-compatible | Object storage for recordings and uploads | 9000 |
Authentication flow¶
sequenceDiagram
participant B as Browser
participant F as Meet Frontend
participant BE as Meet Backend
participant KC as OIDC Provider
participant LK as LiveKit
B->>F: Visit meet.example.com
F->>BE: Check session
BE-->>F: 401 - not authenticated
F->>B: Redirect → OIDC provider
B->>KC: Authenticate
KC-->>B: Redirect → /api/v1.0/callback/?code=…
B->>BE: GET /api/v1.0/callback/?code=…
BE->>KC: Exchange code for tokens
KC-->>BE: ID token + access token
BE->>BE: Create / update user record
BE-->>B: Session cookie, redirect → Meet
B->>F: Load Meet (authenticated)
F->>BE: POST /api/v1.0/rooms/{id}/token/
BE-->>F: LiveKit JWT
F->>LK: Connect via WebRTC
Recording flow¶
sequenceDiagram
participant U as Room owner
participant BE as Backend
participant LK as LiveKit Server
participant EG as LiveKit Egress
participant S3 as ObjectStore
participant Mail as SMTP
U->>BE: Start recording
BE->>LK: Create room composite egress
LK->>EG: Spawn recording worker
EG-->>LK: Join room, capture A/V
U->>BE: Stop recording
BE->>LK: Stop egress
EG->>S3: Upload recording file
LK-->>BE: Webhook: egress ended
S3-->>BE: Webhook: file uploaded (/storage-hook/)
BE->>BE: Set status → saved
BE->>Mail: Send download link to owner
Mail-->>U: Email with download link
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 object storage
- 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