The fallback isn't a placeholder image, it's initials.name is split on whitespace and the first letter of the first two words is uppercased and joined, no avatar library, no hashing, just enough to read as "a person" in a list of rows.
onError does the actual fallback work. The image renders optimistically; if it 404s or the network drops, onError flips a failed flag and the initials circle takes over. A new source.uri resets that flag, so swapping in a fresh URL gets a real second chance instead of being stuck showing initials forever.
The status dot pulses, it doesn't blink. Only status === "online" loops an opacity animation between 0.45 and 1 with withTiming/withRepeat, a continuous ambient breathing loop, not a state toggle, which is why withSpring never enters the picture here. offline/away/busy just render the dot at full opacity with nothing animating.
The dot's border is the cutout. Instead of clipping a bite out of the avatar circle, the dot sits on top with a border colored to match the page background, which reads as a notch cut into the avatar without any actual masking.
Sizing is numeric, not a size variant enum.size is a plain number so the circle, the initials' font size, and the status dot all scale off the same value, with no fixed sm/md/lg steps to fall between.