> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cognee.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Activity in the Cloud UI

> Every pipeline run, memory operation, and session in your workspace, filterable and exportable

The Activity page (route `/activity`) is the full log of what your workspace did: pipeline runs, memory operations, and sessions, with nested work indented under the operation that ran it. Reach it from **View full log →** on the [Overview](/cognee-cloud/ui/dashboard) Activity panel, or from any breakdown row on [Analytics](/cognee-cloud/ui/analytics).

The header states what the numbers mean: duration and tokens are recorded where available (older activity shows **—**), and cost is estimated. A **Refresh** button re-pulls the feed, a **last updated** readout beside it ticks (*just now*, *12s ago*, *4m ago*), and **Export CSV** writes every filtered row in the order shown — including the nested operations that **hide nested** is keeping off screen, so the file can hold more rows than the table does. It appends four columns the table has no room for — **Depth**, **Nested under**, **Counts toward total**, and **Session ID** — and the filename is stamped with the snapshot the rows came from (`cognee-activity-<timestamp>.csv`).

<Note>
  Activity is a Cognee Cloud feature. In the local, open-source UI the route renders a notice — **Activity is a Cognee Cloud feature** — instead of the log. See [Local UI](/cognee-cloud/local-ui#cloud-only-pages).
</Note>

## Columns

| Column          | What it shows                                                                      |
| --------------- | ---------------------------------------------------------------------------------- |
| **Timestamp**   | When the row happened. Nested rows are indented under their parent.                |
| **Action**      | `recall`, `remember`, `improve`, `forget`, or `unknown`, each with its own colour. |
| **Status**      | Lifecycle state of the row — see below.                                            |
| **Duration**    | Elapsed time where the workspace recorded one.                                     |
| **User**        | The actor, with a stable coloured dot so distinct agents are easy to tell apart.   |
| **Via**         | The access channel the operation came through.                                     |
| **Dataset**     | The dataset the operation was scoped to.                                           |
| **Run ID**      | The run's identifier, searchable in the filter bar.                                |
| **Tokens**      | Tokens recorded for the row.                                                       |
| **Cost (est.)** | Estimated spend in USD to four decimals.                                           |

Rows carry inline chips where they add something the columns cannot: **bg** on the action of a background job (*accepted and started; this row is written once and never revisited*), **3 err** on the status of a session with errors recorded inside it, and **nested** on the timestamp of a row whose parent is not in the current view (*widen the range or clear a filter to see its parent*). A still-running row shows its elapsed time counting up rather than a fixed duration.

An **`unknown`** action is an operation name this UI has not been taught — a plugin installed on your pod can record its own operations. It deliberately reads as absent rather than being folded into one of the real actions.

### Statuses

Statuses are listed in lifecycle order, which is also the order the filter offers them and the order the **Status** column sorts by:

| Status        | Colour | Meaning                                                                                                    |
| ------------- | ------ | ---------------------------------------------------------------------------------------------------------- |
| **queued**    | Slate  | Accepted but not started.                                                                                  |
| **running**   | Purple | In flight.                                                                                                 |
| **accepted**  | Cyan   | Background work handed off — nothing updates this row again; the pipelines it launched carry the progress. |
| **completed** | Green  | Finished.                                                                                                  |
| **failed**    | Red    | Finished unsuccessfully.                                                                                   |
| **abandoned** | Amber  | Computed as likely stuck rather than observed to have failed — a warning, not a verdict.                   |
| **unknown**   | Grey   | A state this UI has not been taught.                                                                       |

## Filters

The filter bar sits above the table. Every filter is reflected in the URL, so a filtered view can be shared, bookmarked, and reloaded.

Always visible:

* **date** — condition-first: pick a comparison (**is**, **is between**, **is on**, **is before**, **is after**, **is on or before**, **is on or after**), then either a one-click preset (**Today**, **Yesterday**, **This week**, **Past week**, **This month**, **Past month**, **This year**, **Past year**) or a real date. **is between** takes two dates.
* **action**, **status**, **user** — multi-select lists, built from the values that actually appear in the loaded rows rather than from a fixed enum. Each can include or exclude: **is any of** / **is none of**.
* **hide nested** (on by default) — hides operations nested under a parent. Their tokens stay in the total, counted under that parent.
* **hide 0 tokens** (on by default) — hides rows with nothing to show: those that measured zero tokens, and queued runs that never started. Rows with *no* token data recorded stay, since those are unmeasured rather than free.

Behind **+ More filters**: **via** and **dataset** (both with the same include/exclude operators), **Run ID** (**contains** / **does not contain**), and range filters for **tokens** and **cost**. Setting either bound drops every row with no recorded value — the panel warns *Rows with no recorded tokens are excluded* — which is why the separate **hide 0 tokens** toggle exists for the measured-zero case. The extra row stays open on its own whenever one of those filters is active.

**Clear filters** appears whenever any filter is set, and **Reset sort** whenever the table is sorted away from its default. Click a column header to sort by it.

<Note>
  Filters run in the browser over the rows already loaded. A date far enough back can therefore match nothing even where that activity exists — the empty state says so, and offers **Clear all filters**.
</Note>

## What the feed loads

The page polls every 30 seconds and loads the newest **200 sessions** and **500 runs and memory operations**. When a workspace holds more than that, an amber-ruled **Partial view.** notice above the table names exactly what was kept — *the newest 200 of 3,412 sessions and the newest 500 runs and memory operations* — and repeats that the filters run over what is loaded, so a filtered view can miss older matches. **Export CSV** carries the same caveat in its tooltip.

Rows are added to the DOM 150 at a time, so a workspace with hundreds of rows stays responsive without the count being hidden from you.

A totals row is pinned to the bottom of the table and always reachable. It reads **Total · 1,284 events** with the summed duration, tokens, and cost beneath their columns, and reports separately what those sums leave out — *· 96 unmeasured, excluded below* and the nested rows that are hidden and counted inside their parents.

## When the feed fails

Failure notices sit above the table rather than replacing the rows, so a failed refresh never blanks data you were reading:

| Notice                                                                                                                               | When                                          |
| ------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------- |
| *Couldn't refresh activity — showing the last data loaded.*                                                                          | A refetch failed but earlier rows are in hand |
| *Couldn't load activity. If the workspace was asleep it may still be starting up; otherwise the activity endpoint is not answering.* | Nothing loaded at all                         |
| *Sessions couldn't be loaded, so recall activity from before your workspace started recording operations is missing.*                | Only the sessions half failed                 |

## Empty state

With no activity at all, the page reads **No activity recorded yet.** — *Activity appears here once an agent reads from or writes to your memory. Add data or connect an agent to get the first rows.* — with **Add data** and **Connect an agent** actions.

If the filters match nothing, it reads **No activity matches these filters.** instead, with the caveat above and a **Clear all filters** action.

## Opening a run

A row that belongs to a session is clickable — its timestamp is a button labelled *Open session for {action} at {timestamp}* — and it opens that run in [Sessions](/cognee-cloud/ui/sessions). Rows with no session behind them are not clickable.

<Note>
  Looking for one agent conversation rather than the whole workspace? [Sessions](/cognee-cloud/ui/sessions) shows a single run's transcript, tool calls, and feedback. Looking for where the tokens went rather than what ran? See [Analytics](/cognee-cloud/ui/analytics).
</Note>
