Skip to main content

Smart Lists, Smart Filters, and Search

A Smart Filter searches your tasks using words, tags, dates, or a combination of conditions. Save it as a Smart List to keep it in the lists panel. The results update as your tasks change.

Use the searches on this page once or save them for later. For quick filtering with a few built-in conditions, see Focus Filter.

Tap the search button above the task list or press ⌘F. Type your query in the field, or use Search Presets and Search Dates to set filters. See Search for the available controls.

Combine Today and Overdue​

To show unfinished tasks due today together with overdue tasks, enter this search:

type: duetoday OR overdue

To build the same filter with the controls:

  1. Select the All list and open search, so the search is not limited to one list.
  2. Open Presets. Under Due Date, select Today and Overdue, with no other presets selected.
  3. Turn off Match ALL filters at the top of the sheet so it reads Match ANY filter.
  4. Tap the checkmark to apply, then tap New Smart List to save. To change an existing Smart List, select it first, adjust its presets, and use the save control to update it.

Match ALL filters requires each task to meet both conditions. Tasks overdue from earlier days cannot also be due today, so they are excluded. Match ANY filter includes a task when either condition matches. The saved search keeps following the current day automatically.

note

A separate date range still narrows the results, even with Match ANY filter selected. If the range is limited to today, older overdue tasks remain excluded. Open Date Filter, tap Clear, then tap the checkmark to apply before saving.

To require high priority as well, edit the search field to read:

type: (duetoday OR overdue) AND hiprio

The parentheses group the two date choices, and AND hiprio requires high priority for both. Choosing all three presets with Match ANY filter would also include high-priority tasks due on other days.

Two Ways of Matching Text​

  • Full text matching is literal, and supports wildcards, OR, exclusions, and exact phrases.
  • Sounds-Like Search tolerates spelling mistakes and pronunciation variants. It is on by default.

Turn Sounds-Like Search off when you need the full-text operators to behave exactly. The operator table and worked examples are in Search.

tip

Sounds-Like Search is good for everyday searches. Turn it off when you need exact OR, exclusions, or wildcards.

Full Text and Structured Filters Together​

Free text and structured keywords mix in one query, with the typed words first:

plumber type: starred tags: builders groups: home

Here plumber is the text search and the rest narrow it by property.

The Nine Keywords​

2Do recognizes nine reserved keywords, each ending in a colon:

type:, tags:, taggroups:, locations:, lists:, groups:, modified:, created:, and completed:

Each keyword filters a different task detail. You can combine them, and type:, tags:, and locations: each support their own inline AND, OR, commas, !, and parentheses.

type: Filter by Task Property​

Use type: with one or more of the task properties below:

type: hiprio
type: (proj OR chck) AND hiprio AND !repeat
type: ((starred OR hiprio) AND due) OR today

Inside type:, a comma behaves like AND, ! excludes a token, and parentheses group them.

Task Structure​

TokenMatches
alltasksAny task kind, as a flat view
taskTop-level plain tasks only
subtasksSub-tasks only
projProjects
chckChecklists
emptyprojProjects with no active sub-tasks
emptychckChecklists with no active sub-tasks

Actions, Attachments, Notes, and Capture​

TokenMatches
actionAny action attached
callCall action
smsMessage action
emailMail action
browseURL action
visitVisit action
googleGoogle action
audioAudio attachment
pictPicture attachment
noteHas notes
repeatRepeating
capturedmailCaptured from an email

Dates​

TokenMatches
due / nodueHas / lacks a due date
start / nostartHas / lacks a start date
duetodayDue today
todayDue today (alias for duetoday)
duetomorrowDue tomorrow
tomorrowDue tomorrow (alias for duetomorrow)
duethisweekDue this week
starttodayStarts today
starttomorrowStarts tomorrow
startthisweekStarts this week
anytodayStart or due date is today
anytomorrowStart or due date is tomorrow
anythisweekStart or due date is this week
thisweekStart or due date is this week
overduePast due, across every list, including lists hidden from All
tasksoverduePast due, respecting the lists you excluded from All
donetodayCompleted today
doneyesterdayCompleted yesterday
donethisweekCompleted this week
note

