Activity feed

Chronological list of team events with avatars, action verbs, and relative timestamps.

Today
JB

Jordan Burke uploaded 3 images to Easter Series

12m ago
PN

Priya Nair changed status toCompleted

2h ago
MW

Marcus Webb commented on Welcome Video Script

5h ago
AR

Alex Rodriguez changed status toNew member

9h ago
Yesterday
SC

Samantha Cho changed status toNeeds review

1d ago
TB

Tyler Brooks created project VBS 2025

1d ago
Tue, Jun 23
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

2d ago
DH

Derek Hines completed Sermon Slide Deck — April 27

2d ago
Installation
$Terminal
npx shadcn@latest add https://sdk-components.thesqd.com/r/activity-feed-showcase.json
Usage
Import ActivityFeed and pass an array of items.
TSImport
import { ActivityFeed, type ActivityFeedItem } from "@/components/blocks/activity-feed";
TSExample
import { ActivityFeed } from "@/components/blocks/activity-feed";

const items = [
  {
    id: "1",
    user: { name: "Jordan Burke" },
    action: "uploaded 3 images to",
    target: "Easter Series",
    timestamp: new Date().toISOString(),
    type: "upload",
  },
];

export function Example() {
  return (
    <ActivityFeed
      items={items}
      groupBy="day"
      showRelativeTime
      showSearch
      showFilter
      filterTypes={["upload", "comment", "join", "complete"]}
    />
  );
}
Composition
Anatomy of the ActivityFeed component.
ActivityFeed                              (main component)
├── title?                                (string | null — default "Activity Feed"; null hides header)
├── description?                          (string — default "Recent team activity and updates")
├── card?                                 (boolean — default true; false renders bare list)
├── variant?="activity" | "notifications" (default "activity"; "notifications" switches to notification-center layout)
├── showSearch?                           (boolean — show search input. Default false)
├── searchPlaceholder?                    (string — search input placeholder)
├── showFilter?                           (boolean — show type filter. Default false; requires filterTypes)
├── filterTypes?                          (ActivityType[] — options for the type filter)
├── onMarkAllAsRead?                      (notifications variant — renders a "Mark all as read" action when provided)
├── markAllAsReadLabel?                   (string — default "Mark all as read")
├── items                                 (ActivityFeedItem[])
│   ├── id                                (string — unique key)
│   ├── user                              (ActivityFeedUser)
│   │   ├── name                          (string — display name)
│   │   ├── initials?                     (string — fallback if no avatar)
│   │   └── avatar?                       (string — image URL)
│   ├── action                            (string — verb, e.g. "uploaded")
│   ├── target?                           (string — optional object, e.g. project name)
│   ├── timestamp                         (ISO string | Date)
│   ├── icon?                             (ReactNode — overrides avatar with a lucide icon)
│   └── type?                             (string — used by filterTypes)
├── groupBy="day" | "none"                (default: "day")
├── showRelativeTime                      (boolean, default: true — "2h ago" or absolute)
├── emptyState?                           (ReactNode — replaces the default Empty component)
└── className?                            (string)
Default
Items grouped by day with relative timestamps, avatar initials, search, and type filter.
Today
JB

Jordan Burke uploaded 3 images to Easter Series

12m ago
PN

Priya Nair changed status toCompleted

2h ago
MW

Marcus Webb commented on Welcome Video Script

5h ago
AR

Alex Rodriguez changed status toNew member

9h ago
Yesterday
SC

Samantha Cho changed status toNeeds review

1d ago
TB

Tyler Brooks created project VBS 2025

1d ago
Tue, Jun 23
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

2d ago
DH

Derek Hines completed Sermon Slide Deck — April 27

2d ago
With icons
Pass an icon per item to replace avatars with action-specific lucide icons. Includes search and type filter.
Today

Jordan Burke uploaded 3 images to Easter Series

12m ago

Priya Nair changed status toCompleted

2h ago

Marcus Webb commented on Welcome Video Script

5h ago

Alex Rodriguez changed status toNew member

9h ago
Yesterday

Samantha Cho changed status toNeeds review

1d ago

Tyler Brooks created project VBS 2025

1d ago
Tue, Jun 23

Leah Monroe uploaded the final cut of Baptism Highlight Reel

2d ago

Derek Hines completed Sermon Slide Deck — April 27

2d ago
Compact
Set card={false} and groupBy="none" for a flat bare list — useful in sidebars or narrow panels.
JB

Jordan Burke uploaded 3 images to Easter Series

12m ago
PN

Priya Nair changed status toCompleted

2h ago
MW

Marcus Webb commented on Welcome Video Script

5h ago
AR

Alex Rodriguez changed status toNew member

9h ago
SC

Samantha Cho changed status toNeeds review

1d ago
TB

Tyler Brooks created project VBS 2025

1d ago
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

2d ago
DH

Derek Hines completed Sermon Slide Deck — April 27

2d ago
Empty state
Renders the default Empty component when items is an empty array.
No activity yet
Events will appear here as your team takes action.
Hide search & filter
Defaults for `showSearch` and `showFilter` are both `false` — omit them (or set false) for a header-only feed.
Activity Feed
No search, no filter — header-only.
Today
JB

Jordan Burke uploaded 3 images to Easter Series

