1 Commits
Author SHA1 Message Date
Lotus CIandClaude Opus 5.5 77e719183a draupnir: enable Rust crypto so it can read commands in the encrypted management room
Lint / Shell (shellcheck) (pull_request) Successful in 10s
Lint / JS (eslint) (pull_request) Successful in 9s
Lint / No secrets in webhook configs (pull_request) Successful in 4s
Lint / Landing page is rendered (matrix (pull_request) Successful in 4s
Lint / Python (ruff) (pull_request) Successful in 5s
Lint / Python deps (pip-audit) (pull_request) Successful in 1m17s
Lint / Secret scan (gitleaks) (pull_request) Successful in 10s
Lint / Shell (shellcheck) (push) Successful in 10s
Lint / JS (eslint) (push) Successful in 7s
Lint / No secrets in webhook configs (push) Successful in 5s
Lint / Landing page is rendered (matrix (push) Successful in 4s
Lint / Python (ruff) (push) Successful in 8s
Lint / Python deps (pip-audit) (push) Successful in 1m13s
Lint / Secret scan (gitleaks) (push) Successful in 6s
The management room is end-to-end encrypted, but Draupnir ran with
experimentalRustCrypto: false and Pantalaimon off, so it could post there
(its own messages are unencrypted) but never saw commands: its last reply
to a command was ~57 days ago, and `!draupnir rooms add …` sent from Lotus
on 2026-10-13 was ignored. The same command sent unencrypted worked at
once (✅, joined dco-memes-minecraft).

Merging deploys via lxc110-draupnir.sh, which restarts draupnir.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-13 01:34:10 -04:00
6 changed files with 203 additions and 207 deletions
+5 -1
View File
@@ -7,7 +7,11 @@ pantalaimon:
username: draupnir username: draupnir
password: "" password: ""
experimentalRustCrypto: false # 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
dataPath: "/data/storage" dataPath: "/data/storage"
+1 -9
View File
@@ -23,14 +23,6 @@ import sys
from pathlib import Path from pathlib import Path
ROOT = Path(__file__).resolve().parent 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" INDEX = ROOT / "index.html"
MARK = {"yes": "✓", "no": "✗", "part": "~"} MARK = {"yes": "✓", "no": "✗", "part": "~"}
@@ -104,7 +96,7 @@ def main():
new = replace_block(new, "features", render_features(features)) new = replace_block(new, "features", render_features(features))
new = replace_block(new, "comparison", render_comparison(comparison)) new = replace_block(new, "comparison", render_comparison(comparison))
new = replace_block( new = replace_block(
new, "reviewed", f'Client comparison last reviewed <time datetime="{comparison["reviewed"]}">{human_date(comparison["reviewed"])}</time>' new, "reviewed", f'Client comparison last reviewed <time datetime="{comparison["reviewed"]}">{comparison["reviewed"]}</time>'
) )
if "--check" in sys.argv: if "--check" in sys.argv:
if new != html: if new != html:
+64 -64
View File
@@ -190,18 +190,18 @@
}, },
{ {
"mark": "part", "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", "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": "part"
}, },
{ {
"mark": "yes", "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": [ "cells": [
{ {
"mark": "yes" "mark": "yes"
@@ -258,7 +258,7 @@
] ]
}, },
{ {
"feature": "Focus Assist &rarr; auto Do Not Disturb", "feature": "Focus Assist &rarr; auto Do-Not-Disturb",
"cells": [ "cells": [
{ {
"mark": "yes" "mark": "yes"
@@ -311,7 +311,7 @@
] ]
}, },
{ {
"feature": "Recursive folder drag drop upload", "feature": "Recursive folder drag-drop upload",
"cells": [ "cells": [
{ {
"mark": "yes" "mark": "yes"
@@ -404,7 +404,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "SAS emoji, cross client requests show inline card" "note": "SAS emoji, cross-client requests show inline card"
}, },
{ {
"mark": "part", "mark": "part",
@@ -501,27 +501,27 @@
"cells": [ "cells": [
{ {
"mark": "yes", "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", "mark": "part",
"note": "browser native<br>via Element Call" "note": "browser-native<br>via Element Call"
}, },
{ {
"mark": "part", "mark": "part",
"note": "browser native" "note": "browser-native"
}, },
{ {
"mark": "part", "mark": "part",
"note": "WebRTC native" "note": "WebRTC-native"
}, },
{ {
"mark": "part", "mark": "part",
"note": "browser native (WebRTC)" "note": "browser-native (WebRTC)"
}, },
{ {
"mark": "part", "mark": "part",
"note": "browser native (WebRTC noiseSuppression toggle)" "note": "browser-native (WebRTC noiseSuppression toggle)"
}, },
{ {
"mark": "no" "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": [ "cells": [
{ {
"mark": "yes", "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", "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" "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": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "1 to 30 min timeout,<br>toast notification" "note": "1–30 min timeout,<br>toast notification"
}, },
{ {
"mark": "no" "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": [ "cells": [
{ {
"mark": "yes", "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" "mark": "no"
@@ -678,7 +678,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "DMs &amp; group chats;<br>ring tone, auto dismiss" "note": "DMs &amp; group chats;<br>ring tone, auto-dismiss"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -715,11 +715,11 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "best in class subspace nav" "note": "best-in-class sub-space nav"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "best in class subspace nav" "note": "best-in-class sub-space nav"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -730,11 +730,11 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "Discord like categories" "note": "Discord-like categories"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "subspaces clunky" "note": "sub-spaces clunky"
}, },
{ {
"mark": "part", "mark": "part",
@@ -747,7 +747,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "side panel + Slack style per thread notifications" "note": "side panel + Slack-style per-thread notifications"
}, },
{ {
"mark": "part", "mark": "part",
@@ -869,7 +869,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "best in class" "note": "best-in-class"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -898,7 +898,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "Giphy, Terminal TDS themed,<br>click outside to close" "note": "Giphy, Terminal TDS themed,<br>click-outside to close"
}, },
{ {
"mark": "no" "mark": "no"
@@ -926,7 +926,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "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", "mark": "part",
@@ -937,11 +937,11 @@
}, },
{ {
"mark": "part", "mark": "part",
"note": "per room; downloads &amp; decrypts history client side" "note": "per-room; downloads &amp; decrypts history client-side"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "client side; auto fetches +<br>decrypts history during search" "note": "client-side; auto-fetches +<br>decrypts history during search"
}, },
{ {
"mark": "part", "mark": "part",
@@ -988,7 +988,7 @@
"title": "UX &amp; Extras", "title": "UX &amp; Extras",
"rows": [ "rows": [
{ {
"feature": "Multi account", "feature": "Multi-account",
"cells": [ "cells": [
{ {
"mark": "no" "mark": "no"
@@ -1001,7 +1001,7 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "account switcher; multi account push since v2.6.0" "note": "account switcher; multi-account push since v2.6.0"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -1046,11 +1046,11 @@
] ]
}, },
{ {
"feature": "Discord like UI", "feature": "Discord-like UI",
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "best in class for web" "note": "best-in-class for web"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -1064,7 +1064,7 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "Discord like layout" "note": "Discord-like layout"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1106,7 +1106,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "5 to 80% intensity slider,<br>Settings → Appearance" "note": "5–80% intensity slider,<br>Settings → Appearance"
}, },
{ {
"mark": "no" "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": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
@@ -1230,7 +1230,7 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "Forward action; multi room on Android" "note": "Forward action; multi-room on Android"
}, },
{ {
"mark": "yes" "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": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
@@ -1281,7 +1281,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "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", "mark": "yes",
@@ -1289,11 +1289,11 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "long press reaction for summary sheet" "note": "long-press reaction for summary sheet"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "long press reaction" "note": "long-press reaction"
}, },
{ {
"mark": "yes" "mark": "yes"
@@ -1342,7 +1342,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "emoji picker, auto clear timer<br>(30 min to 7 days), 64 char limit" "note": "emoji picker, auto-clear timer<br>(30 min – 7 days), 64-char limit"
}, },
{ {
"mark": "no" "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": [ "cells": [
{ {
"mark": "yes", "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", "mark": "part",
@@ -1390,11 +1390,11 @@
}, },
{ {
"mark": "part", "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", "mark": "part",
"note": "3 min idle → away; no hide toggle" "note": "3-min idle → away; no hide toggle"
}, },
{ {
"mark": "part", "mark": "part",
@@ -1407,7 +1407,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "right side drawer;<br>Images/Videos/Files tabs" "note": "right-side drawer;<br>Images/Videos/Files tabs"
}, },
{ {
"mark": "no" "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": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "per category sound selector; ▶ preview" "note": "per-category sound selector; ▶ preview"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1599,11 +1599,11 @@
}, },
{ {
"mark": "part", "mark": "part",
"note": "manual drag reorder; no sort selector" "note": "manual drag-reorder; no sort selector"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "Activity, A to Z or Unread first" "note": "Activity, A-Z or Unread-first"
}, },
{ {
"mark": "yes", "mark": "yes",
@@ -1645,7 +1645,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "txt/json/html, date range,<br>E2EE aware" "note": "txt/json/html, date range,<br>E2EE-aware"
}, },
{ {
"mark": "no" "mark": "no"
@@ -1700,7 +1700,7 @@
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
"note": "right click bookmark,<br>sidebar panel, syncs across devices" "note": "right-click bookmark,<br>sidebar panel, syncs across devices"
}, },
{ {
"mark": "no" "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": [ "cells": [
{ {
"mark": "yes", "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": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
@@ -1833,7 +1833,7 @@
] ]
}, },
{ {
"feature": "Quick emoji reactions on hover<small>one click react, no menu needed</small>", "feature": "Quick emoji reactions on hover<small>1-click react, no menu needed</small>",
"cells": [ "cells": [
{ {
"mark": "yes", "mark": "yes",
@@ -1850,23 +1850,23 @@
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "hover bar shows up to 4 recent reactions, one click" "note": "hover bar shows up to 4 recent reactions, 1-click"
}, },
{ {
"mark": "no" "mark": "no"
}, },
{ {
"mark": "yes", "mark": "yes",
"note": "hover bar shows recent reactions, one click" "note": "hover bar shows recent reactions, 1-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": [ "cells": [
{ {
"mark": "yes", "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" "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": [ "cells": [
{ {
"mark": "yes", "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" "mark": "no"
+23 -23
View File
@@ -2,56 +2,56 @@
{ {
"title": "Calls &amp; Voice", "title": "Calls &amp; Voice",
"items": [ "items": [
"Voice rooms with our own Element Call fork on a self hosted LiveKit SFU", "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)", "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", "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)", "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", "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", "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", "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", "Server-enforced room limits and permissions (max participants, audio-only, no screenshare) for every Matrix client",
"AFK auto mute after a configurable idle time" "AFK auto-mute after a configurable idle time"
] ]
}, },
{ {
"title": "Messaging", "title": "Messaging",
"items": [ "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>", "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; to 2&times; playback (MSC3245, E2EE)", "Voice messages with 0.75&times;&ndash;2&times; playback (MSC3245, E2EE)",
"Polls, message scheduling (MSC4140), forwarding, captions and location sharing", "Polls, message scheduling (MSC4140), forwarding, captions and location sharing",
"Pinned messages, saved messages/bookmarks and private notes on people, synced across devices", "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)", "GIF picker (Giphy), custom emoji &amp; sticker packs, math/LaTeX (KaTeX)",
"Pasted code is offered as a formatted code block, with the language detected", "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", "title": "Media &amp; Links",
"items": [ "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", "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", "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" "Optional image compression, folder drag-and-drop upload"
] ]
}, },
{ {
"title": "Privacy &amp; Security", "title": "Privacy &amp; Security",
"items": [ "items": [
"Private read receipts, hide typing, hide online status", "Private read receipts, hide typing, hide online status",
"Tracking parameter stripping (utm_*, fbclid, YouTube si= and ~40 more), on your device", "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", "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" "Device verification fixes (cross-client emoji SAS) and a per-member session panel"
] ]
}, },
{ {
"title": "Look &amp; Feel", "title": "Look &amp; Feel",
"items": [ "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)", "Animated chat backgrounds and 11 seasonal overlays (all respect reduced motion)",
"629 animated avatar decorations in 28 categories, visible to other Lotus users (MSC4133)", "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)" "Settings sync across devices (theme, layout, notification and privacy preferences)"
] ]
}, },
@@ -67,9 +67,9 @@
{ {
"title": "Rooms &amp; Moderation", "title": "Rooms &amp; Moderation",
"items": [ "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)", "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" "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; background: #111;
} }
tr.section-header td { tr.section-header td {
/* section headers span full width: override sticky bg */ /* section headers span full width — override sticky bg */
position: static; position: static;
background: rgba(152,0,0,0.06); 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 { .scroll-hint {
display: none; display: none;
font-size: 0.72rem; font-size: 0.72rem;
@@ -543,11 +543,11 @@
<ol class="steps"> <ol class="steps">
<li> <li>
<span class="step-num">1</span> <span class="step-num">1</span>
<span class="step-text">Ask <code class="homeserver">@jared:matrix.lotusguild.org</code> for a Lotus Guild account</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>
</li> </li>
<li> <li>
<span class="step-num">2</span> <span class="step-num">2</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> <span class="step-text">Register with a <strong>token from Jared</strong> &mdash; <code class="homeserver">@jared:matrix.lotusguild.org</code></span>
</li> </li>
<li> <li>
<span class="step-num">3</span> <span class="step-num">3</span>
@@ -569,14 +569,14 @@
<div class="client-featured"> <div class="client-featured">
<a href="https://chat.lotusguild.org" target="_blank" rel="noopener"> <a href="https://chat.lotusguild.org" target="_blank" rel="noopener">
<span class="client-name">Lotus Guild Chat</span> <span class="client-name">Lotus Guild Chat</span>
<span class="client-desc">Hosted Cinny with the homeserver already set up</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">Windows</span> <span class="tag dim">Windows</span>
<span class="tag dim">Linux</span> <span class="tag dim">Linux</span>
<span class="tag dim">Web</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, Video &amp; Screenshare</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>
</div> </div>
@@ -586,56 +586,56 @@
<div class="fork-group"> <div class="fork-group">
<h4>Calls &amp; Voice</h4> <h4>Calls &amp; Voice</h4>
<ul> <ul>
<li>Voice rooms with our own Element Call fork on a self hosted LiveKit SFU</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>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>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>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>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>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>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>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>AFK auto-mute after a configurable idle time</li>
</ul> </ul>
</div> </div>
<div class="fork-group"> <div class="fork-group">
<h4>Messaging</h4> <h4>Messaging</h4>
<ul> <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>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; to 2&times; playback (MSC3245, E2EE)</li> <li>Voice messages with 0.75&times;&ndash;2&times; playback (MSC3245, E2EE)</li>
<li>Polls, message scheduling (MSC4140), forwarding, captions and location sharing</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>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>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>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> </ul>
</div> </div>
<div class="fork-group"> <div class="fork-group">
<h4>Media &amp; Links</h4> <h4>Media &amp; Links</h4>
<ul> <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>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>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>Optional image compression, folder drag-and-drop upload</li>
</ul> </ul>
</div> </div>
<div class="fork-group"> <div class="fork-group">
<h4>Privacy &amp; Security</h4> <h4>Privacy &amp; Security</h4>
<ul> <ul>
<li>Private read receipts, hide typing, hide online status</li> <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>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>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>Device verification fixes (cross-client emoji SAS) and a per-member session panel</li>
</ul> </ul>
</div> </div>
<div class="fork-group"> <div class="fork-group">
<h4>Look &amp; Feel</h4> <h4>Look &amp; Feel</h4>
<ul> <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>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>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> <li>Settings sync across devices (theme, layout, notification and privacy preferences)</li>
</ul> </ul>
</div> </div>
@@ -651,16 +651,16 @@
<div class="fork-group"> <div class="fork-group">
<h4>Rooms &amp; Moderation</h4> <h4>Rooms &amp; Moderation</h4>
<ul> <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>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> <li>Room widgets, with a permission prompt before a widget may read or send in the room</li>
</ul> </ul>
</div> </div>
</div> </div>
<!-- END:features --> <!-- 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="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: 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 &mdash; set it to <code class="hs-inline">matrix.lotusguild.org</code>.</p>
<div class="space-join"> <div class="space-join">
<p>Already signed in? Jump straight into the community:</p> <p>Already signed in? Jump straight into the community:</p>
@@ -674,7 +674,7 @@
<h3>Other Clients</h3> <h3>Other Clients</h3>
<div class="client-group"> <div class="client-group">
<p class="client-group-label">Web &amp; Desktop: Official Cinny</p> <p class="client-group-label">Web &amp; Desktop &mdash; Official Cinny</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">
@@ -687,13 +687,13 @@
<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">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>
</div> </div>
<div class="client-group"> <div class="client-group">
<p class="client-group-label">Mobile: iOS &amp; Android</p> <p class="client-group-label">Mobile &mdash; iOS &amp; Android</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">
@@ -705,7 +705,7 @@
<span class="tag voice">Voice &amp; Video</span> <span class="tag voice">Voice &amp; Video</span>
</div> </div>
</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>
<div class="client-card"> <div class="client-card">
<div class="client-card-top"> <div class="client-card-top">
@@ -719,13 +719,13 @@
<span class="tag warn">Voice &amp; Video (Experimental)</span> <span class="tag warn">Voice &amp; Video (Experimental)</span>
</div> </div>
</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>
</div> </div>
<div class="client-group"> <div class="client-group">
<p class="client-group-label">Like Discord: Android, Windows, Linux &amp; Web</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">
@@ -739,13 +739,13 @@
<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">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>
</div> </div>
<div class="client-group"> <div class="client-group">
<p class="client-group-label">Desktop: Windows, macOS &amp; Linux</p> <p class="client-group-label">Desktop &mdash; Windows, macOS &amp; Linux</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">
@@ -785,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-26">September 26, 2026</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">
@@ -861,10 +861,10 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<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="part">~</span><small>Linux: click opens chat, Mark as read/Mute actions; no inline reply</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="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="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>
<tr> <tr>
<td>Windows Jump List (recent rooms)</td> <td>Windows Jump List (recent rooms)</td>
@@ -877,7 +877,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<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 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>
@@ -887,7 +887,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<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 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>
@@ -907,7 +907,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<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 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>
@@ -939,7 +939,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</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>own devices only (emoji + recovery key)</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>
@@ -970,18 +970,18 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</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="part">~</span><small>WebRTC 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)</small></td>
<td><span class="part">~</span><small>browser native (WebRTC noiseSuppression toggle)</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="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>
@@ -989,8 +989,8 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>AFK auto mute<small>silence mic after idle timeout</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 class="ours"><span class="yes">✓</span><small>1–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> <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">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>Voice channel user limit<small>admin set max participants</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 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> <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">September 26, 2026</
</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="yes">✓</span><small>rings for DM calls (Answer/Reject); silent prompt for group calls</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="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>
@@ -1041,17 +1041,17 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<tr class="section-header"><td colspan="8">Core Features</td></tr> <tr class="section-header"><td colspan="8">Core Features</td></tr>
<tr> <tr>
<td>Spaces</td> <td>Spaces</td>
<td class="ours"><span class="yes">✓</span><small>best in class subspace nav</small></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 subspace nav</small></td> <td><span class="yes">✓</span><small>best-in-class sub-space nav</small></td>
<td><span class="yes">✓</span><small>dedicated spaces tab,<br>full management</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></td>
<td><span class="yes">✓</span><small>Discord like categories</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="yes">✓</span><small>sub-spaces clunky</small></td>
<td><span class="part">~</span><small>limited</small></td> <td><span class="part">~</span><small>limited</small></td>
</tr> </tr>
<tr> <tr>
<td>Threads</td> <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>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="yes">✓</span><small>thread view since v2.3.0</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">September 26, 2026</
</tr> </tr>
<tr> <tr>
<td>Custom emoji &amp; stickers</td> <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="yes">✓</span></td>
<td><span class="part">~</span></td> <td><span class="part">~</span></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
@@ -1101,7 +1101,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</tr> </tr>
<tr> <tr>
<td>GIF search / picker</td> <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> <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">September 26, 2026</
</tr> </tr>
<tr> <tr>
<td>Message search (encrypted)</td> <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="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>per room; downloads &amp; decrypts history client side</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>
@@ -1131,11 +1131,11 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</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>
<td>Multi account</td> <td>Multi-account</td>
<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="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="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>
@@ -1151,12 +1151,12 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<td><span class="part">~</span></td> <td><span class="part">~</span></td>
</tr> </tr>
<tr> <tr>
<td>Discord like UI</td> <td>Discord-like UI</td>
<td class="ours"><span class="yes">✓</span><small>best in class for web</small></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="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>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>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
@@ -1172,7 +1172,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</tr> </tr>
<tr> <tr>
<td>Night Light / Blue Light Filter<small>warm overlay, adjustable intensity</small></td> <td>Night Light / Blue Light Filter<small>warm overlay, adjustable intensity</small></td>
<td class="ours"><span class="yes">✓</span><small>5 to 80% intensity slider,<br>Settings → Appearance</small></td> <td class="ours"><span class="yes">✓</span><small>5–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> <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">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<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 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>
<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">September 26, 2026</
<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="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="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="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="yes">✓</span><small>'Read Receipts' in message menu lists readers</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> <td><span class="yes">✓</span><small>avatar thumbnails</small></td>
@@ -1232,10 +1232,10 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</tr> </tr>
<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="yes">✓</span><small>hover tooltip + 'View Reactions' viewer</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 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</small></td>
<td><span class="yes">✓</span></td> <td><span class="yes">✓</span></td>
<td><span class="yes">✓</span><small>hover tooltip lists reactors</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>
@@ -1252,7 +1252,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</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 to 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="part">~</span><small>emoji + text status (needs server support)</small></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> <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">September 26, 2026</
<td><span class="yes">✓</span><small>shown next to sender name in timeline &amp; in profile</small></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>shows others' status; no idle detection</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>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>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>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>3-min idle → away; no hide toggle</small></td>
<td><span class="part">~</span><small>auto: unavailable ~30 s after losing focus</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>"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="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">September 26, 2026</
<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="part">~</span><small>iOS: choose alert tone (global)</small></td>
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
@@ -1336,8 +1336,8 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<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>activity only (favourites first, low priority last)</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="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>Activity, A-Z or Unread-first</small></td>
<td><span class="yes">✓</span><small>by importance/unread or alphabetical</small></td> <td><span class="yes">✓</span><small>by importance/unread or alphabetical</small></td>
</tr> </tr>
<tr> <tr>
@@ -1352,7 +1352,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</tr> </tr>
<tr> <tr>
<td>Export room history<small>download messages as file</small></td> <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> <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">September 26, 2026</
</tr> </tr>
<tr> <tr>
<td>Message bookmarks / saved messages</td> <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> <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">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<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 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>
@@ -1391,7 +1391,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<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 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>
<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">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<td>Quick emoji reactions on hover<small>one click react, no menu needed</small></td> <td>Quick emoji reactions on hover<small>1-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 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="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, one click</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="yes">✓</span><small>hover bar shows recent reactions, one click</small></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>
<td class="ours"><span class="yes">✓</span><small>slides in bottom right;<br>4 s auto dismiss, click to jump</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> <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">September 26, 2026</
<td><span class="no">✗</span></td> <td><span class="no">✗</span></td>
</tr> </tr>
<tr> <tr>
<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="part">~</span><small>iOS only (Apple Translation)</small></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>
@@ -1456,7 +1456,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
</div><!-- table-wrap --> </div><!-- table-wrap -->
<div class="security-note" style="margin:14px 16px 6px;"> <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, 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. <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.
</div> </div>
<div class="legend"> <div class="legend">
@@ -1473,7 +1473,7 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<div class="info-grid"> <div class="info-grid">
<div class="info-item"> <div class="info-item">
<div class="info-label">Access</div> <div class="info-label">Access</div>
<div class="info-value">Invite only</div> <div class="info-value">Invite-only</div>
</div> </div>
<div class="info-item"> <div class="info-item">
<div class="info-label">Max Upload</div> <div class="info-label">Max Upload</div>
@@ -1499,16 +1499,16 @@ Client comparison last reviewed <time datetime="2026-09-26">September 26, 2026</
<div class="privacy-strip"> <div class="privacy-strip">
<span class="privacy-badge">No ads or tracking</span> <span class="privacy-badge">No ads or tracking</span>
<span class="privacy-badge">No data sold</span> <span class="privacy-badge">No data sold</span>
<span class="privacy-badge">E2EE: the server cannot read encrypted rooms</span> <span class="privacy-badge">E2EE &mdash; server cannot read encrypted rooms</span>
</div> </div>
</div> </div>
<div class="legal-note"> <div class="legal-note">
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. 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.
</div> </div>
<div class="contact"> <div class="contact">
<p style="font-size:0.85rem;color:#777;margin-bottom:4px;">Questions or need an account?</p> <p style="font-size:0.85rem;color:#777;margin-bottom:4px;">Questions or need a registration token?</p>
<p>Reach out to <code class="homeserver">@jared:matrix.lotusguild.org</code></p> <p>Reach out to <code class="homeserver">@jared:matrix.lotusguild.org</code></p>
</div> </div>
+2 -2
View File
@@ -418,12 +418,12 @@ th:first-child {
background: #111; background: #111;
} }
tr.section-header td { tr.section-header td {
/* section headers span full width: override sticky bg */ /* section headers span full width — override sticky bg */
position: static; position: static;
background: rgba(152,0,0,0.06); 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 { .scroll-hint {
display: none; display: none;
font-size: 0.72rem; font-size: 0.72rem;