---
url: /reference/view-filters.md
description: >-
  Every filter field, operator and relative date a view offers, and how rules
  and groups combine.
---

# View filters

This page lists every field, operator and relative date a [view](/concepts/views)'s filter
offers, in every [view type](/reference/views-compared), and how rules combine. Click **Filter**
in the view's header to open the filter strip under it; every rule is a chip there. The steps to
build a filter are in
[Filter, sort and group a view](/guides/filter-sort-and-group-a-view#filter-by-due-date-and-priority).
Sorting and grouping have their own pages: [View sorting](/reference/view-sorting),
[View grouping](/reference/view-grouping).

## Filter button states

The **Filter** button is in the header of every view type. A running
[GTD session](/guides/run-a-gtd-session) hides it, and so does a
[Scrum Poker session](/guides/estimate-with-scrum-poker#start-a-session) while the session or its
summary is on screen.

| Header shows | Meaning |
|---|---|
| the funnel icon alone, gray | the view has no filter |
| the funnel icon alone, blue | a filter is set, in a narrow header; the tip reads **Filter · 3** |
| the funnel icon, blue and filled | the strip is open |
| **Filter · 3** | three rules, counting the rules inside groups; while the strip is open, the number follows your unsaved edits |
| **Hide filter** as the button's tip | the strip is open; click to close it, and the filter stays |
| **Tools** → **Filter** | a narrow window folds **Group**, **Sort** and **Filter** into one menu (not in Feed, Relations, Dashboard V2 or Scrum Poker's **Task Queue** before a session starts, where **Filter** stays a button of its own) |

## Filter fields

The **Field** picker lists the fields alphabetically. On a list's own page, **List** and
**Workspace** are left out: the list already fixes both.

| Field | Kind | Value you pick | Used in |
|---|---|---|---|
| **Assignee** | person | a member, or **Me (current user)** | [Assign and watch tasks](/guides/assign-and-watch-tasks) |
| **Author** | person | a member, or **Me (current user)**: who created the task | [See what changed in a task](/guides/see-task-history) |
| **Completed** | date | a date or a relative date: when the task was marked done | [Create and edit tasks](/guides/create-and-edit-tasks) |
| **Created** | date | a date or a relative date: when the task was created | [See what changed in a task](/guides/see-task-history) |
| **Description** | text | words to look for | [Write a task description](/guides/write-a-task-description) |
| **Due date** | date | a date or a relative date | [Build your own Today view](/guides/build-a-today-view) |
| **Estimate** | duration | typed like `1h 30m` | [Track time on a task](/guides/track-time) |
| **List** | list | lists from a folder tree | [Organize folders and lists](/guides/organize-folders-and-lists) |
| **Parent Task** | task | a task, found by its title | [Break a task down with subtasks](/guides/break-down-with-subtasks) |
| **Priority** | choice | **None**, **Low**, **Normal**, **High**, **Urgent** | [Task fields](/reference/task-fields) |
| **Stage** | choice | **Not started**, **Active**, **Done** | [Statuses and status templates](/concepts/statuses) |
| **Start date** | date | a date or a relative date | [Plan on the timeline and the calendar](/guides/plan-on-timeline-and-calendar) |
| **Status** | status | statuses from a folder → list → status tree | [Statuses and status templates](/concepts/statuses) |
| **Story points** | number | a number | [Estimate with Scrum Poker](/guides/estimate-with-scrum-poker) |
| **Tags** | tag | tags, shown with their colors | [Tag tasks](/guides/tag-tasks) |
| **Task number** | text | a key or part of one, such as `BT-` | [Task IDs and series](/reference/task-ids) |
| **Title** | text | words to look for | [Create and edit tasks](/guides/create-and-edit-tasks) |
| **Tracked** | duration | typed like `1h 30m` | [Track time on a task](/guides/track-time) |
| **Updated** | date | a date or a relative date: when the task last changed | [See what changed in a task](/guides/see-task-history) |
| **Updated by** | person | a member, or **Me (current user)**: who changed the task last | [See what changed in a task](/guides/see-task-history) |
| **Watchers** | person | a member, or **Me (current user)** | [Assign and watch tasks](/guides/assign-and-watch-tasks) |
| **Workspace** | workspace | one of your workspaces | [Personal and work tasks in one place](/concepts/personal-and-work) |

A new rule starts as **Title**, **is**, with no value: its chip reads `Title = …`.

## Operators by field kind

| Kind | Operators offered |
|---|---|
| text | **is**, **is not**, **contains**, **starts with**, **ends with**, **doesn't contain**, **is empty**, **is set**, **any of**, **none of** |
| choice, status | **is**, **is not**, **any of**, **none of** |
| date | **is**, **is not**, **before / less than**, **after / greater than**, **on or before / ≤**, **on or after / ≥**, **between**, **not between**, **is empty**, **is set** |
| number, duration | the same as date |
| person, list, workspace, tag, task | **is**, **is not**, **any of**, **none of**, **is empty**, **is set** |

For **any of** and **none of** on a text field, type whole values separated by commas. A task
matches only when the field equals one of them exactly, capitals included. For **Task number**:

```text
BT-0042, BT-0043
```

## Operator matches and chips

Each rule shows on the strip as a chip. The chip uses a short form of the operator.

| Operator | Matches | Chip reads |
|---|---|---|
| **is** | exactly this value; for **Tags** and **Watchers**, tasks that have it among theirs | `Assignee = Me (current user)` |
| **is not** | every other task | `Stage != Done` |
| **any of** | one of the values you pick | `Priority: High, Urgent` |
| **none of** | none of the values you pick | `Priority not in: None, Low` |
| **contains** | text that includes the value | `Title contains "invoice"` |
| **doesn't contain** | text that doesn't include it | `Title not contains "draft"` |
| **starts with** | text that begins with it | `Task number starts with "BT-"` |
| **ends with** | text that ends with it | `Title ends with "?"` |
| **before / less than** | an earlier date or a smaller number | `Due date < Today` |
| **after / greater than** | a later date or a larger number | `Story points > 5` |
| **on or before / ≤** | the value or anything earlier or smaller | `Due date <= This week` |
| **on or after / ≥** | the value or anything later or larger | `Created >= Last week` |
| **between** | from the first value (**From**) through the second (**To**), both included | `Due date between Today — Next week` |
| **not between** | anything outside that range | `Due date not between Today — Next week` |
| **is empty** | no value | `Due date is empty` |
| **is set** | any value | `Assignee is set` |

A chip with more than two values names two and counts the rest:
`Tags: @errands, @phone, +1 more`.

**contains**, **doesn't contain**, **starts with** and **ends with** ignore capitals. **is**,
**is not**, **any of** and **none of** match the text exactly.

## Relative dates

A date value is either a fixed date or a relative one. Next to **Value**, click **Relative** or
**Date** to switch. A relative date moves with the calendar, so a saved view stays current.

| Pick | Window it stands for |
|---|---|
| **Today**, **Tomorrow**, **Yesterday** | that day |
| **This week**, **Next week**, **Last week** | Monday through Sunday |
| **This month**, **Next month**, **Last month** | the calendar month |
| **Minutes**, **Hours**, **Days**, **Weeks**, **Months** (under **Custom**) | the whole minute, hour, day, week or month that many units away |

A **Custom** value is a unit and an **Offset** from -120 to 120. The units are:

* **Minutes**
* **Hours**
* **Days**
* **Weeks**
* **Months**

Some values and how they read:

| Unit | Offset | Reads as |
|---|---|---|
| **Days** | `3` | **In 3 days** |
| **Days** | `-2` | **2 days ago** |
| **Hours** | `4` | **In 4 hours** |
| **Months** | `-3` | **3 months ago** |

::: info Whose time zone
Hule works out the window each time the view loads, in the
[**Time zone**](/guides/set-up-notifications) of the person looking at it: **Notifications** in
the settings of the workspace they own, or else of the first one they joined.
**Apply to all my workspaces** there copies it to the rest.
:::

The operator decides how a rule uses the window. On a Wednesday, with **Due date** and
**This week**:

| Operator | Tasks it keeps |
|---|---|
| **is** | due Monday through Sunday of this week |
| **is not** | due in any other week, and tasks with no due date |
| **before / less than** | due before this Monday: overdue from earlier weeks |
| **on or before / ≤** | due up to this Sunday, overdue tasks included |
| **after / greater than** | due from next Monday on |
| **on or after / ≥** | due from this Monday on |
| **between** This week — Next week | due from this Monday through next Sunday |

`Due date < Today` keeps every task due before today, done ones included. The overdue filter,
done tasks left out:

```text
Due date < Today
Stage != Done
```

## People fields and Me

Four fields pick people:

* **Assignee**
* **Author**
* **Updated by**
* **Watchers**

In each of them:

* **Me (current user)** is first in the picker. It means whoever opens the view, so one
  [shared view](/concepts/sharing) shows each member their own tasks.
* A member you pick by name is matched in every workspace the view
  [draws from](/concepts/views).

## Tags from several workspaces

A tag belongs to one workspace. In a view that draws from several workspaces, two tags with the
same name are two different values: pick the one from the workspace you mean. A saved filter
keeps the tags it was saved with, so after you add a workspace to the view, add its tags to the
rule too.

## Rules and groups

* **+ Rule** on the strip adds a rule. Click a chip to change its **Field**, **Operator** and
  value; remove it with its **×**, or with **Remove rule** in its editor.
* **One join per group.** The chip between two rules reads **AND** or **OR**. Click it and pick
  the other word to switch; every join in that group changes together.
* **+ Group** adds a group, drawn in parentheses, with its own **AND** or **OR**. Drag chips into
  it or out of it. An empty group offers its own **+ Rule**.
* **Remove a group** with the **×** after its closing parenthesis (**Remove group**).

For example, High or Urgent tasks that are due by the end of this week, overdue included, or have
no due date. The filter holds:

* a **Priority** rule, **any of** **High**, **Urgent**;
* then **+ Group**, set to **OR**;
* inside the group, two **Due date** rules: **on or before / ≤** **This week**, and **is empty**.

It reads:

```text
When Priority is any of High, Urgent AND (Due date is on or before This week OR Due date is empty)
```

## Advanced filter

The gear on the strip, **Advanced filter**, opens a card titled **Filter —** and the view's name.
It shows the same rules as a tree:

* each group has **AND** / **OR**, **+ Rule** and **+ Group**;
* each rule has **Field**, **Operator** and its value;
* the footer spells out the whole filter as one sentence starting with **When**, as in the
  example above.

Edits in the card show on the strip at once. **Save** on the strip applies them.

## Subtask filtering

The **Subtasks** menu at the right end of the strip, before **Save** and **Discard**, decides whether
a matching subtask brings its top-level task into the view, and which subtasks show under that
task. The button reads **Subtasks ·** and the current choice, for example
**Subtasks · Task itself**. The choice is saved with the rules. How a view shows subtasks at all:
[Break a task down with subtasks](/guides/break-down-with-subtasks).

| Choice | A task shows when | Under a shown task |
|---|---|---|
| **The task itself** (the default) | the task itself matches | all its subtasks |
| **Task or its subtasks — matches only** | the task or any of its subtasks matches | only the matching subtasks, and the subtasks that lead to them |
| **Task or its subtasks — whole tree** | the task or any of its subtasks matches | all its subtasks |

For example, with the rule `Stage != Done`, a task in the **Done** stage whose one unfinished
subtask sits three levels down stays out of the view under **The task itself**. Under
**Task or its subtasks — matches only** it shows with that one subtask and the two subtasks above
it; under **Task or its subtasks — whole tree**, with all of its subtasks.

The menu is greyed out while the view's **Slice** chip, in its header, is set to
**Tasks and subtasks** or **Subtasks only** ([which tasks a view shows](/concepts/views#sources-where-a-view-looks)).
There every subtask is a row of its own, and the filter checks each row directly.

## Save, Discard and Clear all

Rules you add don't filter the view until you save them.

| Button | Shows | What it does |
|---|---|---|
| **Save** | once you change something | saves the rules and the **Subtasks** choice on the view. Greyed out while a rule has no value; pointing at it says "Pick a value for every rule, or remove the empty one." |
| **Discard** | once you change something | throws away unsaved changes |
| **Clear all** | when the view has a saved filter and nothing is unsaved | removes the filter at once |

## Saved filters: who sees them

A filter belongs to the view itself, not to a view type: switching a view from List to Kanban
keeps its filter. Everyone who opens the view sees the filtered tasks, with **Me (current user)**
worked out for each of them.

::: warning Edit access needed
To change a [shared](/concepts/sharing) view's filter you need **Edit** access to the view and a
[permission set](/reference/permissions-and-access) that can update views, such as
**List/Folder manager** or **Admin**. [Personal views](/concepts/views) are always yours to change. With **Read** access you can't
save: a list's page shows the rules as plain chips, and on a view's page **Save** fails with
"Failed to apply filter".
:::

* On a list's page with **Read** access, all groups together show as one chip counting their
  rules, such as `Advanced: 2 conditions`, or the strip reads **No filters applied**.