12m ago
PN

Priya Nair changed status toCompleted

2h ago
MW

Marcus Webb commented on Welcome Video Script

5h ago
AR

Alex Rodriguez changed status toNew member

9h ago
Yesterday
SC

Samantha Cho changed status toNeeds review

1d ago
TB

Tyler Brooks created project VBS 2025

1d ago
Tue, Jun 23
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

2d ago
DH

Derek Hines completed Sermon Slide Deck — April 27

2d ago
Card section wrapper
Same dashboard treatment as the data-grid `card-section` variant: wrap a `card={false}` ActivityFeed in an outer `<Card>` with a `<SectionHeader>` title + right-aligned "View all →" action.
Recent activity
Today
JB

Jordan Burke uploaded 3 images to Easter Series

12m ago
PN

Priya Nair changed status toCompleted

2h ago
MW

Marcus Webb commented on Welcome Video Script

5h ago
AR

Alex Rodriguez changed status toNew member

9h ago
Yesterday
SC

Samantha Cho changed status toNeeds review

1d ago
TB

Tyler Brooks created project VBS 2025

1d ago
Tue, Jun 23
LM

Leah Monroe uploaded the final cut of Baptism Highlight Reel

2d ago
DH

Derek Hines completed Sermon Slide Deck — April 27

2d ago
Notification center
Pass `variant="notifications"` to switch to the notification-center layout: bold body text, category/timestamp sub-row, per-item unread dot, status dot overlaid on the avatar, single-select tab pills for `filterTypes`, and an optional `onMarkAllAsRead` action.
Notifications
Today
C

Courtney booked a haircut with Barber Mike

New BookingsJun 25, 20268:44 PM

S

Smith rescheduled a haircut with Barber

RescheduledJun 25, 20265:44 PM

JD

John Doe registered as a new barber

New barber registrationsJun 25, 20262:44 PM

Barber Tom has updated his availability for the week.

Shift reminderJun 25, 202612:44 PM

LB

Lisa Brown rated Barber Jason 5 stars

New ReviewJun 25, 20268:44 AM

Yesterday
SJ

Sarah Johnson booked a Beard Trim with Barber Alex

New BookingsJun 24, 202610:44 PM

DM

David Miller scheduled a Fade Cut with Barber Chris

New BookingsJun 24, 202610:44 PM

API Reference
Props for the ActivityFeed component and its item/user types.

ActivityFeed

PropTypeDefaultDescription
itemsActivityFeedItem[]Array of activity items to display, most-recent rendered first within each group.
titlestring | null"Activity Feed"Card header title. Pass null to suppress the header entirely.
titleFont"heading" | "sans""sans"Title font face. `"heading"` renders the title in the Albra display face at the larger SectionHeader scale — used by the dashboard `card-section` pattern.
titleColor"default" | "violet""violet"Title color when `titleFont === "heading"`. `"violet"` applies Squad violet (#341756) in light mode. No effect on the default sans title.
fullHeightbooleantrueStretch the Card wrapper to fill its parent's height so feeds in a grid row equalize. Pass `false` to hug content.
descriptionstring"Recent team activity and updates"Card header description shown below the title.
headerActionReactNodeRight-aligned node rendered next to the title (typically a "View all →" link button). Replaces the auto search/filter controls in the CardAction slot.
cardbooleantrueWrap the feed in a Card shell. Pass false to render the bare list (useful when embedding in another card).
variant"activity" | "notifications""activity"Switch the layout. `notifications` renders a notification-center view: bold body, category/timestamp sub-row, per-item unread dot, single-select tab pills for `filterTypes`, optional "Mark all as read" action.
showSearchbooleanfalseShow the search input above the list.
searchPlaceholderstring"Search activity…"Placeholder for the search input.
showFilterbooleanfalseShow the type filter. In `activity` variant renders a multi-select Select; in `notifications` renders single-select tab pills. Requires `filterTypes`.
filterTypesActivityType[]Options for the type filter. Items match via their optional `type` field.
onMarkAllAsRead() => voidNotifications variant — renders a "Mark all as read" action button when provided.
markAllAsReadLabelstring"Mark all as read"Label for the mark-all action.
groupBy"day" | "none""day"When "day", items are bucketed under "Today" / "Yesterday" / date headers.
showRelativeTimebooleantrueShow "2h ago" style labels. On hover a Tooltip shows the absolute timestamp.
emptyStateReactNodeCustom empty-state element rendered when items is empty.
classNamestringOverride or extend the wrapper classes.

ActivityFeedItem

PropTypeDefaultDescription
idstringUnique identifier used as the React key.
userActivityFeedUserWho performed the action.
actionstringAction verb or phrase, e.g. "uploaded".
targetstringOptional target name rendered after the action.
timestampstring | DateISO date string or Date object.
iconReactNodeOptional leading icon that replaces the avatar.
typestringFree-form type tag matched against filterTypes.
unreadbooleanNotifications variant — marks the item as unread (leading dot + tonal row).
categorystringNotifications variant — small source label rendered before the date.

ActivityFeedUser

PropTypeDefaultDescription
namestringFull display name shown as bold text.
initialsstringFallback initials if avatar is absent. Auto-computed from name if omitted.
avatarstringImage URL for the user avatar.