When we started Meetario, a scheduling app for people who get paid per session, every booking needed a video link. Asking users to pay for Zoom on top of their booking tool felt wrong, so we self-hosted Jitsi Meet and made it look and behave like part of our product.
Here's what that took.
1. One room per booking, protected by JWT
Jitsi rooms are public by default: anyone with the URL can join. We enabled JWT authentication on Prosody and disabled guest access. When someone opens their meeting link, our backend checks who they are (the host via their session, the attendee via a signed URL from the confirmation email) and redirects them to the Jitsi room with a short-lived token:
- room: the booking's room name
- context.user: email and display name from the booking
- features.moderator: true for the host only
The display name is pre-filled from the booking, so attendees never type it again.
2. Branding without forking jitsi-meet
We didn't want to maintain a fork of the frontend. docker-jitsi-meet lets you append your own config to the generated files, so we mount three things:
- custom-config.js: a trimmed toolbar, no deep-linking interstitial on mobile, no third-party requests, a custom close page
- custom-interface_config.js: app name, watermark link, no mobile app promo
- head.html and title.html: favicon, page title and a little CSS for the logo size
Colors come from Jitsi's dynamic branding: config.brandingDataUrl points to a JSON file with a palette, logo and background. One gotcha: that JSON is fetched cross-origin from the meeting page, so it needs an Access-Control-Allow-Origin header. Without it, the browser silently blocks it and you get the stock theme.
3. Sending people somewhere useful after the call
Jitsi's close page is a static file. Ours reads document.referrer to recover the room name and redirects to our app: hosts land on a note form for the meeting, attendees on a short rating page.
4. Running it on a small box
Jitsi's JVMs default to 3 GB of heap each. On a shared 8 GB server with MySQL and PHP, we capped jicofo at 512 MB and the videobridge at 1.5 GB. We also stopped restarting Jitsi on every app deploy. That had been dropping live calls and spiking the CPU for minutes.
What it gives users
Every booking gets a private, branded room with no extra subscription. Hosts are moderators, attendees join from the confirmation email, and nobody has to install anything.
If you're building something similar, docker-jitsi-meet plus JWT plus dynamic branding gets you about 90% of the way without touching the frontend code.
Meetario is free to try at meetario.com.
Top comments (0)