La Suite Meet Documentation
repository·main·Indexed 24 days ago
https://github.com/suitenumerique/meetAn open-source, self-hostable video conferencing platform powered by LiveKit. Features include support for 100+ participants, screen sharing, secure chat, and telephony integration. Documentation covers installation via Kubernetes, Docker Compose, Scalingo, Nix, and YunoHost, as well as configuring Keycloak for OIDC authentication and Nginx proxy for SSL termination.
What's inside La Suite Meet
- La Suite Meet is a simple, high-performance video conferencing solution powered by LiveKit. It is designed to provide Zoom-level performance with high-quality video and audio, accessible directly via a web browser without requiring installation. It is fully self-hostable and released under the MIT License.
Room Recording (Beta) Overview
mainLa Suite Meet provides a room recording feature (currently in beta) that allows users to record their video conferencing sessions.
Key behaviors:
- When a recording finishes, the room owner is notified via email with a download link.
- Recordings are automatically deleted after a period defined by the
RECORDING_EXPIRATION_DAYSenvironment variable. - The feature uses LiveKit Egress to capture the session.
Current Limitations:
- Simultaneous recording and transcription are not supported.
- Recording layout is fixed: it captures the active speaker and any shared screens (frontend configuration is not yet available).
- Shareable links with embedded video players are not yet supported.
Understand LiveKit signaling requirements
mainSignaling is the mechanism used by LiveKit to enable real-time communication. It allows peers to discover each other, exchange session descriptions, and negotiate network paths for audio and video streams.
LiveKit signaling relies on a WebSocket connection between the client and the LiveKit API server. This WebSocket is mandatory for all signaling messages, including:
- Session descriptions
- ICE candidates
- Connection state updates
If the WebSocket connection is lost, the client will automatically attempt to resume the RTC (Real-Time Communication) session once connectivity is restored.
How the transcription workflow works
mainThe transcription process is an asynchronous pipeline triggered after a recording is completed. The flow follows these steps:
- Trigger: The Backend API sends a
POST /api/v1/tasks/request to the Summary Service. The payload includesowner_id,filename,email,sub,room,recording_date, andrecording_time. - Queueing: The Summary Service registers a task in the
transcribe-queuevia Celery. - Processing: A Celery worker fetches the audio file from MinIO (Object Storage).
- Transcription: The worker sends the audio to the WhisperX API, which returns a segmented transcript.
- Formatting: The worker formats the transcript into text.
- Delivery: The worker sends a
POST /create-for-ownerrequest to LaSuite Docs (containingtitle,content,email,sub, andapi token) to generate the final document for the room owner.
- Trigger: The Backend API sends a
How Room Recording Works
mainThe recording lifecycle follows this sequence:
- Start: The user clicks 'start recording' in the React frontend, which calls
POST /api/v1.0/rooms/{id}/start-recording/on the Django backend. The backend requests a room composite egress from the LiveKit API. - Recording: LiveKit Egress joins the room as a participant to capture audio and video. The frontend updates the recording status and notifies other participants via the LiveKit data channel.
- Stop: The user clicks 'stop recording', triggering
POST /api/v1.0/rooms/{id}/stop-recording/. The backend instructs LiveKit to stop the egress. - Upload & Notify: Egress uploads the file to Object Storage. The storage provider sends a webhook notification to the backend. The backend updates the recording status to
SAVEDand sends an email to the room owner. - Download: The owner receives an email and can navigate to
/recording/{id}to download the file.
sequenceDiagram participant User participant Frontend as Frontend (React) participant Backend as Django Backend participant LiveKit as LiveKit API participant Egress as LiveKit Egress participant Storage as Object Storage participant Room as LiveKit Room participant Email as Email Service User->>Frontend: Click start recording button Frontend->>Backend: POST /api/v1.0/rooms/{id}/start-recording/ Backend->>LiveKit: Create egress request LiveKit->>Egress: Start room composite egress Egress->>Room: Join room as recording participant Note over Egress,Room: Egress joins room to capture audio/video LiveKit-->>Backend: Return egress_id Backend->>Backend: Update Recording with worker_id Backend-->>Frontend: HTTP 201 - Recording started Frontend->>Frontend: Update recording status Frontend->>Frontend: Notify other participants Note over Frontend: Via LiveKit data channel Note over Egress,Room: Recording in progress... User->>Frontend: Click stop recording button Frontend->>Backend: POST /api/v1.0/rooms/{id}/stop-recording/ Backend->>LiveKit: Stop egress request LiveKit->>Egress: Stop recording Egress->>Storage: Upload recorded file Storage->>Backend: Storage event notification Backend->>Backend: Update Recording status to SAVED Backend->>Email: Send notification to room owner Backend-->>Frontend: HTTP 200 - Recording stopped Frontend->>Frontend: Update UI and notify participants Email->>User: Send email with recording link User->>Frontend: Navigate to /recording/{id} to download file Frontend->>Frontend: Download recording file- Start: The user clicks 'start recording' in the React frontend, which calls
Understand session management and duration
mainAfter a successful OIDC login, authentication is maintained via a Django session cookie.
By default, the session duration is set to 12 hours. If you are self-hosting or configuring the backend, you can adjust this duration using the
SESSION_COOKIE_AGEsetting to align with your organization's security policies.How Telephony SIP works: Room Lifecycle and Participant Calling
mainRoom Lifecycle
- The Backend creates a new room and assigns a unique PIN code.
- Upon receiving a
room_startedwebhook from LiveKit, the Backend creates a LiveKit SIP dispatch rule. - When the room ends (
room_endedwebhook), the Backend clears the SIP dispatch rule.
Participant Calling Flow
- A Caller dials the phone number provided by the SIP Trunk Provider.
- The SIP Trunk Provider routes the call to the LiveKit SIP server.
- LiveKit SIP prompts the Caller for the room PIN code.
- The Caller enters the PIN code.
- LiveKit SIP checks the SIP Dispatch rule for a matching PIN and trunk ID.
- If found, the SIP Dispatch returns the room ID, and LiveKit SIP connects the participant to the LiveKit Room.
Understand the Recording and Transcription features
mainThe Experimental Stack's functionality is driven by the Recording and Transcription features. For detailed implementation details and usage, refer to the specific feature documentation:
- Recording feature: Recording feature documentation
- Transcription feature: Transcription feature documentation
Understand the Visio architecture
mainVisio is composed of four primary running components and several supporting services. Understanding this relationship is key to local development.
Core Components
- React frontend: Built with Vite.js.
- Django server: The primary backend.
- LiveKit server: Handles video/audio communication.
- FastAPI server: (Optional) Required for AI beta features.
Supporting Services
- PostgreSQL: Stores data (users, rooms, recordings).
- Redis: Used for caching and inter-service communication.
- MinIO: Stores files such as room recordings.
- Celery workers: (Optional) Required for meeting transcriptions (AI beta features).
Understand the Add-on Authentication Flow
mainThe
TokenExchangeServiceimplements a multi-step handshake to securely exchange a temporary session for a JWT access token. The lifecycle follows these stages:- Initialization: Call
init_session()to create aPENDINGsession. This returns atransit_token, asession_id, and acsrf_token. - Transit Consumption: The client must use the
transit_tokento callconsume_transit_token(transit_token). This marks the token asCONSUMEDand returns thesession_id. This step prevents replay attacks; if aCONSUMEDtoken is used again, the associated session is immediately evicted from the cache. - Authentication: Once the transit token is consumed, the backend calls
set_access_token(user, session_id). This transitions the session state fromPENDINGtoAUTHENTICATEDand stores the JWT in the cache. - Token Retrieval: The client calls
get_session(session_id)to retrieve the public session data (includingaccess_token,token_type,expires_in, andscope).
Note:
get_sessionperforms a one-time read forAUTHENTICATEDsessions; once the token is retrieved, the session is evicted from the cache to ensure the token is only fetched once.- Initialization: Call
Key features of La Suite Meet
mainLa Suite Meet includes the following features:
- Meeting Stability: Optimized for large meetings with 100+ participants.
- Screen Sharing: Support for multiple simultaneous screen sharing streams.
- Chat: Non-persistent, secure chat functionality.
- Security: Robust authentication, access control, and upcoming end-to-end encryption.
- Meeting Tools: Meeting recording, and meeting transcription & summary (currently in beta).
- Integrations: Telephony integration.
- Customization: Customizable frontend style.
- LiveKit Advanced Features: Speaker detection, simulcast, end-to-end optimizations, selective subscription, and SVC codecs (VP9, AV1).
Understand OIDC authentication in La Suite Meet
mainLa Suite Meet uses OIDC (OpenID Connect) authentication via the Authorization Code Flow. The authentication process, including token validation and user management, is handled by thedjango-lasuitecomponent.