Skip to main content

Smart Lists, Smart Filters, and Search

A Smart Filter is anything you can describe in 2Do's search: a keyword, a tag query, a date range, or a combination of all of those. A Smart List is a Smart Filter that has been saved as a permanent entry in the source panel, so the view is always one tap away and stays up to date as your tasks change.

The same engine powers search and Smart Lists, so anything on this page can be run as a one-off search or kept as a list. The Focus Filter is related but deliberately simpler: it uses a small set of built-in conditions for quick narrowing.

Tap the search button at the top of the task list, or press ⌘F. Everything below is typed into that field. The controls under it, including the Search Presets sheet and the Search Dates editor, build the same query without typing. See Search for the search surface itself.

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 turns the search field into a structured filter against one dimension of your tasks. They combine freely, and type:, tags:, and locations: each support their own inline AND, OR, commas, !, and parentheses.

type: Filter by Task Property

The most expressive keyword. type: takes one or more tokens:

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

Watch the asymmetry: bare 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.

"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

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.

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

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 lives inside the tags: section; it does not spill into type:.

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 it is applied at the end, as one final condition. To place it yourself, use the special {datefilter} keyword in the query:

type: inprogress OR {datefilter}

2Do substitutes the editor's date filter at that spot instead of appending it.

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 while a search is active, 2Do can either keep the search 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 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.

Saving a Filter as a Smart List

When the search shows what you want, tap the New Smart List control in the row under the search field. There is no naming prompt: the Smart List is created straight away, named after the query, and joins your source panel. Rename it whenever you like.

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 its rule appears in the search field. 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.

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

Tags and Locations

GoalQuery
Tagged waitingtags: waiting
Not tagged 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