today and tomorrow match the due date only, but bare thisweek matches start or due. Use anytoday and anytomorrow when you want the "start or due" behaviour for a single day.

Tokens that check the due date also match a task whose duration counts back into that day or week, the same way the Today list does. See Dates and Durations.

"This week" follows your configured start of the week under Settings > General, and every date token is evaluated live, so a saved Smart List using one keeps rolling forward on its own.

Priority​

TokenMatches
prioAny priority
noprioNo priority
hiprioHigh priority
medprioMedium priority
lowprioLow priority
starredStarred

State and Presence​

TokenMatches
alarmsHas alerts
durationHas a duration
inprogressStart date or duration window currently active
scheduledNot completed, with a future start date
pausedBelongs to a paused tag

Tags and Locations​

TokenMatches
anytagHas at least one tag
notagHas no tag
anylocationHas at least one location
nolocationHas no location

tags: Filter by Tag​

Comma-separated values are OR by default. AND, OR, !, and parentheses all work.

tags: home, work # same as: tags: home OR work
tags: (home OR work) AND !play
tags: (call OR mail) AND work
tags: ? # any tag set
tags: ~ # no tag set
tags: !work # has a tag, but not work
tags: ~ OR !work # not tagged work, including untagged tasks

tags: !work matches tasks that have at least one tag and are not tagged work, so tasks with no tags are left out. To include them, use tags: ~ OR !work.

taggroups: Filter by Tag Group​

Match every tag inside one or more named tag groups. Each group expands to the tags it holds, then behaves like tags:. Prefix a group with ! to exclude it. As with a tags: exclusion, excluding a group that contains tags, such as taggroups: !Someday, only matches tasks that have at least one tag.

taggroups: Contexts # any tag inside the Contexts group
taggroups: !Someday # exclude every tag in the Someday group

locations: Filter by Location​

The same model as tags:.

locations: home, drycleaners # same as: locations: home OR drycleaners
locations: (home OR work) AND !playground
locations: ? # any location set
locations: ~ # no location set
locations: ~ OR !home # not at home, including tasks with no location

locations: !home only matches tasks that have a location set. Use locations: ~ OR !home to include tasks without one.

lists: Filter by List​

Filter to tasks living in one or more named lists. Positive names are OR-ed together; prefix a name with ! to exclude a list.

lists: Work, Home # tasks from the Work or Home lists
lists: !Archive # everything except the Archive list

lists: is scope-replacing: a resolved lists: filter searches across all your lists, whichever list is selected and whatever the search scope is set to. groups: and completed: behave the same way. The other keywords stay inside whichever list you are searching.

note

Because 2Do allows lists to share a name, lists: Work matches every list called "Work". It cannot tell two identically named lists apart.

groups: Filter by List Group​

Restrict the search to tasks inside, or outside, one or more list groups.

groups: projects # all tasks in the Projects list group
groups: home, work # tasks in either group
groups: !home # exclude the Home group

modified:, created:, and completed: Filter by Recency​

All three take a relative duration: a number plus a unit. The units are min / minute(s), h / hour(s), d / day(s), w / week(s), m / month(s), and y / year(s). Long spellings work, and the number can be fractional. A month counts as 30.5 days and a year as 365 days.

A plain value, or one prefixed with <, means "within the last". Prefix it with > for "more than that long ago".

modified: 2d # modified within the last 2 days
modified: >2d # modified more than 2 days ago
created: 2h # created within the last 2 hours
created: <1w # created less than a week ago
completed: 7d # completed within the last 7 days
completed: >30d # completed more than 30 days ago
note

completed: widens the search to include completed tasks, and across every list, so you do not have to unhide them first. It is the rolling counterpart to the fixed donetoday, doneyesterday, and donethisweek tokens.

Combining Keywords​

