---
title: Show only active projects (funnel filter)
---
# Show only active projects (funnel filter)

## What it is

A **funnel** toggle in the projects-sidebar header collapses your project list down to just the projects that have something happening — a running, waiting-on-you, or errored session — and hides the quiet ones. Off by default; flip it on when a long project list is mostly idle and you only want to see what needs you.

### What you see

The **projects sidebar header** carries a small **funnel** icon button (next to the **+ Add** button and the ⋯ overflow menu), shown whenever you have at least one project.

- **Off (default)** — every project shows, exactly as before.
- **On (the funnel lights up in your accent color)** — only projects that currently show a colored count badge stay: a **green** running session, an **amber** "waiting on you" (needs-you) session, or a **red** errored/stalled session. Projects with no colored badge drop out of the list.

The rule matches what your eye already sees: if a project shows no colored number, the filter hides it. Two things never surprise you — the project you're **currently viewing** always stays in the list even if it goes quiet, and if **nothing** is active you get a small "Nothing active right now" message with a one-tap **Show all projects** button instead of a blank list.

**Turning it on tells you what it did.** The funnel is a small unlabelled icon, easy to hit by accident, so switching it **on** now pops a brief message — "Showing 9 of 162 hubs" — with a **Show all hubs** button that turns it straight back off. It only speaks when it actually hides something, and it says nothing when you turn it off.

The toggle is a view preference: it **remembers** its on/off state across restarts and applies on your phone (mobile web) too — the same funnel sits in the mobile projects list header, next to the search button.

### What persists

One boolean on `AppSettings` (`showOnlyActiveProjects`, default `false`, in the appearance slice). It's written through the normal settings path (`updateSetting`, silently) and rides the mobile bootstrap payload so the phone restores it at first paint. It lives nowhere else.

## Where to find it

A small **funnel** icon button in the **projects sidebar header**, next to **+ Add** and the ⋯ overflow menu.

## How it behaves

### When projects are hidden — the "Showing X of Y" notice

Whenever something is hiding projects from your list, a small line appears at the top: **"Showing 3 of 127 projects"** with a one-tap way back. It is there so a hidden list can never be mistaken for lost work: you always see the count, and a single click brings them all back. The same strip appears on your phone.

It covers **both** hiders — the funnel filter and the header's **name search** — and the button matches whichever is on: **Clear** while you're searching, **Show all hubs** for the funnel.

**You can always get out.** If a filter or a search hides *every* project, you get the full message instead — "Nothing active right now", or "No hubs match …" — each with its own one-tap way back. The count strip and that message are driven by the same fact, so it is not possible for both to be missing at once: whenever nothing is on screen, something is offering you the way out. (This was reported as a sidebar "locked" into showing only group headings with no escape — see the History note below.)

**This filter is now the only thing that can hide a project row.** The notice used to cover a second hider too — the "Sort by usage" feature's **Rarely Used** group. That group was removed on 2026-08-28 after it blanked two users' sidebars, so there is nothing left for the notice to rescue there. See [sidebar-sort-by-usage.md](sidebar-sort-by-usage.md) § History.

### How it decides "active"

A project stays visible when it has at least one session in a **running**, **needs-you**, or **error / stalled** state — the same three states that draw the green / amber / red count badges on the project row. Idle, ended, paused, and archived sessions don't count, so a project whose only sessions are finished is treated as quiet.

While the filter is on — and the same way while you're searching the list by name — every collapsed group expands so a match inside still shows: project groups (dividers), the built-in sub-groups (Agent Tools, Automation, System, …), and the Plugins / Unused / Rarely-Used sections all open, their arrows flipping to match. Your collapse choices are untouched and return the moment you clear the filter or search. Reordering projects by drag is paused while the filter is on (the same as while searching), so a partial list can't scramble your saved order.

### History

- **2026-09-02** — the notice was extended to cover **search**, the totals were corrected to include hubs living inside a pinned group, the turn-on toast was added, and the escape hatch was made proof against a list of bare group headings. Reported as a sidebar permanently filtered down to group headings with no way out (feedback `906e16f5`).
- **2026-08-28** — the sort-by-usage "Rarely Used" auto-demote was removed; see [sidebar-sort-by-usage.md](sidebar-sort-by-usage.md).
- **2026-08-24** — the "Showing X of Y" notice was added (feedback `f7086815`).

## For agents

### Implementation map

For agents editing this feature — full invariants live in [projects-active-filter-contract.md](../../.claude/memory/contracts/projects-active-filter-contract.md):

- Predicate: `projectHasActivity(counts)` in [session-status.ts](../../src/shared/types/session-status.ts) — `running + attention + error > 0`.
- Desktop: [ProjectsSidebar.tsx](../../src/renderer/src/features/dashboard/ProjectsSidebar.tsx) — the funnel button + the status filter woven into the existing search-filter chokepoint (`filteredUnpinnedSorted` / `filteredPinned` / `filteredDividers` / `effectiveCollapsedIds`) + the drag-freeze guard.
- Mobile: [MobileProjectsList.tsx](../../src/renderer/src/features/dashboard/MobileProjectsList.tsx) — the funnel button + a thin filter over `unpinnedSorted` / `pinnedProjects` using the same predicate on the mobile `sessionCountsMap`.
- Setting: `showOnlyActiveProjects` in [appearance-settings.ts](../../src/shared/types/settings/appearance-settings.ts); bootstrap key in [web-bootstrap.ts](../../src/shared/types/web-bootstrap.ts).
- AI-pointable anchors: `sidebar-active-filter-toggle`, `sidebar-active-filter-show-all`, `sidebar-hidden-notice`, `sidebar-hidden-notice-show-all` (registered in [sidebar-left-rail.ui-anchors.ts](../../src/renderer/src/features/dashboard/sidebar-left-rail.ui-anchors.ts)).
- Counting: `countHubRows` / `countPinnedSectionHubRows` in [sidebar-grouping.ts](../../src/renderer/src/features/dashboard/sidebar-grouping.ts) — one number (**rendered hub rows**, group headings excluded) drives both the notice and the filter empty states on both surfaces.

## Related

The other projects-sidebar display choices sit beside it in the same header: the sidebar item list decides which entries exist at all, sort-by-usage reorders what remains, and collapsing the sidebar hides the whole column.
