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:
| Service | Image | Purpose |
|---|---|---|
| Web | aiqlick-meeting (custom) | Custom React UI served by nginx |
| Prosody | jitsi/prosody | XMPP server for user authentication and room management |
| Jicofo | jitsi/jicofo | Conference focus component for room creation and participant management |
| JVB | jitsi/jvb | Jitsi Video Bridge -- SFU (Selective Forwarding Unit) for media routing |
| Jigasi | aiqlick-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, IP16.16.21.64) - Security Group:
jitsi-sg - CI/CD: GitHub Actions triggers SSM commands to the EC2 instance for
git pull,docker compose pull, andforce-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
| Port | Protocol | Service | Purpose |
|---|---|---|---|
| 443 | TCP | Web (nginx) | HTTPS for the meeting UI |
| 80 | TCP | Web (nginx) | HTTP redirect to HTTPS |
| 10000 | UDP | JVB | WebRTC media (video and audio) |
| 20000-20050 | UDP | Jigasi | RTP audio for transcription capture |
| 5222 | TCP | Prosody | Internal XMPP client connections |
| 5347 | TCP | Prosody | Internal 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
- A user opens a meeting link at
https://book.aiqlick.com/{room-name}. - The browser loads the custom
aiqlick-meetingReact application from nginx. - The client authenticates with Prosody via XMPP and joins (or creates) the conference room.
- Jicofo manages the conference state -- allocating JVB resources and tracking participants.
- JVB handles all media routing as an SFU, forwarding video and audio streams between participants over WebRTC (UDP 10000).
- 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
roomNamefield correlates withTranscription.meetingIdto 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.