feat: update client comparison table (May 2026)
Lint / Shell (shellcheck) (push) Successful in 15s
Lint / JS (eslint) (push) Successful in 8s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 1m4s
Lint / Secret scan (gitleaks) (push) Successful in 6s

- 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:
2026-05-15 00:49:04 -04:00
parent ffff199b7f
commit f3a7bcd00b
2 changed files with 49 additions and 9 deletions
+32 -1
View File
@@ -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
View File
@@ -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 &mdash; March 2026</p>
<p class="comparison-title">Client Feature Comparison &mdash; 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 &amp; Video</td></tr>
<tr>
<td>Voice &amp; 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 &amp; 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>