diff --git a/modules/rmeets/mod.ts b/modules/rmeets/mod.ts index e1c4973c..c8413518 100644 --- a/modules/rmeets/mod.ts +++ b/modules/rmeets/mod.ts @@ -755,9 +755,12 @@ routes.get("/:room", (c) => { "raisehand","tileview","toggle-camera", "fullscreen","chat","settings", "participants-pane","select-background", - "sharedvideo","shareaudio","meetingintelligence", + "sharedvideo","shareaudio", ], }, + customToolbarButtons: [ + { icon: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-4h2v-2h-2v2zm1-10c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z'/%3E%3C/svg%3E", id: "mi-btn", text: "Intelligence" }, + ], interfaceConfigOverwrite: { SHOW_JITSI_WATERMARK: false, SHOW_BRAND_WATERMARK: false, @@ -771,6 +774,12 @@ routes.get("/:room", (c) => { // Remove loading spinner — iframe is already injected by the constructor var loadingEl = document.querySelector(".loading"); if (loadingEl) loadingEl.remove(); + // Custom toolbar button → open our MI page + api.addEventListener("toolbarButtonClicked", function(e) { + if (e.key === "mi-btn") { + window.open("${meetsBase}/meeting-intelligence", "_blank"); + } + }); api.addEventListener("readyToClose", function() { try { window.close(); } catch(e) {} document.getElementById("jitsi-container").innerHTML = diff --git a/server/index.ts b/server/index.ts index a94cd1f8..11427dbc 100644 --- a/server/index.ts +++ b/server/index.ts @@ -4050,6 +4050,12 @@ const server = Bun.serve({ if (adminHtml) return adminHtml; } + // ── favicon.ico → favicon.png fallback ── + if (url.pathname === "/favicon.ico") { + const staticResponse = await serveStatic("favicon.png"); + if (staticResponse) return staticResponse; + } + // ── Static assets (before Hono routing) ── if (url.pathname !== "/" && !url.pathname.startsWith("/api/") && !url.pathname.startsWith("/ws/")) { const assetPath = url.pathname.slice(1);