Skip to main content

Video Conferencing

AIQLick uses a custom fork of Jitsi Meet for video conferencing, deployed on a dedicated EC2 instance. The system provides real-time video meetings with integrated transcription and AI-powered meeting insights.

Architecture

The video conferencing stack runs as five Docker Compose services on a single EC2 t3.medium instance:

ServiceImagePurpose
Webaiqlick-meeting (custom)Custom React UI served by nginx
Prosodyjitsi/prosodyXMPP server for user authentication and room management
Jicofojitsi/jicofoConference focus component for room creation and participant management
JVBjitsi/jvbJitsi Video Bridge -- SFU (Selective Forwarding Unit) for media routing
Jigasiaiqlick-jigasi (custom)Transcription gateway that captures audio and streams it to background-tasks

The Web and Jigasi services use custom Docker images built from AIQLick forks and stored in ECR. Prosody, Jicofo, and JVB use standard Jitsi Docker images.

Deployment

  • URL: https://book.aiqlick.com
  • EC2 Instance: i-0620d2e23695f5bfc (t3.medium, IP 16.16.21.64)
  • Security Group: jitsi-sg
  • CI/CD: GitHub Actions triggers SSM commands to the EC2 instance for git pull, docker compose pull, and force-recreate.

Network Configuration

Browser ──WebRTC──► JVB (UDP 10000)
Browser ──HTTPS───► Web/nginx (TCP 443)
Prosody ◄─────────► Jicofo, JVB, Jigasi (internal XMPP)
Jigasi ──RTP──────► UDP 20000-20050
Jigasi ──WebSocket─► wss://ai.aiqlick.com/transcription/ws
PortProtocolServicePurpose
443TCPWeb (nginx)HTTPS for the meeting UI
80TCPWeb (nginx)HTTP redirect to HTTPS
10000UDPJVBWebRTC media (video and audio)
20000-20050UDPJigasiRTP audio for transcription capture
5222TCPProsodyInternal XMPP client connections
5347TCPProsodyInternal XMPP component connections

All external ports (22, 80, 443, 10000, 20000-20050) are open to 0.0.0.0/0 in the jitsi-sg security group.

Meeting Flow

  1. A user opens a meeting link at https://book.aiqlick.com/{room-name}.
  2. The browser loads the custom aiqlick-meeting React application from nginx.
  3. The client authenticates with Prosody via XMPP and joins (or creates) the conference room.
  4. Jicofo manages the conference state -- allocating JVB resources and tracking participants.
  5. JVB handles all media routing as an SFU, forwarding video and audio streams between participants over WebRTC (UDP 10000).
  6. When a moderator joins, Jigasi automatically enters the conference as a hidden participant and begins capturing audio for transcription.

Custom Meeting UI

The aiqlick-meeting repository is a forked and customized Jitsi Meet frontend built with React and Webpack. It provides:

  • AIQLick-branded meeting interface.
  • Integration hooks for the transcription and meeting insight systems.
  • Custom participant controls aligned with the platform's UX.

The built application is packaged as a Docker image (aiqlick-meeting in ECR) and served by nginx inside the Web container.

Integration with Backend

The backend maintains a Meeting model in the database that stores:

  • Room name, scheduled time, and participant list.
  • The roomName field correlates with Transcription.meetingId to link transcription records back to meetings.
  • Meeting reminders are sent hourly at 24-hour, 6-hour, and 1-hour intervals before the scheduled time.

Transcription

When a moderator joins a meeting, Jigasi automatically starts capturing audio and streaming it to the background-tasks service for real-time transcription. See the Transcription System page for details on the full pipeline.