feat: update client comparison table (May 2026)
- 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 <noreply@anthropic.com>
This commit is contained in:
@@ -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 `<style>` overrides Giphy SDK SearchBar input (dark bg, orange border/focus ring, JetBrains Mono), custom orange scrollbar |
|
||||
| **Terminal Design System toggle** | `src/app/state/settings.ts`, `src/app/features/settings/` | `lotusTerminal` boolean setting. When enabled: PTT badge and GIF picker use LotusGuild Terminal Design System aesthetics |
|
||||
| **LiveKit codec config** | `/etc/livekit/config.yaml` (LXC 151) | `enabled_codecs`: VP8, H264, VP9, Opus, RED for better quality and redundancy |
|
||||
|
||||
**Key config values (`/opt/lotus-cinny/config.json`, root — vite copies this to dist):**
|
||||
```json
|
||||
{
|
||||
"defaultHomeserver": 0,
|
||||
"homeserverList": ["matrix.lotusguild.org"],
|
||||
"allowCustomHomeservers": false,
|
||||
"gifApiKey": "AqqDuQwZNjYttz7Mn6ME4JH1bJIuZ5CO"
|
||||
}
|
||||
```
|
||||
|
||||
> Note: The root `/opt/lotus-cinny/config.json` is what matters — vite copies it to `dist/`. `public/config.json` is not used.
|
||||
|
||||
---
|
||||
|
||||
## Known Issues
|
||||
@@ -655,7 +684,9 @@ All commands use the `!` prefix. Run `!help` in any room for the full list.
|
||||
| SSO | Authelia (OIDC) + LLDAP | — |
|
||||
| Webhook bridge | matrix-hookshot | 7.3.2 |
|
||||
| Reverse proxy | Nginx Proxy Manager | — |
|
||||
| Web client | Cinny (`dev` branch, nightly build) | dev |
|
||||
| Web client | Lotus Cinny (fork of `cinnyapp/cinny` main) | custom |
|
||||
| Element Call embed | `@element-hq/element-call-embedded` | 0.19.3 |
|
||||
| GIF picker | Giphy JS/React SDK (`@giphy/react-components`) | — |
|
||||
| Auto-deploy | adnanh/webhook | 2.8.0 |
|
||||
| Bot language | Python 3 | 3.x |
|
||||
| Bot library | matrix-nio (E2EE) | latest |
|
||||
|
||||
+17
-8
@@ -554,7 +554,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<p class="also-available">
|
||||
A custom Lotus Guild fork of Cinny, based on stable releases.
|
||||
A custom Lotus Guild fork of Cinny with added features: DM calls with ring notification, GIF picker, draggable+resizable PiP call window, poll display, deleted message placeholders, and the Lotus Terminal design theme.
|
||||
Prefer the official client? Use <a href="https://cinny.in" target="_blank" rel="noopener">cinny.in</a> and set homeserver to <code style="font-size:0.8em;color:#e88;">matrix.lotusguild.org</code>.
|
||||
</p>
|
||||
|
||||
@@ -658,7 +658,7 @@
|
||||
|
||||
<!-- ── Feature Comparison Table ── -->
|
||||
<div class="comparison-section">
|
||||
<p class="comparison-title">Client Feature Comparison — March 2026</p>
|
||||
<p class="comparison-title">Client Feature Comparison — May 2026</p>
|
||||
<p class="scroll-hint" id="scrollHint">← swipe to compare →</p>
|
||||
<div class="table-wrap">
|
||||
<table>
|
||||
@@ -757,7 +757,7 @@
|
||||
<tr class="section-header"><td colspan="7">Voice & Video</td></tr>
|
||||
<tr>
|
||||
<td>Voice & video calls</td>
|
||||
<td class="ours"><span class="part">~</span><small>dedicated space rooms only,<br>not DMs</small></td>
|
||||
<td class="ours"><span class="yes">✓</span><small>rooms & DMs, group calls,<br>screenshare via Element Call</small></td>
|
||||
<td><span class="yes">✓</span><small>MatrixRTC</small></td>
|
||||
<td><span class="part">~</span><small>experimental, varies<br>by homeserver</small></td>
|
||||
<td><span class="part">~</span><small>1:1 + group,<br>no E2EE voice rooms</small></td>
|
||||
@@ -766,7 +766,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Screenshare</td>
|
||||
<td class="ours"><span class="no">✗</span></td>
|
||||
<td class="ours"><span class="yes">✓</span><small>via Element Call embed</small></td>
|
||||
<td><span class="yes">✓</span></td>
|
||||
<td><span class="no">✗</span></td>
|
||||
<td><span class="no">✗</span></td>
|
||||
@@ -775,13 +775,22 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Group calls</td>
|
||||
<td class="ours"><span class="part">~</span><small>space rooms only</small></td>
|
||||
<td class="ours"><span class="yes">✓</span><small>via Element Call embed</small></td>
|
||||
<td><span class="yes">✓</span><small>MatrixRTC</small></td>
|
||||
<td><span class="no">✗</span></td>
|
||||
<td><span class="part">~</span><small>no E2EE voice rooms</small></td>
|
||||
<td><span class="yes">✓</span></td>
|
||||
<td><span class="part">~</span><small>partial</small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Incoming call notification<small>ring + Answer/Decline</small></td>
|
||||
<td class="ours"><span class="yes">✓</span><small>DM rooms; ring tone,<br>30s auto-dismiss</small></td>
|
||||
<td><span class="yes">✓</span><small>native push</small></td>
|
||||
<td><span class="part">~</span><small>experimental</small></td>
|
||||
<td><span class="yes">✓</span></td>
|
||||
<td><span class="yes">✓</span><small>desktop</small></td>
|
||||
<td><span class="part">~</span><small>partial</small></td>
|
||||
</tr>
|
||||
|
||||
<!-- Core features -->
|
||||
<tr class="section-header"><td colspan="7">Core Features</td></tr>
|
||||
@@ -805,7 +814,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Polls</td>
|
||||
<td class="ours"><span class="no">✗</span></td>
|
||||
<td class="ours"><span class="part">~</span><small>display-only; open in<br>Element to vote</small></td>
|
||||
<td><span class="yes">✓</span></td>
|
||||
<td><span class="part">~</span><small>recently added</small></td>
|
||||
<td><span class="no">✗</span></td>
|
||||
@@ -823,7 +832,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>GIF search / picker</td>
|
||||
<td class="ours"><span class="no">✗</span></td>
|
||||
<td class="ours"><span class="yes">✓</span><small>Giphy, Terminal TDS themed,<br>click-outside to close</small></td>
|
||||
<td><span class="no">✗</span></td>
|
||||
<td><span class="no">✗</span></td>
|
||||
<td><span class="yes">✓</span><small>privacy proxy,<br>uploads to homeserver</small></td>
|
||||
@@ -889,7 +898,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Deleted message visibility<small>(redacted events)</small></td>
|
||||
<td class="ours"><span class="no">✗</span><small>hides deleted messages<br>entirely — no trace</small></td>
|
||||
<td class="ours"><span class="yes">✓</span><small>"Message deleted" with reason<br>if provided</small></td>
|
||||
<td><span class="yes">✓</span><small>"Message deleted"<br>placeholder shown</small></td>
|
||||
<td><span class="yes">✓</span><small>shows redaction notice</small></td>
|
||||
<td><span class="yes">✓</span><small>shows redaction notice</small></td>
|
||||
|
||||
Reference in New Issue
Block a user