Context
Operator-reported (2026-06-01): in most Portal news views, timeline avatars fetch the full-resolution image instead of a bounded thumbnail.
The Problem
Portal.view.content.Component already ships a getAvatarUrl(user) helper that returns ${repoUserUrl}${user}.png?size=40 (GitHub's ~1KB 40px image instead of the ~40KB original) — but the per-view timeline render paths bypass it, emitting the raw .png URL with no ?size=40:
apps/portal/view/news/tickets/Component.mjs:267 (image: me.repoUserUrl + author + '.png'), :275 (<img src="${me.repoUserUrl}${author}.png">), :341, :350
apps/portal/view/news/discussions/Component.mjs:203, :211, :349
- pulls view (same shared render pattern)
So every 40px timeline avatar downloads the full-res original.
The Fix
Route every avatar render through the base getAvatarUrl(user) (and the bot-fallback path the base already provides) so the ?size=40 bound is applied uniformly. No new config — the helper exists; the render sites just need to use it.
Acceptance Criteria
Out of Scope
- Changing the avatar source host or the bot-fallback list.
Related
- Epic #12204 (Portal news views).
Context
Operator-reported (2026-06-01): in most Portal news views, timeline avatars fetch the full-resolution image instead of a bounded thumbnail.
The Problem
Portal.view.content.Componentalready ships agetAvatarUrl(user)helper that returns${repoUserUrl}${user}.png?size=40(GitHub's ~1KB 40px image instead of the ~40KB original) — but the per-view timeline render paths bypass it, emitting the raw.pngURL with no?size=40:apps/portal/view/news/tickets/Component.mjs:267(image: me.repoUserUrl + author + '.png'),:275(<img src="${me.repoUserUrl}${author}.png">),:341,:350apps/portal/view/news/discussions/Component.mjs:203,:211,:349So every 40px timeline avatar downloads the full-res original.
The Fix
Route every avatar render through the base
getAvatarUrl(user)(and the bot-fallback path the base already provides) so the?size=40bound is applied uniformly. No new config — the helper exists; the render sites just need to use it.Acceptance Criteria
<img>/vdom-image renders resolve their URL viagetAvatarUrl(or the base avatar render helper), so the request carries?size=40.?size=40) form for a normal user.Out of Scope
Related