You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Filing as a separate issue from the rotation bug (#245 fixes that one) since the memory behaviour is independent of the secrets back-fill.
What we don't know yet (please update if reproducible)
Whether it's the browser tab's heap or somewhere else (Freenet node memory? Chat-delegate state?)
Whether it grows monotonically vs spikes on specific actions (send message, room switch, member set change)
Whether disabling private rooms / private-room creation makes it go away
Suspects, ordered by likelihood
Repeated delegate rotation churn. The fix(delegate): back-fill prior secret versions for newly-joined members #245 fix re-emits encrypted_secrets for newly-joined members at every version; on a long-lived room with many rotations this is O(versions × members) per join. Probably fine, but worth measuring.
Chat-delegate state retention. PR feat: move private-room secret rotation into chat delegate (#228 PR 2) #235 added per-room delegate state (signing keys, member set caches, per-version secret cache at secret_keys::secret(room, v)). The per-version secret cache grows unboundedly — there's no GC for old versions.
In-room DM state accumulation. PR feat(common): in-room encrypted direct messages between members (#230 Phase 1) #240 added DirectMessagesV1 (currently empty in production since Phase 2 UI is not shipped). The direct_messages: DirectMessagesV1 { messages: [], purges: [] } field appears in every state update; if something is cloning the whole state for each update, the empty vecs get allocated repeatedly. Cheap individually, but accumulation possible.
Subscription leak. The EnsureRoomSubscription once-per-session dedup in ui/src/components/app/chat_delegate.rs:162 is per-session, but the underlying subscription on the node side might be leaking handles.
Report
Ivvor on Matrix (2026-05-14, post-#242 deploy):
Filing as a separate issue from the rotation bug (#245 fixes that one) since the memory behaviour is independent of the secrets back-fill.
What we don't know yet (please update if reproducible)
Suspects, ordered by likelihood
secret_keys::secret(room, v)). The per-version secret cache grows unboundedly — there's no GC for old versions.ROOMSsignal mutations. PR feat(ui): re-enable private room creation (#228 Phase 4) #239 added private-room UI surfaces. A signal that fires too eagerly during rotation propagation could trigger render storms.DirectMessagesV1(currently empty in production since Phase 2 UI is not shipped). Thedirect_messages: DirectMessagesV1 { messages: [], purges: [] }field appears in every state update; if something is cloning the whole state for each update, the empty vecs get allocated repeatedly. Cheap individually, but accumulation possible.EnsureRoomSubscriptiononce-per-session dedup inui/src/components/app/chat_delegate.rs:162is per-session, but the underlying subscription on the node side might be leaking handles.Repro ideas (need Ivvor or a fresh tester)
If easy: a 5-minute screen recording of
chrome://process-internals/showing the tab's RSS over time would tell us a lot.Relates to
[AI-assisted - Claude]