From 8481610066dcee62233e2bc18688200bf12748d7 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Tue, 30 Jun 2026 22:43:49 -0400 Subject: [PATCH] docs(call): document soundboard/quality/permissions (README table + landing) - README Custom Features table: add rows for the in-call soundboard (P5-15), call quality controls, and room call-permissions (P5-31). - landing: mention the soundboard, per-user quality controls, and server-enforced room call-permissions in the feature blurb. Co-Authored-By: Claude Opus 4.8 --- README.md | 3 +++ landing/index.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 47fc4fa..1919c4e 100644 --- a/README.md +++ b/README.md @@ -502,6 +502,9 @@ All custom code lives in `src/app/` on the `lotus` branch of `code.lotusguild.or | **Screenshare fullscreen** | `src/app/features/call/CallControls.tsx`, `src/app/features/call/Controls.tsx` | When screensharing, a fullscreen button appears in call controls. Calls `callEmbedRef.current?.requestFullscreen()` on the Cinny call container. EC naturally spotlights the screenshare — the old 600ms grid-revert code was removed (it caused fullscreen to show avatars instead of the screen) | | **PiP screenshare focus** | `src/app/components/CallEmbedProvider.tsx`, `src/app/plugins/call/CallControl.ts` | When the floating PiP window is active and screenshare is detected (no cameras present), auto-enables EC spotlight view so the screenshare fills the PiP rather than showing avatar tiles | | **Screenshare audio mute** | `src/app/features/call/Controls.tsx`, `src/app/features/call/CallControls.tsx`, `src/app/plugins/call/CallControl.ts` | Dedicated button to independently mute/unmute audio from screenshares without muting microphone audio. Targets `audio[data-lk-source="screen_share_audio"]` LiveKit elements. Persists across deafen/undeafen cycles | +| **In-call soundboard (P5-15)** | `src/app/features/call/CallSoundboard.tsx`, `src/app/hooks/useSoundboard.ts`, `src/app/utils/soundboardClips.ts`, `CallControl.ts#injectAudio` | Call-bar popout of user-uploaded clips. Playing one sends the fork's `io.lotus.inject_audio` (armed via `lotusAudioInject=1`) so it publishes as a real LiveKit track heard by all, plus local playback. Clips are uploadable like emoji/sticker packs — stored in `io.lotus.soundboard` account data (synced across devices); host resolves mxc → authed download → `blob:` URL for the widget. Gated by `soundboardEnabled` setting | +| **Call quality controls (P5-31)** | `src/app/utils/callQuality.ts`, `src/app/hooks/useCallQuality.ts`, `CallControl.ts#setQuality` | Per-user mic/screenshare bitrate + screenshare framerate (Settings → Calls), applied via the fork's `io.lotus.set_quality`, clamped to any room cap (`min(user, room)`). **Client-cooperative** (numeric caps aren't SFU-enforceable). Unit-tested | +| **Room call permissions (P5-31)** | `src/app/features/common-settings/general/RoomQuality.tsx`, `types/matrix/room.ts` (`LotusRoomQuality`), `CallControls.tsx` | Admin switches in Room Settings → Voice write `io.lotus.room_quality` `allow_screenshare`/`allow_camera`; the call bar hides blocked buttons. **Hard-enforced server-side for all clients** by `voice-limit-guard` (this repo) — see [Voice Channel Limits & Call Permissions](#voice-channel-limits--call-permissions) | | **Custom status message** | `src/app/features/settings/account/Profile.tsx`, `src/app/features/room/MembersDrawer.tsx`, `src/app/components/user-profile/UserHero.tsx`, `src/app/components/user-profile/UserRoomProfile.tsx`, `src/app/hooks/useUserPresence.ts` | Discord-style free-form status text. Set via Settings → Account → "Status Message" with an emoji picker (lazy-loaded `EmojiBoard`). Saved via `mx.setPresence({ status_msg })`. Displayed below the username in the members drawer and user profile popout. Syncs live via Matrix presence events | | **PTT (Push-to-Talk)** | `src/app/features/call/CallControls.tsx`, `src/app/state/settings.ts` | Hold-to-talk key (default: Space, configurable). Mutes mic on join; holds mic open while key is held. Badge shows `PTT — Hold SPACE` / `● Live`. Listens on both main window and EC iframe `contentWindow` for key events | | **PTT badge theming** | `src/app/features/call/CallControls.tsx` | Plain folds `Chip` by default; neon terminal style (`#00FF88`/`#FF6B00`, JetBrains Mono) when `lotusTerminal` setting is on | diff --git a/landing/index.html b/landing/index.html index 8c9848c..1a0dc0f 100644 --- a/landing/index.html +++ b/landing/index.html @@ -555,7 +555,7 @@

