A dead avatar URL rendered a permanent broken image instead of initials

Fixkamo-meet
Shipped
August 5, 2026 at 1:43 AM UTC
Author
Kamo
Commit
a73117b

A participant whose photo is missing from storage showed a broken-image icon to everyone else in the call, forever — it never degraded to initials. Upstream can render _loadableAvatarUrl unconditionally because that value is only ever set after getFirstLoadableAvatarUrl() has successfully preloaded it. This fork removed that guarantee on both sides: the participants middleware sets it straight from the JWT when disableThirdPartyRequests is on (no preload), and _mapStateToProps falls back to the raw avatarURL. So an unvalidated URL now reaches the component. When the avatar comes from redux rather than an explicit `url` prop, `useReduxLoadableAvatarURL` is already true, so setting avatarFailed did not change `effectiveURL` — render produced the same failing <img> again, and StatelessAvatar only reaches its initials branch when the url is falsy. Remember which URL failed and skip it, so the fallback actually happens. Also reset the failure state when _loadableAvatarUrl changes, not just `url`. Found via a real meet: one participant's photo is recorded in the DB (avatars.file_hash, is_active) but the object does not exist in MinIO, so **************** returns 404. 4 of 25 active photo avatars are orphaned that way.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing