Files
matrix/landing/data/comparison.json
T
Lotus CIandClaude Opus 5.5 090a394782
Lint / Shell (shellcheck) (push) Successful in 18s
Lint / JS (eslint) (push) Successful in 11s
Lint / Landing page is rendered (matrix (push) Successful in 6s
Lint / Python (ruff) (push) Successful in 7s
Lint / Python deps (pip-audit) (push) Successful in 1m5s
Lint / Secret scan (gitleaks) (push) Successful in 10s
landing: structured feature groups, single-source comparison table (#11)
- The ~1,800-word "our fork adds" paragraph becomes seven titled groups
  (Calls & Voice, Messaging, Media & Links, Privacy & Security, Look &
  Feel, Desktop App, Rooms & Moderation), one short line per feature,
  with a link to LOTUS_FEATURES.md instead of duplicating the changelog.
- The comparison table lives in landing/data/comparison.json (converted
  losslessly: all 71 rows render with identical cell text) and the
  feature groups in landing/data/features.json. landing/build.py renders
  them between <!-- BEGIN/END --> markers; everything else stays
  hand-edited.
- CSS moved to landing/style.css and inlined by build.py (the LXC 139
  deploy copies index.html only, so a linked stylesheet wouldn't ship).
  The fork paragraph's 16 repeated inline styles are gone.
- Visible "Client comparison last reviewed <date>" stamp from
  comparison.json, replacing the stale "June 2026 (latest)" title.
- CI: `landing-fresh` fails if index.html doesn't match its sources.

Page is ~1,850 px shorter on desktop and ~2,500 px on phones; no
horizontal overflow at 1280 px or Pixel 7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
2026-09-23 22:15:27 -04:00

1869 lines
41 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"reviewed": "2026-09-23",
"clients": [
{
"name": "Lotus Chat",
"sub": "chat.lotusguild.org<br>Our Cinny fork"
},
{
"name": "Cinny",
"sub": "cinny.in<br>Official"
},
{
"name": "Element X",
"sub": "iOS &amp; Android"
},
{
"name": "FluffyChat",
"sub": "All platforms"
},
{
"name": "Commet",
"sub": "Android / Win / macOS / Linux"
},
{
"name": "Element",
"sub": "Web &amp; Desktop"
},
{
"name": "Nheko",
"sub": "Desktop only"
}
],
"sections": [
{
"title": "Platform",
"rows": [
{
"feature": "iOS",
"cells": [
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Android",
"cells": [
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Desktop app",
"cells": [
{
"mark": "yes"
},
{
"mark": "yes",
"note": "Cinny Desktop"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "Win, macOS &amp; Linux"
},
{
"mark": "yes"
},
{
"mark": "yes"
}
]
},
{
"feature": "Web browser",
"cells": [
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
},
{
"feature": "Performance",
"cells": [
{
"text": "Light"
},
{
"text": "Light"
},
{
"text": "Very fast",
"note": "Sliding Sync"
},
{
"text": "Moderate"
},
{
"text": "Moderate"
},
{
"text": "Heavy",
"note": "Electron / JS"
},
{
"text": "Light",
"note": "Native C++"
}
]
}
]
},
{
"title": "Desktop App",
"rows": [
{
"feature": "Native rich notifications (click&rarr;open, inline reply)",
"cells": [
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "part"
},
{
"mark": "no"
}
]
},
{
"feature": "Windows Jump List (recent rooms)",
"cells": [
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Taskbar + volume-flyout call controls",
"cells": [
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Focus Assist &rarr; auto Do-Not-Disturb",
"cells": [
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Stay awake during calls",
"cells": [
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "part"
},
{
"mark": "no"
}
]
},
{
"feature": "Recursive folder drag-drop upload",
"cells": [
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
}
]
},
{
"title": "Security &amp; Encryption",
"rows": [
{
"feature": "E2EE",
"cells": [
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
}
]
},
{
"feature": "Vodozemac encryption<small>stronger crypto track record</small>",
"cells": [
{
"mark": "no",
"note": "js-sdk"
},
{
"mark": "no",
"note": "js-sdk"
},
{
"mark": "yes",
"note": "Rust SDK"
},
{
"mark": "yes",
"note": "dart-sdk"
},
{
"mark": "yes",
"note": "dart-sdk"
},
{
"mark": "no",
"note": "js-sdk, migrating"
},
{
"mark": "no"
}
]
},
{
"feature": "Device verification",
"cells": [
{
"mark": "yes",
"note": "SAS emoji, cross-client requests show inline card"
},
{
"mark": "part",
"note": "cross-client requests<br>may show unsupported"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
}
]
}
]
},
{
"title": "Voice &amp; Video",
"rows": [
{
"feature": "Voice &amp; video calls",
"cells": [
{
"mark": "yes",
"note": "rooms &amp; DMs, group calls,<br>screenshare via Element Call"
},
{
"mark": "part",
"note": "Element Call embed;<br>no ring notification"
},
{
"mark": "yes",
"note": "MatrixRTC"
},
{
"mark": "part",
"note": "experimental, varies<br>by homeserver"
},
{
"mark": "part",
"note": "1:1 + group,<br>no E2EE voice rooms"
},
{
"mark": "yes"
},
{
"mark": "yes"
}
]
},
{
"feature": "Screenshare",
"cells": [
{
"mark": "yes",
"note": "via Element Call; fullscreen button,<br>independent audio mute"
},
{
"mark": "yes",
"note": "via Element Call embed"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "XDG portals &amp; native"
}
]
},
{
"feature": "Noise suppression<small>filter background noise from mic</small>",
"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"
},
{
"mark": "part",
"note": "browser-native<br>via Element Call"
},
{
"mark": "part",
"note": "browser-native"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "browser-native;<br>ML only on LiveKit Cloud"
},
{
"mark": "no"
}
]
},
{
"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"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "AFK auto-mute<small>silence mic after idle timeout</small>",
"cells": [
{
"mark": "yes",
"note": "1–30 min timeout,<br>toast notification"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"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"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Call join/leave sounds<small>cue when others come &amp; go</small>",
"cells": [
{
"mark": "yes",
"note": "3 styles,<br>Web Audio synth"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Group calls",
"cells": [
{
"mark": "yes",
"note": "via Element Call embed"
},
{
"mark": "yes",
"note": "via Element Call embed"
},
{
"mark": "yes",
"note": "MatrixRTC"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "no E2EE voice rooms"
},
{
"mark": "yes"
},
{
"mark": "part",
"note": "partial"
}
]
},
{
"feature": "Incoming call notification<small>ring + Answer/Decline</small>",
"cells": [
{
"mark": "yes",
"note": "DMs &amp; group chats;<br>ring tone, auto-dismiss"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "native push"
},
{
"mark": "part",
"note": "experimental"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "desktop"
},
{
"mark": "part",
"note": "partial"
}
]
}
]
},
{
"title": "Core Features",
"rows": [
{
"feature": "Spaces",
"cells": [
{
"mark": "yes",
"note": "best-in-class sub-space nav"
},
{
"mark": "yes",
"note": "best-in-class sub-space nav"
},
{
"mark": "yes",
"note": "dedicated spaces tab,<br>full management"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "Discord-like categories"
},
{
"mark": "yes",
"note": "sub-spaces clunky"
},
{
"mark": "part",
"note": "limited"
}
]
},
{
"feature": "Threads",
"cells": [
{
"mark": "yes",
"note": "side panel + Slack-style per-thread notifications"
},
{
"mark": "part",
"note": "basic, no dedicated view"
},
{
"mark": "part",
"note": "Labs flag"
},
{
"mark": "no",
"note": "shows as regular messages"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
},
{
"feature": "Polls",
"cells": [
{
"mark": "yes",
"note": "create, vote &amp; display;<br>single or multiple choice"
},
{
"mark": "part",
"note": "display only"
},
{
"mark": "yes",
"note": "create, vote &amp; end"
},
{
"mark": "yes",
"note": "added v2.3.0"
},
{
"mark": "yes",
"note": "added v0.4.2"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
},
{
"feature": "Voice messages<small>record &amp; play</small>",
"cells": [
{
"mark": "yes",
"note": "record &amp; play, E2EE;<br>0.75×/1×/1.5×/2× speed"
},
{
"mark": "part",
"note": "playback only"
},
{
"mark": "yes",
"note": "record, play, variable speed,<br>reply with voice"
},
{
"mark": "yes",
"note": "record &amp; play,<br>pause support"
},
{
"mark": "part",
"note": "playback confirmed;<br>recording unclear"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
},
{
"feature": "Pinned messages",
"cells": [
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "dedicated pins view"
},
{
"mark": "part",
"note": "view only"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
}
]
},
{
"feature": "Custom emoji &amp; stickers",
"cells": [
{
"mark": "yes",
"note": "best-in-class"
},
{
"mark": "yes"
},
{
"mark": "part"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "bulk upload, Signal packs"
},
{
"mark": "part",
"note": "sometimes shows mxc:// URLs"
},
{
"mark": "yes"
}
]
},
{
"feature": "GIF search / picker",
"cells": [
{
"mark": "yes",
"note": "Giphy, Terminal TDS themed,<br>click-outside to close"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "privacy proxy,<br>uploads to homeserver"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Message search (encrypted)",
"cells": [
{
"mark": "yes",
"note": "local cache scan; load-more<br>buttons extend history per room"
},
{
"mark": "part",
"note": "server search only;<br>no E2EE support"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "cache scan only"
},
{
"mark": "yes",
"note": "client-side; auto-fetches +<br>decrypts history during search"
},
{
"mark": "part",
"note": "desktop only, not web"
},
{
"mark": "part",
"note": "local DB scan"
}
]
},
{
"feature": "Widgets",
"cells": [
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
}
]
},
{
"title": "UX &amp; Extras",
"rows": [
{
"feature": "Multi-account",
"cells": [
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "supported but clunky"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no",
"note": "CLI profiles only"
}
]
},
{
"feature": "Image captions<small>(text + image as one event)</small>",
"cells": [
{
"mark": "yes",
"note": "caption field on<br>image &amp; video upload"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "scrollable captions<br>on media (v26.04.2)"
},
{
"mark": "yes",
"note": "unique feature"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "part"
}
]
},
{
"feature": "Discord-like UI",
"cells": [
{
"mark": "yes",
"note": "best-in-class for web"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no",
"note": "WhatsApp/Telegram style"
},
{
"mark": "yes",
"note": "most Discord-like overall"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Shared calendars &amp; albums",
"cells": [
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "unique to Commet"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Night Light / Blue Light Filter<small>warm overlay, adjustable intensity</small>",
"cells": [
{
"mark": "yes",
"note": "5–80% intensity slider,<br>Settings → Appearance"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Animated chat backgrounds<small>CSS-only, GPU-accelerated</small>",
"cells": [
{
"mark": "yes",
"note": "5 animated wallpapers (rain,<br>stars, grid pulse, aurora,<br>fireflies); pause toggle"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Deleted message visibility<small>(redacted events)</small>",
"cells": [
{
"mark": "yes",
"note": "\"Message deleted\" with reason<br>if provided"
},
{
"mark": "no",
"note": "redacted messages hidden"
},
{
"mark": "yes",
"note": "\"Message deleted\"<br>placeholder shown"
},
{
"mark": "yes",
"note": "shows redaction notice"
},
{
"mark": "yes",
"note": "shows redaction notice"
},
{
"mark": "yes",
"note": "\"Message deleted\"<br>placeholder shown"
},
{
"mark": "yes",
"note": "shows redaction notice"
}
]
},
{
"feature": "Location sharing",
"cells": [
{
"mark": "part",
"note": "map embed view +<br>static share button"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "live &amp; static,<br>map rendering"
},
{
"mark": "part",
"note": "basic static"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
},
{
"feature": "Message forwarding",
"cells": [
{
"mark": "yes",
"note": "forward to any room"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "via share menu"
},
{
"mark": "yes"
},
{
"mark": "part"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
},
{
"feature": "Per-message read receipts<small>who read each message</small>",
"cells": [
{
"mark": "yes",
"note": "avatar pill below message,<br>click for list + timestamps"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "avatar thumbnails"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "avatar row below message"
},
{
"mark": "yes"
}
]
},
{
"feature": "Who reacted<small>see who reacted with each emoji</small>",
"cells": [
{
"mark": "yes",
"note": "hover tooltip with names;<br>right-click for full avatar modal"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "tap reaction chip"
},
{
"mark": "part"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "tooltip + click for list"
},
{
"mark": "yes"
}
]
},
{
"feature": "Edit history viewer<small>see all prior versions of an edited message</small>",
"cells": [
{
"mark": "yes",
"note": "click \"(edited)\" label → modal<br>with all versions + timestamps"
},
{
"mark": "no",
"note": "label shown, not clickable"
},
{
"mark": "yes"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "yes"
}
]
},
{
"feature": "Custom status message<small>shown below username</small>",
"cells": [
{
"mark": "yes",
"note": "emoji picker, auto-clear timer<br>(30 min – 7 days), 64-char limit"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "via profile settings"
},
{
"mark": "no"
}
]
},
{
"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"
},
{
"mark": "part",
"note": "manual AFK only; auto idle<br>detection PR open, unmerged"
},
{
"mark": "part",
"note": "basic online/offline only"
},
{
"mark": "part",
"note": "basic online/offline only"
},
{
"mark": "part",
"note": "inactivity monitor shipped Oct 2025;<br>no tab/close detection confirmed"
},
{
"mark": "part",
"note": "3-min idle timer (shipped Nov 2023);<br>no tab detection, no offline on close,<br>no user-facing hide toggle"
},
{
"mark": "part",
"note": "basic online/offline only"
}
]
},
{
"feature": "Media Gallery<small>browse room images/videos/files</small>",
"cells": [
{
"mark": "yes",
"note": "right-side drawer;<br>Images/Videos/Files tabs"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Sidebar room filter<small>filter by name in real time</small>",
"cells": [
{
"mark": "yes",
"note": "Home &amp; DMs tabs"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Favorite rooms<small>starred section in sidebar</small>",
"cells": [
{
"mark": "yes",
"note": "m.favourite tag, syncs<br>across devices"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "favourites section"
},
{
"mark": "no"
}
]
},
{
"feature": "Invite link + QR code",
"cells": [
{
"mark": "yes",
"note": "matrix.to URL + QR code<br>in invite modal &amp; room settings"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Custom notification sounds<small>per-category sound selector</small>",
"cells": [
{
"mark": "yes",
"note": "per-category sound selector; ▶ preview"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Notification quiet hours<small>silence notifs in a time window</small>",
"cells": [
{
"mark": "yes",
"note": "silence all notifs in a time window; overnight support"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Room sort order<small>sort sidebar rooms by activity, name, or unread</small>",
"cells": [
{
"mark": "yes",
"note": "Recent / A→Z / Unread First"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "sort by activity only"
},
{
"mark": "part",
"note": "alphabetical only"
},
{
"mark": "yes",
"note": "multiple sort options"
},
{
"mark": "part",
"note": "limited"
},
{
"mark": "no"
}
]
},
{
"feature": "Push notifications",
"cells": [
{
"mark": "part",
"note": "web push only"
},
{
"mark": "part",
"note": "web push only"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes"
},
{
"mark": "yes",
"note": "desktop"
},
{
"mark": "yes"
}
]
},
{
"feature": "Export room history<small>download messages as file</small>",
"cells": [
{
"mark": "yes",
"note": "txt/json/html, date range,<br>E2EE-aware"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes",
"note": "has export"
},
{
"mark": "no"
}
]
},
{
"feature": "Message scheduling<small>send later with datetime picker</small>",
"cells": [
{
"mark": "yes",
"note": "MSC4140, datetime picker,<br>cancel tray above composer"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "partial / labs"
},
{
"mark": "no"
}
]
},
{
"feature": "Message bookmarks / saved messages",
"cells": [
{
"mark": "yes",
"note": "right-click bookmark,<br>sidebar panel, syncs across devices"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "yes"
},
{
"mark": "no"
}
]
},
{
"feature": "Collapsible long messages<small>auto-collapse &gt;20 lines</small>",
"cells": [
{
"mark": "yes",
"note": "\"Read more\" toggle,<br>threshold configurable"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Inline GIF preview<small>Giphy / Tenor links auto-embed</small>",
"cells": [
{
"mark": "yes",
"note": "via homeserver proxy,<br>no direct CDN contact"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Presence avatar border ring<small>colored ring shows online status</small>",
"cells": [
{
"mark": "yes",
"note": "green/yellow/red ring;<br>timeline, members, mentions"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Room emoji prefix<small>🎮 renders larger in sidebar</small>",
"cells": [
{
"mark": "yes",
"note": "1.15× size; emoji picker<br>in all name inputs"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"feature": "Quick emoji reactions on hover<small>1-click react, no menu needed</small>",
"cells": [
{
"mark": "yes",
"note": "3 recent emoji in hover bar;<br>dismisses emoji picker"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "part",
"note": "hover bar, no recents"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"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"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
},
{
"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"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
},
{
"mark": "no"
}
]
}
]
}
]
}