La Suite Meet Documentation

repository·main·Indexed 24 days ago

https://github.com/suitenumerique/meet

An 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.

Tokens
100.3K
Snippets
91
Records
273
Agent score
78%

What's inside La Suite Meet

  1. Overview of La Suite Meet

    main
    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.
  2. Room Recording (Beta) Overview

    main

    La 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_DAYS environment 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.
  3. Understand LiveKit signaling requirements

    main

    Signaling 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.

  4. How the transcription workflow works

    main

    The transcription process is an asynchronous pipeline triggered after a recording is completed. The flow follows these steps:

    1. Trigger: The Backend API sends a POST /api/v1/tasks/ request to the Summary Service. The payload includes owner_id, filename, email, sub, room, recording_date, and recording_time.
    2. Queueing: The Summary Service registers a task in the transcribe-queue via Celery.
    3. Processing: A Celery worker fetches the audio file from MinIO (Object Storage).
    4. Transcription: The worker sends the audio to the WhisperX API, which returns a segmented transcript.
    5. Formatting: The worker formats the transcript into text.
    6. Delivery: The worker sends a POST /create-for-owner request to LaSuite Docs (containing title, content, email, sub, and api token) to generate the final document for the room owner.
  5. How Room Recording Works

    main

    The recording lifecycle follows this sequence:

    1. 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.
    2. 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.
    3. Stop: The user clicks 'stop recording', triggering POST /api/v1.0/rooms/{id}/stop-recording/. The backend instructs LiveKit to stop the egress.
    4. 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 SAVED and sends an email to the room owner.
    5. 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
  6. Understand session management and duration

    main

    After 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_AGE setting to align with your organization's security policies.

  7. How Telephony SIP works: Room Lifecycle and Participant Calling

    main

    Room Lifecycle

    1. The Backend creates a new room and assigns a unique PIN code.
    2. Upon receiving a room_started webhook from LiveKit, the Backend creates a LiveKit SIP dispatch rule.
    3. When the room ends (room_ended webhook), the Backend clears the SIP dispatch rule.

    Participant Calling Flow

    1. A Caller dials the phone number provided by the SIP Trunk Provider.
    2. The SIP Trunk Provider routes the call to the LiveKit SIP server.
    3. LiveKit SIP prompts the Caller for the room PIN code.
    4. The Caller enters the PIN code.
    5. LiveKit SIP checks the SIP Dispatch rule for a matching PIN and trunk ID.
    6. If found, the SIP Dispatch returns the room ID, and LiveKit SIP connects the participant to the LiveKit Room.
  8. Understand the Visio architecture

    main

    Visio 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).
  9. Understand the Add-on Authentication Flow

    main

    The TokenExchangeService implements a multi-step handshake to securely exchange a temporary session for a JWT access token. The lifecycle follows these stages:

    1. Initialization: Call init_session() to create a PENDING session. This returns a transit_token, a session_id, and a csrf_token.
    2. Transit Consumption: The client must use the transit_token to call consume_transit_token(transit_token). This marks the token as CONSUMED and returns the session_id. This step prevents replay attacks; if a CONSUMED token is used again, the associated session is immediately evicted from the cache.
    3. Authentication: Once the transit token is consumed, the backend calls set_access_token(user, session_id). This transitions the session state from PENDING to AUTHENTICATED and stores the JWT in the cache.
    4. Token Retrieval: The client calls get_session(session_id) to retrieve the public session data (including access_token, token_type, expires_in, and scope).

    Note: get_session performs a one-time read for AUTHENTICATED sessions; once the token is retrieved, the session is evicted from the cache to ensure the token is only fetched once.

  10. Key features of La Suite Meet

    main

    La 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).