Friends tab on Home (Discord-style): one-way friends list, presence, nicknames, Active Now #93

Open
opened 2026-10-07 20:25:52 +00:00 by robocub · 0 comments
Member

Why

Discord users expect a Friends view: who they talk to, whether those people are online, and what they're up to. Today Vommet's Home shows alerts, invites, recent activity and rooms, with no way to see your people at a glance. Matrix has no "friend" concept, so this is a client-side feature: nothing new is needed from the server or from the other person's client.

What exists already

  • Nicknames: PetNameComponent (upstream #1036, account data chat.commet.petnames), already used for members and room names. The Friends list reuses it: nickname as the main name, real name / MXID secondary.
  • Presence: MatrixUserPresenceComponent: online / unavailable / offline, status message, and a 2-minute "recently seen" fallback from receipts and typing. There's no screen that shows it yet.

Matrix limits this design has to handle

  1. Presence only flows between users who share a room. A friend you share no room with always looks offline. In practice a friend needs a DM.
  2. Some homeservers disable presence federation. Show that as a grey "unknown" state, not as "offline".
  3. Voice activity is free: org.matrix.msc3401.call.member state is only visible in rooms you're in, so "only show activity where you share a room" is automatic.
  4. No standard for "Playing X". Status message only, for now.

Proposal

Home gets tabs: Home | Friends.

Phase 1: Friends list

  • One-way list (operator decision 2026-10-07): Matrix has no true mutual buddies, so there are no friend requests and no "pending" state. Adding someone only changes your list; they aren't asked to accept anything.
  • The friends list is private, stored in account data (im.nether.vommet.friends), and syncs across your devices.
  • One-tap "add all my DM partners" to seed it; DM partners not on the list appear as suggestions.
  • Filters: Online / All, plus search (matches nickname, display name, MXID).
  • Each row shows: avatar + presence dot, nickname (real name on hover/secondary line), status message, Message button, ⋮ menu (set nickname, remove friend, start call).

Phase 2: Add Friend

  • Add Friend: MXID or user-directory search → add to the list. If you have no DM with them, offer to open one. That DM invite is the only thing the other person ever sees, so it's honest and works with any Matrix client.

Phase 3: Active Now

  • Desktop: right-hand column. Mobile: a section at the top of the tab.
  • One card per call in a shared room, showing who's in it ("A and B · Room name").
  • Default: only calls that include at least one friend.
  • Depends on the expiry-aware call-participant helper from the space call-indicator issue, so dead memberships don't show as people in a call.

Phase 4 (later): rich activity

  • Status-message conventions or extended profile fields (MSC4133) for "Playing X".
  • The voice bridge could pass Discord activity through for bridged users.

Open questions (current defaults in brackets)

  • Is a friend an explicit list or every DM partner? [explicit list, seeded from DMs]
  • Should adding a friend notify them? Decided: no. The list is one-way; the only thing they might see is a DM invite if you choose to open one.
  • Should Active Now show calls without friends in them? [no, friends only]
  • #68 Show mutual spaces and rooms on a user's profile (the profile card can show "friend" + mutual rooms)
  • #94 Voice-activity indicators on spaces (shares the call-participant helper)
## Why Discord users expect a **Friends** view: who they talk to, whether those people are online, and what they're up to. Today Vommet's Home shows alerts, invites, recent activity and rooms, with no way to see your people at a glance. Matrix has no "friend" concept, so this is a client-side feature: nothing new is needed from the server or from the other person's client. ## What exists already - **Nicknames:** `PetNameComponent` (upstream #1036, account data `chat.commet.petnames`), already used for members and room names. The Friends list reuses it: nickname as the main name, real name / MXID secondary. - **Presence:** `MatrixUserPresenceComponent`: online / unavailable / offline, status message, and a 2-minute "recently seen" fallback from receipts and typing. There's no screen that shows it yet. ## Matrix limits this design has to handle 1. **Presence only flows between users who share a room.** A friend you share no room with always looks offline. In practice a friend needs a DM. 2. **Some homeservers disable presence federation.** Show that as a grey "unknown" state, not as "offline". 3. **Voice activity is free:** `org.matrix.msc3401.call.member` state is only visible in rooms you're in, so "only show activity where you share a room" is automatic. 4. **No standard for "Playing X".** Status message only, for now. ## Proposal Home gets tabs: **Home | Friends**. **Phase 1: Friends list** - **One-way list (operator decision 2026-10-07):** Matrix has no true mutual buddies, so there are no friend requests and no "pending" state. Adding someone only changes *your* list; they aren't asked to accept anything. - The friends list is private, stored in account data (`im.nether.vommet.friends`), and syncs across your devices. - One-tap "add all my DM partners" to seed it; DM partners not on the list appear as suggestions. - Filters: Online / All, plus search (matches nickname, display name, MXID). - Each row shows: avatar + presence dot, nickname (real name on hover/secondary line), status message, Message button, ⋮ menu (set nickname, remove friend, start call). **Phase 2: Add Friend** - Add Friend: MXID or user-directory search → add to the list. If you have no DM with them, offer to open one. That DM invite is the only thing the other person ever sees, so it's honest and works with any Matrix client. **Phase 3: Active Now** - Desktop: right-hand column. Mobile: a section at the top of the tab. - One card per call in a shared room, showing who's in it ("A and B · Room name"). - Default: only calls that include at least one friend. - Depends on the expiry-aware call-participant helper from the space call-indicator issue, so dead memberships don't show as people in a call. **Phase 4 (later): rich activity** - Status-message conventions or extended profile fields (MSC4133) for "Playing X". - The voice bridge could pass Discord activity through for bridged users. ## Open questions (current defaults in brackets) - Is a friend an explicit list or every DM partner? [explicit list, seeded from DMs] - ~~Should adding a friend notify them?~~ Decided: no. The list is one-way; the only thing they might see is a DM invite if you choose to open one. - Should Active Now show calls without friends in them? [no, friends only] ## Related - #68 Show mutual spaces and rooms on a user's profile (the profile card can show "friend" + mutual rooms) - #94 Voice-activity indicators on spaces (shares the call-participant helper)
robocub changed title from Friends tab on Home (Discord-style): presence, nicknames, pending, Active Now to Friends tab on Home (Discord-style): one-way friends list, presence, nicknames, Active Now 2026-10-07 21:39:39 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nether/vommet#93
No description provided.