Activity feed

A day-grouped history of alarms, reports and integrations, with filters, collapsed repeats and held arrivals.

Refined portVue source: WildActivityFeed.vueStorybook story: Data Display/Activity FeedReact component: WActivityFeed, WActivityAction

Try it

Filter it, turn on Problems only, simulate an event, and move between rows with the arrow keys.

Activity
Problems only
Today7
  • Alarm SMS, failed:Low battery alarm SMS to Sam Okonkwo
    Bore 12
    The carrier rejected the number. Check the contact’s phone.
    12 minutes ago, Tue 29 Sep 2026, 11:28 am
  • Alarm email, succeeded:High pressure alarm emailed to 3 people, 3 times
    North Pump, 840ms, Pressure over 250 kPa
    25 minutes ago, Tue 29 Sep 2026, 11:15 am
  • Report, succeeded:Weekly irrigation report sent
    Sam Okonkwo, 12.4s, Attachment
    2 hours ago, Tue 29 Sep 2026, 9:40 am
  • Webhook, warning:Readings pushed to Hortplus
    8.2s, hortplus.com/ingest
    Answered in 8.2 s, over the 5 s budget.
    3 hours ago, Tue 29 Sep 2026, 8:40 am
  • Calculation, info:Evapotranspiration recalculated for 24 sites
    3.1s
    5 hours ago, Tue 29 Sep 2026, 6:40 am
Yesterday3
  • CSV export, succeeded:Soil moisture exported
    Mere Tane, 2.3s, 3 depths · 30 days
    yesterday, Mon 28 Sep 2026, 9:40 am
  • API call, failed:Reading sync from the Emu Park gateway
    Emu Park
    The gateway has been unreachable for 42 minutes.
    yesterday, Mon 28 Sep 2026, 7:40 am
  • Data import, succeeded:Imported 1,240 readings from CSV
    Sam Okonkwo, 5.4s
    yesterday, Mon 28 Sep 2026, 4:40 am
This week2
  • Alarm email, succeeded:Tank low alarm emailed to 2 people
    Tank sensor 2, 650ms, Level under 20%
    3 days ago, Sat 26 Sep 2026, 10:40 am
  • Report, pending:Monthly compliance report
    4 days ago, Fri 25 Sep 2026, 10:40 am
Older1
  • Webhook, succeeded:Readings pushed to Hortplus
    1.2s, hortplus.com/ingest
    20 Sep, Sun 20 Sep 2026, 10:40 am
New events wait behind a pill until you show them.
Density
State
Collapse repeats
<WActivityFeed
  items={executions}
  now={now}
  density="comfortable"
  filter={family}
  onFilterChange={setFamily}
  failuresOnly={problemsOnly}
  onFailuresOnlyChange={setProblemsOnly}
  newCount={held.length}
  onShowNew={releaseHeld}
  onItemClick={openExecution}
  renderActions={rowActions}
  hasMore
  onLoadMore={loadOlder}
/>

When to use

  • Use it when several kinds of event share one history, such as alarms beside reports.
  • Use it where someone checks that things ran, or looks for the one that didn’t.
Don’t use it
  • For one event on its own. Use Activity item.
  • For work still running, such as an irrigation run. Use Progress bar.
  • For one message about the whole page. Use Alert.

Grouping

Rows group under Today, Yesterday, This week and Older, each with a count. A rail joins the rows of a group, so the list reads as a sequence.

Activity
Today7
  • Alarm SMS, failed:Low battery alarm SMS to Sam Okonkwo
    Bore 12
    The carrier rejected the number. Check the contact’s phone.
    12 minutes ago, Tue 29 Sep 2026, 11:28 am
  • Alarm email, succeeded:High pressure alarm emailed to 3 people, 3 times
    North Pump, 840ms, Pressure over 250 kPa
    25 minutes ago, Tue 29 Sep 2026, 11:15 am
  • Report, succeeded:Weekly irrigation report sent
    Sam Okonkwo, 12.4s, Attachment
    2 hours ago, Tue 29 Sep 2026, 9:40 am
  • Webhook, warning:Readings pushed to Hortplus
    8.2s, hortplus.com/ingest
    Answered in 8.2 s, over the 5 s budget.
    3 hours ago, Tue 29 Sep 2026, 8:40 am
  • Calculation, info:Evapotranspiration recalculated for 24 sites
    3.1s
    5 hours ago, Tue 29 Sep 2026, 6:40 am
