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.
Where the Search Lives
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:
- Select the All list and open search, so the search is not limited to one list.
- Open Presets. Under Due Date, select Today and Overdue, with no other presets selected.
- Turn off Match ALL filters at the top of the sheet so it reads Match ANY filter.
- 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.
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.
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
| Token | Matches |
|---|---|
alltasks | Any task kind, as a flat view |
task | Top-level plain tasks only |
subtasks | Sub-tasks only |
proj | Projects |
chck | Checklists |
emptyproj | Projects with no active sub-tasks |
emptychck | Checklists with no active sub-tasks |
Actions, Attachments, Notes, and Capture
| Token | Matches |
|---|---|
action | Any action attached |
call | Call action |
sms | Message action |
email | Mail action |
browse | URL action |
visit | Visit action |
google | Google action |
audio | Audio attachment |
pict | Picture attachment |
note | Has notes |
repeat | Repeating |
capturedmail | Captured from an email |
Dates
| Token | Matches |
|---|---|
due / nodue | Has / lacks a due date |
start / nostart | Has / lacks a start date |
duetoday | Due today |
today | Due today (alias for duetoday) |
duetomorrow | Due tomorrow |
tomorrow | Due tomorrow (alias for duetomorrow) |
duethisweek | Due this week |
starttoday | Starts today |
starttomorrow | Starts tomorrow |
startthisweek | Starts this week |
anytoday | Start or due date is today |
anytomorrow | Start or due date is tomorrow |
anythisweek | Start or due date is this week |
thisweek | Start or due date is this week |
overdue | Past due, across every list, including lists hidden from All |
tasksoverdue | Past due, respecting the lists you excluded from All |
donetoday | Completed today |
doneyesterday | Completed yesterday |
donethisweek | Completed this week |
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
| Token | Matches |
|---|---|
prio | Any priority |
noprio | No priority |
hiprio | High priority |
medprio | Medium priority |
lowprio | Low priority |
starred | Starred |
State and Presence
| Token | Matches |
|---|---|
alarms | Has alerts |
duration | Has a duration |
inprogress | Start date or duration window currently active |
scheduled | Not completed, with a future start date |
paused | Belongs to a paused tag |
Tags and Locations
| Token | Matches |
|---|---|
anytag | Has at least one tag |
notag | Has no tag |
anylocation | Has at least one location |
nolocation | Has 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.
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
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).
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.
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.
Inherit Search in Project View
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.
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
| Goal | Query |
|---|---|
| Anything high priority | type: hiprio |
| High or medium priority | type: hiprio OR medprio |
| High priority, due this week | type: hiprio AND duethisweek |
| Prioritized but undated | type: prio AND nodue |
| Needs a priority | type: noprio AND !repeat |
Dates and Scheduling
| Goal | Query |
|---|---|
| Due today | type: duetoday |
| Anything happening today, start or due | type: anytoday |
| Due tomorrow | type: duetomorrow |
| Due this week | type: duethisweek |
| Everything this week, start or due | type: anythisweek |
| Overdue | type: overdue |
| Overdue or due today | type: overdue OR duetoday |
| Starts in the future | type: scheduled |
| In progress right now | type: inprogress |
| No due date at all, a Someday list | type: nodue |
Tags and Locations
| Goal | Query |
|---|---|
Tagged waiting | tags: waiting |
Not tagged waiting | tags: !waiting |
Tagged home or errands | tags: home, errands |
| At work but not blocked | tags: work AND !blocked |
Any tag in the Contexts group, minus phone | taggroups: Contexts tags: !phone |
| Has at least one tag | type: anytag |
| Completely untagged | type: notag |
| Has a location | type: anylocation |
| An errand you can also navigate to | type: anylocation AND visit |
Lists and Groups
| Goal | Query |
|---|---|
| Tasks from the Work or Home lists | lists: Work, Home |
| Work and Home, only what is due today | lists: Work, Home type: duetoday |
| Everything except the Archive list | lists: !Archive |
| Everything inside the Projects list group | groups: Projects |
| The Projects group, high priority only | groups: Projects type: hiprio |
Status and Structure
| Goal | Query |
|---|---|
| Starred | type: starred |
| Repeating tasks | type: repeat |
| Projects only | type: proj |
| Empty projects | type: emptyproj |
| Projects or checklists that are high priority | type: (proj OR chck) AND hiprio |
| Has an attachment | type: (audio OR pict) |
| Captured from email this month | type: capturedmail created: 30d |
| Stalled: started long ago, not repeating | type: inprogress AND !repeat created: >14d |
| Waiting on someone, or anything urgent | tags: waiting OR type: hiprio |
| Recently created | created: 2d |
| Recently completed | completed: 7d |
| Everything already sized, for quick wins | type: duration |