Documentation
How Si-Des Meet works
Everything you need to run, join and secure a meeting: quick start, end-to-end encryption, live translation, the mobile and desktop apps, self-hosting, shortcuts and troubleshooting.
Overview
Si-Des Meet is a video conferencing platform built around one idea: a real-time AI participant that can join your call, take notes, transcribe the conversation, judge a debate, or run polls — alongside the usual video, chat, screen share and breakout rooms you would expect.
Identity and sign-in are handled by Si-des Auth, the same single sign-on used across Si-des Tech’s apps — Si-Des Meet itself never stores a password.
Meetings can be end-to-end encrypted, translated live into each person’s language, and joined from the web, Windows, macOS or Android.
Getting started
There are two ways to start a meeting:
- Instant — from the home page, start a room immediately and share the link. No account required.
- Scheduled — set a title, time and security options, then share the generated link or calendar invite (.ics). Open the schedule page →
Both work whether or not you are signed in — see Guest vs. account for what changes once you are.
Your first meeting in four steps
- Open the home page. Enter your name and start an instant meeting, or open Schedule to choose a date, time and time zone.
- On the join screen, check your camera and microphone. As host, leave “End-to-end encrypt this meeting” switched on (recommended).
- Click Join. Open the lock badge at the top of the room and copy the secure invite link.
- Send the link to your guests. They open it in a modern browser, enter a name and join. No account or install is needed.
Hosting a meeting
As host you decide who comes in, which tools are available and how the meeting ends.
- Schedule ahead — Choose a title, time and time zone. Add a passcode, a waiting room, a participant limit and invitee email addresses. Guests receive an invitation (now or at a time you choose), optional reminders and a calendar file (.ics).
- Control who enters — Turn on the waiting room and admit people one by one. Add a passcode, or limit access by country, device type, browser or operating system (geofencing, when your workspace enables it).
- Share the right link — For an encrypted meeting, copy the secure invite link from the lock badge. The key sits after the # sign, so always share the whole link.
- Run the session — Use chat, Q&A, polls, breakout rooms, the whiteboard and annotation, screen sharing, reactions and hand raising. Extras such as the games arena and role-play practice appear when your administrator enables them.
- Moderate — Hosts and co-hosts can admit or deny guests, mute everyone, promote a co-host, start or stop recording and remove a participant. Removal is enforced on the server, and you can also block that person’s device for a period of time.
- Record locally — Recording is started by the host and runs in the host’s browser. Nothing is uploaded to our servers.
- End for everyone — The host can end the meeting for all participants at once.
Joining a meeting
You can join from any modern browser or from the apps. Guests do not need an account.
- With a link — Open the invitation link, enter your display name, check your camera and microphone, then join.
- With a room code — On the home page, paste the room code or the full link into the join box.
- Passcode or waiting room — If the host set a passcode, enter it exactly (it is case-sensitive). With a waiting room, you enter once the host admits you.
- Encrypted meetings — The key is part of the link, after the # sign. Open the complete link. If you only have the room code, paste the full link or key when the app asks for it.
- In the apps — The Android and desktop apps open meeting links directly. In the Android app you can also paste a link or scan a QR code.
Encryption and safety codes
In an end-to-end encrypted (E2EE) meeting, audio, video, screen sharing and in-meeting messages are encrypted on your device. Only devices that hold the meeting key can decrypt them. The media server forwards scrambled data it cannot read.
How the key travels
How it works
- The host’s browser generates a random 256-bit key. It is never sent to Si-Des Meet.
- The key goes into the invite link after a # sign (#k=…). Browsers never send the part after # to any server, so neither our web server nor the media server receives it.
- Everyone who opens the full link derives their encryption keys locally, inside the LiveKit SDK in their browser or app.
- Each audio and video frame is encrypted with AES-GCM before it leaves the device. Chat, whiteboard, poll and reaction packets are encrypted the same way.
- The media server (SFU) routes the encrypted frames to participants. It can see who is connected and how much data flows, but not what is said or shown.
Safety code
Open the lock badge in the room to see a safety code: five groups of four letters and digits computed from the key with SHA-256. Everyone should see the same code. Read it aloud once at the start. If someone’s code differs, they hold a different key: stop and send a fresh link.
Good to know
- The AI assistant and server-side recording or streaming cannot run in an E2EE meeting, because they need to read the content. AI-assisted meetings use standard transport encryption (DTLS-SRTP over TLS) instead.
- Anyone with the full link can join and decrypt. Share it privately, and add a waiting room or passcode for sensitive meetings.
- The key is kept in the browser tab’s session storage and removed from the address bar once the page has loaded. People who join without it are asked to paste it.
- Metadata is not hidden: servers can still see display or account names, IP addresses, connection times and the room name.
- Requires a browser with insertable streams: Chrome, Edge, Safari 15.4 or later, or Firefox 117 or later.
Live translation and captions
Live translation lets everyone read chat messages and live captions in their own language.
- Live captions — Switch captions on in the room. Each person’s browser transcribes their own speech and shares only the finished text with the room. Speech recognition is provided by your browser; in some browsers it uses a cloud service run by the browser’s vendor.
- Translate chat — Under each message you can choose Translate, or switch on automatic translation to read everyone’s messages in your language.
- On-device first — When your browser has a built-in translator (the Translator API in recent Chrome), text is translated on your device and never leaves it.
- Server fallback — Otherwise the text is sent to our server and translated by an AI model. In end-to-end encrypted meetings this is off by default: you must opt in, because it sends text outside the encrypted channel.
- Interface languages — The interface is available in English, French, Spanish and Kinyarwanda today. German, Portuguese, Swahili and Arabic (right-to-left) are being added.
Meeting modes
Every meeting runs in one of three modes:
- Normal — no AI assistant. A standard video call.
- AI Mode — the AI assistant joins automatically the moment the meeting starts.
- Hybrid — the AI assistant is available, but the host invites it manually from inside the room.
Whether guests (not signed in) may use the AI assistant at all is a workspace-level setting — see Roles & permissions.
AI assistant
The AI assistant joins a meeting as a participant. The host chooses its role: assistant (answers questions, can search the web and describe a shared screen), debate judge, minutes (summary, decisions, action items) or transcription.
- Starting it — Choose AI Mode when scheduling and it joins automatically. In Hybrid mode, open the AI panel in the room and invite it when you need it.
- Resilient by design — The assistant tries several model providers in order. When one is busy or out of quota it is put on a short cooldown and the next takes over. A keyless hosted backstop, and an optional self-hosted Ollama model, keep it answering when free-tier quotas run out.
- Token budgets — Long conversations are summarised and trimmed so each request stays small. That keeps answers fast and makes quotas last longer.
- Not in encrypted meetings — The assistant has to hear and read the meeting, so it cannot join an end-to-end encrypted one. A meeting is either end-to-end encrypted or AI-assisted.
- Your data — Audio and messages sent to the assistant are processed by the AI providers configured by the platform administrator. Do not use it for content you may not share with those providers.
3D layouts
Besides the standard grid, the host can switch the meeting to a 3D layout from Layout in the room menu. Everyone follows the same layout.
- Virtual house — walk with WASD, the arrow keys or a click; walls block you, doors let you through. You only hear people in your room. The host edits one room at a time from a dropdown, drags rooms and corners in the 3D view, resizes the whole house ("Entire house"), sets music per room (calm generated tunes, or a YouTube, SoundCloud or MP3/radio link) and can gather everyone in a room. Music is muted until you turn it on.
- Conference VR — the host picks a setting (conference hall, indoor arena, stadium, ocean deck, park, forest) and a seating layout (table, classroom, circle, mixed tables, arena with a stage, standing). You can sit, stand (X), walk and swap chairs; chairs are added as people arrive. The big screen shows a shared screen, the speaker, the shared whiteboard or a slide, and it can be hidden. Your camera only appears on the screen if you choose it.
- Invitations — use Invite in either layout to invite everyone or picked people to a room, your spot or the stage. They can accept or decline; hosts and co-hosts can also bring people straight there with no approval step.
- Gestures, outfits and safety — turn on gesture controls in Settings → Accessibility (open palm raises your hand, fist lowers it, thumbs up and victory send reactions). Pick your avatar's colours from the palette button. Anyone can report a person from the participants list; abusive chat words are masked. If a 3D view fails, the meeting carries on and you can switch to the standard view.
Security & access
- Waiting room — guests wait until the host admits them. Host status is decided by an atomic, server-side claim (or, for a scheduled meeting, by who is signed in as its owner) — never by who happens to click the link first.
- Passcode — an optional extra code required to join.
- Geo-fencing — restrict who can join by country, device type, browser or OS. Enforced server-side at token issuance, not just hidden in the UI.
- Recording — a local, in-browser recording the host starts manually. Not a server-side cloud recording.
Recording and geo-fencing require a Si-des Auth account by default, and a workspace’s super admin can further enable or restrict either one for guests or signed-in users independently — the toggle you see in the scheduling form always reflects the current, real setting.
Read the security overview →Roles & permissions
Host vs. participant
The host can admit or deny waiting-room guests, start and stop recording, and moderate the room. For a meeting scheduled from the dashboard, the host is whoever’s signed-in account created it. For an instant room, the first person to complete the join flow claims host — atomically, so two near-simultaneous joiners cannot both become host.
Super admin
A platform-wide role, separate from meeting hosting. From the Admin Console’s Access Control tab, a super admin sets the participant cap for guest meetings and whether recording, geo-fencing and the AI assistant are available to guests and to signed-in users — independently for each tier. These settings are enforced by the same APIs that issue join tokens and save meetings, not just reflected in the interface.
Guest vs. account
Defaults shown below — your workspace’s super admin may have changed any of these in Access Control.
| Capability | Guest | Signed in |
|---|---|---|
| Start / join a meeting | Yes | Yes |
| Participants per meeting | Capped (default 3) | Unlimited |
| Saved to a dashboard | No | Yes |
| Recording | Off by default | On by default |
| Geo-fencing | Off by default | On by default |
| AI assistant | On by default | On by default |
Keyboard shortcuts
Single-letter shortcuts work in the meeting room when you are not typing in a field and no Ctrl, Cmd or Alt key is held.
| Key | Action |
|---|---|
M | Mute / unmute microphone |
V | Turn camera on / off |
H | Raise / lower hand |
C | Open chat |
P | Open participants |
? | Show this help |
Esc | Close menus, drawers and dialogs |
TabEnterSpace | Move between controls; Enter or Space activates the focused one |
Ctrl/Cmd + Shift + M | Mute or unmute the microphone from any window (desktop app only) |
Android app
The Android app lets you join, schedule and manage meetings and take part in native video calls. iOS is planned for later.
What it does
- Join by link, room code or QR code, and schedule meetings from a dashboard.
- Native LiveKit calls with end-to-end encryption, using the same #k= invite link as the web.
- Your camera is never mirrored for other people. Mirroring of your own preview is optional and off by default.
- Live translated chat, and a low-data mode for weak or metered connections.
- The server address can be changed inside the app, so it also works with self-hosted deployments.
Install on Android
- Open the Downloads page on your phone and tap the Android APK.
- When Android asks, allow installs from your browser or file manager (“Install unknown apps”). Turn the setting off again afterwards.
- Open the app, confirm the server address if it asks, then join with a link or sign in.
Organisations can roll the same APK out through a mobile-device-management (MDM) system. For Google Play, the project can build an Android App Bundle (AAB) to upload to a Play Console listing. Check the Downloads page for what is currently available.
Deep links
Links that start with sidesmeet:// open the app directly, as do https meeting links for the server the app is built for. Encrypted links keep their #k= key when opened in the app.
Desktop apps
Desktop apps for Windows and macOS wrap the web experience in a native window with a few extras.
- Windows 10 and 11 (x64 installer) and macOS (universal DMG for Apple Silicon and Intel, or a PKG package).
- A global hotkey toggles your microphone even when another window is in front: Ctrl+Shift+M on Windows, Cmd+Shift+M on macOS.
- A system tray menu to focus the app or open the scheduler, and links that open meetings directly in the app.
- The macOS build is ad-hoc signed, so Gatekeeper may warn you the first time. Right-click the app and choose Open. Instructions are on the Downloads page.
Self-hosting and environment
Si-Des Meet is a Next.js application that you can run on Vercel or on your own server. It needs a MongoDB database, a LiveKit server for real-time media and a Si-des Auth client for sign-in. This is a summary; DEPLOYMENT.md in the repository is the full guide.
Deployment outline
- Register Si-Des Meet as a client in Si-des Auth (PKCE on, scopes openid profile email) with the redirect URI https://your-domain/api/auth/callback/sides-auth.
- Set the environment variables below on your host (on Vercel: Settings, Environment Variables). NEXT_PUBLIC_* values are baked in at build time, so redeploy after changing them.
- Run npx prisma generate and npx prisma db push, then recreate the two sparse unique indexes on the Meeting collection (the command is in DEPLOYMENT.md).
- Build and start: npm install, npm run build, npm start. Put nginx or Caddy in front for HTTPS. Camera, microphone and screen sharing only work over HTTPS.
- Call GET /api/cron/send-scheduled-emails every 5 minutes with the header Authorization: Bearer <CRON_SECRET> so deferred invitations and reminders are sent.
- Deploy the AI worker separately from the ai-agent folder (lk agent deploy) and set provider API keys as secrets there. The website never runs it in production.
Environment variables
| Variable | Needed | What it is for |
|---|---|---|
NEXTAUTH_SECRET | Required | Secret that signs sessions and also the short-lived host and admit proofs. Generate with openssl rand -base64 32 and keep it private. |
NEXTAUTH_URLNEXT_PUBLIC_SITE_URL | Required | Public https address of the site (NEXTAUTH_URL for sign-in callbacks, NEXT_PUBLIC_SITE_URL for links and metadata). |
SIDES_AUTH_URLNEXT_PUBLIC_SIDES_AUTH_URL | Required | Public URL of Si-des Auth (the NEXT_PUBLIC_ variant lets the browser build the sign-out redirect). |
SIDES_MEET_CLIENT_IDSIDES_MEET_CLIENT_SECRET | Required | Credentials of the client you registered in Si-des Auth. |
SIDES_MEET_SUPER_ADMIN_EMAILS | Required | Comma-separated emails promoted to super admin the first time they sign in. |
DATABASE_URL | Required | MongoDB connection string (a dedicated database such as sides_meet). |
LIVEKIT_URLLIVEKIT_API_KEYLIVEKIT_API_SECRETLIVEKIT_HTTP_URL | Required | Your LiveKit server: wss URL, API key and secret. LIVEKIT_HTTP_URL is the https address used by server-side moderation calls; it defaults to the https form of LIVEKIT_URL where the code allows. |
SMTP_HOSTSMTP_PORTSMTP_USERSMTP_PASSWORDSMTP_FROM | Optional | SMTP server used for invitations, reminders and the contact form. Without it the site works but no email is sent. |
CRON_SECRET | Optional | Shared secret that protects the scheduled-email endpoint. |
SUPPORT_EMAILNEXT_PUBLIC_GESTURE_MODEL_URLNEXT_PUBLIC_POSE_MODEL_URLNEXT_PUBLIC_EXTRA_BLOCKED_WORDS | Optional | Inbox that receives contact-form messages. NEXT_PUBLIC_GESTURE_MODEL_URL and NEXT_PUBLIC_POSE_MODEL_URL let you host the hand-gesture and pose models yourself. NEXT_PUBLIC_EXTRA_BLOCKED_WORDS adds words to the chat filter. |
GROQ_API_KEYOPENROUTER_API_KEYAI_OLLAMA_ENABLEDOLLAMA_BASE_URL | Optional | AI worker (set with lk agent update-secrets): the API key variables named in the admin AI Models list, such as GROQ_API_KEY or OPENROUTER_API_KEY. Keys are never stored in the database. AI_OLLAMA_ENABLED, OLLAMA_BASE_URL, OLLAMA_MODEL and AI_POLLINATIONS_ENABLED control the last-resort tiers. |
Admin console
The admin console at /admin is for super admins. Role changes apply the next time a person signs in.
- Overview — Live and historical numbers for meetings and users.
- All meetings — Browse and remove meetings.
- Users — See accounts and promote or demote admins.
- Access control — Participant limits and maximum duration for guests and signed-in users; whether recording, geofencing and the AI assistant are available to each; turning meeting creation, the games arena and the practice studio on or off; a site announcement; and disabling individual routes.
- AI models — An ordered list of models per role (chat, web search, vision, grading). The worker tries them top to bottom and falls through on rate limits. Each row names an environment variable for its key; the key itself is never stored.
- Reports — Conduct reports sent from rooms. Admins can review the evidence, dismiss a report or take action.
Architecture
Si-Des Meet is a serverless web application that delegates real-time media to a managed WebRTC SFU and runs its AI participant as a separate worker, so each concern scales and fails independently.
Components
| Layer | Technology | Responsibility |
|---|---|---|
| Client | Next.js 15, React 19, Mantine 8, LiveKit components | Meeting UI, device handling, local-only state (chat and Q&A live in the browser only while you are in the room). |
| Edge | Next.js middleware, security headers | Blocks unauthenticated access to /dashboard and non-admins from /admin; sets CSP, HSTS and other hardening headers. |
| API | Next.js route handlers (serverless) | Issues short-lived LiveKit tokens after checking passcode, schedule and geofence rules; meeting CRUD; admin console; AI dispatch with per-room throttling. |
| Identity | NextAuth + Si-des Auth (OIDC) | Passwords never touch Si-Des Meet; roles (USER / ADMIN) come from the signed session. |
| Data | MongoDB Atlas via Prisma | Meetings, users, platform settings, notifications and the admin-managed AI model registry. No media is stored. |
| Media | LiveKit Cloud SFU | Selective forwarding of encrypted audio/video, plus reliable data channels for chat, polls, hand-raise and games. |
| AI | Python livekit-agents worker | Joins as a participant: speech-to-text, language model, text-to-speech, screen understanding, minutes. Uses an ordered, admin-editable chain of models and falls over automatically on rate limits. |
| Messaging | nodemailer + Vercel Cron | Sends invitations immediately or at a chosen time before the meeting, and countdown reminders; each recipient gets an individual message. |
Joining a meeting
1. The browser asks /api/livekit/token to join, sending the meeting id, display name and passcode.
2. The server validates the meeting (schedule window, passcode with brute-force throttling, participant cap, geofence) and, if the caller is signed in and owns it, marks them host.
3. It returns a signed, short-lived LiveKit token; the browser connects straight to the SFU over WebRTC — media never passes through the web server.
4. When the host invites the AI, the API checks the room is live, throttles the request, attaches the current model chain and dispatches the worker into the room.
5. On leave or meeting end, room data is purged from the browser; the media provider retains nothing by default.
Design principles
Stateless compute, managed state. Web and worker tiers hold no session state, so they scale horizontally and recover by restarting.
Least privilege. Server routes that use the LiveKit admin key verify the caller’s room-admin token; admin routes verify the ADMIN role server-side; secrets stay in environment variables and are never sent to the browser.
Graceful degradation. Every external dependency has a fallback: AI models fail over, email failures never block a meeting, admin dashboards render partial data if one query is slow.
Accessible by default. Semantic landmarks, skip links, keyboard-reachable controls, theme and reduced-motion support.
API and real-time overview
Si-Des Meet’s HTTP endpoints exist to serve its own web, desktop and Android clients. They are not a versioned public API, may change between releases and do not use API keys. Treat this as an overview for self-hosters and integrators, not a stable contract.
| Area | Routes | Notes |
|---|---|---|
| Sign-in | /api/auth/*/api/auth/mobile-token | OpenID Connect through Si-des Auth (NextAuth); a mobile token exchange for the Android app. |
| Meetings | /api/meetings/api/meetings/schedule/api/meetings/[id]/api/meetings/[id]/join/api/meetings/[id]/claim-host/api/meetings/[id]/host-status | Create, schedule, read, update and delete meetings; join checks; atomic host claim and host status. |
| Rooms and media | /api/livekit/token/api/livekit/admit/api/livekit/remove/api/livekit/moderate/api/livekit/end-meeting/api/livekit/broadcast/api/livekit/agent/api/livekit/camera-key | Issue short-lived LiveKit tokens after passcode, schedule, participant-cap and geofence checks; admit, remove, moderate, end a meeting, broadcast, dispatch the AI agent, and authorise a phone camera. Moderation routes require a room-admin token. |
| Platform | /api/public/settings/api/me/preferences/api/notifications/api/reports/api/roleplay/*/api/contact/api/cron/send-scheduled-emails/api/chat/generative/api/translate | Public settings, user preferences, notifications, conduct reports, role-play practice, the contact form and the scheduled-email cron. |
| Admin | /api/admin/* | Overview, meetings, users, access settings, AI model list, reports and LiveKit status. Every route checks the ADMIN role on the server. |
Rate limits: each client IP may make about 300 API requests per minute, and sensitive routes such as the token, passcode, contact and report endpoints have tighter limits. Limits are held in server memory per instance, so put a CDN or firewall in front for stronger protection.
Real-time
Clients connect to LiveKit with a signed token over a secure WebSocket (wss://) for signalling. Audio and video travel over WebRTC (DTLS-SRTP). In-room features such as chat, polls, reactions and the whiteboard send small JSON messages over reliable WebRTC data channels. In an encrypted meeting those packets are encrypted with the meeting key.
Troubleshooting
Most problems come from permissions, the network or a mismatched link. Work through these in order.
| Problem | What to try |
|---|---|
| Camera or microphone is not found | Click the camera icon in the address bar and set Camera and Microphone to Allow. Check your system privacy settings. Close other apps or tabs that use the camera, then try again. |
| The browser never asks for camera access | Cameras and microphones only work in a secure context: https:// or http://localhost. An address such as http://192.168.1.20 will not work. Use HTTPS (a reverse proxy with a certificate, or a tunnel) when testing on a local network. |
| “Reconnecting” keeps appearing | Switch to a stronger network, pause large downloads or turn your camera off to keep audio flowing. Enable Data saver in Settings. On managed networks, WebRTC needs outbound UDP; if it is blocked, ask your network team to allow it or to allow TURN over TLS on port 443 (LiveKit Cloud provides TURN; a self-hosted LiveKit server must have it configured). Also allow wss:// and https:// to your LiveKit host. |
| I hear echo or nothing at all | Wear headphones, check the microphone is not crossed out and choose the right input and output in Settings, Audio. |
| Black video or “could not decrypt” in an encrypted meeting | Everyone must use the same full invite link, including the part after #. Compare safety codes. If they differ, the host should send a fresh link. Make sure every browser supports insertable streams (see Encryption). |
| The AI assistant will not join | The assistant cannot join end-to-end encrypted meetings. Otherwise try once more after a few seconds, and check that the host allowed it for guests if you are not signed in. |
| The Android app cannot connect | Open the server setting and check the address starts with https:// and matches your deployment. For a self-hosted server, confirm the certificate is valid and the LiveKit URL is reachable from mobile data. |
Privacy & cookies
Told upfront, plainly: Si-Des Meet sets one essential cookie to keep you signed in (a NextAuth session cookie). That is it on this domain — no advertising cookies, no third-party trackers, no analytics cookies.
When you sign in, you are redirected to Si-des Auth, which sets its own essential cookies there (to run the login flow and keep your single sign-on session going across Si-des Tech’s apps) — covered by Si-des Auth’s own privacy policy, shown to you the first time you land on its sign-in page.
Your camera and microphone stream directly to LiveKit’s media servers to reach other participants — it is not stored afterward unless the host explicitly starts a recording, which happens locally in the host’s own browser.
Local storage and session storage hold preferences (language, theme, display options), temporary join details and, in encrypted meetings, the meeting key for that tab. They stay on your device. We use no advertising or analytics cookies.
To limit abuse, your browser computes a visitor identifier with the open-source FingerprintJS library. Our server converts it into a keyed hash straight away and does not store the raw value. The hash is used for per-device rate limits, for blocking a removed participant’s device from a room for a limited time, and for a short badge shown to other participants.
Because every cookie here is strictly necessary to sign you in and keep the app working, there is no cookie-consent choice to make — only this disclosure, shown before you ever need to accept anything.