Author SHA1 Message Date
Lotus CIandClaude Opus 5.5 d17c40e79f landing: describe SSO sign-up, drop dashes and hyphens from the page text
Lint / Shell (shellcheck) (pull_request) Successful in 13s
Lint / JS (eslint) (pull_request) Successful in 17s
Lint / No secrets in webhook configs (pull_request) Successful in 10s
Lint / Landing page is rendered (matrix (pull_request) Successful in 9s
Lint / Python (ruff) (pull_request) Successful in 11s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m11s
Lint / Secret scan (gitleaks) (pull_request) Successful in 6s
Lint / Shell (shellcheck) (push) Successful in 9s
Lint / JS (eslint) (push) Successful in 7s
Lint / No secrets in webhook configs (push) Successful in 4s
Lint / Landing page is rendered (matrix (push) Successful in 5s
Lint / Python (ruff) (push) Successful in 6s
Lint / Python deps (pip-audit) (push) Successful in 39s
Lint / Secret scan (gitleaks) (push) Successful in 6s
The "How to Join" steps still said to register with a token from Jared;
accounts now come from LLDAP and people sign in with Lotus SSO. The steps
now read: ask Jared for a Lotus Guild account, open chat.lotusguild.org and
sign in with Lotus SSO, join the space. The contact line asks "Questions or
need an account?" and the server details say "Invite only".

Visible text no longer uses em dashes, en dashes or hyphens (dashes became
colons, commas, full stops or "to"; compounds became separate words), in
the hand-written parts and in data/features.json / comparison.json, with
index.html regenerated by build.py. Package names (matrix-js-sdk,
matrix-rust-sdk, matrix-dart-sdk, matrix-sdk-crypto-wasm) and D-Bus keep
their hyphens; markup, URLs and <code> are untouched. The reviewed date
displays as "September 26, 2026" (datetime attribute stays ISO).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-13 02:36:25 -04:00
6 changed files with 207 additions and 203 deletions
+1 -5
View File
@@ -7,11 +7,7 @@ pantalaimon:
username: draupnir
password: ""
# The management room (and most Lotus rooms) are end-to-end encrypted. Without
# crypto Draupnir can post there but can't read commands, so `!draupnir …` was
# silently ignored (LotusGuild/cinny audit, 2026-10-13). Rust crypto stores its
# keys under dataPath.
experimentalRustCrypto: true
experimentalRustCrypto: false
dataPath: "/data/storage"
+9 -1
View File
@@ -23,6 +23,14 @@ import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent
def human_date(iso):
"""2026-09-26 -> September 26, 2026 (the page avoids hyphens in visible text)."""
from datetime import date
d = date.fromisoformat(iso)
return f"{d:%B} {d.day}, {d.year}"
INDEX = ROOT / "index.html"
MARK = {"yes": "✓", "no": "✗", "part": "~"}
@@ -96,7 +104,7 @@ def main():
new = replace_block(new, "features", render_features(features))
new = replace_block(new, "comparison", render_comparison(comparison))
new = replace_block(
new, "reviewed", f'Client comparison last reviewed <time datetime="{comparison["reviewed"]}">{comparison["reviewed"]}</time>'
new, "reviewed", f'Client comparison last reviewed <time datetime="{comparison["reviewed"]}">{human_date(comparison["reviewed"])}</time>'
)
if "--check" in sys.argv:
if new != html:
+64 -64
View File
@@ -190,18 +190,18 @@
},
{
"mark": "part",
"note": "Linux: click opens chat, Mark-as-read/Mute actions; no inline reply"
"note": "Linux: click opens chat, Mark as read/Mute actions; no inline reply"
},
{
"mark": "yes",
"note": "Windows &amp; Linux: click-to-open, inline reply, call accept/decline"
"note": "Windows &amp; Linux: click to open, inline reply, call accept/decline"
},
{
"mark": "part"
},
{
"mark": "yes",
"note": "Linux inline reply (D-Bus), macOS quick reply, click-to-open"
"note": "Linux inline reply (D-Bus), macOS quick reply, click to open"
}
]
},
@@ -232,7 +232,7 @@
]
},
{
"feature": "Taskbar + volume-flyout call controls",
"feature": "Taskbar + volume flyout call controls",
"cells": [
{
"mark": "yes"
@@ -258,7 +258,7 @@
]
},
{
"feature": "Focus Assist &rarr; auto Do-Not-Disturb",
"feature": "Focus Assist &rarr; auto Do Not Disturb",
"cells": [
{
"mark": "yes"
@@ -311,7 +311,7 @@
]
},
{
"feature": "Recursive folder drag-drop upload",
"feature": "Recursive folder drag drop upload",
"cells": [
{
"mark": "yes"
@@ -404,7 +404,7 @@
"cells": [
{
"mark": "yes",
"note": "SAS emoji, cross-client requests show inline card"
"note": "SAS emoji, cross client requests show inline card"
},
{
"mark": "part",
@@ -501,27 +501,27 @@
"cells": [
{
"mark": "yes",
"note": "3 tiers: off / browser-native /<br>on-device ML (RNNoise, Speex,<br>DTLN, DeepFilterNet&nbsp;3),<br>works on self-hosted SFU"
"note": "3 tiers: off / browser native /<br>on device ML (RNNoise, Speex,<br>DTLN, DeepFilterNet&nbsp;3),<br>works on self hosted SFU"
},
{
"mark": "part",
"note": "browser-native<br>via Element Call"
"note": "browser native<br>via Element Call"
},
{
"mark": "part",
"note": "browser-native"
"note": "browser native"
},
{
"mark": "part",
"note": "WebRTC-native"
"note": "WebRTC native"
},
{
"mark": "part",
"note": "browser-native (WebRTC)"
"note": "browser native (WebRTC)"
},
{
"mark": "part",
"note": "browser-native (WebRTC noiseSuppression toggle)"
"note": "browser native (WebRTC noiseSuppression toggle)"
},
{
"mark": "no"
@@ -529,15 +529,15 @@
]
},
{
"feature": "Push-to-Talk<small>hold key to transmit</small>",
"feature": "Push to Talk<small>hold key to transmit</small>",
"cells": [
{
"mark": "yes",
"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": "part",
"note": "hold Space while muted (Element Call built-in); no configurable key"
"note": "hold Space while muted (Element Call built in); no configurable key"
},
{
"mark": "no"
@@ -558,11 +558,11 @@
]
},
{
"feature": "AFK auto-mute<small>silence mic after idle timeout</small>",
"feature": "AFK auto mute<small>silence mic after idle timeout</small>",
"cells": [
{
"mark": "yes",
"note": "1–30 min timeout,<br>toast notification"
"note": "1 to 30 min timeout,<br>toast notification"
},
{
"mark": "no"
@@ -585,11 +585,11 @@
]
},
{
"feature": "Voice channel user limit<small>admin-set max participants</small>",
"feature": "Voice channel user limit<small>admin set max participants</small>",
"cells": [
{
"mark": "yes",
"note": "per-room cap,<br>server-enforced<br>for all clients"
"note": "per room cap,<br>server enforced<br>for all clients"
},
{
"mark": "no"
@@ -678,7 +678,7 @@
"cells": [
{
"mark": "yes",
"note": "DMs &amp; group chats;<br>ring tone, auto-dismiss"
"note": "DMs &amp; group chats;<br>ring tone, auto dismiss"
},
{
"mark": "yes",
@@ -715,11 +715,11 @@
"cells": [
{
"mark": "yes",
"note": "best-in-class sub-space nav"
"note": "best in class subspace nav"
},
{
"mark": "yes",
"note": "best-in-class sub-space nav"
"note": "best in class subspace nav"
},
{
"mark": "yes",
@@ -730,11 +730,11 @@
},
{
"mark": "yes",
"note": "Discord-like categories"
"note": "Discord like categories"
},
{
"mark": "yes",
"note": "sub-spaces clunky"
"note": "subspaces clunky"
},
{
"mark": "part",
@@ -747,7 +747,7 @@
"cells": [
{
"mark": "yes",
"note": "side panel + Slack-style per-thread notifications"
"note": "side panel + Slack style per thread notifications"
},
{
"mark": "part",
@@ -869,7 +869,7 @@
"cells": [
{
"mark": "yes",
"note": "best-in-class"
"note": "best in class"
},
{
"mark": "yes"
@@ -898,7 +898,7 @@
"cells": [
{
"mark": "yes",
"note": "Giphy, Terminal TDS themed,<br>click-outside to close"
"note": "Giphy, Terminal TDS themed,<br>click outside to close"
},
{
"mark": "no"
@@ -926,7 +926,7 @@
"cells": [
{
"mark": "yes",
"note": "local cache scan; load-more<br>buttons extend history per room"
"note": "local cache scan; load more<br>buttons extend history per room"
},
{
"mark": "part",
@@ -937,11 +937,11 @@
},
{
"mark": "part",
"note": "per-room; downloads &amp; decrypts history client-side"
"note": "per room; downloads &amp; decrypts history client side"
},
{
"mark": "yes",
"note": "client-side; auto-fetches +<br>decrypts history during search"
"note": "client side; auto fetches +<br>decrypts history during search"
},
{
"mark": "part",
@@ -988,7 +988,7 @@
"title": "UX &amp; Extras",
"rows": [
{
"feature": "Multi-account",
"feature": "Multi account",
"cells": [
{
"mark": "no"
@@ -1001,7 +1001,7 @@
},
{
"mark": "yes",
"note": "account switcher; multi-account push since v2.6.0"
"note": "account switcher; multi account push since v2.6.0"
},
{
"mark": "yes"
@@ -1046,11 +1046,11 @@
]
},
{
"feature": "Discord-like UI",
"feature": "Discord like UI",
"cells": [
{
"mark": "yes",
"note": "best-in-class for web"
"note": "best in class for web"
},
{
"mark": "yes"
@@ -1064,7 +1064,7 @@
},
{
"mark": "yes",
"note": "Discord-like layout"
"note": "Discord like layout"
},
{
"mark": "no"
@@ -1106,7 +1106,7 @@
"cells": [
{
"mark": "yes",
"note": "5–80% intensity slider,<br>Settings → Appearance"
"note": "5 to 80% intensity slider,<br>Settings → Appearance"
},
{
"mark": "no"
@@ -1129,7 +1129,7 @@
]
},
{
"feature": "Animated chat backgrounds<small>CSS-only, GPU-accelerated</small>",
"feature": "Animated chat backgrounds<small>CSS only, GPU accelerated</small>",
"cells": [
{
"mark": "yes",
@@ -1230,7 +1230,7 @@
},
{
"mark": "yes",
"note": "Forward action; multi-room on Android"
"note": "Forward action; multi room on Android"
},
{
"mark": "yes"
@@ -1247,7 +1247,7 @@
]
},
{
"feature": "Per-message read receipts<small>who read each message</small>",
"feature": "Per message read receipts<small>who read each message</small>",
"cells": [
{
"mark": "yes",
@@ -1281,7 +1281,7 @@
"cells": [
{
"mark": "yes",
"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": "yes",
@@ -1289,11 +1289,11 @@
},
{
"mark": "yes",
"note": "long-press reaction for summary sheet"
"note": "long press reaction for summary sheet"
},
{
"mark": "yes",
"note": "long-press reaction"
"note": "long press reaction"
},
{
"mark": "yes"
@@ -1342,7 +1342,7 @@
"cells": [
{
"mark": "yes",
"note": "emoji picker, auto-clear timer<br>(30 min – 7 days), 64-char limit"
"note": "emoji picker, auto clear timer<br>(30 min to 7 days), 64 char limit"
},
{
"mark": "no"
@@ -1370,11 +1370,11 @@
]
},
{
"feature": "Online presence tracking<small>idle/away auto-detection</small>",
"feature": "Online presence tracking<small>idle/away auto detection</small>",
"cells": [
{
"mark": "yes",
"note": "online on start, idle after 10 min,<br>unavailable when tab hidden,<br>offline on close; hide-status toggle"
"note": "online on start, idle after 10 min,<br>unavailable when tab hidden,<br>offline on close; hide status toggle"
},
{
"mark": "part",
@@ -1390,11 +1390,11 @@
},
{
"mark": "part",
"note": "sets 'unavailable' 15s after the app loses focus; no input-idle timer"
"note": "sets 'unavailable' 15s after the app loses focus; no input idle timer"
},
{
"mark": "part",
"note": "3-min idle → away; no hide toggle"
"note": "3 min idle → away; no hide toggle"
},
{
"mark": "part",
@@ -1407,7 +1407,7 @@
"cells": [
{
"mark": "yes",
"note": "right-side drawer;<br>Images/Videos/Files tabs"
"note": "right side drawer;<br>Images/Videos/Files tabs"
},
{
"mark": "no"
@@ -1524,11 +1524,11 @@
]
},
{
"feature": "Custom notification sounds<small>per-category sound selector</small>",
"feature": "Custom notification sounds<small>per category sound selector</small>",
"cells": [
{
"mark": "yes",
"note": "per-category sound selector; ▶ preview"
"note": "per category sound selector; ▶ preview"
},
{
"mark": "no"
@@ -1599,11 +1599,11 @@
},
{
"mark": "part",
"note": "manual drag-reorder; no sort selector"
"note": "manual drag reorder; no sort selector"
},
{
"mark": "yes",
"note": "Activity, A-Z or Unread-first"
"note": "Activity, A to Z or Unread first"
},
{
"mark": "yes",
@@ -1645,7 +1645,7 @@
"cells": [
{
"mark": "yes",
"note": "txt/json/html, date range,<br>E2EE-aware"
"note": "txt/json/html, date range,<br>E2EE aware"
},
{
"mark": "no"
@@ -1700,7 +1700,7 @@
"cells": [
{
"mark": "yes",
"note": "right-click bookmark,<br>sidebar panel, syncs across devices"
"note": "right click bookmark,<br>sidebar panel, syncs across devices"
},
{
"mark": "no"
@@ -1723,7 +1723,7 @@
]
},
{
"feature": "Collapsible long messages<small>auto-collapse &gt;20 lines</small>",
"feature": "Collapsible long messages<small>auto collapse &gt;20 lines</small>",
"cells": [
{
"mark": "yes",
@@ -1751,7 +1751,7 @@
]
},
{
"feature": "Inline GIF preview<small>Giphy / Tenor links auto-embed</small>",
"feature": "Inline GIF preview<small>Giphy / Tenor links auto embed</small>",
"cells": [
{
"mark": "yes",
@@ -1833,7 +1833,7 @@
]
},
{
"feature": "Quick emoji reactions on hover<small>1-click react, no menu needed</small>",
"feature": "Quick emoji reactions on hover<small>one click react, no menu needed</small>",
"cells": [
{
"mark": "yes",
@@ -1850,23 +1850,23 @@
},
{
"mark": "yes",
"note": "hover bar shows up to 4 recent reactions, 1-click"
"note": "hover bar shows up to 4 recent reactions, one click"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "hover bar shows recent reactions, 1-click"
"note": "hover bar shows recent reactions, one click"
}
]
},
{
"feature": "In-app notification toasts<small>TDS-styled, when window focused</small>",
"feature": "In app notification toasts<small>TDS styled, when window focused</small>",
"cells": [
{
"mark": "yes",
"note": "slides in bottom-right;<br>4 s auto-dismiss, click to jump"
"note": "slides in bottom right;<br>4 s auto dismiss, click to jump"
},
{
"mark": "no"
@@ -1889,11 +1889,11 @@
]
},
{
"feature": "On-device message translation<small>read foreign messages in your language</small>",
"feature": "On device message translation<small>read foreign messages in your language</small>",
"cells": [
{
"mark": "yes",
"note": "100% on-device browser AI;<br>works in E2EE rooms, no cloud;<br>Chromium desktop &amp; Lotus app"
"note": "100% on device browser AI;<br>works in E2EE rooms, no cloud;<br>Chromium desktop &amp; Lotus app"
},
{
"mark": "no"
+23 -23
View File
@@ -2,56 +2,56 @@
{
"title": "Calls &amp; Voice",
"items": [
"Voice rooms with our own Element Call fork on a self-hosted LiveKit SFU",
"Push-to-talk and push-to-deafen, with system-wide hotkeys on the Windows app (work while a game has focus)",
"Mic level meter on the mute button; per-person call volume that's remembered between calls",
"On-device noise suppression: Off, browser-native, or ML (RNNoise, Speex, DTLN, DeepFilterNet&nbsp;3)",
"In-call soundboard with your own clips, synced across your devices",
"Incoming-call ring with Answer/Decline, join/leave sounds, draggable picture-in-picture window",
"Screenshare fullscreen and audio mute; per-user mic/screenshare bitrate and framerate caps",
"Server-enforced room limits and permissions (max participants, audio-only, no screenshare) for every Matrix client",
"AFK auto-mute after a configurable idle time"
"Voice rooms with our own Element Call fork on a self hosted LiveKit SFU",
"Push to talk and push to deafen, with system wide hotkeys on the Windows app (work while a game has focus)",
"Mic level meter on the mute button; per person call volume that's remembered between calls",
"On device noise suppression: Off, browser native, or ML (RNNoise, Speex, DTLN, DeepFilterNet&nbsp;3)",
"In call soundboard with your own clips, synced across your devices",
"Incoming call ring with Answer/Decline, join/leave sounds, draggable picture in picture window",
"Screenshare fullscreen and audio mute; per user mic/screenshare bitrate and framerate caps",
"Server enforced room limits and permissions (max participants, audio only, no screenshare) for every Matrix client",
"AFK auto mute after a configurable idle time"
]
},
{
"title": "Messaging",
"items": [
"Threads with a side panel, unread chips, &ldquo;Mark all read&rdquo; and per-thread notification overrides",
"Threads with a side panel, unread chips, &ldquo;Mark all read&rdquo; and per thread notification overrides",
"Search operators: <code>from:</code>, <code>in:</code>, <code>before:</code>/<code>after:</code> (dates or <code>7d</code>), <code>has:link|image|video|file</code>, <code>is:pinned</code>",
"Voice messages with 0.75&times;&ndash;2&times; playback (MSC3245, E2EE)",
"Voice messages with 0.75&times; to 2&times; playback (MSC3245, E2EE)",
"Polls, message scheduling (MSC4140), forwarding, captions and location sharing",
"Pinned messages, saved messages/bookmarks and private notes on people, synced across devices",
"Who-reacted viewer, read receipt avatars, quick reactions on hover",
"Who reacted viewer, read receipt avatars, quick reactions on hover",
"GIF picker (Giphy), custom emoji &amp; sticker packs, math/LaTeX (KaTeX)",
"Pasted code is offered as a formatted code block, with the language detected",
"On-device message translation: text never leaves your machine, works in encrypted rooms"
"On device message translation: text never leaves your machine, works in encrypted rooms"
]
},
{
"title": "Media &amp; Links",
"items": [
"Click-to-play inline embeds: YouTube, Vimeo, Twitch, TikTok, X, Instagram, Reddit, Bluesky, Spotify, SoundCloud, Apple Music, Tidal and more",
"Click to play inline embeds: YouTube, Vimeo, Twitch, TikTok, X, Instagram, Reddit, Bluesky, Spotify, SoundCloud, Apple Music, Tidal and more",
"Rich link cards for GitHub, Steam, Wikipedia, IMDb, npm and others; animated GIF previews",
"Full-screen viewer with pinch-zoom, swipe/arrow-key navigation and captions; media gallery for every file shared in a room",
"Optional image compression, folder drag-and-drop upload"
"Full screen viewer with pinch zoom, swipe/arrow key navigation and captions; media gallery for every file shared in a room",
"Optional image compression, folder drag and drop upload"
]
},
{
"title": "Privacy &amp; Security",
"items": [
"Private read receipts, hide typing, hide online status",
"Tracking-parameter stripping (utm_*, fbclid, YouTube si= and ~40 more), on your device",
"Opt-in on-device search index for encrypted rooms, wiped on logout",
"Device verification fixes (cross-client emoji SAS) and a per-member session panel"
"Tracking parameter stripping (utm_*, fbclid, YouTube si= and ~40 more), on your device",
"Opt in on device search index for encrypted rooms, wiped on logout",
"Device verification fixes (cross client emoji SAS) and a per member session panel"
]
},
{
"title": "Look &amp; Feel",
"items": [
"Lotus Terminal theme, night-light filter, glassmorphism sidebar",
"Lotus Terminal theme, night light filter, glassmorphism sidebar",
"Animated chat backgrounds and 11 seasonal overlays (all respect reduced motion)",
"629 animated avatar decorations in 28 categories, visible to other Lotus users (MSC4133)",
"Custom status with emoji and auto-clear, Discord-style presence rings",
"Custom status with emoji and auto clear, Discord style presence rings",
"Settings sync across devices (theme, layout, notification and privacy preferences)"
]
},
@@ -67,9 +67,9 @@
{
"title": "Rooms &amp; Moderation",
"items": [
"Knock-to-join with an admin approve/deny panel and live pending-count badge",
"Knock to join with an admin approve/deny panel and live pending count badge",
"Invite links with QR codes, favourites, room filter, room history export (txt/json/html)",
"Room activity &amp; mod log, stats panel, server ACL editor, policy-list viewer",
"Room activity &amp; mod log, stats panel, server ACL editor, policy list viewer",
"Room widgets, with a permission prompt before a widget may read or send in the room"
]
}
+108 -108
View File
@@ -426,12 +426,12 @@
background: #111;
}
tr.section-header td {
/* section headers span full width — override sticky bg */
/* section headers span full width: override sticky bg */
position: static;
background: rgba(152,0,0,0.06);
}
/* Scroll hint — visible only on mobile via JS class */
/* Scroll hint: visible only on mobile via JS class */
.scroll-hint {
display: none;
font-size: 0.72rem;
@@ -543,11 +543,11 @@
<ol class="steps">
<li>
<span class="step-num">1</span>
<span class="step-text">Open <a href="https://chat.lotusguild.org" target="_blank" rel="noopener">chat.lotusguild.org</a> &mdash; your homeserver is pre-configured</span>
<span class="step-text">Ask <code class="homeserver">@jared:matrix.lotusguild.org</code> for a Lotus Guild account</span>
</li>
<li>
<span class="step-num">2</span>
<span class="step-text">Register with a <strong>token from Jared</strong> &mdash; <code class="homeserver">@jared:matrix.lotusguild.org</code></span>
<span class="step-text">Open <a href="https://chat.lotusguild.org" target="_blank" rel="noopener">chat.lotusguild.org</a> and sign in with <strong>Lotus SSO</strong></span>
</li>
<li>
<span class="step-num">3</span>
@@ -569,14 +569,14 @@
<div class="client-featured">
<a href="https://chat.lotusguild.org" target="_blank" rel="noopener">
<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 with the homeserver already set up</span>
<span class="tag-row">
<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 voice">Voice, Video &amp; Screenshare</span>
<span class="tag">Discord-like UI</span>
<span class="tag">Discord like UI</span>
</span>
</a>
</div>
@@ -586,56 +586,56 @@
<div class="fork-group">
<h4>Calls &amp; Voice</h4>
<ul>
<li>Voice rooms with our own Element Call fork on a self-hosted LiveKit SFU</li>
<li>Push-to-talk and push-to-deafen, with system-wide hotkeys on the Windows app (work while a game has focus)</li>
<li>Mic level meter on the mute button; per-person call volume that's remembered between calls</li>
<li>On-device noise suppression: Off, browser-native, or ML (RNNoise, Speex, DTLN, DeepFilterNet&nbsp;3)</li>
<li>In-call soundboard with your own clips, synced across your devices</li>
<li>Incoming-call ring with Answer/Decline, join/leave sounds, draggable picture-in-picture window</li>
<li>Screenshare fullscreen and audio mute; per-user mic/screenshare bitrate and framerate caps</li>
<li>Server-enforced room limits and permissions (max participants, audio-only, no screenshare) for every Matrix client</li>
<li>AFK auto-mute after a configurable idle time</li>
<li>Voice rooms with our own Element Call fork on a self hosted LiveKit SFU</li>
<li>Push to talk and push to deafen, with system wide hotkeys on the Windows app (work while a game has focus)</li>
<li>Mic level meter on the mute button; per person call volume that's remembered between calls</li>
<li>On device noise suppression: Off, browser native, or ML (RNNoise, Speex, DTLN, DeepFilterNet&nbsp;3)</li>
<li>In call soundboard with your own clips, synced across your devices</li>
<li>Incoming call ring with Answer/Decline, join/leave sounds, draggable picture in picture window</li>
<li>Screenshare fullscreen and audio mute; per user mic/screenshare bitrate and framerate caps</li>
<li>Server enforced room limits and permissions (max participants, audio only, no screenshare) for every Matrix client</li>
<li>AFK auto mute after a configurable idle time</li>
</ul>
</div>
<div class="fork-group">
<h4>Messaging</h4>
<ul>
<li>Threads with a side panel, unread chips, &ldquo;Mark all read&rdquo; and per-thread notification overrides</li>
<li>Threads with a side panel, unread chips, &ldquo;Mark all read&rdquo; and per thread notification overrides</li>
<li>Search operators: <code>from:</code>, <code>in:</code>, <code>before:</code>/<code>after:</code> (dates or <code>7d</code>), <code>has:link|image|video|file</code>, <code>is:pinned</code></li>
<li>Voice messages with 0.75&times;&ndash;2&times; playback (MSC3245, E2EE)</li>
<li>Voice messages with 0.75&times; to 2&times; playback (MSC3245, E2EE)</li>
<li>Polls, message scheduling (MSC4140), forwarding, captions and location sharing</li>
<li>Pinned messages, saved messages/bookmarks and private notes on people, synced across devices</li>
<li>Who-reacted viewer, read receipt avatars, quick reactions on hover</li>
<li>Who reacted viewer, read receipt avatars, quick reactions on hover</li>
<li>GIF picker (Giphy), custom emoji &amp; sticker packs, math/LaTeX (KaTeX)</li>
<li>Pasted code is offered as a formatted code block, with the language detected</li>
<li>On-device message translation: text never leaves your machine, works in encrypted rooms</li>
<li>On device message translation: text never leaves your machine, works in encrypted rooms</li>
</ul>
</div>
<div class="fork-group">
<h4>Media &amp; Links</h4>
<ul>
<li>Click-to-play inline embeds: YouTube, Vimeo, Twitch, TikTok, X, Instagram, Reddit, Bluesky, Spotify, SoundCloud, Apple Music, Tidal and more</li>
<li>Click to play inline embeds: YouTube, Vimeo, Twitch, TikTok, X, Instagram, Reddit, Bluesky, Spotify, SoundCloud, Apple Music, Tidal and more</li>
<li>Rich link cards for GitHub, Steam, Wikipedia, IMDb, npm and others; animated GIF previews</li>
<li>Full-screen viewer with pinch-zoom, swipe/arrow-key navigation and captions; media gallery for every file shared in a room</li>
<li>Optional image compression, folder drag-and-drop upload</li>
<li>Full screen viewer with pinch zoom, swipe/arrow key navigation and captions; media gallery for every file shared in a room</li>
<li>Optional image compression, folder drag and drop upload</li>
</ul>
</div>
<div class="fork-group">
<h4>Privacy &amp; Security</h4>
<ul>
<li>Private read receipts, hide typing, hide online status</li>
<li>Tracking-parameter stripping (utm_*, fbclid, YouTube si= and ~40 more), on your device</li>
<li>Opt-in on-device search index for encrypted rooms, wiped on logout</li>
<li>Device verification fixes (cross-client emoji SAS) and a per-member session panel</li>
<li>Tracking parameter stripping (utm_*, fbclid, YouTube si= and ~40 more), on your device</li>
<li>Opt in on device search index for encrypted rooms, wiped on logout</li>
<li>Device verification fixes (cross client emoji SAS) and a per member session panel</li>
</ul>
</div>
<div class="fork-group">
<h4>Look &amp; Feel</h4>
<ul>
<li>Lotus Terminal theme, night-light filter, glassmorphism sidebar</li>
<li>Lotus Terminal theme, night light filter, glassmorphism sidebar</li>
<li>Animated chat backgrounds and 11 seasonal overlays (all respect reduced motion)</li>
<li>629 animated avatar decorations in 28 categories, visible to other Lotus users (MSC4133)</li>
<li>Custom status with emoji and auto-clear, Discord-style presence rings</li>
<li>Custom status with emoji and auto clear, Discord style presence rings</li>
<li>Settings sync across devices (theme, layout, notification and privacy preferences)</li>
</ul>
</div>
@@ -651,16 +651,16 @@
<div class="fork-group">
<h4>Rooms &amp; Moderation</h4>
<ul>
<li>Knock-to-join with an admin approve/deny panel and live pending-count badge</li>
<li>Knock to join with an admin approve/deny panel and live pending count badge</li>
<li>Invite links with QR codes, favourites, room filter, room history export (txt/json/html)</li>
<li>Room activity &amp; mod log, stats panel, server ACL editor, policy-list viewer</li>
<li>Room activity &amp; mod log, stats panel, server ACL editor, policy list viewer</li>
<li>Room widgets, with a permission prompt before a widget may read or send in the room</li>
</ul>
</div>
</div>
<!-- END:features -->
<p class="fork-more">Full list in <a href="https://code.lotusguild.org/LotusGuild/cinny/src/branch/lotus/LOTUS_FEATURES.md" target="_blank" rel="noopener">LOTUS_FEATURES.md</a>.</p>
<p class="also-available">Prefer the unmodified upstream? <a href="https://cinny.in" target="_blank" rel="noopener">cinny.in</a> works with our homeserver &mdash; set it to <code class="hs-inline">matrix.lotusguild.org</code>.</p>
<p class="also-available">Prefer the unmodified upstream? <a href="https://cinny.in" target="_blank" rel="noopener">cinny.in</a> works with our homeserver: set it to <code class="hs-inline">matrix.lotusguild.org</code>.</p>
<div class="space-join">
<p>Already signed in? Jump straight into the community:</p>
@@ -674,7 +674,7 @@
<h3>Other Clients</h3>
<div class="client-group">
<p class="client-group-label">Web &amp; Desktop &mdash; Official Cinny</p>
<p class="client-group-label">Web &amp; Desktop: Official Cinny</p>
<div class="client-cards">
<div class="client-card">
<div class="client-card-top">
@@ -687,13 +687,13 @@
<span class="tag voice">Voice, Video &amp; Screenshare</span>
</div>
</div>
<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>
<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 class="client-group">
<p class="client-group-label">Mobile &mdash; iOS &amp; Android</p>
<p class="client-group-label">Mobile: iOS &amp; Android</p>
<div class="client-cards">
<div class="client-card">
<div class="client-card-top">
@@ -705,7 +705,7 @@
<span class="tag voice">Voice &amp; Video</span>
</div>
</div>
<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>
<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 class="client-card">
<div class="client-card-top">
@@ -719,13 +719,13 @@
<span class="tag warn">Voice &amp; Video (Experimental)</span>
</div>
</div>
<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>
<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 class="client-group">
<p class="client-group-label">Discord-like &mdash; Android, Windows, Linux &amp; Web</p>
<p class="client-group-label">Like Discord: Android, Windows, Linux &amp; Web</p>
<div class="client-cards">
<div class="client-card">
<div class="client-card-top">
@@ -739,13 +739,13 @@
<span class="tag voice">Voice, Video &amp; Screenshare</span>
</div>
</div>
<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>
<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 class="client-group">
<p class="client-group-label">Desktop &mdash; Windows, macOS &amp; Linux</p>
<p class="client-group-label">Desktop: Windows, macOS &amp; Linux</p>
<div class="client-cards">
<div class="client-card">
<div class="client-card-top">
@@ -785,7 +785,7 @@
<div class="comparison-section">
<p class="comparison-title">Client Feature Comparison</p>
<p class="reviewed"><!-- BEGIN:reviewed -->
Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</time>
<!-- END:reviewed --></p>
<p class="scroll-hint" id="scrollHint">← swipe to compare →</p>
<div class="table-wrap">
@@ -861,10 +861,10 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td class="ours"><span class="yes">✓</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="yes">✓</span><small>Windows &amp; Linux: click-to-open, inline reply, call accept/decline</small></td>
<td><span class="part">~</span><small>Linux: click opens chat, Mark as read/Mute actions; no inline reply</small></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="yes">✓</span><small>Linux inline reply (D-Bus), macOS quick reply, click-to-open</small></td>
<td><span class="yes">✓</span><small>Linux inline reply (D-Bus), macOS quick reply, click to open</small></td>
</tr>
<tr>
<td>Windows Jump List (recent rooms)</td>
@@ -877,7 +877,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Taskbar + volume-flyout call controls</td>
<td>Taskbar + volume flyout call controls</td>
<td class="ours"><span class="yes">✓</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -887,7 +887,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Focus Assist &rarr; auto Do-Not-Disturb</td>
<td>Focus Assist &rarr; auto Do Not Disturb</td>
<td class="ours"><span class="yes">✓</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -907,7 +907,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Recursive folder drag-drop upload</td>
<td>Recursive folder drag drop upload</td>
<td class="ours"><span class="yes">✓</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -939,7 +939,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<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>own devices only (emoji + recovery key)</small></td>
<td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td>
@@ -970,18 +970,18 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<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><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>WebRTC-native</small></td>
<td><span class="part">~</span><small>browser-native (WebRTC)</small></td>
<td><span class="part">~</span><small>browser-native (WebRTC noiseSuppression toggle)</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</small></td>
<td><span class="part">~</span><small>WebRTC native</small></td>
<td><span class="part">~</span><small>browser native (WebRTC)</small></td>
<td><span class="part">~</span><small>browser native (WebRTC noiseSuppression toggle)</small></td>
<td><span class="no">✗</span></td>
</tr>
<tr>
<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><span class="part">~</span><small>hold Space while muted (Element Call built-in); no configurable key</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><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>
@@ -989,8 +989,8 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>AFK auto-mute<small>silence mic after idle timeout</small></td>
<td class="ours"><span class="yes">✓</span><small>1–30 min timeout,<br>toast notification</small></td>
<td>AFK auto mute<small>silence mic after idle timeout</small></td>
<td class="ours"><span class="yes">✓</span><small>1 to 30 min timeout,<br>toast notification</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -999,8 +999,8 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Voice channel user limit<small>admin-set max participants</small></td>
<td class="ours"><span class="yes">✓</span><small>per-room cap,<br>server-enforced<br>for all clients</small></td>
<td>Voice channel user limit<small>admin set max participants</small></td>
<td class="ours"><span class="yes">✓</span><small>per room cap,<br>server enforced<br>for all clients</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -1030,7 +1030,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<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="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="part">~</span><small>experimental</small></td>
@@ -1041,17 +1041,17 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<tr class="section-header"><td colspan="8">Core Features</td></tr>
<tr>
<td>Spaces</td>
<td class="ours"><span class="yes">✓</span><small>best-in-class sub-space nav</small></td>
<td><span class="yes">✓</span><small>best-in-class sub-space nav</small></td>
<td class="ours"><span class="yes">✓</span><small>best in class subspace nav</small></td>
<td><span class="yes">✓</span><small>best in class subspace nav</small></td>
<td><span class="yes">✓</span><small>dedicated spaces tab,<br>full management</small></td>
<td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>Discord-like categories</small></td>
<td><span class="yes">✓</span><small>sub-spaces clunky</small></td>
<td><span class="yes">✓</span><small>Discord like categories</small></td>
<td><span class="yes">✓</span><small>subspaces clunky</small></td>
<td><span class="part">~</span><small>limited</small></td>
</tr>
<tr>
<td>Threads</td>
<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>Labs flag</small></td>
<td><span class="yes">✓</span><small>thread view since v2.3.0</small></td>
@@ -1091,7 +1091,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<td>Custom emoji &amp; stickers</td>
<td class="ours"><span class="yes">✓</span><small>best-in-class</small></td>
<td class="ours"><span class="yes">✓</span><small>best in class</small></td>
<td><span class="yes">✓</span></td>
<td><span class="part">~</span></td>
<td><span class="yes">✓</span></td>
@@ -1101,7 +1101,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<td>GIF search / picker</td>
<td class="ours"><span class="yes">✓</span><small>Giphy, Terminal TDS themed,<br>click-outside to close</small></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="no">✗</span></td>
@@ -1111,11 +1111,11 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<td>Message search (encrypted)</td>
<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="no">✗</span></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="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="part">~</span><small>desktop only, not web</small></td>
<td><span class="part">~</span><small>local DB scan</small></td>
</tr>
@@ -1131,11 +1131,11 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr class="section-header"><td colspan="8">UX &amp; Extras</td></tr>
<tr>
<td>Multi-account</td>
<td>Multi account</td>
<td class="ours"><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="yes">✓</span><small>account switcher; multi-account push since v2.6.0</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="no">✗</span></td>
<td><span class="no">✗</span><small>CLI profiles only</small></td>
@@ -1151,12 +1151,12 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="part">~</span></td>
</tr>
<tr>
<td>Discord-like UI</td>
<td class="ours"><span class="yes">✓</span><small>best-in-class for web</small></td>
<td>Discord like UI</td>
<td class="ours"><span class="yes">✓</span><small>best in class for web</small></td>
<td><span class="yes">✓</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span><small>WhatsApp/Telegram style</small></td>
<td><span class="yes">✓</span><small>Discord-like layout</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>
</tr>
@@ -1172,7 +1172,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<td>Night Light / Blue Light Filter<small>warm overlay, adjustable intensity</small></td>
<td class="ours"><span class="yes">✓</span><small>5–80% intensity slider,<br>Settings → Appearance</small></td>
<td class="ours"><span class="yes">✓</span><small>5 to 80% intensity slider,<br>Settings → Appearance</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -1181,7 +1181,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Animated chat backgrounds<small>CSS-only, GPU-accelerated</small></td>
<td>Animated chat backgrounds<small>CSS only, GPU accelerated</small></td>
<td class="ours"><span class="yes">✓</span><small>5 animated wallpapers (rain,<br>stars, grid pulse, aurora,<br>fireflies); pause toggle</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -1214,14 +1214,14 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td>Message forwarding</td>
<td class="ours"><span class="yes">✓</span><small>forward to any room</small></td>
<td><span class="no">✗</span></td>
<td><span class="yes">✓</span><small>Forward action; multi-room on Android</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="no">✗</span></td>
<td><span class="yes">✓</span></td>
<td><span class="yes">✓</span></td>
</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><span class="yes">✓</span><small>'Read Receipts' in message menu lists readers</small></td>
<td><span class="yes">✓</span><small>avatar thumbnails</small></td>
@@ -1232,10 +1232,10 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<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="yes">✓</span><small>hover tooltip + 'View Reactions' viewer</small></td>
<td><span class="yes">✓</span><small>long-press reaction for summary sheet</small></td>
<td><span class="yes">✓</span><small>long-press reaction</small></td>
<td><span class="yes">✓</span><small>long press reaction for summary sheet</small></td>
<td><span class="yes">✓</span><small>long press reaction</small></td>
<td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>hover tooltip lists reactors</small></td>
<td><span class="yes">✓</span></td>
@@ -1252,7 +1252,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<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 to 7 days), 64 char limit</small></td>
<td><span class="no">✗</span></td>
<td><span class="part">~</span><small>emoji + text status (needs server support)</small></td>
<td><span class="yes">✓</span><small>Set status; shown under DM header &amp; in profile</small></td>
@@ -1261,18 +1261,18 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="yes">✓</span><small>shown next to sender name in timeline &amp; in profile</small></td>
</tr>
<tr>
<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>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><span class="part">~</span><small>shows others' status; no idle detection</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>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>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>
<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="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>
@@ -1311,8 +1311,8 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<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>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><span class="no">✗</span></td>
<td><span class="part">~</span><small>iOS: choose alert tone (global)</small></td>
<td><span class="no">✗</span></td>
@@ -1336,8 +1336,8 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
<td><span class="part">~</span><small>sort by activity only</small></td>
<td><span class="part">~</span><small>activity only (favourites first, low priority last)</small></td>
<td><span class="part">~</span><small>manual drag-reorder; no sort selector</small></td>
<td><span class="yes">✓</span><small>Activity, A-Z or Unread-first</small></td>
<td><span class="part">~</span><small>manual drag reorder; no sort selector</small></td>
<td><span class="yes">✓</span><small>Activity, A to Z or Unread first</small></td>
<td><span class="yes">✓</span><small>by importance/unread or alphabetical</small></td>
</tr>
<tr>
@@ -1352,7 +1352,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<td>Export room history<small>download messages as file</small></td>
<td class="ours"><span class="yes">✓</span><small>txt/json/html, date range,<br>E2EE-aware</small></td>
<td class="ours"><span class="yes">✓</span><small>txt/json/html, date range,<br>E2EE aware</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -1372,7 +1372,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</tr>
<tr>
<td>Message bookmarks / saved messages</td>
<td class="ours"><span class="yes">✓</span><small>right-click bookmark,<br>sidebar panel, syncs across devices</small></td>
<td class="ours"><span class="yes">✓</span><small>right click bookmark,<br>sidebar panel, syncs across devices</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -1381,7 +1381,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Collapsible long messages<small>auto-collapse &gt;20 lines</small></td>
<td>Collapsible long messages<small>auto collapse &gt;20 lines</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>
@@ -1391,7 +1391,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Inline GIF preview<small>Giphy / Tenor links auto-embed</small></td>
<td>Inline GIF preview<small>Giphy / Tenor links auto embed</small></td>
<td class="ours"><span class="yes">✓</span><small>via homeserver proxy,<br>no direct CDN contact</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -1421,18 +1421,18 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<td>Quick emoji reactions on hover<small>1-click react, no menu needed</small></td>
<td>Quick emoji reactions on hover<small>one click react, no menu needed</small></td>
<td class="ours"><span class="yes">✓</span><small>3 recent emoji in hover bar;<br>dismisses emoji picker</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 up to 4 recent reactions, 1-click</small></td>
<td><span class="yes">✓</span><small>hover bar shows up to 4 recent reactions, one click</small></td>
<td><span class="no">✗</span></td>
<td><span class="yes">✓</span><small>hover bar shows recent reactions, 1-click</small></td>
<td><span class="yes">✓</span><small>hover bar shows recent reactions, one click</small></td>
</tr>
<tr>
<td>In-app notification toasts<small>TDS-styled, when window focused</small></td>
<td class="ours"><span class="yes">✓</span><small>slides in bottom-right;<br>4 s auto-dismiss, click to jump</small></td>
<td>In app notification toasts<small>TDS styled, when window focused</small></td>
<td class="ours"><span class="yes">✓</span><small>slides in bottom right;<br>4 s auto dismiss, click to jump</small></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
<td><span class="no">✗</span></td>
@@ -1441,8 +1441,8 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<td><span class="no">✗</span></td>
</tr>
<tr>
<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>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><span class="no">✗</span></td>
<td><span class="part">~</span><small>iOS only (Apple Translation)</small></td>
<td><span class="no">✗</span></td>
@@ -1456,7 +1456,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
</div><!-- table-wrap -->
<div class="security-note" style="margin:14px 16px 6px;">
<strong>Encryption architecture:</strong> Element X uses the native <strong>matrix-rust-sdk</strong> with Vodozemac. FluffyChat and Commet use <strong>matrix-dart-sdk</strong>, which also wraps Vodozemac for its crypto &mdash; all three benefit from Vodozemac's stronger security track record over the older JavaScript SDK. Cinny and Element Web/Desktop currently use <strong>matrix-js-sdk</strong>; Element is actively migrating to the Rust SDK. Clients using Vodozemac were not affected by historical js-sdk vulnerabilities.
<strong>Encryption architecture:</strong> Element X uses the native <strong>matrix-rust-sdk</strong> with Vodozemac. FluffyChat and Commet use <strong>matrix-dart-sdk</strong>, which also wraps Vodozemac for its crypto, so all three benefit from Vodozemac's stronger security track record over the older JavaScript SDK. Cinny and Element Web/Desktop currently use <strong>matrix-js-sdk</strong>; Element is actively migrating to the Rust SDK. Clients using Vodozemac were not affected by historical js-sdk vulnerabilities.
</div>
<div class="legend">
@@ -1473,7 +1473,7 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<div class="info-grid">
<div class="info-item">
<div class="info-label">Access</div>
<div class="info-value">Invite-only</div>
<div class="info-value">Invite only</div>
</div>
<div class="info-item">
<div class="info-label">Max Upload</div>
@@ -1499,16 +1499,16 @@ Client comparison last reviewed <time datetime="2026-09-26">2026-09-26</time>
<div class="privacy-strip">
<span class="privacy-badge">No ads or tracking</span>
<span class="privacy-badge">No data sold</span>
<span class="privacy-badge">E2EE &mdash; server cannot read encrypted rooms</span>
<span class="privacy-badge">E2EE: the server cannot read encrypted rooms</span>
</div>
</div>
<div class="legal-note">
This service is provided "as-is" with no uptime guarantee. Not for emergency use &mdash; do not use to contact emergency services (e.g. 911). Use is governed by our <a href="https://wiki.lotusguild.org/en/Legal/terms-of-service" target="_blank" rel="noopener">Terms of Service</a> and <a href="https://wiki.lotusguild.org/en/Legal/privacy-policy" target="_blank" rel="noopener">Privacy Policy</a>. Governing law: State of Ohio, United States.
This service is provided "as is" with no uptime guarantee. Not for emergency use. Do not use to contact emergency services (e.g. 911). Use is governed by our <a href="https://wiki.lotusguild.org/en/Legal/terms-of-service" target="_blank" rel="noopener">Terms of Service</a> and <a href="https://wiki.lotusguild.org/en/Legal/privacy-policy" target="_blank" rel="noopener">Privacy Policy</a>. Governing law: State of Ohio, United States.
</div>
<div class="contact">
<p style="font-size:0.85rem;color:#777;margin-bottom:4px;">Questions or need a registration token?</p>
<p style="font-size:0.85rem;color:#777;margin-bottom:4px;">Questions or need an account?</p>
<p>Reach out to <code class="homeserver">@jared:matrix.lotusguild.org</code></p>
</div>
+2 -2
View File
@@ -418,12 +418,12 @@ th:first-child {
background: #111;
}
tr.section-header td {
/* section headers span full width — override sticky bg */
/* section headers span full width: override sticky bg */
position: static;
background: rgba(152,0,0,0.06);
}
/* Scroll hint — visible only on mobile via JS class */
/* Scroll hint: visible only on mobile via JS class */
.scroll-hint {
display: none;
font-size: 0.72rem;