landing: re-verify every client claim (reviewed 2026-09-26)
Lint / Shell (shellcheck) (push) Successful in 21s
Lint / JS (eslint) (push) Successful in 11s
Lint / No secrets in webhook configs (push) Successful in 9s
Lint / Landing page is rendered (matrix (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 7s
Lint / Python deps (pip-audit) (push) Successful in 47s
Lint / Secret scan (gitleaks) (push) Successful in 7s

Each client's card and all 64 table cells were checked against its latest
release (source at the release tag, changelogs, official docs):
Cinny v4.12.7, Element Web v1.12.29, Element X 26.09.2, FluffyChat
v2.9.5, Commet v0.5.0, Nheko v0.12.1. ~95 cells corrected, notes
tightened, chips made consistent (platforms / SDK / one calling chip).

Notable:
- Cinny: calls, voice rooms and screenshare via Element Call are stable
  (card gained the calling chip); ring, who-reacted, read receipts: yes;
  polls: no.
- Element X: cannot START a screenshare (mobile web views have no
  getDisplayMedia) — chip is now "Voice & Video".
- FluffyChat: threads, pinning, media gallery, custom status, QR invites:
  yes; calls still experimental (DM-only, legacy 1:1).
- Commet: web app + Windows/Linux, no macOS; screenshare, widgets
  (v0.5.0), favourites: yes; "Beta" chip dropped (not self-described).
- Nheko: calls are 1:1 only and only in Linux builds; threads: yes; no
  release since Aug 2025.
- Element: no bookmarks or scheduling; custom status is Labs; QR invites
  and sort order: yes.
- Lotus Chat: Vodozemac yes (Rust crypto), widgets yes, push = only while
  open (no background push yet); desktop app is Windows + Linux (the
  feature list said macOS).
- Vodozemac is yes for every js-sdk client now (Rust crypto).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
This commit is contained in:
Lotus CI
2026-09-26 16:53:07 -04:00
co-authored by Claude Opus 5.5
parent f0017f4d5a
commit 1dccca914c
3 changed files with 324 additions and 265 deletions
+196 -143
View File
@@ -1,5 +1,5 @@
{ {
"reviewed": "2026-09-23", "reviewed": "2026-09-26",
"clients": [ "clients": [
{ {
"name": "Lotus Chat", "name": "Lotus Chat",
@@ -15,11 +15,11 @@
}, },
{ {
"name": "FluffyChat", "name": "FluffyChat",
"sub": "All platforms" "sub": "Android, iOS, Web &amp; Linux"
}, },
{ {
"name": "Commet", "name": "Commet",
"sub": "Android / Win / macOS / Linux" "sub": "Android / Win / Linux / Web"
}, },
{ {
"name": "Element", "name": "Element",
@@ -97,14 +97,15 @@
"note": "Cinny Desktop" "note": "Cinny Desktop"
}, },
{ {
"mark": "no" "mark": "part",
"note": "iOS build runs on Apple Silicon Macs (no Windows/Linux)"
}, },
{ {
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "Win, macOS &amp; Linux" "note": "Windows &amp; Linux (macOS: build from source only)"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -130,7 +131,8 @@
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "app.commet.chat (v0.5.0)"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -187,16 +189,19 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "Linux: click opens chat, Mark-as-read/Mute actions; no inline reply"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "Windows &amp; Linux: click-to-open, inline reply, call accept/decline"
}, },
{ {
"mark": "part" "mark": "part"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "Linux inline reply (D-Bus), macOS quick reply, click-to-open"
} }
] ]
}, },
@@ -291,7 +296,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "wakelock during (experimental) calls"
}, },
{ {
"mark": "no" "mark": "no"
@@ -365,12 +371,12 @@
"feature": "Vodozemac encryption<small>stronger crypto track record</small>", "feature": "Vodozemac encryption<small>stronger crypto track record</small>",
"cells": [ "cells": [
{ {
"mark": "no", "mark": "yes",
"note": "js-sdk" "note": "Rust crypto (matrix-sdk-crypto-wasm) via js-sdk"
}, },
{ {
"mark": "no", "mark": "yes",
"note": "js-sdk" "note": "Rust crypto (matrix-sdk-crypto-wasm) via js-sdk"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -385,8 +391,8 @@
"note": "dart-sdk" "note": "dart-sdk"
}, },
{ {
"mark": "no", "mark": "yes",
"note": "js-sdk, migrating" "note": "Rust crypto (matrix-sdk-crypto-wasm)"
}, },
{ {
"mark": "no" "mark": "no"
@@ -402,7 +408,7 @@
}, },
{ {
"mark": "part", "mark": "part",
"note": "cross-client requests<br>may show unsupported" "note": "own devices only (emoji + recovery key)"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -434,26 +440,27 @@
"note": "rooms &amp; DMs, group calls,<br>screenshare via Element Call" "note": "rooms &amp; DMs, group calls,<br>screenshare via Element Call"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "Element Call embed;<br>no ring notification" "note": "1:1 + group via embedded Element Call"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "MatrixRTC" "note": "1:1 &amp; group via embedded Element Call"
}, },
{ {
"mark": "part", "mark": "part",
"note": "experimental, varies<br>by homeserver" "note": "experimental setting, DMs only (legacy 1:1 WebRTC)"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "1:1 + group,<br>no E2EE voice rooms" "note": "1:1 WebRTC; voice channels via MatrixRTC + LiveKit; E2EE experimental"
}, },
{ {
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "yes" "mark": "part",
"note": "1:1 only, legacy VoIP; Linux builds only"
} }
] ]
}, },
@@ -469,20 +476,23 @@
"note": "via Element Call embed" "note": "via Element Call embed"
}, },
{ {
"mark": "yes" "mark": "no",
"note": "can view others' screenshares, cannot start one"
}, },
{ {
"mark": "no" "mark": "part",
"note": "experimental 1:1 calls, mobile &amp; web only"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "desktop, Android &amp; browser; 1:1 and voice channels"
}, },
{ {
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "XDG portals &amp; native" "note": "Linux builds only (1:1 calls; XDG portal)"
} }
] ]
}, },
@@ -502,14 +512,16 @@
"note": "browser-native" "note": "browser-native"
}, },
{ {
"mark": "no" "mark": "part",
}, "note": "WebRTC-native"
{
"mark": "no"
}, },
{ {
"mark": "part", "mark": "part",
"note": "browser-native;<br>ML only on LiveKit Cloud" "note": "browser-native (WebRTC)"
},
{
"mark": "part",
"note": "browser-native (WebRTC noiseSuppression toggle)"
}, },
{ {
"mark": "no" "mark": "no"
@@ -524,7 +536,8 @@
"note": "configurable hold key,<br>PTT badge in call bar;<br>M = push-to-deafen;<br>system-wide on Windows desktop" "note": "configurable hold key,<br>PTT badge in call bar;<br>M = push-to-deafen;<br>system-wide on Windows desktop"
}, },
{ {
"mark": "no" "mark": "part",
"note": "hold Space while muted (Element Call built-in); no configurable key"
}, },
{ {
"mark": "no" "mark": "no"
@@ -536,7 +549,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "hold Space while muted in Element Call; no configurable key"
}, },
{ {
"mark": "no" "mark": "no"
@@ -605,19 +619,23 @@
"note": "3 styles,<br>Web Audio synth" "note": "3 styles,<br>Web Audio synth"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "via Element Call (calls up to 8 people)"
},
{
"mark": "yes",
"note": "via Element Call"
}, },
{ {
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "voice channels play join/leave cues for other participants"
}, },
{ {
"mark": "no" "mark": "yes",
}, "note": "Element Call (calls up to 8 people)"
{
"mark": "no"
}, },
{ {
"mark": "no" "mark": "no"
@@ -637,21 +655,21 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "MatrixRTC" "note": "via embedded Element Call"
}, },
{ {
"mark": "no" "mark": "no"
}, },
{ {
"mark": "part", "mark": "part",
"note": "no E2EE voice rooms" "note": "MatrixRTC voice channels; E2EE experimental (v0.5.0)"
}, },
{ {
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "part", "mark": "no",
"note": "partial" "note": "1:1 only; no MatrixRTC/Element Call or Jitsi"
} }
] ]
}, },
@@ -663,7 +681,8 @@
"note": "DMs &amp; group chats;<br>ring tone, auto-dismiss" "note": "DMs &amp; group chats;<br>ring tone, auto-dismiss"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "rings for DM calls (Answer/Reject); silent prompt for group calls"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -678,11 +697,11 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "desktop" "note": "ringing toast with Accept/Decline (web &amp; desktop)"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "partial" "note": "ringtone (selectable) + Accept/Decline bar"
} }
] ]
} }
@@ -739,8 +758,8 @@
"note": "Labs flag" "note": "Labs flag"
}, },
{ {
"mark": "no", "mark": "yes",
"note": "shows as regular messages" "note": "thread view since v2.3.0"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -749,7 +768,8 @@
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "since v0.11.0"
} }
] ]
}, },
@@ -761,8 +781,8 @@
"note": "create, vote &amp; display;<br>single or multiple choice" "note": "create, vote &amp; display;<br>single or multiple choice"
}, },
{ {
"mark": "part", "mark": "no",
"note": "display only" "note": "not rendered (no m.poll support)"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -811,7 +831,8 @@
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "no" "mark": "part",
"note": "playback only (inline audio player); no recording"
} }
] ]
}, },
@@ -829,8 +850,8 @@
"note": "dedicated pins view" "note": "dedicated pins view"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "view only" "note": "pin/unpin + pinned banner"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -916,7 +937,7 @@
}, },
{ {
"mark": "part", "mark": "part",
"note": "cache scan only" "note": "per-room; downloads &amp; decrypts history client-side"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -936,7 +957,8 @@
"feature": "Widgets", "feature": "Widgets",
"cells": [ "cells": [
{ {
"mark": "no" "mark": "yes",
"note": "room widgets; asks before a widget may read or send in the room"
}, },
{ {
"mark": "no" "mark": "no"
@@ -948,13 +970,15 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "added v0.5.0 (Widgets API, native runner on Android/Windows)"
}, },
{ {
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "no" "mark": "part",
"note": "listed in room header, open externally"
} }
] ]
} }
@@ -976,8 +1000,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "supported but clunky" "note": "account switcher; multi-account push since v2.6.0"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -999,21 +1023,22 @@
"note": "caption field on<br>image &amp; video upload" "note": "caption field on<br>image &amp; video upload"
}, },
{ {
"mark": "no" "mark": "part",
"note": "shows captions from other clients; cannot send"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "scrollable captions<br>on media (v26.04.2)" "note": "scrollable captions<br>on media (v26.04.2)"
}, },
{ {
"mark": "yes", "mark": "yes"
"note": "unique feature"
}, },
{ {
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "shows captions from other clients; cannot send"
}, },
{ {
"mark": "part" "mark": "part"
@@ -1039,7 +1064,7 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "most Discord-like overall" "note": "Discord-like layout"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1138,8 +1163,8 @@
"note": "\"Message deleted\" with reason<br>if provided" "note": "\"Message deleted\" with reason<br>if provided"
}, },
{ {
"mark": "no", "mark": "part",
"note": "redacted messages hidden" "note": "hidden by default; shown with \"Show Hidden Events\""
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -1150,8 +1175,8 @@
"note": "shows redaction notice" "note": "shows redaction notice"
}, },
{ {
"mark": "yes", "mark": "no",
"note": "shows redaction notice" "note": "redacted events are hidden from the timeline"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -1171,7 +1196,8 @@
"note": "map embed view +<br>static share button" "note": "map embed view +<br>static share button"
}, },
{ {
"mark": "no" "mark": "part",
"note": "shows received locations; cannot send"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -1203,20 +1229,20 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "via share menu" "note": "Forward action; multi-room on Android"
},
{
"mark": "yes"
},
{
"mark": "part"
}, },
{ {
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "no" "mark": "no"
},
{
"mark": "yes"
},
{
"mark": "yes"
} }
] ]
}, },
@@ -1228,7 +1254,8 @@
"note": "avatar pill below message,<br>click for list + timestamps" "note": "avatar pill below message,<br>click for list + timestamps"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "'Read Receipts' in message menu lists readers"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -1257,21 +1284,23 @@
"note": "hover tooltip with names;<br>right-click for full avatar modal" "note": "hover tooltip with names;<br>right-click for full avatar modal"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "hover tooltip + 'View Reactions' viewer"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "tap reaction chip" "note": "long-press reaction for summary sheet"
}, },
{ {
"mark": "part" "mark": "yes",
"note": "long-press reaction"
}, },
{ {
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "tooltip + click for list" "note": "hover tooltip lists reactors"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -1290,7 +1319,8 @@
"note": "label shown, not clickable" "note": "label shown, not clickable"
}, },
{ {
"mark": "yes" "mark": "no",
"note": "shows \"(edited)\" label only"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1302,7 +1332,8 @@
"mark": "yes" "mark": "yes"
}, },
{ {
"mark": "yes" "mark": "no",
"note": "only an 'Edited' marker"
} }
] ]
}, },
@@ -1317,20 +1348,24 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
}, "note": "emoji + text status (needs server support)"
{
"mark": "no"
},
{
"mark": "no"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "via profile settings" "note": "Set status; shown under DM header &amp; in profile"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "shown under name in user panels/profile"
},
{
"mark": "part",
"note": "Labs; needs homeserver support (MSC4429)"
},
{
"mark": "yes",
"note": "shown next to sender name in timeline &amp; in profile"
} }
] ]
}, },
@@ -1343,7 +1378,11 @@
}, },
{ {
"mark": "part", "mark": "part",
"note": "manual AFK only; auto idle<br>detection PR open, unmerged" "note": "shows others' status; no idle detection"
},
{
"mark": "part",
"note": "reports own presence; doesn't show others'"
}, },
{ {
"mark": "part", "mark": "part",
@@ -1351,19 +1390,15 @@
}, },
{ {
"mark": "part", "mark": "part",
"note": "basic online/offline only" "note": "sets 'unavailable' 15s after the app loses focus; no input-idle timer"
}, },
{ {
"mark": "part", "mark": "part",
"note": "inactivity monitor shipped Oct 2025;<br>no tab/close detection confirmed" "note": "3-min idle → away; no hide toggle"
}, },
{ {
"mark": "part", "mark": "part",
"note": "3-min idle timer (shipped Nov 2023);<br>no tab detection, no offline on close,<br>no user-facing hide toggle" "note": "auto: unavailable ~30 s after losing focus"
},
{
"mark": "part",
"note": "basic online/offline only"
} }
] ]
}, },
@@ -1378,16 +1413,19 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "\"Media and files\" browser in room info"
},
{
"mark": "yes",
"note": "Gallery &amp; Files tabs in chat search"
}, },
{ {
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
}, "note": "Files panel lists room attachments; no grid gallery"
{
"mark": "no"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1405,10 +1443,12 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "room list search + filter chips"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "search field filters chat list by name + filter chips"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1432,20 +1472,24 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "Favourites filter chip (no separate section)"
}, },
{ {
"mark": "no" "mark": "part",
"note": "favourite (pin) floats to top; tag filter chips"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "'Favorites' section (v0.5.0)"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "favourites section" "note": "favourites section"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "'Favourites' tag in community sidebar"
} }
] ]
}, },
@@ -1460,16 +1504,19 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "share room link; no QR"
},
{
"mark": "yes",
"note": "share invite link + QR codes"
}, },
{ {
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
}, "note": "Share room dialog: matrix.to link + QR code"
{
"mark": "no"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1487,7 +1534,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "iOS: choose alert tone (global)"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1496,7 +1544,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "per room, not per category"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1546,18 +1595,19 @@
}, },
{ {
"mark": "part", "mark": "part",
"note": "alphabetical only" "note": "activity only (favourites first, low priority last)"
},
{
"mark": "yes",
"note": "multiple sort options"
}, },
{ {
"mark": "part", "mark": "part",
"note": "limited" "note": "manual drag-reorder; no sort selector"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "Activity, A-Z or Unread-first"
},
{
"mark": "yes",
"note": "by importance/unread or alphabetical"
} }
] ]
}, },
@@ -1566,11 +1616,11 @@
"cells": [ "cells": [
{ {
"mark": "part", "mark": "part",
"note": "web push only" "note": "OS notifications while the app is open; no background push yet"
}, },
{ {
"mark": "part", "mark": "part",
"note": "web push only" "note": "only while the tab/app is open; optional email"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -1638,8 +1688,7 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "part", "mark": "no"
"note": "partial / labs"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1666,7 +1715,7 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "yes" "mark": "no"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1687,7 +1736,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "collapses &gt;25 lines (configurable), Show more/less"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1771,7 +1821,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "leading emoji becomes the room icon when no avatar"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1798,14 +1849,15 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "part", "mark": "yes",
"note": "hover bar, no recents" "note": "hover bar shows up to 4 recent reactions, 1-click"
}, },
{ {
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "yes",
"note": "hover bar shows recent reactions, 1-click"
} }
] ]
}, },
@@ -1847,7 +1899,8 @@
"mark": "no" "mark": "no"
}, },
{ {
"mark": "no" "mark": "part",
"note": "iOS only (Apple Translation)"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1866,4 +1919,4 @@
] ]
} }
] ]
} }
+1 -1
View File
@@ -58,7 +58,7 @@
{ {
"title": "Desktop App", "title": "Desktop App",
"items": [ "items": [
"Windows, macOS and Linux (Tauri)", "Windows and Linux (Tauri): installer, AppImage, .deb and Arch package",
"Rich Windows notifications with inline reply; Focus Assist sync", "Rich Windows notifications with inline reply; Focus Assist sync",
"Taskbar call controls, jump list and upload progress; tray with call status", "Taskbar call controls, jump list and upload progress; tray with call status",
"Stays awake during calls, reconnects on network changes, updates itself" "Stays awake during calls, reconnects on network changes, updates itself"
+127 -121
View File
@@ -571,9 +571,11 @@
<span class="client-name">Lotus Guild Chat</span> <span class="client-name">Lotus Guild Chat</span>
<span class="client-desc">Hosted Cinny &mdash; homeserver pre-configured, no setup</span> <span class="client-desc">Hosted Cinny &mdash; homeserver pre-configured, no setup</span>
<span class="tag-row"> <span class="tag-row">
<span class="tag dim">Desktop &amp; Web</span> <span class="tag dim">Windows</span>
<span class="tag dim">Linux</span>
<span class="tag dim">Web</span>
<span class="tag dev">Lotus Fork</span> <span class="tag dev">Lotus Fork</span>
<span class="tag voice">Voice &amp; Video Rooms</span> <span class="tag voice">Voice, Video &amp; Screenshare</span>
<span class="tag">Discord-like UI</span> <span class="tag">Discord-like UI</span>
</span> </span>
</a> </a>
@@ -640,7 +642,7 @@
<div class="fork-group"> <div class="fork-group">
<h4>Desktop App</h4> <h4>Desktop App</h4>
<ul> <ul>
<li>Windows, macOS and Linux (Tauri)</li> <li>Windows and Linux (Tauri): installer, AppImage, .deb and Arch package</li>
<li>Rich Windows notifications with inline reply; Focus Assist sync</li> <li>Rich Windows notifications with inline reply; Focus Assist sync</li>
<li>Taskbar call controls, jump list and upload progress; tray with call status</li> <li>Taskbar call controls, jump list and upload progress; tray with call status</li>
<li>Stays awake during calls, reconnects on network changes, updates itself</li> <li>Stays awake during calls, reconnects on network changes, updates itself</li>
@@ -678,11 +680,14 @@
<div class="client-card-top"> <div class="client-card-top">
<a href="https://cinny.in" target="_blank" rel="noopener" class="client-card-name">Cinny</a> <a href="https://cinny.in" target="_blank" rel="noopener" class="client-card-name">Cinny</a>
<div class="client-card-tags"> <div class="client-card-tags">
<span class="tag dim">Windows</span>
<span class="tag dim">macOS</span>
<span class="tag dim">Linux</span>
<span class="tag dim">Web</span> <span class="tag dim">Web</span>
<span class="tag dim">Desktop</span> <span class="tag voice">Voice, Video &amp; Screenshare</span>
</div> </div>
</div> </div>
<p class="client-card-desc">The upstream open-source Cinny client. Same Discord-like UI and best-in-class space navigation as Lotus Chat, but without our custom additions (no GIF picker, no call ring notification, no PiP window, no message forwarding). Set homeserver to <code style="font-size:0.85em;color:#e88;background:rgba(152,0,0,0.08);padding:1px 5px;border-radius:4px;">matrix.lotusguild.org</code>.</p> <p class="client-card-desc">The upstream open-source Cinny client, on the web and as a desktop app for Windows, macOS and Linux. It has the same Discord-like UI and space navigation as Lotus Chat, and now includes voice/video calls, voice rooms and screenshare through embedded Element Call, with ringing for DM calls. It lacks our custom additions (no GIF picker, no PiP window, no message forwarding). Set homeserver to <code style="font-size:0.85em;color:#e88;background:rgba(152,0,0,0.08);padding:1px 5px;border-radius:4px;">matrix.lotusguild.org</code>.</p>
</div> </div>
</div> </div>
</div> </div>
@@ -697,10 +702,10 @@
<span class="tag dim">iOS</span> <span class="tag dim">iOS</span>
<span class="tag dim">Android</span> <span class="tag dim">Android</span>
<span class="tag rust">Rust SDK</span> <span class="tag rust">Rust SDK</span>
<span class="tag voice">Voice, Video &amp; Screenshare</span> <span class="tag voice">Voice &amp; Video</span>
</div> </div>
</div> </div>
<p class="client-card-desc">Fastest Matrix client &mdash; instant load via Sliding Sync. Native MatrixRTC calls (voice-only + video), screenshare, DM voice calls, live location sharing, media captions. Full space create &amp; management. Rust encryption (Vodozemac).</p> <p class="client-card-desc">Element's next-generation mobile client for iOS and Android, built on the Rust SDK with Simplified Sliding Sync for near-instant startup (the iOS app also runs on Apple Silicon Macs). Voice and video calls, 1:1 and group, via embedded Element Call (MatrixRTC). It can view but not start screenshares. Live location sharing, media captions, polls, pinned messages, a media browser and spaces with create and management, plus custom status on supported homeservers. Threads are in Labs. Rust crypto (Vodozemac).</p>
</div> </div>
<div class="client-card"> <div class="client-card">
<div class="client-card-top"> <div class="client-card-top">
@@ -708,19 +713,19 @@
<div class="client-card-tags"> <div class="client-card-tags">
<span class="tag dim">iOS</span> <span class="tag dim">iOS</span>
<span class="tag dim">Android</span> <span class="tag dim">Android</span>
<span class="tag dim">Desktop</span> <span class="tag dim">Linux</span>
<span class="tag dim">Web</span> <span class="tag dim">Web</span>
<span class="tag dim">Dart SDK</span> <span class="tag rust">Dart SDK</span>
<span class="tag warn">Calls Experimental</span> <span class="tag warn">Voice &amp; Video (Experimental)</span>
</div> </div>
</div> </div>
<p class="client-card-desc">Simple, beginner-friendly, fully cross-platform. Dart SDK with Vodozemac encryption. Unique: supports image captions (text + image as one event). Voice/video calls are experimental &mdash; reliability varies by homeserver and platform.</p> <p class="client-card-desc">Simple, beginner-friendly Matrix client with a WhatsApp/Telegram-style design, available on Android, iOS, web and Linux desktop. Built on the Dart SDK with Vodozemac encryption. Supports threads, polls, image captions, custom sticker packs, voice messages and spaces. 1:1 voice and video calls exist but remain experimental: they are off by default, DM-only, legacy WebRTC, and there are no group calls.</p>
</div> </div>
</div> </div>
</div> </div>
<div class="client-group"> <div class="client-group">
<p class="client-group-label">Discord-like &mdash; Android, Windows, macOS &amp; Linux</p> <p class="client-group-label">Discord-like &mdash; Android, Windows, Linux &amp; Web</p>
<div class="client-cards"> <div class="client-cards">
<div class="client-card"> <div class="client-card">
<div class="client-card-top"> <div class="client-card-top">
@@ -728,13 +733,13 @@
<div class="client-card-tags"> <div class="client-card-tags">
<span class="tag dim">Android</span> <span class="tag dim">Android</span>
<span class="tag dim">Windows</span> <span class="tag dim">Windows</span>
<span class="tag dim">macOS</span>
<span class="tag dim">Linux</span> <span class="tag dim">Linux</span>
<span class="tag beta">Beta</span> <span class="tag dim">Web</span>
<span class="tag voice">Voice &amp; Video</span> <span class="tag rust">Dart SDK</span>
<span class="tag voice">Voice, Video &amp; Screenshare</span>
</div> </div>
</div> </div>
<p class="client-card-desc">Most Discord-like client overall. Multi-account support, built-in GIF search (privacy proxy &mdash; uploads to homeserver), shared calendars &amp; photo albums, polls, screenshare on browsers &amp; Android. Available on Android, Windows, macOS, Linux, and Web. Active development &mdash; iOS planned.</p> <p class="client-card-desc">Discord-style client built with Flutter. Multi-account support with all accounts signed in at once, built-in GIF search (Tenor through a privacy proxy, uploaded to your homeserver), shared calendar and photo-album rooms, polls, threads and widgets (new in v0.5.0). 1:1 calls use WebRTC and voice channels use MatrixRTC/LiveKit, with screenshare on desktop, Android and web. Encrypted group calls are experimental. Available for Windows, Linux, Android and on the web at app.commet.chat. Actively developed; macOS and iOS are planned.</p>
</div> </div>
</div> </div>
</div> </div>
@@ -753,7 +758,7 @@
<span class="tag voice">Voice, Video &amp; Screenshare</span> <span class="tag voice">Voice, Video &amp; Screenshare</span>
</div> </div>
</div> </div>
<p class="client-card-desc">Most feature-complete Matrix client &mdash; every spec feature including polls, widgets, threads, screenshare. Heavier on resources. Encrypted message search on desktop only (not web).</p> <p class="client-card-desc">Element's reference web and desktop client (Electron), with the broadest feature set here: threads, polls, widgets, location sharing, chat export and a room list with sections, filters and sorting. Voice/video calls with screenshare use embedded Element Call when the homeserver provides it, with legacy 1:1 and Jitsi fallbacks. Heavier on resources. Encrypted message search on desktop only (not web).</p>
</div> </div>
<div class="client-card"> <div class="client-card">
<div class="client-card-top"> <div class="client-card-top">
@@ -762,10 +767,11 @@
<span class="tag dim">Windows</span> <span class="tag dim">Windows</span>
<span class="tag dim">macOS</span> <span class="tag dim">macOS</span>
<span class="tag dim">Linux</span> <span class="tag dim">Linux</span>
<span class="tag voice">Voice &amp; Video</span> <span class="tag rust">Qt/C++</span>
<span class="tag voice">Voice, Video &amp; Screenshare (1:1, Linux)</span>
</div> </div>
</div> </div>
<p class="client-card-desc">Native C++/Qt client &mdash; lightest desktop option, no Electron. Deep KDE/Plasma integration. No threads, no mobile or web. Best for Linux power users who want minimal resource usage.</p> <p class="client-card-desc">Native Qt/C++ desktop client with no Electron and a low resource footprint. It has threads, local encrypted search, custom emoji and sticker packs, and a D-Bus API for Linux integrations. 1:1 voice and video calls with screenshare use legacy WebRTC and are only in Linux builds; there are no group calls. No mobile or web version. Development has slowed: the last release was v0.12.1 in August 2025. A good fit for Linux users who want a lightweight native client.</p>
</div> </div>
</div> </div>
</div> </div>
@@ -779,7 +785,7 @@
<div class="comparison-section"> <div class="comparison-section">
<p class="comparison-title">Client Feature Comparison</p> <p class="comparison-title">Client Feature Comparison</p>
<p class="reviewed"><!-- BEGIN:reviewed --> <p class="reviewed"><!-- BEGIN:reviewed -->
Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time> Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<!-- END:reviewed --></p> <!-- END:reviewed --></p>
<p class="scroll-hint" id="scrollHint">← swipe to compare →</p> <p class="scroll-hint" id="scrollHint">← swipe to compare →</p>
<div class="table-wrap"> <div class="table-wrap">
@@ -791,8 +797,8 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<th class="ours">Lotus Chat<small>chat.lotusguild.org<br>Our Cinny fork</small></th> <th class="ours">Lotus Chat<small>chat.lotusguild.org<br>Our Cinny fork</small></th>
<th>Cinny<small>cinny.in<br>Official</small></th> <th>Cinny<small>cinny.in<br>Official</small></th>
<th>Element X<small>iOS &amp; Android</small></th> <th>Element X<small>iOS &amp; Android</small></th>
<th>FluffyChat<small>All platforms</small></th> <th>FluffyChat<small>Android, iOS, Web &amp; Linux</small></th>
<th>Commet<small>Android / Win / macOS / Linux</small></th> <th>Commet<small>Android / Win / Linux / Web</small></th>
<th>Element<small>Web &amp; Desktop</small></th> <th>Element<small>Web &amp; Desktop</small></th>
<th>Nheko<small>Desktop only</small></th> <th>Nheko<small>Desktop only</small></th>
</tr> </tr>
@@ -823,9 +829,9 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td>Desktop app</td> <td>Desktop app</td>
<td class="ours"><span class="yes">✓</span></td> <td class="ours"><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>Cinny Desktop</small></td> <td><span class="yes">✓</span><small>Cinny Desktop</small></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>iOS build runs on Apple Silicon Macs (no Windows/Linux)</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>Win, macOS &amp; Linux</small></td> <td><span class="yes">✓</span><small>Windows &amp; Linux (macOS: build from source only)</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
</tr> </tr>
@@ -835,7 +841,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>app.commet.chat (v0.5.0)</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
@@ -855,10 +861,10 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td class="ours"><span class="yes">✓</span></td> <td class="ours"><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>Linux: click opens chat, Mark-as-read/Mute actions; no inline reply</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>Windows &amp; Linux: click-to-open, inline reply, call accept/decline</small></td>
<td><span class="part">~</span></td> <td><span class="part">~</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>Linux inline reply (D-Bus), macOS quick reply, click-to-open</small></td>
</tr> </tr>
<tr> <tr>
<td>Windows Jump List (recent rooms)</td> <td>Windows Jump List (recent rooms)</td>
@@ -895,7 +901,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td class="ours"><span class="yes">✓</span></td> <td class="ours"><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>wakelock during (experimental) calls</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span></td> <td><span class="part">~</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
@@ -923,18 +929,18 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
</tr> </tr>
<tr> <tr>
<td>Vodozemac encryption<small>stronger crypto track record</small></td> <td>Vodozemac encryption<small>stronger crypto track record</small></td>
<td class="ours"><span class="no">✗</span><small>js-sdk</small></td> <td class="ours"><span class="yes">✓</span><small>Rust crypto (matrix-sdk-crypto-wasm) via js-sdk</small></td>
<td><span class="no">✗</span><small>js-sdk</small></td> <td><span class="yes">✓</span><small>Rust crypto (matrix-sdk-crypto-wasm) via js-sdk</small></td>
<td><span class="yes">✓</span><small>Rust SDK</small></td> <td><span class="yes">✓</span><small>Rust SDK</small></td>
<td><span class="yes">✓</span><small>dart-sdk</small></td> <td><span class="yes">✓</span><small>dart-sdk</small></td>
<td><span class="yes">✓</span><small>dart-sdk</small></td> <td><span class="yes">✓</span><small>dart-sdk</small></td>
<td><span class="no">✗</span><small>js-sdk, migrating</small></td> <td><span class="yes">✓</span><small>Rust crypto (matrix-sdk-crypto-wasm)</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>Device verification</td> <td>Device verification</td>
<td class="ours"><span class="yes">✓</span><small>SAS emoji, cross-client requests show inline card</small></td> <td class="ours"><span class="yes">✓</span><small>SAS emoji, cross-client requests show inline card</small></td>
<td><span class="part">~</span><small>cross-client requests<br>may show unsupported</small></td> <td><span class="part">~</span><small>own devices only (emoji + recovery key)</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
@@ -945,41 +951,41 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<tr> <tr>
<td>Voice &amp; video calls</td> <td>Voice &amp; video calls</td>
<td class="ours"><span class="yes">✓</span><small>rooms &amp; DMs, group calls,<br>screenshare via Element Call</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="part">~</span><small>Element Call embed;<br>no ring notification</small></td> <td><span class="yes">✓</span><small>1:1 + group via embedded Element Call</small></td>
<td><span class="yes">✓</span><small>MatrixRTC</small></td> <td><span class="yes">✓</span><small>1:1 &amp; group via embedded Element Call</small></td>
<td><span class="part">~</span><small>experimental, varies<br>by homeserver</small></td> <td><span class="part">~</span><small>experimental setting, DMs only (legacy 1:1 WebRTC)</small></td>
<td><span class="part">~</span><small>1:1 + group,<br>no E2EE voice rooms</small></td> <td><span class="yes">✓</span><small>1:1 WebRTC; voice channels via MatrixRTC + LiveKit; E2EE experimental</small></td>
<td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="part">~</span><small>1:1 only, legacy VoIP; Linux builds only</small></td>
</tr> </tr>
<tr> <tr>
<td>Screenshare</td> <td>Screenshare</td>
<td class="ours"><span class="yes">✓</span><small>via Element Call; fullscreen button,<br>independent audio mute</small></td> <td class="ours"><span class="yes">✓</span><small>via Element Call; fullscreen button,<br>independent audio mute</small></td>
<td><span class="yes">✓</span><small>via Element Call embed</small></td> <td><span class="yes">✓</span><small>via Element Call embed</small></td>
<td><span class="no">✗</span><small>can view others' screenshares, cannot start one</small></td>
<td><span class="part">~</span><small>experimental 1:1 calls, mobile &amp; web only</small></td>
<td><span class="yes">✓</span><small>desktop, Android &amp; browser; 1:1 and voice channels</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>Linux builds only (1:1 calls; XDG portal)</small></td>
<td><span class="no">✗</span></td>
<td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>XDG portals &amp; native</small></td>
</tr> </tr>
<tr> <tr>
<td>Noise suppression<small>filter background noise from mic</small></td> <td>Noise suppression<small>filter background noise from mic</small></td>
<td class="ours"><span class="yes">✓</span><small>3 tiers: off / browser-native /<br>on-device ML (RNNoise, Speex,<br>DTLN, DeepFilterNet&nbsp;3),<br>works on self-hosted SFU</small></td> <td class="ours"><span class="yes">✓</span><small>3 tiers: off / browser-native /<br>on-device ML (RNNoise, Speex,<br>DTLN, DeepFilterNet&nbsp;3),<br>works on self-hosted SFU</small></td>
<td><span class="part">~</span><small>browser-native<br>via Element Call</small></td> <td><span class="part">~</span><small>browser-native<br>via Element Call</small></td>
<td><span class="part">~</span><small>browser-native</small></td> <td><span class="part">~</span><small>browser-native</small></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>WebRTC-native</small></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>browser-native (WebRTC)</small></td>
<td><span class="part">~</span><small>browser-native;<br>ML only on LiveKit Cloud</small></td> <td><span class="part">~</span><small>browser-native (WebRTC noiseSuppression toggle)</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>Push-to-Talk<small>hold key to transmit</small></td> <td>Push-to-Talk<small>hold key to transmit</small></td>
<td class="ours"><span class="yes">✓</span><small>configurable hold key,<br>PTT badge in call bar;<br>M = push-to-deafen;<br>system-wide on Windows desktop</small></td> <td class="ours"><span class="yes">✓</span><small>configurable hold key,<br>PTT badge in call bar;<br>M = push-to-deafen;<br>system-wide on Windows desktop</small></td>
<td><span class="part">~</span><small>hold Space while muted (Element Call built-in); no configurable key</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>hold Space while muted in Element Call; no configurable key</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
@@ -1005,32 +1011,32 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<tr> <tr>
<td>Call join/leave sounds<small>cue when others come &amp; go</small></td> <td>Call join/leave sounds<small>cue when others come &amp; go</small></td>
<td class="ours"><span class="yes">✓</span><small>3 styles,<br>Web Audio synth</small></td> <td class="ours"><span class="yes">✓</span><small>3 styles,<br>Web Audio synth</small></td>
<td><span class="yes">✓</span><small>via Element Call (calls up to 8 people)</small></td>
<td><span class="yes">✓</span><small>via Element Call</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>voice channels play join/leave cues for other participants</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>Element Call (calls up to 8 people)</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>Group calls</td> <td>Group calls</td>
<td class="ours"><span class="yes">✓</span><small>via Element Call embed</small></td> <td class="ours"><span class="yes">✓</span><small>via Element Call embed</small></td>
<td><span class="yes">✓</span><small>via Element Call embed</small></td> <td><span class="yes">✓</span><small>via Element Call embed</small></td>
<td><span class="yes">✓</span><small>MatrixRTC</small></td> <td><span class="yes">✓</span><small>via embedded Element Call</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>no E2EE voice rooms</small></td> <td><span class="part">~</span><small>MatrixRTC voice channels; E2EE experimental (v0.5.0)</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="part">~</span><small>partial</small></td> <td><span class="no">✗</span><small>1:1 only; no MatrixRTC/Element Call or Jitsi</small></td>
</tr> </tr>
<tr> <tr>
<td>Incoming call notification<small>ring + Answer/Decline</small></td> <td>Incoming call notification<small>ring + Answer/Decline</small></td>
<td class="ours"><span class="yes">✓</span><small>DMs &amp; group chats;<br>ring tone, auto-dismiss</small></td> <td class="ours"><span class="yes">✓</span><small>DMs &amp; group chats;<br>ring tone, auto-dismiss</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>rings for DM calls (Answer/Reject); silent prompt for group calls</small></td>
<td><span class="yes">✓</span><small>native push</small></td> <td><span class="yes">✓</span><small>native push</small></td>
<td><span class="part">~</span><small>experimental</small></td> <td><span class="part">~</span><small>experimental</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>desktop</small></td> <td><span class="yes">✓</span><small>ringing toast with Accept/Decline (web &amp; desktop)</small></td>
<td><span class="part">~</span><small>partial</small></td> <td><span class="yes">✓</span><small>ringtone (selectable) + Accept/Decline bar</small></td>
</tr> </tr>
<tr class="section-header"><td colspan="8">Core Features</td></tr> <tr class="section-header"><td colspan="8">Core Features</td></tr>
<tr> <tr>
@@ -1048,15 +1054,15 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td class="ours"><span class="yes">✓</span><small>side panel + Slack-style per-thread notifications</small></td> <td class="ours"><span class="yes">✓</span><small>side panel + Slack-style per-thread notifications</small></td>
<td><span class="part">~</span><small>basic, no dedicated view</small></td> <td><span class="part">~</span><small>basic, no dedicated view</small></td>
<td><span class="part">~</span><small>Labs flag</small></td> <td><span class="part">~</span><small>Labs flag</small></td>
<td><span class="no">✗</span><small>shows as regular messages</small></td> <td><span class="yes">✓</span><small>thread view since v2.3.0</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>since v0.11.0</small></td>
</tr> </tr>
<tr> <tr>
<td>Polls</td> <td>Polls</td>
<td class="ours"><span class="yes">✓</span><small>create, vote &amp; display;<br>single or multiple choice</small></td> <td class="ours"><span class="yes">✓</span><small>create, vote &amp; display;<br>single or multiple choice</small></td>
<td><span class="part">~</span><small>display only</small></td> <td><span class="no">✗</span><small>not rendered (no m.poll support)</small></td>
<td><span class="yes">✓</span><small>create, vote &amp; end</small></td> <td><span class="yes">✓</span><small>create, vote &amp; end</small></td>
<td><span class="yes">✓</span><small>added v2.3.0</small></td> <td><span class="yes">✓</span><small>added v2.3.0</small></td>
<td><span class="yes">✓</span><small>added v0.4.2</small></td> <td><span class="yes">✓</span><small>added v0.4.2</small></td>
@@ -1071,14 +1077,14 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td><span class="yes">✓</span><small>record &amp; play,<br>pause support</small></td> <td><span class="yes">✓</span><small>record &amp; play,<br>pause support</small></td>
<td><span class="part">~</span><small>playback confirmed;<br>recording unclear</small></td> <td><span class="part">~</span><small>playback confirmed;<br>recording unclear</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>playback only (inline audio player); no recording</small></td>
</tr> </tr>
<tr> <tr>
<td>Pinned messages</td> <td>Pinned messages</td>
<td class="ours"><span class="yes">✓</span></td> <td class="ours"><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>dedicated pins view</small></td> <td><span class="yes">✓</span><small>dedicated pins view</small></td>
<td><span class="part">~</span><small>view only</small></td> <td><span class="yes">✓</span><small>pin/unpin + pinned banner</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
@@ -1108,20 +1114,20 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td class="ours"><span class="yes">✓</span><small>local cache scan; load-more<br>buttons extend history per room</small></td> <td class="ours"><span class="yes">✓</span><small>local cache scan; load-more<br>buttons extend history per room</small></td>
<td><span class="part">~</span><small>server search only;<br>no E2EE support</small></td> <td><span class="part">~</span><small>server search only;<br>no E2EE support</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>cache scan only</small></td> <td><span class="part">~</span><small>per-room; downloads &amp; decrypts history client-side</small></td>
<td><span class="yes">✓</span><small>client-side; auto-fetches +<br>decrypts history during search</small></td> <td><span class="yes">✓</span><small>client-side; auto-fetches +<br>decrypts history during search</small></td>
<td><span class="part">~</span><small>desktop only, not web</small></td> <td><span class="part">~</span><small>desktop only, not web</small></td>
<td><span class="part">~</span><small>local DB scan</small></td> <td><span class="part">~</span><small>local DB scan</small></td>
</tr> </tr>
<tr> <tr>
<td>Widgets</td> <td>Widgets</td>
<td class="ours"><span class="no">✗</span></td> <td class="ours"><span class="yes">✓</span><small>room widgets; asks before a widget may read or send in the room</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="yes">✓</span><small>added v0.5.0 (Widgets API, native runner on Android/Windows)</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>listed in room header, open externally</small></td>
</tr> </tr>
<tr class="section-header"><td colspan="8">UX &amp; Extras</td></tr> <tr class="section-header"><td colspan="8">UX &amp; Extras</td></tr>
<tr> <tr>
@@ -1129,7 +1135,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td class="ours"><span class="no">✗</span></td> <td class="ours"><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>supported but clunky</small></td> <td><span class="yes">✓</span><small>account switcher; multi-account push since v2.6.0</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span><small>CLI profiles only</small></td> <td><span class="no">✗</span><small>CLI profiles only</small></td>
@@ -1137,11 +1143,11 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<tr> <tr>
<td>Image captions<small>(text + image as one event)</small></td> <td>Image captions<small>(text + image as one event)</small></td>
<td class="ours"><span class="yes">✓</span><small>caption field on<br>image &amp; video upload</small></td> <td class="ours"><span class="yes">✓</span><small>caption field on<br>image &amp; video upload</small></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>shows captions from other clients; cannot send</small></td>
<td><span class="yes">✓</span><small>scrollable captions<br>on media (v26.04.2)</small></td> <td><span class="yes">✓</span><small>scrollable captions<br>on media (v26.04.2)</small></td>
<td><span class="yes">✓</span><small>unique feature</small></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>shows captions from other clients; cannot send</small></td>
<td><span class="part">~</span></td> <td><span class="part">~</span></td>
</tr> </tr>
<tr> <tr>
@@ -1150,7 +1156,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span><small>WhatsApp/Telegram style</small></td> <td><span class="no">✗</span><small>WhatsApp/Telegram style</small></td>
<td><span class="yes">✓</span><small>most Discord-like overall</small></td> <td><span class="yes">✓</span><small>Discord-like layout</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
@@ -1187,17 +1193,17 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<tr> <tr>
<td>Deleted message visibility<small>(redacted events)</small></td> <td>Deleted message visibility<small>(redacted events)</small></td>
<td class="ours"><span class="yes">✓</span><small>"Message deleted" with reason<br>if provided</small></td> <td class="ours"><span class="yes">✓</span><small>"Message deleted" with reason<br>if provided</small></td>
<td><span class="no">✗</span><small>redacted messages hidden</small></td> <td><span class="part">~</span><small>hidden by default; shown with "Show Hidden Events"</small></td>
<td><span class="yes">✓</span><small>"Message deleted"<br>placeholder shown</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>
<td><span class="yes">✓</span><small>shows redaction notice</small></td> <td><span class="no">✗</span><small>redacted events are hidden from the timeline</small></td>
<td><span class="yes">✓</span><small>"Message deleted"<br>placeholder shown</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>
</tr> </tr>
<tr> <tr>
<td>Location sharing</td> <td>Location sharing</td>
<td class="ours"><span class="part">~</span><small>map embed view +<br>static share button</small></td> <td class="ours"><span class="part">~</span><small>map embed view +<br>static share button</small></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>shows received locations; cannot send</small></td>
<td><span class="yes">✓</span><small>live &amp; static,<br>map rendering</small></td> <td><span class="yes">✓</span><small>live &amp; static,<br>map rendering</small></td>
<td><span class="part">~</span><small>basic static</small></td> <td><span class="part">~</span><small>basic static</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
@@ -1208,16 +1214,16 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td>Message forwarding</td> <td>Message forwarding</td>
<td class="ours"><span class="yes">✓</span><small>forward to any room</small></td> <td class="ours"><span class="yes">✓</span><small>forward to any room</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>via share menu</small></td> <td><span class="yes">✓</span><small>Forward action; multi-room on Android</small></td>
<td><span class="yes">✓</span></td>
<td><span class="part">~</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td>
</tr> </tr>
<tr> <tr>
<td>Per-message read receipts<small>who read each message</small></td> <td>Per-message read receipts<small>who read each message</small></td>
<td class="ours"><span class="yes">✓</span><small>avatar pill below message,<br>click for list + timestamps</small></td> <td class="ours"><span class="yes">✓</span><small>avatar pill below message,<br>click for list + timestamps</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>'Read Receipts' in message menu lists readers</small></td>
<td><span class="yes">✓</span><small>avatar thumbnails</small></td> <td><span class="yes">✓</span><small>avatar thumbnails</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
@@ -1227,59 +1233,59 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<tr> <tr>
<td>Who reacted<small>see who reacted with each emoji</small></td> <td>Who reacted<small>see who reacted with each emoji</small></td>
<td class="ours"><span class="yes">✓</span><small>hover tooltip with names;<br>right-click for full avatar modal</small></td> <td class="ours"><span class="yes">✓</span><small>hover tooltip with names;<br>right-click for full avatar modal</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>hover tooltip + 'View Reactions' viewer</small></td>
<td><span class="part">~</span><small>tap reaction chip</small></td> <td><span class="yes">✓</span><small>long-press reaction for summary sheet</small></td>
<td><span class="part">~</span></td> <td><span class="yes">✓</span><small>long-press reaction</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>tooltip + click for list</small></td> <td><span class="yes">✓</span><small>hover tooltip lists reactors</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
</tr> </tr>
<tr> <tr>
<td>Edit history viewer<small>see all prior versions of an edited message</small></td> <td>Edit history viewer<small>see all prior versions of an edited message</small></td>
<td class="ours"><span class="yes">✓</span><small>click "(edited)" label → modal<br>with all versions + timestamps</small></td> <td class="ours"><span class="yes">✓</span><small>click "(edited)" label → modal<br>with all versions + timestamps</small></td>
<td><span class="no">✗</span><small>label shown, not clickable</small></td> <td><span class="no">✗</span><small>label shown, not clickable</small></td>
<td><span class="yes">✓</span></td> <td><span class="no">✗</span><small>shows "(edited)" label only</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="no">✗</span><small>only an 'Edited' marker</small></td>
</tr> </tr>
<tr> <tr>
<td>Custom status message<small>shown below username</small></td> <td>Custom status message<small>shown below username</small></td>
<td class="ours"><span class="yes">✓</span><small>emoji picker, auto-clear timer<br>(30 min – 7 days), 64-char limit</small></td> <td class="ours"><span class="yes">✓</span><small>emoji picker, auto-clear timer<br>(30 min – 7 days), 64-char limit</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>emoji + text status (needs server support)</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>Set status; shown under DM header &amp; in profile</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>shown under name in user panels/profile</small></td>
<td><span class="yes">✓</span><small>via profile settings</small></td> <td><span class="part">~</span><small>Labs; needs homeserver support (MSC4429)</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>shown next to sender name in timeline &amp; in profile</small></td>
</tr> </tr>
<tr> <tr>
<td>Online presence tracking<small>idle/away auto-detection</small></td> <td>Online presence tracking<small>idle/away auto-detection</small></td>
<td class="ours"><span class="yes">✓</span><small>online on start, idle after 10 min,<br>unavailable when tab hidden,<br>offline on close; hide-status toggle</small></td> <td class="ours"><span class="yes">✓</span><small>online on start, idle after 10 min,<br>unavailable when tab hidden,<br>offline on close; hide-status toggle</small></td>
<td><span class="part">~</span><small>manual AFK only; auto idle<br>detection PR open, unmerged</small></td> <td><span class="part">~</span><small>shows others' status; no idle detection</small></td>
<td><span class="part">~</span><small>basic online/offline only</small></td> <td><span class="part">~</span><small>reports own presence; doesn't show others'</small></td>
<td><span class="part">~</span><small>basic online/offline only</small></td>
<td><span class="part">~</span><small>inactivity monitor shipped Oct 2025;<br>no tab/close detection confirmed</small></td>
<td><span class="part">~</span><small>3-min idle timer (shipped Nov 2023);<br>no tab detection, no offline on close,<br>no user-facing hide toggle</small></td>
<td><span class="part">~</span><small>basic online/offline only</small></td> <td><span class="part">~</span><small>basic online/offline only</small></td>
<td><span class="part">~</span><small>sets 'unavailable' 15s after the app loses focus; no input-idle timer</small></td>
<td><span class="part">~</span><small>3-min idle → away; no hide toggle</small></td>
<td><span class="part">~</span><small>auto: unavailable ~30 s after losing focus</small></td>
</tr> </tr>
<tr> <tr>
<td>Media Gallery<small>browse room images/videos/files</small></td> <td>Media Gallery<small>browse room images/videos/files</small></td>
<td class="ours"><span class="yes">✓</span><small>right-side drawer;<br>Images/Videos/Files tabs</small></td> <td class="ours"><span class="yes">✓</span><small>right-side drawer;<br>Images/Videos/Files tabs</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="yes">✓</span><small>"Media and files" browser in room info</small></td>
<td><span class="yes">✓</span><small>Gallery &amp; Files tabs in chat search</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>Files panel lists room attachments; no grid gallery</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>Sidebar room filter<small>filter by name in real time</small></td> <td>Sidebar room filter<small>filter by name in real time</small></td>
<td class="ours"><span class="yes">✓</span><small>Home &amp; DMs tabs</small></td> <td class="ours"><span class="yes">✓</span><small>Home &amp; DMs tabs</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>room list search + filter chips</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>search field filters chat list by name + filter chips</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
@@ -1288,30 +1294,30 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td>Favorite rooms<small>starred section in sidebar</small></td> <td>Favorite rooms<small>starred section in sidebar</small></td>
<td class="ours"><span class="yes">✓</span><small>m.favourite tag, syncs<br>across devices</small></td> <td class="ours"><span class="yes">✓</span><small>m.favourite tag, syncs<br>across devices</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>Favourites filter chip (no separate section)</small></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>favourite (pin) floats to top; tag filter chips</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>'Favorites' section (v0.5.0)</small></td>
<td><span class="yes">✓</span><small>favourites section</small></td> <td><span class="yes">✓</span><small>favourites section</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>'Favourites' tag in community sidebar</small></td>
</tr> </tr>
<tr> <tr>
<td>Invite link + QR code</td> <td>Invite link + QR code</td>
<td class="ours"><span class="yes">✓</span><small>matrix.to URL + QR code<br>in invite modal &amp; room settings</small></td> <td class="ours"><span class="yes">✓</span><small>matrix.to URL + QR code<br>in invite modal &amp; room settings</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>share room link; no QR</small></td>
<td><span class="yes">✓</span><small>share invite link + QR codes</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>Share room dialog: matrix.to link + QR code</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>Custom notification sounds<small>per-category sound selector</small></td> <td>Custom notification sounds<small>per-category sound selector</small></td>
<td class="ours"><span class="yes">✓</span><small>per-category sound selector; ▶ preview</small></td> <td class="ours"><span class="yes">✓</span><small>per-category sound selector; ▶ preview</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>iOS: choose alert tone (global)</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>per room, not per category</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
@@ -1329,15 +1335,15 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td class="ours"><span class="yes">✓</span><small>Recent / A→Z / Unread First</small></td> <td class="ours"><span class="yes">✓</span><small>Recent / A→Z / Unread First</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>sort by activity only</small></td> <td><span class="part">~</span><small>sort by activity only</small></td>
<td><span class="part">~</span><small>alphabetical only</small></td> <td><span class="part">~</span><small>activity only (favourites first, low priority last)</small></td>
<td><span class="yes">✓</span><small>multiple sort options</small></td> <td><span class="part">~</span><small>manual drag-reorder; no sort selector</small></td>
<td><span class="part">~</span><small>limited</small></td> <td><span class="yes">✓</span><small>Activity, A-Z or Unread-first</small></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>by importance/unread or alphabetical</small></td>
</tr> </tr>
<tr> <tr>
<td>Push notifications</td> <td>Push notifications</td>
<td class="ours"><span class="part">~</span><small>web push only</small></td> <td class="ours"><span class="part">~</span><small>OS notifications while the app is open; no background push yet</small></td>
<td><span class="part">~</span><small>web push only</small></td> <td><span class="part">~</span><small>only while the tab/app is open; optional email</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
@@ -1361,7 +1367,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>partial / labs</small></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
@@ -1371,7 +1377,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="yes">✓</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
@@ -1379,7 +1385,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td class="ours"><span class="yes">✓</span><small>"Read more" toggle,<br>threshold configurable</small></td> <td class="ours"><span class="yes">✓</span><small>"Read more" toggle,<br>threshold configurable</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>collapses &gt;25 lines (configurable), Show more/less</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
@@ -1410,7 +1416,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="yes">✓</span><small>leading emoji becomes the room icon when no avatar</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
@@ -1420,9 +1426,9 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="part">~</span><small>hover bar, no recents</small></td> <td><span class="yes">✓</span><small>hover bar shows up to 4 recent reactions, 1-click</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="yes">✓</span><small>hover bar shows recent reactions, 1-click</small></td>
</tr> </tr>
<tr> <tr>
<td>In-app notification toasts<small>TDS-styled, when window focused</small></td> <td>In-app notification toasts<small>TDS-styled, when window focused</small></td>
@@ -1438,7 +1444,7 @@ Client comparison last reviewed <time datetime="2026-09-23">2026-09-23</time>
<td>On-device message translation<small>read foreign messages in your language</small></td> <td>On-device message translation<small>read foreign messages in your language</small></td>
<td class="ours"><span class="yes">✓</span><small>100% on-device browser AI;<br>works in E2EE rooms, no cloud;<br>Chromium desktop &amp; Lotus app</small></td> <td class="ours"><span class="yes">✓</span><small>100% on-device browser AI;<br>works in E2EE rooms, no cloud;<br>Chromium desktop &amp; Lotus app</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="part">~</span><small>iOS only (Apple Translation)</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>