Filtering and Sorting

Thursday, Apr 23, 2026

ClawManager uses a TaskWarrior-compatible filter syntax for its named filters and its inline search bar. A filter expression is a space-separated list of tokens, combined with AND logic. Filters can also carry an optional ordering expression that controls how matching tasks are sorted.

Where filters run

  • Named filters — created and managed from the funnel icon in the topbar. Each filter has a name, an expression, an optional ordering, a favourite flag (shows it as a chip in the filter row), and a readonly flag (used for the built-in “My Tasks”).
  • Inline search — the search input in the topbar auto-detects whether its contents are filter syntax. If a token starts with +, -, or matches a known keyword:value pattern, the whole input is parsed as a filter. Otherwise it falls back to a case-insensitive description substring search.
  • Built-in filters — seeded once on first launch:
    • My Tasksstatus:pending, ordered priority-,due+, readonly.
    • Todaystatus:pending due.before:today, ordered priority-,due+. Pending tasks due today or earlier (i.e. due today + overdue).
    • This Weekstatus:pending due.before:eow, ordered priority-,due+. Pending tasks due on or before the end of the current week (Sunday).
    • Completedstatus:completed, ordered modified-.

Filter syntax

Tokens are space-separated and combined with AND. Unknown tokens are ignored.

Tag tokens

Token Meaning
+<tag> Task has the tag.
-<tag> Task does not have the tag.

Tags are case-sensitive. If the tag name is all-uppercase and matches a known virtual tag (see below), it is resolved as a virtual tag rather than a literal tag.

Field tokens

Token Meaning
project:<name> Task has the given project. Case-insensitive match.
priority:<H|M|L> Task has the given priority. Case-insensitive.
status:<pending|completed|deleted|recurring> Task has the given status.
description:<text> Task description equals this text exactly (case-sensitive).
description.contains:<text> Task description contains this text (case-insensitive).

Notes:

  • description:<text> is literal equality against the whole description. For the common “search by substring” case, use description.contains: or plain text in the inline search bar.
  • There is no wildcard syntax. To match “has any project”, use the virtual tag +PROJECT; to match “has any priority”, use +PRIORITY; and so on.

Due-date tokens

The due:, due.before:, and due.after: keys accept either an ISO date or one of a few keywords.

Token Meaning
due:today Due on today’s calendar day.
due:tomorrow Due on tomorrow’s calendar day.
due:eow Due on or before the end of this week (Sunday, 23:59:59). Same behaviour as due.before:eow.
due:eom Due on or before the last day of this month. Same behaviour as due.before:eom.
due:<YYYY-MM-DD> Due on that exact calendar day.
due.before:<value> Due on or before the end of that day. Accepts today, tomorrow, eow, eom, or YYYY-MM-DD.
due.after:<value> Due on or after the start of that day. Accepts the same values as due.before.

Notes:

  • due: for a specific day compares on the task’s calendar day in the local time zone, not the exact timestamp. Two tasks due at different times on the same day both match due:today.
  • due:eow and due:eom are treated as before end-of-week and end-of-month respectively, rather than as exact-day matches.
  • Invalid dates (e.g. 2026-02-31) and unrecognized keywords cause the token to match nothing rather than being ignored.
  • Tasks with no due date never match any due: / due.before: / due.after: token.

Virtual tags

Virtual tags are uppercase tag names that are computed from a task’s properties rather than stored on the task. They are written with the same +TAG / -TAG syntax as regular tags. Virtual-tag detection is an exact-match check against the uppercase name, so +ACTIVE is a virtual tag and +active is a regular user tag.

Status-based

Tag Matches tasks that…
+PENDING have pending status.
+COMPLETED have completed status.

Field presence

Tag Matches tasks that…
+TAGGED have at least one tag.
+PRIORITY have a priority set.
+PROJECT have a project set.
+ANNOTATED have at least one annotation.

Activity and state

Tag Matches tasks that…
+ACTIVE are currently started (have a start time, not yet stopped).
+WAITING have a wait date in the future.
+SCHEDULED have a scheduled date set.
+UNTIL have an until date set.

Parent / child

Tag Matches tasks that…
+PARENT are recurring template tasks (status recurring).
+CHILD were generated from a recurring parent (have a parent field).

Due-date relative

All due-date virtual tags evaluate against the task’s due date in the local time zone. Tasks with no due date never match.

Tag Matches tasks that…
+OVERDUE are past their due date (before start of today).
+DUE are due within the next 7 days, starting today.
+DUETODAY / +TODAY are due on today’s calendar day.
+YESTERDAY were due yesterday.
+TOMORROW are due tomorrow.
+WEEK are due this week (Monday–Sunday, based on today).
+MONTH are due in the current calendar month.
+QUARTER are due in the current calendar quarter.
+YEAR are due in the current calendar year.

Dependencies

Tag Matches tasks that…
+BLOCKED have at least one dependency that is not completed or deleted.
+UNBLOCKED have no open dependencies (or no dependencies at all).
+BLOCKING are listed as a dependency by another task that is not completed or deleted.
+READY are pending, unblocked, and not waiting. Convenience combination of +PENDING +UNBLOCKED -WAITING.

Other

Tag Matches tasks that…
+UDA have any user-defined attribute (a key in the task map that is not a core TaskChampion field or a known tag_ / dep_ / annotation_ prefix).
+ORPHAN (reserved) always matches nothing — there is no UDA schema registry.
+LATEST have the most recent entry timestamp across all tasks.

Combining filters and virtual tags

Virtual tags compose with any other tokens via AND:

+PENDING +urgent project:work due.before:eow
+OVERDUE -someday priority:H
+READY +PROJECT

Sort ordering

Each named filter can carry an ordering expression. The ordering is a comma-separated list of sort keys; each key is a field name optionally suffixed with + (ascending, the default) or - (descending). The leftmost key is the primary sort; later keys break ties.

Syntax

Expression Meaning
priority- Priority descending (H, M, L, none).
due+ Due date ascending (earliest first).
priority-,due+ Priority descending, then due date ascending as a tie-breaker.
project+,priority-,due+ Project ascending, then priority descending, then due date ascending.
modified- Most recently modified first (used by the built-in Completed filter).

A token with no suffix is treated as ascending. Empty tokens and tokens with an empty field name are skipped.

Supported fields

Known fields use type-aware comparison:

Field Comparison
priority Rank-based: H > M > L > none. Direction flips the rank order.
due Numeric (seconds since epoch).
entry Numeric (task creation time).
modified Numeric (last-modified time).
description Case-insensitive string, locale-aware.

Any other field name falls back to task.getValue(field), which makes custom attributes (UDAs) and any other TaskChampion key sortable. Numeric values use numeric comparison; everything else is compared as a case-insensitive string.

Null handling

Null and empty values always sort last, regardless of ascending or descending direction. This means due+ puts tasks with no due date after all dated tasks, and due- also puts them last rather than promoting them to the top.

No ordering

If a filter’s ordering expression is empty or omitted, the matching tasks are returned in their underlying working-set order — no explicit sort is applied.

Examples

Goal Expression Ordering
High-priority pending work tasks, soonest first status:pending priority:H project:work due+
Everything due this week that isn’t blocked +PENDING +WEEK -BLOCKED due+,priority-
Overdue tasks, highest priority first +OVERDUE +PENDING priority-,due+
Anything tagged urgent but not on the someday list +urgent -someday +PENDING priority-
Most recently completed tasks status:completed modified-
Tasks with no project +PENDING -PROJECT due+