feat(rmeets): minimal mode for clean meeting links without rSpace shell

Add ?minimal=1 query param that renders a full-screen Jitsi meeting
page without the rSpace header, tab bar, or module chrome. Used by
scheduled meeting links so guests get a clean, direct video call
experience. Includes prejoin screen, all standard Jitsi controls,
and auto-closes the tab when the meeting ends.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-04-06 01:24:15 +00:00
parent 7e07170304
commit c037e13423
1 changed files with 53 additions and 0 deletions

View File

@ -466,6 +466,59 @@ routes.get("/:room", (c) => {
}));
}
// Minimal mode — full-screen Jitsi without rSpace shell (for scheduled meeting links)
if (c.req.query("minimal") === "1" || c.req.query("join") === "1") {
const jitsiRoom = encodeURIComponent(room);
return c.html(`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>${escapeHtml(room)} Meeting</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%;overflow:hidden;background:#111;font-family:system-ui,sans-serif}
#jitsi-container{width:100%;height:100%}
.loading{display:flex;align-items:center;justify-content:center;height:100%;color:#94a3b8;flex-direction:column;gap:12px}
.loading .spinner{width:32px;height:32px;border:3px solid #334155;border-top-color:#6366f1;border-radius:50%;animation:spin 0.8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
</style>
</head>
<body>
<div id="jitsi-container">
<div class="loading"><div class="spinner"></div><span>Connecting to meeting...</span></div>
</div>
<script src="${escapeHtml(JITSI_URL)}/external_api.js"></script>
<script>
const api = new JitsiMeetExternalAPI("${escapeHtml(JITSI_URL.replace(/^https?:\/\//, ""))}", {
roomName: "${jitsiRoom}",
parentNode: document.getElementById("jitsi-container"),
width: "100%",
height: "100%",
configOverrides: {
startWithAudioMuted: false,
startWithVideoMuted: false,
prejoinPageEnabled: true,
disableDeepLinking: true,
},
interfaceConfigOverrides: {
SHOW_JITSI_WATERMARK: false,
SHOW_BRAND_WATERMARK: false,
SHOW_POWERED_BY: false,
TOOLBAR_BUTTONS: [
"microphone","camera","closedcaptions","desktop","fullscreen",
"fodeviceselection","hangup","chat","recording","livestreaming",
"etherpad","settings","raisehand","videoquality","filmstrip",
"feedback","shortcuts","tileview","participants-pane",
],
},
});
api.addEventListener("readyToClose", () => { window.close(); });
</script>
</body>
</html>`);
}
return c.html(renderShell({
title: `${room} — rMeets | rSpace`,
moduleId: "rmeets",