Show author avatars with nldd-avatar #167

Closed
opened 2026-07-24 05:28:48 +00:00 by robbertbos · 2 comments
Owner

NLDD 0.8.69 ships nldd-avatar: image with automatic fallback to initials (derived from name) or a person icon, sizes on the nldd-icon scale, and nldd-byline renders it natively. Waggle shows author names in cards and threads but no avatar. Evaluate adding avatars (Mattermost profile image via the file proxy, initials as fallback) in CardRow, thread view and the reply composer.

NLDD 0.8.69 ships nldd-avatar: image with automatic fallback to initials (derived from name) or a person icon, sizes on the nldd-icon scale, and nldd-byline renders it natively. Waggle shows author names in cards and threads but no avatar. Evaluate adding avatars (Mattermost profile image via the file proxy, initials as fallback) in CardRow, thread view and the reply composer.
Author
Owner

Rescoping rather than closing. Two of the three surfaces this asked for exist today (delivered by #130):

  • CardRow.vue:347, 468 - author avatar, MM profile image via /api/mm/avatar, initials fallback
  • ThreadView.vue:122-129 - same, per thread message
  • also CardDetailsModal.vue:181, ReactorPopover.vue:61, MentionProfilePopover.vue:83

The third is not there: the reply composer shows no avatar for the person writing. MessageEditor/ReplyComposer only pass an account through so the mention autocomplete can load candidate avatars (ReplyComposer.vue:38).

So what is left is one question, not a sweep: does a composer get an avatar of the current user next to the input? That is a design call - it costs vertical space in the busiest surface and adds no information the user lacks. Leaving this open with that as the remaining scope.

Rescoping rather than closing. Two of the three surfaces this asked for exist today (delivered by #130): - CardRow.vue:347, 468 - author avatar, MM profile image via /api/mm/avatar, initials fallback - ThreadView.vue:122-129 - same, per thread message - also CardDetailsModal.vue:181, ReactorPopover.vue:61, MentionProfilePopover.vue:83 The third is not there: the reply composer shows no avatar for the person writing. MessageEditor/ReplyComposer only pass an account through so the mention autocomplete can load candidate avatars (ReplyComposer.vue:38). So what is left is one question, not a sweep: does a composer get an avatar of the current user next to the input? That is a design call - it costs vertical space in the busiest surface and adds no information the user lacks. Leaving this open with that as the remaining scope.
Author
Owner

Closing as already done - most of it landed two days after this was filed.

nldd-avatar renders the real Mattermost profile image with initials as
fallback in CardRow (both variants), ThreadView, CardDetailsModal,
ReactorPopover and MentionProfilePopover. Commits 0c0bb5e and 575cfa7
(2026-07-26) moved five separately hand-built image -> initials -> icon chains
onto the component, so the fallback lives in one place instead of five.

The proxy this asks us to evaluate exists too: GET /api/mm/avatar/{user_id}
(backend/waggle/api/mm_avatar.py:167), separate from the file proxy and
cache-busted with the last_picture_update version that sync stores per author
(sync_service.py:139, mm_thread.py:205).

Three things named here were not done. None of them needs this issue open:

  • The reply composer has no avatar. It shows no "you are replying as"
    avatar, and the thread payload already returns what it would need. That is a
    design question rather than a migration - worth its own issue if we want it.
  • nldd-byline is unused. CardRow and ThreadView hand-roll the author +
    timestamp row next to nldd-avatar. A refactor with no user-visible change.
  • mentionSuggest.ts still hand-builds <img> + initials (it renders
    outside Vue, into the Tiptap suggestion popup), so it missed the sweep.

One loose end while we are here: initials() exists twice, in
cardViewUtils.ts:32 and ThreadView.vue:73, with different edge cases (?
fallback vs none).

Closing as already done - most of it landed two days after this was filed. `nldd-avatar` renders the real Mattermost profile image with initials as fallback in `CardRow` (both variants), `ThreadView`, `CardDetailsModal`, `ReactorPopover` and `MentionProfilePopover`. Commits `0c0bb5e` and `575cfa7` (2026-07-26) moved five separately hand-built image -> initials -> icon chains onto the component, so the fallback lives in one place instead of five. The proxy this asks us to evaluate exists too: `GET /api/mm/avatar/{user_id}` (`backend/waggle/api/mm_avatar.py:167`), separate from the file proxy and cache-busted with the `last_picture_update` version that sync stores per author (`sync_service.py:139`, `mm_thread.py:205`). Three things named here were not done. None of them needs this issue open: - **The reply composer has no avatar.** It shows no "you are replying as" avatar, and the thread payload already returns what it would need. That is a design question rather than a migration - worth its own issue if we want it. - **`nldd-byline` is unused.** `CardRow` and `ThreadView` hand-roll the author + timestamp row next to `nldd-avatar`. A refactor with no user-visible change. - **`mentionSuggest.ts` still hand-builds `<img>` + initials** (it renders outside Vue, into the Tiptap suggestion popup), so it missed the sweep. One loose end while we are here: `initials()` exists twice, in `cardViewUtils.ts:32` and `ThreadView.vue:73`, with different edge cases (`?` fallback vs none).
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
robbertbos/waggle#167
No description provided.