Verify-then-fix batch of minor bugs; each staged diff reviewed by 2 agents
(both SHIP). Two listed items (N6 receipt-avatar refresh, H10 room-name
length reject) were already handled and left unchanged.
Threads:
- T5: a just-sent reply no longer under-notifies — `participated` also checks
the local thread timeline for our own events, since the server-bundle
`hasCurrentUserParticipated` lags.
- T6: a room set to "Mentions & Keywords only" no longer over-notifies Default
thread replies — new `roomMentionsOnly` gate (behavior-identical when false;
+4 unit tests).
- T7: thread-mode account-data writes are serialized with content carried
forward (setAccountData is a bare PUT whose result lags the /sync echo, so
plain serialization wouldn't stop the lost update); carry only on success.
Calls / audio:
- C-L2: a real incoming ring cancels a lingering Settings ringtone preview.
- C-L3: the ringtone AudioContext is primed on the first page gesture (via the
always-mounted CallEmbedProvider) so the first ring after a cold load isn't
silent.
- C-L5: useCallSpeakers depends on a stable boolean, so the tile MutationObserver
+ io.lotus.call_state subscription aren't rebuilt on every membership change.
Crypto:
- F5: the OIDC refresher forwards the freshly-refreshed token expiry
(passed on the tokens object at runtime) as expiresInMs, so the persisted
expiresAt no longer goes stale across reloads.
Gates: tsc 0, eslint 0, prettier clean, 860/860 tests, build ok.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Several localStorage caches held decrypted message content or user PII and
survived a normal logout, leaving residue on a shared device (the search
index was already wiped; these were not):
- cinny_scheduled_messages_v1 - decrypted IContent.body of pending sends
- cinny_recent_searches_v1 - search query text
- cinny_recent_forward_targets_v1 - recent forward contact/room graph
- cinny_recent_gifs_v1 / cinny_recent_stickers_v1 - media the user sent
- navToActivePath<userId> - per-space last-visited room paths
- (plus the translation cache added earlier)
Add a clear function per module and a single auditable clearPlaintextCaches()
aggregator, called from both logout paths (logoutClient + the server-forced
SessionLoggedOut handler) alongside the existing session/search-index wipes.
Unit-tested.
Deliberately NOT cleared (documented in the aggregator): unsent composer
drafts and the presence status message (preserved by product decision N98);
SDK sync/crypto store + io.lotus.* account data (reminders/bookmarks/notes),
already wiped by mx.clearStores(); low-sensitivity UI/metadata residue.
The forward-targets/gifs/stickers/nav-path additions and the accurate
"not covered" documentation address findings from two review passes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Follow-up hardening from two review passes on the on-device translation
feature:
- Privacy (HIGH): the translation cache is decrypted message plaintext,
but logout did not clear it (unlike the search index), leaving up to
300 cleartext bodies in localStorage on shared devices. Add
clearTranslationCache() and call it from both logout paths
(logoutClient and the server-forced SessionLoggedOut handler).
- Edited messages (MEDIUM): the cache key was eventId:target with no
content dependence, so an edit reused the pre-edit translation. Fold a
content fingerprint into the key, and re-arm the auto-translate
one-shot when the text changes.
- Settings (LOW): coerce a persisted translateTargetLang to a supported
curated code so the hook never targets a language the engine can't
produce (previously only the UI clamped it).
- Chinese (LOW): restore canonical BCP-47 case (zh-Hant / zh-Hans) at
the Translator API boundary, since normalizeLang lowercases the script
subtag for internal keys.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The IndexedDB crypto store is evictable while the localStorage session survives,
so the browser can drop it out from under a live login -> the device resurrects
with a blank key store and re-uploads a one-time key at an id Synapse already
holds -> a permanent '400 M_UNKNOWN: One time key ... already exists' upload
storm (and undecryptable to-device/media keys downstream).
initClient now calls navigator.storage.persist() before creating the crypto
store, so the origin's storage is marked persistent and won't be evicted.
Best-effort (granted by engagement/PWA-install, no prompt; denial is non-fatal).
Preventive only -- an already-diverged device still needs a clean re-login.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
B2 of the Matrix protocol-gaps roadmap, gate-green (688 tests):
- Enable QR verification methods (show/scan/reciprocate) in initMatrix.
- Extend DeviceVerification: the Ready step offers your own QR (byte-mode encode
via qrcode), a camera 'Scan their QR code' flow, and an emoji fallback; the
Started step routes reciprocate → a confirm step (useVerifierShowReciprocateQr)
or SAS as before.
- New QrScanner component: getUserMedia + jsQR, handing the raw binaryData bytes
to request.scanQRCode (BarcodeDetector is string-only, so can't be used).
- Adds qrcode + jsqr (small, pure-JS, client-only); build-verified under rolldown.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
threadSupport:true makes matrix-js-sdk partition m.thread relations into Thread
objects (replies leave the main timeline; roots stay). markAsRead now sends
UNTHREADED receipts so one receipt still clears room + thread notification
counts — without this, badges would stick unread. The thread panel + summary
chips land in the same push.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Raw-IndexedDB cache (lotus-search-cache: messages keyed [roomId,eventId] +
per-room coverage) merged into local search with in-memory-wins dedupe. OPT-IN
(default off) via a standalone atom — stores decrypted text at rest, so it ships
with a privacy note, a Clear button, and an unconditional wipe on logout
(initMatrix). All IDB errors degrade to cache-miss. +8 tests (1 IDB skip in node).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- initMatrix.ts: import the shared Session type; when a session has a refresh
token + oidc metadata, wire a LotusOidcTokenRefresher via createClient's
refreshToken + tokenRefreshFunction (reactive 401 refresh). Rust crypto is
unaffected (still keyed on userId/deviceId).
- client/oidcTokenRefresher.ts: OidcTokenRefresher subclass that persists rotated
tokens back to the fallback session.
- client/oidcLogout.ts + logoutClient: best-effort revoke access+refresh tokens at
the issuer's revocation_endpoint on logout (tolerant of failure).
- settings/account/OidcManageAccount.tsx: MSC2965 "Manage account" deep-link,
shown only when authMetadata is present (OIDC servers); mirrors OtherDevices.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- N98: logoutClient and handleLogout now call removeFallbackSession() (removes
only the 4 session credential keys) instead of window.localStorage.clear(),
so settings, unsent drafts, PiP position, and status are preserved across a
normal logout. localStorage.clear() stays reserved for clearLoginData() (the
explicit factory-reset path).
- N99: the useSyncState callback now handles ERROR/STOPPED. A sync failure
before the first PREPARED (offline at startup, homeserver unreachable) shows
a dedicated error splash with a Retry button (startMatrix) instead of an
endless "Heating up" spinner alongside a contradictory "Connection Lost!"
banner. Guarded by a hasPreparedRef so post-PREPARED transient errors still
go through <SyncStatus>; PREPARED self-heals the splash on recovery, and the
redundant banner is suppressed while the splash is shown.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- EditHistoryModal: use raw fetch with /_matrix/client/v1/ path for
relations API — Synapse only supports relations at v1, not v3 (fixes
Sentry JAVASCRIPT-REACT-K / 404 error)
- RoomViewHeader: remove useReportRoomSupported spec-version gate —
Synapse 1.114+ has the endpoint but only advertises spec v1.12;
button now always shows for non-creator, non-server-notice rooms
- ReportRoomModal: handle M_UNRECOGNIZED/404 with "not supported by
your homeserver" message
- RoomNavItem: add isServerNotice guard to Room Settings in sidebar
context menu (was only guarded in header three-dots menu)
- initMatrix: bump setMaxListeners from 50 → 150 to prevent
MaxListenersExceededWarning with large room lists
- RoomProfile: save topic with formatted_body + format when markdown
syntax is detected; add markdown hint below topic textarea
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each RoomNavItem subscribes to session_started/session_ended on the
MatrixRTCSessionManager, one per visible room. The default limit of 10
fires a spurious warning when 11+ rooms are in the sidebar. Listeners
are properly cleaned up — this is not a real leak.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- typescript 5.9.3 to 6.0.3
- moduleResolution Node to bundler (correct for Vite projects)
- target/lib ES2016 to ES2020 (enables flatMap, Promise.allSettled)
- Fix global to globalThis in initMatrix.ts (browser env)
- Fix EventEmitter default to named import in CallControl.ts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix prettier formatting in useCall.ts and initMatrix.ts (unblocks CI)
- Fix viteStaticCopy stripBase so manifest.json and public/locales/ land
at correct output paths (was getting extra 'public/' prefix from v4 path
preservation behavior)
- Silence react-router v7 HydrateFallback warning on root route (SPA has
no SSR hydration, null is intentional)
When matrix-sdk is briefly upgraded then reverted, the local IndexedDB
schema version is higher than the SDK expects. Detect the VersionError
DOMException and show a clear 'Clear local data and reload' button
instead of a cryptic error message.
* fix inaccessible space on alias change
* fix new room in space open in home
* allow opening space timeline
* hide event timeline feature behind dev tool
* add navToActivePath to clear cache function
* add hide activity toggle
* stop sending/receiving typing status
* send private read receipt when setting toggle is activated
* prevent showing read-receipt when feature toggle in on
* fix set power level broken after sdk update
* add media authentication hook
* fix service worker types
* fix service worker not working in dev mode
* fix env mode check when registering sw
* chore: Bump matrix-js-sdk to 34.4.0
* feat: Authenticated media support
* chore: Use Vite PWA for service worker support
* fix: Fix Vite PWA SW entry point
Forget this. :P
* fix: Also add Nginx rewrite for sw.js
* fix: Correct Nginx rewrite
* fix: Add Netlify redirect for sw.js
Otherwise the generic SPA rewrite to index.html would take effect, breaking Service Worker.
* fix: Account for subpath when regisering service worker
* chore: Correct types
* handle client boot error in loading screen
* use sync state hook in client root
* add loading screen options
* removed extra condition in loading finish
* add sync connection status bar
* optimize room typing members hook
* remove unused code - WIP
* remove old code from initMatrix
* remove twemojify function
* remove old sanitize util
* delete old markdown util
* delete Math atom component
* uninstall unused dependencies
* remove old notification system
* decrypt message in inbox notification center and fix refresh in background
* improve notification
---------
Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com>
* load room on url change
* add direct room list
* render space room list
* fix css syntax error
* update scroll virtualizer
* render subspaces room list
* improve sidebar notification badge perf
* add nav category components
* add space recursive direct component
* use nav category component in home, direct and space room list
* add empty home and direct list layout
* fix unread room menu ref
* add more navigation items in room, direct and space tab
* add more navigation
* fix unread room menu to links
* fix space lobby and search link
* add explore navigation section
* add notifications navigation menu
* redirect to initial path after login
* include unsupported room in rooms
* move router hooks in hooks/router folder
* add featured explore - WIP
* load featured room with room summary
* fix room card topic line clamp
* add react query
* load room summary using react query
* add join button in room card
* add content component
* use content component in featured community content
* fix content width
* add responsive room card grid
* fix async callback error status
* add room card error button
* fix client drawer shrink
* add room topic viewer
* open room card topic in viewer
* fix room topic close btn
* add get orphan parent util
* add room card error dialog
* add view featured room or space btn
* refactor orphanParent to orphanParents
* WIP - explore server
* show space hint in room card
* add room type filters
* add per page item limit popout
* reset scroll on public rooms load
* refactor explore ui
* refactor public rooms component
* reset search on server change
* fix typo
* add empty featured section info
* display user server on top
* make server room card view btn clickable
* add user server as default redirect for explore path
* make home empty btn clickable
* add thirdparty instance filter in server explore
* remove since param on instance change
* add server button in explore menu
* rename notifications path to inbox
* update react-virtual
* Add notification messages inbox - WIP
* add scroll top container component
* add useInterval hook
* add visibility change callback prop to scroll top container component
* auto refresh notifications every 10 seconds
* make message related component reusable
* refactor matrix event renderer hoook
* render notification message content
* refactor matrix event renderer hook
* update sequence card styles
* move room navigate hook in global hooks
* add open message button in notifications
* add mark room as read button in notification group
* show error in notification messages
* add more featured spaces
* render reply in notification messages
* make notification message reply clickable
* add outline prop for attachments
* make old settings dialog viewable
* add open featured communities as default config option
* add invite count notification badge in sidebar and inbox menu
* add element size observer hook
* improve element size observer hook props
* improve screen size hook
* fix room avatar util function
* allow Text props in Time component
* fix dm room util function
* add invitations
* add no invites and notification cards
* fix inbox tab unread badge visible without invite count
* update folds and change inbox icon
* memo search param construction
* add message search in home
* fix default message search order
* fix display edited message new content
* highlight search text in search messages
* fix message search loading
* disable log in production
* add use space context
* add useRoom context
* fix space room list
* fix inbox tab active state
* add hook to get space child room recursive
* add search for space
* add virtual tile component
* virtualize home and directs room list
* update nav category component
* use virtual tile component in more places
* fix message highlight when click on reply twice
* virtualize space room list
* fix space room list lag issue
* update folds
* add room nav item component in space room list
* use room nav item in home and direct room list
* make space categories closable and save it in local storage
* show unread room when category is collapsed
* make home and direct room list category closable
* rename room nav item show avatar prop
* fix explore server category text alignment
* rename closedRoomCategories to closedNavCategories
* add nav category handler hook
* save and restore last navigation path on space select
* filter space rooms category by activity when it is closed
* save and restore home and direct nav path state
* save and restore inbox active path on open
* save and restore explore tab active path
* remove notification badge unread menu
* add join room or space before navigate screen
* move room component to features folder and add new room header
* update folds
* add room header menu
* fix home room list activity sorting
* do not hide selected room item on category closed in home and direct tab
* replace old select room/tab call with navigate hook
* improve state event hooks
* show room card summary for joined rooms
* prevent room from opening in wrong tab
* only show message sender id on hover in modern layout
* revert state event hooks changes
* add key prop to room provider components
* add welcome page
* prevent excessive redirects
* fix sidebar style with no spaces
* move room settings in popup window
* remove invite option from room settings
* fix open room list search
* add leave room prompt
* standardize room and user avatar
* fix avatar text size
* add new reply layout
* rename space hierarchy hook
* add room topic hook
* add room name hook
* add room avatar hook and add direct room avatar util
* space lobby - WIP
* hide invalid space child event from space hierarchy in lobby
* move lobby to features
* fix element size observer hook width and height
* add lobby header and hero section
* add hierarchy room item error and loading state
* add first and last child prop in sequence card
* redirect to lobby from index path
* memo and retry hierarchy room summary error
* fix hierarchy room item styles
* rename lobby hierarchy item card to room item card
* show direct room avatar in space lobby
* add hierarchy space item
* add space item unknown room join button
* fix space hierarchy hook refresh after new space join
* change user avatar color and fallback render to user icon
* change room avatar fallback to room icon
* rename room/user avatar renderInitial prop to renderFallback
* add room join and view button in space lobby
* make power level api more reusable
* fix space hierarchy not updating on child update
* add menu to suggest or remove space children
* show reply arrow in place of reply bend in message
* fix typeerror in search because of wrong js-sdk t.ds
* do not refetch hierarchy room summary on window focus
* make room/user avatar un-draggable
* change welcome page support button copy
* drag-and-drop ordering of lobby spaces/rooms - WIP
* add ASCIILexicalTable algorithms
* fix wrong power level check in lobby items options
* fix lobby can drop checks
* fix join button error crash
* fix reply spacing
* fix m direct updated with other account data
* add option to open room/space settings from lobby
* add option in lobby to add new or existing room/spaces
* fix room nav item selected styles
* add space children reorder mechanism
* fix space child reorder bug
* fix hierarchy item sort function
* Apply reorder of lobby into room list
* add and improve space lobby menu items
* add existing spaces menu in lobby
* change restricted room allow params when dragging outside space
* move featured servers config from homeserver list
* removed unused features from space settings
* add canonical alias as name fallback in lobby item
* fix unreliable unread count update bug
* fix after login redirect
* fix room card topic hover style
* Add dnd and folders in sidebar spaces
* fix orphan space not visible in sidebar
* fix sso login has mix of icon and button
* fix space children not visible in home upon leaving space
* recalculate notification on updating any space child
* fix user color saturation/lightness
* add user color to user avatar
* add background colors to room avatar
* show 2 length initial in sidebar space avatar
* improve link color
* add nav button component
* open legacy create room and create direct
* improve page route structure
* handle hash router in path utils
* mobile friendly router and navigation
* make room header member drawer icon mobile friendly
* setup index redirect for inbox and explore server route
* add leave space prompt
* improve member drawer filter menu
* add space context menu
* add context menu in home
* add leave button in lobby items
* render user tab avatar on sidebar
* force overwrite netlify - test
* netlify test
* fix reset-password path without server redirected to login
* add message link copy button in message menu
* reset unread on sync prepared
* fix stuck typing notifications
* show typing indication in room nav item
* refactor closedNavCategories atom to use userId in store key
* refactor closedLobbyCategoriesAtom to include userId in store key
* refactor navToActivePathAtom to use userId in storage key
* remove unused file
* refactor openedSidebarFolderAtom to include userId in storage key
* add context menu for sidebar space tab
* fix eslint not working
* add option to pin/unpin child spaces
* add context menu for directs tab
* add context menu for direct and home tab
* show lock icon for non-public space in header
* increase matrix max listener count
* wrap lobby add space room in callback hook