Skip to content

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-queue and summarize-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

  1. User visits the Meet frontend
  2. Frontend redirects unauthenticated users to the configured OIDC provider (e.g., Keycloak, ProConnect)
  3. After login, the OIDC provider issues tokens back to the frontend
  4. The frontend exchanges these tokens with the Django backend
  5. Django validates the token, creates/updates the user record, and returns a LiveKit JWT
  6. The frontend uses the LiveKit JWT to connect to the LiveKit server

Recording flow

  1. A room owner triggers recording from the UI
  2. Frontend calls POST /api/v1.0/recordings/ on the Django backend
  3. Django calls the LiveKit Egress API to start room composite recording
  4. Egress writes the recording file to Garage/S3
  5. Garage fires a webhook to POST /api/v1.0/recordings/storage-hook/ when the file arrives
  6. Django processes the webhook, updates the recording record, and makes the file downloadable

Transcription flow (beta)

  1. Recording completes (or transcription is started independently)
  2. Django backend triggers the Summary service with the audio/video file location
  3. Summary service downloads the file from Garage
  4. Celery worker on transcribe-queue runs Whisper STT
  5. Celery worker on summarize-queue calls the configured LLM API
  6. Results are stored and made available for download via the Django API