From f3a7bcd00b8a35cf0152427e6f213fa8ce477057 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Fri, 15 May 2026 00:49:04 -0400 Subject: [PATCH] feat: update client comparison table (May 2026) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cinny voice/video/calls: ✓ now covers rooms, DMs, group calls, screenshare via Element Call embed - Cinny screenshare: ✓ (via EC iframe) - Cinny GIF picker: ✓ Giphy with Terminal TDS theme - Cinny polls: ~ display-only (read-only m.poll.start renderer) - Cinny deleted messages: ✓ now shows placeholder instead of hiding - New row: incoming call notification (ring + Answer/Decline for DMs) - Updated featured client description with custom feature list - README Lotus Cinny section updated with latest custom features Co-Authored-By: Claude Sonnet 4.6 --- README.md | 33 ++++++++++++++++++++++++++++++++- landing/index.html | 25 +++++++++++++++++-------- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index dcb2839..eea6456 100644 --- a/README.md +++ b/README.md @@ -408,6 +408,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. +### 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.19.3 (`@element-hq/element-call-embedded`), dist copied to `public/element-call/` by vite | +| **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 | +| **Auto-revert spotlight on screenshare** | `src/app/plugins/call/CallControl.ts` (`onControlMutation`) | When screenshare starts EC normally forces spotlight view. We detect the `screenshare` button going `primary` and after 600ms click `gridButton` to revert to grid layout | +| **PTT (Push-to-Talk)** | `src/app/features/call/CallControls.tsx`, `src/app/state/settings.ts` | Hold-to-talk key (default: Space, configurable). Mutes mic on join; holds mic open while key is held. Badge shows `PTT — Hold SPACE` / `● Live`. Listens on both main window and EC iframe `contentWindow` for key events | +| **PTT badge theming** | `src/app/features/call/CallControls.tsx` | Plain folds `Chip` by default; neon terminal style (`#00FF88`/`#FF6B00`, JetBrains Mono) when `lotusTerminal` setting is on | +| **GIF picker** | `src/app/components/GifPicker.tsx`, `src/app/features/room/RoomInput.tsx` | Giphy JS/React SDK (`@giphy/react-components`, `@giphy/js-fetch-api`, `styled-components`). API key in `config.json` → `gifApiKey`. GIF button appears next to Send only when `gifApiKey` is set. Sends GIF as `m.image` (fetches blob → `mx.uploadContent` → `mx.sendMessage`). `FocusTrap` handles click-outside / Escape to close | +| **GIF picker terminal theme** | `src/app/components/GifPicker.tsx` | When `lotusTerminal` is on: dark navy background (`#060c14`), orange dim border, 4px radius, `// GIF_SEARCH` header, injected `