# Lotus Chat — Work Backlog **Repo:** `lotus` branch at `https://code.lotusguild.org/LotusGuild/cinny` **Deploy:** push to `lotus` → CI → auto-deploy to `chat.lotusguild.org` (~11 min) --- ## ⚠️ TDS DESIGN LAW — READ BEFORE TOUCHING ANY UI > **ALL Lotus Terminal Design System (TDS) styling — colors, animations, glows, borders, fonts, spacing — MUST come exclusively from `/root/code/web_template/base.css` CSS variables.** > Do NOT hardcode hex values. Do NOT invent new variable names. Do NOT deviate from the design tokens defined in that file. > The canonical variable reference: `--lt-accent-orange`, `--lt-accent-cyan`, `--lt-accent-green`, `--lt-glow-orange`, `--lt-box-glow-*`, `--lt-border-color`, etc. > Reference implementation for code patterns: `/root/code/tinker_tickets/` (markdown.js, base.js, ticket.css) > This rule applies to EVERY task in this file without exception. --- ## 🧩 NATIVE-CINNY LAW — EVERY FEATURE MUST FEEL LIKE STOCK CINNY > **Every feature we implement must feel native to the upstream Cinny app — indistinguishable from something the Cinny team would have shipped.** Reference: . > > Concretely this means: > > - **Use the `folds` design system, not bespoke UI.** Build with folds primitives (`Button`, `Chip`, `IconButton`, `Menu`, `MenuItem`, `Dialog`, `Modal`, `Input`, `Switch`, `Badge`, `SettingTile`, `SequenceCard`, etc.) and folds tokens (`color.*`, `config.space.*`, `config.radii.*`, `config.borderWidth.*`). No hardcoded hex/`rgba()` for UI chrome, no invented/undefined CSS variables. > - **Match Cinny's existing patterns.** Before adding UI, find the closest existing Cinny component/flow and mirror it (e.g. a new dropdown uses `Button`+`PopOut`+`Menu`+`MenuItem` like the rest; a new modal has a `Header` with a close `IconButton`; a new setting is a `SettingTile` inside a `SequenceCard`). Consistency with stock Cinny beats personal style. > - **Lotus-custom additions should be unobtrusive** and fit Cinny's visual language, spacing, and interaction conventions — a stranger using Cinny should not be able to tell which features are ours. > > **The ONE exception:** explicit **Lotus Terminal Design System (TDS)** features, which intentionally have their own distinct look and follow the **TDS Design Law** above. TDS styling is opt-in (only active in Lotus Terminal mode); everything else must look and feel like native Cinny. --- Completed features are documented in [LOTUS_FEATURES.md](./LOTUS_FEATURES.md). --- ## ✅ Done — Awaiting Verification Built and gate-green; verify per [LOTUS_TESTING.md](./LOTUS_TESTING.md), then they graduate to LOTUS_FEATURES.md. (Bug-side fixes awaiting verification live in LOTUS_BUGS.md.) | Feature | Test guide | | :-------------------------------------------------------------------------------- | :---------------- | | Full-Screen Camera Broadcasts (per-participant focus) | A5 / G2 | | Advanced search filters (sender/date/has-link/has:image·file·video/pinned/recent) | K2 / M1 / M2 / M4 | | Custom Accent Color Picker (non-TDS themes) | M3 | | 5 Color Theme Presets (Cyberpunk/Ocean/Blood Red/Matrix/Midnight) | M5 | | Intersection-based lazy media loading | H1 | | Context-aware thumbnail previews | H2 | | Desktop — proactive update notifications (Tauri) | J1 | | Remind Me Later | K1 | | Mobile Bookmarks access | E5 | --- Legend: - `[AUDIT REQUIRED]` — at least one assumption needs code/server verification before implementing - `[SERVER CHECK]` — depends on a Synapse feature or MSC; verify on `matrix.lotusguild.org` - `[LOW PRIORITY]` — implement after all higher-priority items - `[EXTREME COMPLEXITY]` — multi-sprint, plan separately before touching - `[BLOCKED]` — cannot build until a server upgrade, upstream MSC, or dependency resolves - `[IMPROVE]` — feature exists in upstream Cinny; this task enhances it for Lotus Chat Status: `[ ]` pending · `[~]` in progress · `[x]` completed --- ## Server Capabilities (as of June 2026) - **Homeserver:** `matrix.lotusguild.org` - **Synapse version:** `1.155.0` (2026-06-18) — fully up to date; last version for Debian 12 (LXC 151 already on Debian 13 Trixie) - **Matrix spec:** up to `v1.12` formally; newer MSC features via `unstable_features` ### Confirmed facts | Finding | Impact | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | | **MSC flags ON:** `msc4140` · `msc3771` · `msc3440.stable` · `msc4133.stable` · `simplified_msc3575` · `msc4222` · `msc3266` · `msc3401_matrix_rtc` | All safe to use now | | **MSC flags OFF:** `msc4306` (thread subscriptions) · `msc3882` · `msc3912` · `msc4155` | These features are BLOCKED | | **MSC3266** room summary: flag `msc3266_enabled: true` set but `GET /v1/rooms/{id}/summary` still returns 404 (M_UNRECOGNIZED) | Room Preview BLOCKED — endpoint not implemented in Synapse 1.155 | | **MSC3892** relation redaction: not in flags | Reaction Redaction feature BLOCKED | | **MSC4260** report user: `POST /_matrix/client/v3/users/{userId}/report` returns **200** ✅ | **Report User UNBLOCKED** — endpoint live since Synapse 1.133; ready to build | | **MSC4151** report room: HTTP 405 on GET = endpoint exists (POST only) | Report Room live ✅ | | `folds AvatarImage` does NOT accept children | Add frame/overlay inside `UserAvatar.tsx` itself — optional `frameName` prop | | No in-app toast system exists (was) | Built `ToastProvider` + Jotai queue; at `App.tsx:65` | | `useUnverifiedDeviceCount()` hook exists | `src/app/hooks/useDeviceVerificationStatus.ts:65-106` | | Voice player: `AudioContent.tsx:44-223` | Playback rate on hidden `