Activity Feed
Chronological event stream with relative timestamps that keep themselves current, plus a notification bell with an unread count.
activityfeednotificationstimelineapp
Note
Events carry a `type` string, not an icon component — real events arrive as JSON and a component cannot travel in JSON — and the caller maps types to icons, with a fallback so an unknown type cannot take the feed down. Times are ISO strings, rendered only after mount: computing them during render makes the server and client disagree about "2m ago" and breaks hydration. They refresh on an interval, so a row does not still claim "3m ago" an hour later.