From 3fe232a6b7e5e7c608808f8afe6cf46bd093f47d Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Mon, 29 Jun 2026 20:57:44 -0400 Subject: [PATCH] docs: note planned Element Call fork (Lotus Call) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tag the EC embed row and add a callout explaining the plan to fork element-hq/element-call and self-build it for true ownership (decorations, focus/screenshare, reconnect mic, theming, call-audio injection — all unfixable against the prebuilt @element-hq/element-call-embedded bundle). Infra notes: EC uses our LiveKit SFU (livekit/, LXC 151) + lk-jwt-service; a new build/deploy pipeline will be needed. Full plan: LotusGuild/cinny → HANDOFF_ELEMENT_CALL_FORK.md. Co-Authored-By: Claude Opus 4.8 --- README.md | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2cd7f72..54bbf69 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ matrix/ | Service | IP | LXC | RAM | Disk | Versions | |---------|----|-----|-----|------|----------| -| Synapse | 10.10.10.29 | 151 | 8GB | 50GB | Synapse 1.149.0, LiveKit 1.9.11, hookshot 7.3.2, coturn latest | +| Synapse | 10.10.10.29 | 151 | 8GB | 50GB | Synapse 1.155.0, LiveKit 1.9.11, hookshot 7.3.2, coturn latest | | PostgreSQL 17 | 10.10.10.44 | 109 | 6GB | 30GB | PostgreSQL 17.9 | | Cinny Web | 10.10.10.6 | 106 | 2GB | 8GB | Debian 12, nginx, Node 24, Lotus Cinny fork (custom, tracks `cinnyapp/cinny` main) | | Draupnir | 10.10.10.24 | 110 | 1GB | 10GB | Draupnir v2.9.0, Node.js v22 | @@ -454,13 +454,35 @@ chmod 600 /etc/cinny-monitor.env **Why 8GB RAM:** Vite's build process needs ~6GB Node heap (`--max_old_space_size=6144`) for the rendering-chunks phase. Previously at 4GB — OOM killed during render. +### 🔱 Planned: Element Call fork — "Lotus Call" (true ownership) + +We currently embed Element Call as a **pre-built npm bundle** +(`@element-hq/element-call-embedded` 0.20.1, copied to cinny `public/element-call/`). +We can steer it (widget API + same-origin DOM hacks) but **cannot change its +compiled logic** — so several in-call issues (avatar decorations on tiles, camera +focus/fullscreen during screenshare, mic-after-reconnect, native theming, real +call-audio injection for a soundboard) are unfixable from outside. + +**Plan: fork `element-hq/element-call` → a new `LotusGuild/element-call` repo, +build it from source, host our build, and replace the npm bundle.** This is AGPL +(same license, compatible). Infra implications for THIS repo: +- EC talks to our **LiveKit SFU** (`livekit/`, LXC 151) + `lk-jwt-service` — the + fork's runtime `config.json` must point at `matrix.lotusguild.org` + our + LiveKit. The current cinny EC `config.json` lives in `cinny/config.json` here. +- A new build/deploy pipeline for the EC fork will be needed (likely its own LXC + or CI artifact), analogous to the cinny build on LXC 106. + +**Full handoff & step-by-step plan:** `LotusGuild/cinny` → +[`HANDOFF_ELEMENT_CALL_FORK.md`](https://code.lotusguild.org/LotusGuild/cinny/src/branch/lotus/HANDOFF_ELEMENT_CALL_FORK.md). +Start a fresh session with that doc. + ### Custom Features All custom code lives in `src/app/` on the `lotus` branch of `code.lotusguild.org/LotusGuild/cinny`. Changes survive upstream merges as long as they don't conflict with the same files upstream touched. | Feature | Files | Notes | |---------|-------|-------| -| **Element Call embed** | `src/app/plugins/call/`, `src/app/hooks/useCallEmbed.ts`, `src/app/components/CallEmbedProvider.tsx` | EC 0.20.1 (`@element-hq/element-call-embedded`), dist copied to `public/element-call/` by vite | +| **Element Call embed** | `src/app/plugins/call/`, `src/app/hooks/useCallEmbed.ts`, `src/app/components/CallEmbedProvider.tsx` | EC 0.20.1 (`@element-hq/element-call-embedded`), **prebuilt** dist copied to `public/element-call/` by vite. Same-origin (`allow-same-origin`), controlled via `matrix-widget-api` + DOM-poking. 🔱 **[EC-FORK]** planned — see `LotusGuild/cinny` → `HANDOFF_ELEMENT_CALL_FORK.md` | | **DM calls** | `src/app/features/room/Room.tsx`, `src/app/features/room/RoomViewHeader.tsx` | Phone button in DM room header; `useCallStart(true)` passes `intent: StartedByUser`; Room.tsx switches to CallView layout when DM has active call | | **Picture-in-picture call** | `src/app/components/CallEmbedProvider.tsx` | When navigating away from the call room, the embed shrinks to a 280×158px PiP in the bottom-right. Click navigates back. Implemented via `useEffect` imperatively overriding styles on `callEmbedRef.current` — cannot use a wrapper div because `useCallEmbedPlacementSync` writes `top/left/width/height` directly onto that element | | **Screenshare fullscreen** | `src/app/features/call/CallControls.tsx`, `src/app/features/call/Controls.tsx` | When screensharing, a fullscreen button appears in call controls. Calls `callEmbedRef.current?.requestFullscreen()` on the Cinny call container. EC naturally spotlights the screenshare — the old 600ms grid-revert code was removed (it caused fullscreen to show avatars instead of the screen) | @@ -521,8 +543,12 @@ Periodic `TLS/TCP socket error: Connection reset by peer` in coturn logs. Normal ## Server Checklist +## Server Checklist + ### Quality of Life +- [x] **Upgrade Synapse to v1.155.0** — Done 2026-06-18. LXC 151 was already on Debian 13 Trixie; no OS migration needed. - [x] Migrate from SQLite to PostgreSQL + - [x] TURN/STUN server (coturn) for reliable voice/video - [x] URL previews - [x] Upload size limit 200MB @@ -734,7 +760,7 @@ All commands use the `!` prefix. Run `!help` in any room for the full list. | Component | Technology | Version | |-----------|-----------|---------| -| Homeserver | Synapse | 1.149.0 | +| Homeserver | Synapse | 1.155.0 | | Database | PostgreSQL | 17.9 | | TURN | coturn | latest | | Video/voice calls | LiveKit SFU | 1.9.11 |