Keywords can appear in any order, as long as free text comes first. Separate keyword sections are joined with an implicit AND, and an OR inside a section stays local to that section:

type: overdue tags: home OR school
tags: someday type: prio OR starred groups: shopping
tags: !work type: (hiprio AND thisweek) OR starred groups: !work

The first line means overdue and (tagged home or school). The OR applies only to the tags, not to the type: condition.

AND by Default, OR to Branch​

The join between two whole keyword sections is AND. To make a section an alternative instead, put a standalone OR directly in front of its keyword:

type: overdue OR tags: urgent

That returns tasks that are overdue or tagged urgent. More precisely: every unmarked section is AND-ed into one group, then each OR-marked section is appended as its own alternative, giving (unmarked group) OR alt1 OR alt2. So:

plumber type: hiprio OR tags: urgent OR completed: 1d

returns (text "plumber" and high priority) or (tagged urgent) or (completed in the last day).

note

Only a standalone OR sitting directly before a keyword branches the query. An OR at the very start of the search, or inside a single section, is ordinary text or a within-section operator. The free-text term can never be an OR branch; it always joins the AND group.

Date Filters Beyond type:​

The Search Dates editor adds an explicit date condition on top of whatever else the query holds: a fixed range, a dynamic range that moves with the calendar, or No Due Date.

By default, a task must match both the query and the date filter. Choosing a new date range keeps the other search filters in place. To make the date filter an alternative, use OR {datefilter}:

type: inprogress OR {datefilter}

This includes tasks that are in progress or match the date filter.

Due in the Next Two Weeks​

To show unfinished tasks due from today through the next two weeks across your lists:

  1. Select All and open search, so the saved filter is not tied to one list.
  2. Replace the search text with type: alltasks. This clears any earlier text, preset, tag, or list filters from the query.
  3. Open Date Filter, choose Dynamic, and set 2 Weeks. Turn off Include Scheduled to match due dates only, then tap the checkmark to apply.
  4. Check the results, then tap New Smart List to save.

The date range moves forward each day. You can rename the Smart List, but changing its name does not change its saved filters.

note

type: duethisweek matches unfinished tasks due from today through the end of the current week. type: !duethisweek excludes those tasks, including today. Either preset still applies alongside a two-week date filter, so remove the This Week preset entirely when you want the full two-week range.

The Search Presets Sheet​

For a structured filter without typing, use the Search Presets sheet from the search controls. It offers 2Do's built-in filters as tappable rows, with a ! control for turning any of them into an exclusion, and a Match ALL filters / Match ANY filter switch. A live preview shows the exact type: expression it will put in the field, which you can then edit by hand.

Some parser tokens are not offered as rows, such as google, alarms, noprio, and the completion tokens, but they are still accepted when you type them.

Searching for text, a named list, a named tag or tag group, or a custom date range is not something the sheet does. Type those as keywords, or use the Search Dates editor. The two mix freely: build the structure with the sheet, then add the named criteria in the field.

tip

For a structured filter, start with the Search Presets sheet and read its preview. The keyword syntax is best for refining what it built, or for a one-off that is quicker to type than to tap out.

When you open a project or checklist from a Smart List or while a search is active, 2Do can either keep that filter applied to the sub-tasks inside or show every sub-task unfiltered. Settings > Today & Lists > Focus & Smart Lists > Inherit Search controls it, described as Project view inherits search keywords. It is on by default.

  • On: opening a project keeps the Smart List's rule or your current search applied to its sub-tasks, so you only see the ones that match.
  • Off: the project shows all of its sub-tasks, ignoring the search. Your original search comes back when you leave the project.

A Smart List's rule counts as a search here even though you did not type it, and that includes its date range. Sub-tasks in a project are matched on their own dates, so a project opened from a Smart List such as Next 5 Days shows only the sub-tasks dated within those five days. Sub-tasks with no date or a later date stay hidden, and the project can look empty.

tip

If a project opens empty or with sub-tasks missing, turn off Inherit Search, or open the project from the list it belongs to.

Saving a Filter as a Smart List​