Our Lotus Guild fork of Cinny adds: voice message recording & playback with 0.75×/1×/1.5×/2× speed control (MSC3245, E2EE), device verification fix (cross-client SAS emoji + inline cards), per-member device session panel with per-device verify buttons, full Discord-style presence tracking (online on startup, idle/away after 10 min inactivity, unavailable when tab hidden, offline on close — with a “Hide Online Status” privacy toggle), presence status indicators (online/busy/away dots) in member lists, incoming call ring + Answer/Decline (DMs & group chats), GIF picker (Giphy), emoji & sticker picker (custom packs, stickers send as m.sticker events), pinned messages panel (pin icon in room header, pin/unpin from message menu), who-reacted viewer (hover any reaction for a name tooltip; right-click for a full avatar list), draggable+resizable picture-in-picture call window, poll creation & voting (single or multiple choice, 2–10 options), message forwarding, image/video captions, location sharing (map view + send), deleted message placeholders, per-message read receipt avatars (click for full list with timestamps), private read receipts toggle (Settings → Privacy), screenshare fullscreen button, screenshare audio mute (mute a screenshare’s audio without leaving the call), PTT (Push-to-Talk with configurable hold key), push-to-deafen (M key, configurable in Settings → Calls), custom status messages with emoji picker + auto-clear timer (30 min – 7 days) shown below usernames, encrypted room search via local cache scan with per-room “Load more” history buttons, a dedicated Privacy settings section (hide typing, hide online status), sidebar room filter (search rooms by name in Home and DMs tabs), favorite rooms (star any room, syncs across devices via m.favourite tag), media gallery drawer (browse all images/videos/files shared in a room), invite link + QR code (in both invite modal and room settings), knock-to-join support (Request to Join button + admin Approve/Deny panel), code syntax highlighting in Lotus Terminal mode (keywords, strings, numbers, comments, functions), night light / blue light filter (warm orange overlay with adjustable intensity in Settings → Appearance), message length counter in the composer, and the Lotus Terminal design theme (with TDS-styled orange typing indicator dots). - Also added in June 2026: message scheduling (MSC4140, datetime picker, cancel tray), saved messages / bookmarks (right-click any message, sidebar panel, syncs across devices), room history export (txt/json/html, date range, E2EE-aware), room activity & mod log (joins, kicks, bans, power level changes), server ACL editor (allow/deny lists, wildcard validation, power-level gated), room stats panel (top members, top reactions, media breakdown, 24h activity heatmap), opt-in image compression (Canvas API at 0.82 quality, shows before/after sizes), 13 domain-specific URL preview cards (YouTube, Vimeo, Twitch, Reddit, X/Twitter, Spotify, Steam, IMDb, Wikipedia, GitHub, Discord, npm, Stack Overflow), inline GIF preview (Giphy & Tenor share links auto-embed as animated GIFs via the homeserver proxy), policy list viewer (admin panel for m.policy.rule.* ban list rooms — complements Draupnir), collapsible long messages (auto-collapse > 20 lines with “Read more” toggle, threshold configurable), message send animation (0.15 s fade+scale on own messages, respects prefers-reduced-motion), right-click room context menu improvements (Mute with duration submenu 15 min–indefinite, Copy Room Link, Mark as Read, Leave Room, Room Settings), quick emoji reactions directly on message hover (3 most-recent emoji in the hover bar, single click to react), in-app notification toasts (TDS-styled slide-in card from bottom-right when the window is focused, 4 s auto-dismiss, click to navigate), presence avatar border ring (2px green/yellow/red ring on user avatars in the timeline, members list, @mention autocomplete, and notifications), room emoji prefix support (leading emoji renders at 1.15× in the sidebar; emoji picker button on all room name inputs), glassmorphism sidebar toggle (Settings → Appearance, off by default; frosted blur effect lets chat backgrounds show through the sidebar — fixed in June 2026 to mirror the background onto document.body so the blur has content to work through), and 5 CSS-only animated chat backgrounds: Digital Rain (two-layer vertical stripe scroll with parallax), Star Drift (three-layer radial-gradient dots drifting diagonally), Grid Pulse (neon grid lines expanding/contracting), Aurora Flow (sweeping radial gradient ellipses on a 200% canvas), and Fireflies (three layers of glowing dots drifting). All respect prefers-reduced-motion and include a "Pause Background Animations" toggle in Settings → Appearance. Also added: AFK auto-mute for voice calls (mic silenced after a configurable idle timeout of 1–30 min detected via Web Audio AnalyserNode; in-app toast confirms the action; toggle + duration selector in Settings → Calls), knock-to-join admin badge (a live warning badge on the Members button in the room header counts pending knock requests in real time, visible only to users with sufficient invite permissions), voice channel user limit (admins set a max-participant cap per room via the io.lotus.voice_limit state event; enforced server-side for every Matrix client by a guard that fronts the LiveKit JWT issuer and refuses tokens once a room is full, with a “Channel Full (N/N)” message and disabled Join button in Lotus Chat, while members already in the call can always rejoin), and custom call join/leave sound effects (a local cue plays when someone enters or leaves a call you’re in — tracked via MatrixRTC membership changes, synthesized in-browser with the Web Audio API so no assets are bundled; choose Chime, Soft, Retro, or off in Settings → Calls). Also shipped in June 2026: 11 seasonal & holiday theme overlays (Halloween, Christmas, New Year, Autumn, Valentine’s Day, St. Patrick’s Day, Earth Day, Lunar New Year, April Fools’, Deep Space, and Retro Arcade — auto-selected by date with a manual override in Settings → Appearance; CSS-only particle systems, fully animated, all respect prefers-reduced-motion), improved chat background animations (phosphor-flicker brightness layer on Digital Rain, seamless per-tile star looping, per-layer independent aurora positions for a true fluid sweep, organic firefly bioluminescence via independent brightness+opacity pulses), user-to-user private notes (freeform text note on any user’s profile, visible only to you, auto-saves after 800 ms, syncs across devices via io.lotus.user_notes account data), presence status revert fix (status message now re-read from storage on every activity event so changing your custom status in Profile Settings is never silently overwritten), and voice ringing fix for public space channels (joining a persistent voice room no longer triggers the incoming-call ring; the m.space.parent state key lookup was corrected to use getStateEvents instead of the single-key variant that always returned undefined), and avatar decorations (99 curated APNG overlay frames — Gaming, Cyber, Space, Fantasy, Elements, Japanese, Nature, Spooky, Cozy — that animate around your avatar in the message timeline, members list, and @mention autocomplete; decoration is stored in your public Matrix profile via MSC4133 so other Lotus Chat users see it on your avatar in real time; select from Settings → Account → Avatar Decoration; includes a Lotus Flower decoration), and a 3-tier call noise-suppression control (Settings → General → Calls — Off, Browser-native, or on-device ML) where the ML tier runs a choice of on-device models (RNNoise, Speex, DTLN, or DeepFilterNet 3) entirely in your browser to strip keyboard clatter, fans, and background chatter from your mic before it reaches the call; unlike Krisp-style cloud filters it needs no LiveKit Cloud subscription and works on our self-hosted SFU. Powered by our own self-built fork of Element Call, so call behavior is tuned for Lotus Guild rather than locked to an upstream bundle. + Also added in June 2026: message scheduling (MSC4140, datetime picker, cancel tray), saved messages / bookmarks (right-click any message, sidebar panel, syncs across devices), room history export (txt/json/html, date range, E2EE-aware), room activity & mod log (joins, kicks, bans, power level changes), server ACL editor (allow/deny lists, wildcard validation, power-level gated), room stats panel (top members, top reactions, media breakdown, 24h activity heatmap), opt-in image compression (Canvas API at 0.82 quality, shows before/after sizes), 13 domain-specific URL preview cards (YouTube, Vimeo, Twitch, Reddit, X/Twitter, Spotify, Steam, IMDb, Wikipedia, GitHub, Discord, npm, Stack Overflow), inline GIF preview (Giphy & Tenor share links auto-embed as animated GIFs via the homeserver proxy), policy list viewer (admin panel for m.policy.rule.* ban list rooms — complements Draupnir), collapsible long messages (auto-collapse > 20 lines with “Read more” toggle, threshold configurable), message send animation (0.15 s fade+scale on own messages, respects prefers-reduced-motion), right-click room context menu improvements (Mute with duration submenu 15 min–indefinite, Copy Room Link, Mark as Read, Leave Room, Room Settings), quick emoji reactions directly on message hover (3 most-recent emoji in the hover bar, single click to react), in-app notification toasts (TDS-styled slide-in card from bottom-right when the window is focused, 4 s auto-dismiss, click to navigate), presence avatar border ring (2px green/yellow/red ring on user avatars in the timeline, members list, @mention autocomplete, and notifications), room emoji prefix support (leading emoji renders at 1.15× in the sidebar; emoji picker button on all room name inputs), glassmorphism sidebar toggle (Settings → Appearance, off by default; frosted blur effect lets chat backgrounds show through the sidebar — fixed in June 2026 to mirror the background onto document.body so the blur has content to work through), and 5 CSS-only animated chat backgrounds: Digital Rain (two-layer vertical stripe scroll with parallax), Star Drift (three-layer radial-gradient dots drifting diagonally), Grid Pulse (neon grid lines expanding/contracting), Aurora Flow (sweeping radial gradient ellipses on a 200% canvas), and Fireflies (three layers of glowing dots drifting). All respect prefers-reduced-motion and include a "Pause Background Animations" toggle in Settings → Appearance. Also added: AFK auto-mute for voice calls (mic silenced after a configurable idle timeout of 1–30 min detected via Web Audio AnalyserNode; in-app toast confirms the action; toggle + duration selector in Settings → Calls), knock-to-join admin badge (a live warning badge on the Members button in the room header counts pending knock requests in real time, visible only to users with sufficient invite permissions), voice channel user limit (admins set a max-participant cap per room via the io.lotus.voice_limit state event; enforced server-side for every Matrix client by a guard that fronts the LiveKit JWT issuer and refuses tokens once a room is full, with a “Channel Full (N/N)” message and disabled Join button in Lotus Chat, while members already in the call can always rejoin), and custom call join/leave sound effects (a local cue plays when someone enters or leaves a call you’re in — tracked via MatrixRTC membership changes, synthesized in-browser with the Web Audio API so no assets are bundled; choose Chime, Soft, Retro, or off in Settings → Calls). Also shipped in June 2026: 11 seasonal & holiday theme overlays (Halloween, Christmas, New Year, Autumn, Valentine’s Day, St. Patrick’s Day, Earth Day, Lunar New Year, April Fools’, Deep Space, and Retro Arcade — auto-selected by date with a manual override in Settings → Appearance; CSS-only particle systems, fully animated, all respect prefers-reduced-motion), improved chat background animations (phosphor-flicker brightness layer on Digital Rain, seamless per-tile star looping, per-layer independent aurora positions for a true fluid sweep, organic firefly bioluminescence via independent brightness+opacity pulses), user-to-user private notes (freeform text note on any user’s profile, visible only to you, auto-saves after 800 ms, syncs across devices via io.lotus.user_notes account data), presence status revert fix (status message now re-read from storage on every activity event so changing your custom status in Profile Settings is never silently overwritten), and voice ringing fix for public space channels (joining a persistent voice room no longer triggers the incoming-call ring; the m.space.parent state key lookup was corrected to use getStateEvents instead of the single-key variant that always returned undefined), and avatar decorations (99 curated APNG overlay frames — Gaming, Cyber, Space, Fantasy, Elements, Japanese, Nature, Spooky, Cozy — that animate around your avatar in the message timeline, members list, and @mention autocomplete; decoration is stored in your public Matrix profile via MSC4133 so other Lotus Chat users see it on your avatar in real time; select from Settings → Account → Avatar Decoration; includes a Lotus Flower decoration), and a 3-tier call noise-suppression control (Settings → General → Calls — Off, Browser-native, or on-device ML) where the ML tier runs a choice of on-device models (RNNoise, Speex, DTLN, or DeepFilterNet 3) entirely in your browser to strip keyboard clatter, fans, and background chatter from your mic before it reaches the call; unlike Krisp-style cloud filters it needs no LiveKit Cloud subscription and works on our self-hosted SFU. Powered by our own self-built fork of Element Call, so call behavior is tuned for Lotus Guild rather than locked to an upstream bundle. Most recently: an in-call soundboard (upload your own short audio clips — like custom emojis, synced across your devices — and play them into a call so everyone hears them, mixed in as a real call track), per-user call quality controls (cap your microphone/screenshare bitrate and screenshare framerate for slower connections, in Settings → Calls), and server-enforced room call permissions (admins can turn off screen sharing or make a room audio-only, enforced for every Matrix client by the same LiveKit token guard — and it stops an in-progress screenshare within seconds of being switched off). Prefer the unmodified upstream? cinny.in works with our homeserver — set it to matrix.lotusguild.org.