Yesterday3
  • CSV export, succeeded:Soil moisture exported
    Mere Tane, 2.3s, 3 depths · 30 days
    yesterday, Mon 28 Sep 2026, 9:40 am
  • API call, failed:Reading sync from the Emu Park gateway
    Emu Park
    The gateway has been unreachable for 42 minutes.
    yesterday, Mon 28 Sep 2026, 7:40 am
  • Data import, succeeded:Imported 1,240 readings from CSV
    Sam Okonkwo, 5.4s
    yesterday, Mon 28 Sep 2026, 4:40 am
This week2
  • Alarm email, succeeded:Tank low alarm emailed to 2 people
    Tank sensor 2, 650ms, Level under 20%
    3 days ago, Sat 26 Sep 2026, 10:40 am
  • Report, pending:Monthly compliance report
    4 days ago, Fri 25 Sep 2026, 10:40 am
Older1
  • Webhook, succeeded:Readings pushed to Hortplus
    1.2s, hortplus.com/ingest
    20 Sep, Sun 20 Sep 2026, 10:40 am
Back-to-back runs of one event, with the same description, site and outcome, become one row with a count. Runs a person started never merge.

States

Skeleton rows while loading. An empty feed says why it’s empty, and a filtered one offers to show everything.

Activity
loading
Activity

No activity yet

Alarm notifications, reports and integrations appear here as they run.
nothing yet
ActivityProblems only

No problems to show

Everything in this period ran as expected.
problems only, all clear

Content

  • Describe what ran and who it reached: “High pressure alarm emailed to 3 people”.
  • Put the site, the person and the target in their own fields, so the description stays short.
  • Write failure messages as the next step: “Check the contact’s phone”.

Accessibility

Each row is announced as its type, its outcome and its description, then the details and the full time. Day labels are headings, and Problems only is a checkbox.

KeyWhat it does
TabMoves to the chosen filter, Problems only, the new events pill, each row and its actions, then Show older activity.
Left / RightIn the filter, moves to the next or previous family and shows it.
SpaceTurns Problems only on or off.
Down / UpMoves to the next or previous row.
Home / EndMoves to the first or last row. In the filter, picks the first or last family.
Enter / SpaceOpens the focused row.
EscapeHides the time tooltip.

Props

PropTypeDefaultDescription
itemsActivityExecution[]—The events, in any order. The feed sorts them.
nowDate | number—One clock for every relative time.
timeZonestring—IANA zone for days and times.
density'comfortable' | 'compact''comfortable'Row height and type size.
titlestring'Activity'Toolbar title and the feed’s accessible name.
filter'all' | ProcessFamily'all'Which family to show.
onFilterChange(f) => void—Shows the family filter.
failuresOnlybooleanfalseShows failures and warnings only.
onFailuresOnlyChange(on) => void—Shows the Problems only checkbox.
collapseRepeatsbooleantrueJoins back-to-back identical events into one row.
newCountnumber0Held-back arrivals, shown as a pill.
onShowNew() => void—Releases the held-back arrivals.
loadingbooleanfalseSkeleton rows in place of the list.
onItemClick(item) => void—Makes each row a button.
renderActions(item) => ReactNode—Row actions. Use WActivityAction.
hasMorebooleanfalseShows the Show older activity button.
onLoadMore() => void—Loads the next page.
maxHeightnumber—Scrolls inside the feed, with sticky day labels.

Tokens

TokenValueWhere it lands
--global-neutral-grey-400#ECECEDRail and toolbar rule.
--global-neutral-grey-300#F1F1F1Rule after each day label.
--global-neutral-grey-1100#2D2B32Day label, and new events pill hover.
--global-neutral-grey-1000#4F4D55Day count.
--global-neutral-grey-200#F5F5F5Day count chip.
--global-neutral-grey-1300#0A090BToolbar title and new events pill.
--global-blue-100#EBFAFFWash behind an arriving row.
--global-blue-1000#1877F2Show older activity, and focus ring.
--radius-3xl16pxFeed corners.
--shadow-card0 2px 12px -1px …Feed elevation.