When the search shows the tasks you want, tap New Smart List below the search field. The Smart List appears in the lists panel, named after the query. You can rename it there.

A Smart List keeps the query, the date range, the search scope, and the sound-alike setting exactly as you had them. A Smart List built while a single list was selected filters within that list, so switch to the All focus list first if you want it to search everything.

Updating or Editing a Smart List​

Select the Smart List and open search to see its saved rule. Adjust the query, the date filter, or the presets, then tap the same save control. As long as the Smart List you are viewing is still the source of the search, it is updated in place and the view changes immediately. If you have moved to another list in the meantime, the control creates a new Smart List instead.

tip

A Smart List is only a view. Deleting one never deletes its tasks, so experiment freely.

An Asterisk in the Search Field​

If a Smart List's saved search is *, that asterisk appears when you open search within it. On its own, * matches all text; the list's date range and other filters still apply. A Smart List named All Tasks still uses its saved search, just like any other Smart List.

Typing directly after the asterisk changes the search. With Sounds-Like Search off, *book matches words ending in book, such as notebook, but not bookshop. Typing book matches both. See Full Text Operators.

For a fresh text search within that Smart List, replace the * with your words. The saved rule stays unchanged unless you use the save control. To start with an empty field and no saved Smart List filters, select the built-in All list in the lists panel, then tap the search button.

Completed Tasks in a Smart List​

A Smart List leaves completed tasks out, so the view stays on what is still outstanding. To bring them in, ask for them in the query: completed: 7d for a rolling window, or type: donetoday, doneyesterday, or donethisweek for a fixed one.

Recipe Library​

Every recipe below is a real query. Type it into the search field, confirm it returns what you expect, then save it as a Smart List. Most are best built while the All focus list is selected, so they search everything.

Priority​

GoalQuery
Anything high prioritytype: hiprio
High or medium prioritytype: hiprio OR medprio
High priority, due this weektype: hiprio AND duethisweek
Prioritized but undatedtype: prio AND nodue
Needs a prioritytype: noprio AND !repeat

Dates and Scheduling​

GoalQuery
Due todaytype: duetoday
Anything happening today, start or duetype: anytoday
Due tomorrowtype: duetomorrow
Due this weektype: duethisweek
Everything this week, start or duetype: anythisweek
Overduetype: overdue
Overdue or due todaytype: overdue OR duetoday
Starts in the futuretype: scheduled
In progress right nowtype: inprogress
No due date at all, a Someday listtype: nodue

For a rolling range that includes today, see Due in the Next Two Weeks.

Tags and Locations​

GoalQuery
Tagged waitingtags: waiting
Not tagged waiting, including untagged taskstags: ~ OR !waiting
Has a tag, but not waitingtags: !waiting
Tagged home or errandstags: home, errands
At work but not blockedtags: work AND !blocked
Any tag in the Contexts group, minus phonetaggroups: Contexts tags: !phone
Has at least one tagtype: anytag
Completely untaggedtype: notag
Has a locationtype: anylocation
An errand you can also navigate totype: anylocation AND visit

Lists and Groups​

GoalQuery
Tasks from the Work or Home listslists: Work, Home
Work and Home, only what is due todaylists: Work, Home type: duetoday
Everything except the Archive listlists: !Archive
Everything inside the Projects list groupgroups: Projects
The Projects group, high priority onlygroups: Projects type: hiprio

Status and Structure​

GoalQuery
Starredtype: starred
Repeating taskstype: repeat
Projects onlytype: proj
Empty projectstype: emptyproj
Projects or checklists that are high prioritytype: (proj OR chck) AND hiprio
Has an attachmenttype: (audio OR pict)
Captured from email this monthtype: capturedmail created: 30d
Stalled: started long ago, not repeatingtype: inprogress AND !repeat created: >14d
Waiting on someone, or anything urgenttags: waiting OR type: hiprio
Recently createdcreated: 2d
Recently completedcompleted: 7d
Everything already sized, for quick winstype: duration