Smart Lists, Smart Filters, and Search
A Smart Filter is anything you can describe in 2Do's search bar: a keyword, a tag query, a date range, a combination of all of those. A Smart List is a Smart Filter that's been saved as a permanent entry in the Lists Panel, so the perspective is always one click away and stays up to date as your tasks change.
The same search engine powers the Global Search Bar and Smart Lists, so anything you can describe with the syntax on this page can be applied as a one-off search or saved as a permanent Smart List. The Focus Filter is related, but intentionally simpler: it uses a small built-in condition menu for quick narrowing.

The Global Search Bar
The Global Search Bar lives in the toolbar, a magnifying-glass button that auto-collapses when not in use. Click it (or press ⌘F) to expand the field and start typing — or use one of the two menus the field carries. They do different jobs:
- The Presets menu inside the field is the quick one. It drops ready-made queries into the field, including a Show only... submenu for the common "just show me these" perspectives. Whatever it inserts is ordinary search text, so you can edit it by hand afterwards.
- The Search Options panel is the full one. Open it with the filter button in the search field, or press
⌥⇧⌘F(Find Options...). It holds the Soundex switch, the Search Presets rule builder, the date filters, a This List / All Lists scope control, and an Include Scheduled checkbox.
The scope control decides whether the search covers only the list you're currently in or every list you have. ⌥⌘F (Toggle Search Scope) flips it without opening the panel. Include Scheduled brings tasks with a future start date into the results, and it's remembered when you save the search as a Smart List.
Two Search Modes: Full Text and Soundex
2Do supports two distinct ways of matching text:
- Full Text Search — literal matching with wildcards and
OR. Use this when you want exact control over the results. - Soundex Search — sound-alike matching. It tolerates common spelling mistakes, missing letters, and pronunciation variants.
| If you typed this | Soundex can still find |
|---|---|
plumver | plumber |
Steven | Stephen |
alexnder | Alexander |
Jon | John |
Soundex broadens text searches so similar-sounding words can still match. To use Full Text wildcards and OR precisely, toggle Soundex off in the Search Options panel; otherwise Soundex intentionally widens the results.
Quick Find vs. Search
2Do has two find surfaces. Don't confuse them:
- Search (
⌘F, magnifying-glass button) — filters the current list or all lists to matching tasks, with full Smart Filter syntax. The list collapses to just the results, and you can save what you've built as a Smart List. - Quick Find (
Fwhile focused on the Task List, or View > Task Find Bar) — jumps the selection to the first task whose title matches, without filtering anything out. Auto-expands projects and checklists when the match is in a sub-task. Best when you know the task is there and just want to navigate to it.
Inherit Search in Project View
When you open a Project or Checklist while a search is active, 2Do can either keep that search applied to the sub-tasks inside or show every sub-task unfiltered. This is controlled by Inherit Search under 2Do > Settings > Today & Lists, in the Focus & Smart Lists section. It is on by default.
- On (default) — opening a project keeps your current search applied to its sub-tasks, so you only see the sub-tasks that match.
- Off — Project View shows all of a project's sub-tasks, ignoring the outside search. Your original search is restored the moment you leave the project.
Inherit Search is an app-wide preference (not per-project) and syncs across your devices via iCloud.
Full Text Search Operators
Free text is matched against each task's title, notes, and searchable metadata. With Soundex off, 2Do supports these operators in the search field:
| Pattern | Behavior | Example |
|---|---|---|
word | A bare word matches anywhere inside a word, not just whole words | ject → project, subject, rejected |
word1 word2 | Implicit AND — matches tasks containing both words | new job |
word1 OR word2 | OR — matches either word | Call OR new |
word1 AND word2 | Explicit AND (same as a plain space) | new AND job |
word -word2 | Excludes a word | new job -find |
!word | Excludes a word (alternate syntax) | !work |
word* | Prefix wildcard — anchors the match to the start of a word | new* → new, newer, newest, but not renew |
*word | Suffix wildcard — anchors the match to the end of a word | *book → book, notebook, handbook, but not bookshop |
*word* | Contains wildcard — the text anywhere inside a word; identical to typing the bare word | *ject* → project, subject, rejected |
"exact phrase" | Literal phrase — matches the words together, in order | "new job" |
* | Matches every task | Pair it with structured keywords for a broad text base |
OR, AND, or, and and between two free-text words are all recognized as operators (case doesn't matter), and two words with nothing between them are joined with an implicit AND. Because of this, you can't free-text-search for the literal words and / or on their own; wrap them in quotes ("and") to search for them as text.
Worked examples (using sample tasks: Get a haircut one day, Buy a new car some day, Find a new job, Call: Mum, tell about my new job, Call: Tim):
new job→ Find a new job, Call: Mum, tell about my new jobnew job -find→ Call: Mum, tell about my new joba day→ Get a haircut one day, Buy a new car some dayCall OR new→ Buy a new car some day, Find a new job, Call: Mum, tell about my new job, Call: Tim"new job"→ Find a new job, Call: Mum, tell about my new job (the two words together)
A few characters change matching mode automatically: including # or @ in your text, or wrapping the whole query in "quotes", turns Soundex off for that search so the match stays literal; handy for tags-in-text, email addresses, or exact phrases.
The Nine Built-In 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 bar into a structured filter against a specific dimension of your tasks. They can be combined freely (see Combining Keywords), and type:, tags:, and locations: each support their own inline AND / OR / commas / ! / brackets.
type: — Filter by Task Property
The most expressive keyword. type: accepts a list of presets that filter by a specific task property. For example:
type: hiprio
…shows every high-priority task. Use AND, OR, brackets, and ! to combine presets:
type: (proj OR chck) AND hiprio AND !repeat
type: ((starred OR hiprio) AND due) OR today
type: Presets — Task Structure
| Preset | Matches |
|---|---|
alltasks | Any task (Project, Checklist, Sub-task, or Task) — flat view |
task | Top-level plain Tasks only (no projects, checklists, or sub-tasks) |
subtasks | Sub-tasks only |
proj | Projects |
chck | Checklists |
emptyproj | Projects with no active sub-tasks |
emptychck | Checklists with no active sub-tasks |
type: Presets — Actions
| Preset | Matches |
|---|---|
action | Tasks with any Action attached |
call | Call action |
sms | Message action |
email | Mail action |
browse | Browse (URL) action |
visit | Visit (Address / Maps) action |
google | Google (web search) action |
type: Presets — Attachments, Notes, and Capture
| Preset | Matches |
|---|---|
audio | Tasks with audio attachments |
pict | Tasks with picture attachments |
note | Tasks with notes |
capturedmail | Tasks captured from an email (they carry a mail-capture identifier) |
type: Presets — Priority
| Preset | Matches |
|---|---|
prio | With any priority |
noprio | Without priority |
hiprio | High priority |
medprio | Medium priority |
lowprio | Low priority |
type: Presets — Status and Tracking
| Preset | Matches |
|---|---|
starred | Starred tasks |
alarms | With alarms set |
repeat | Recurring tasks |
duration | With a duration assigned |
inprogress | Not-completed tasks whose start date or duration window is currently active |
scheduled | Not-completed tasks with a future start date |
paused | Tasks belonging to a paused tag |
type: Presets — Tags and Locations
| Preset | Matches |
|---|---|
anytag | Tasks with at least one tag |
notag | Tasks without any tag |
anylocation | Tasks with at least one location |
nolocation | Tasks without a location |
type: Presets — Has a Date
| Preset | Matches |
|---|---|
due | Has a due date |
nodue | No due date |
start | Has a start date |
nostart | No start date |
type: Presets — Due Date
| Preset | Matches |
|---|---|
duetoday | Due today |
today | Due today (alias for duetoday) |
duetomorrow | Due tomorrow |
tomorrow | Due tomorrow (alias for duetomorrow) |
duethisweek | Due this week |
type: Presets — Start Date
| Preset | Matches |
|---|---|
starttoday | Starts today |
starttomorrow | Starts tomorrow |
startthisweek | Starts this week |
type: Presets — Start or Due Date
| Preset | Matches |
|---|---|
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 (alias for anythisweek) |
Watch the asymmetry: bare today and tomorrow match the due date only, but bare thisweek matches start or due. Use the explicit anytoday / anytomorrow / anythisweek presets when you want the "start or due" behavior for a single day.
type: Presets — Overdue and Completed
| Preset | Matches |
|---|---|
overdue | Past-due, across every list (including lists you've hidden from All) |
tasksoverdue | Past-due, but respecting the lists you've excluded from All |
donetoday | Completed today |
doneyesterday | Completed yesterday |
donethisweek | Completed this week |
"This week" always follows your configured start-of-week (2Do > Settings), and every date preset is evaluated live, so a saved Smart List that uses one keeps rolling forward on its own.
tags: — Filter by Tag
Filter the list to tasks that carry specific tags. Comma-separated lists are treated as OR by default; use AND, OR, brackets, and ! for finer control.
tags: home, work # implicit OR — 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
Include every tag that belongs to one or more named Tag Groups. Each group expands to all of the tags inside it, then behaves exactly like tags:: positive groups are OR'd together, and ! negates a whole group.
taggroups: Contexts # any tag inside the "Contexts" group
taggroups: !Someday # exclude every tag in the "Someday" group
locations: — Filter by Location
Same model as tags:. Comma-separated = OR; supports AND / OR / ! / brackets.
locations: home, drycleaners # = locations: home OR drycleaners
locations: (home OR work) AND !playground
locations: ? # any location set
locations: ~ # no location set
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
lists: — Filter by List
Filter to tasks that live in one or more named lists. Positive names are OR'd; prefix a name with ! to exclude that 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 of your lists, regardless of which list is currently selected. groups: and completed: behave the same way. The remaining keywords stay inside whichever list you're searching.
Because 2Do allows duplicate list names, lists: Work matches every list named "Work"; it can't tell two identically-named lists apart.
modified:, created:, and completed: — Filter by Recency
Filter by how long ago a task was last modified, first created, or completed. All three take the same relative-time value: a number plus a unit, where the units are mins, h (hours), d (days), w (weeks), m (months), and y (years). Long spellings work too (3 days, 2 weeks, 1 month), and the number can be fractional (1.5h, 0.5d). 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 with > for "more than … 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: automatically widens the search to include completed tasks (and across all your lists), so you don't have to unhide them first. It's the relative-time counterpart to the fixed type: donetoday / doneyesterday / donethisweek presets; reach for completed: when you want a rolling window like "the last 3 days".
Combining Keywords
Real power comes from combining keywords. They can appear in any order, but if you also include a free-text search keyword, the free-text term must appear first:
plumber type: starred tags: builders groups: home
Here plumber is the text search and the rest narrow it down by property.
When you combine multiple keyword sections, 2Do inserts an implicit AND between them (the 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 over into type:.
AND by default, OR to branch
The join between two whole keyword sections is AND by default. To turn a section into an alternative instead, put a standalone OR immediately in front of its keyword:
type: overdue OR tags: urgent
This returns tasks that are overdue or tagged urgent. More precisely: every unmarked section is AND-ed together into one group, then each OR-marked section is appended as its own alternative. The result is (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 (OR tags:, OR type:, …) branches the query. A leading OR at the very start of the search, or the OR inside a single section, is treated as ordinary text or a within-section operator. The free-text term can never be an OR branch — it always joins the AND group. You can also express either-or logic with two separate Smart Lists or the rule builder's any of the following mode.
Date Filters Beyond type:
The date filters in the Search Options panel add an explicit date condition on top of whatever else is in the bar. Three options:
- Without Due Date — only tasks with no due date (perfect for a Someday Smart List).
- Date Range — pick a fixed From date and To date.
- Dynamic Range — Next N days / weeks / months / years — moves with the calendar.
By default the date filter is appended at the end of the search and applies as one final condition on top of everything else. To place it yourself (say, as one side of an OR), use the special {datefilter} keyword in the query, for example type: inprogress OR {datefilter}, and the panel's date filter is substituted at that spot instead.
The Rule Builder
For complex multi-condition filters, prefer the visual rule builder over the keyword syntax. Open the Search Options panel (the filter button in the search field, or ⌥⇧⌘F) → Search Presets → click [+] to add a clause.
The builder assembles the same preset-style clauses the type: keyword offers, so each clause picks a task property and the state you want it in:
| Property | Matches |
|---|---|
| Task | is / is not a given type; is / is not in progress, paused, or scheduled |
| Note | has / doesn't have a note |
| Repeating | is / is not repeating |
| Due Date | is / is not: Any Date, No Date, Overdue, Today, Tomorrow, This Week |
| Start Date | is / is not: Any Date, No Date, Today, Tomorrow, This Week |
| Any Date | Today, Tomorrow, This Week — the start or due date |
| Duration | has / doesn't have a duration |
| Completion | completed / not completed Today |
| Alarm | has / doesn't have an alarm |
| Starred | is / is not starred |
| Priority | Any, No, Low, Medium, High |
| Tag | is set / is not set |
| Location | is set / is not set |
| Picture | attached / not attached |
| Audio | attached / not attached |
| Action | is / is not: Any Action, Call, Message, URL, Email, Visit, Google |
That's the whole set. Searching for specific text, a named list, a named tag or tag group, or a custom date range isn't something the builder does — type those as query keywords (plain text, lists:, tags:, taggroups:) or use the panel's date filters. The two mix freely: build the structure visually, then add the text and named criteria in the field.
Combine as many clauses as you need. Joined with all (AND) or any (OR) at the top. For finer expressions, hold the Option key to create a sub-filter — a nested rule group, so you can put an any group inside an all parent.
Saving a Filter as a Smart List
Once your search returns the perspective you want, click the [+] button to the left of the search field. There's no naming prompt — the Smart List is created straight away and named after the query. Rename it in the Lists Panel whenever you like. Its rule keeps applying as your tasks change, so the list is always up to date.
A Smart List filters tasks within whichever list was active when you created it. To filter across everything, select the All Focus List first, then build the search.
You can also start from scratch:
- File > New > New Smart List, or
- the + button at the bottom of the Lists Panel → New Smart List.
A Smart List has a name, a color, an icon (Smart Lists show a different glyph than regular lists), and a rule built from one or more clauses.
Updating or Editing a Smart List
To change a Smart List's rule, select the Smart List in the sidebar and its rule appears in the search bar. Adjust the query (or the date filter and rule builder), then click the save button next to the search field. There's no dialog to answer: as long as the Smart List you're viewing is still the source of the search, it's updated in place and the perspective changes immediately. If it isn't — say you moved to another list first — the button creates a new Smart List instead.
Completed Tasks in a Smart List
By default a Smart List leaves completed tasks out, so the view stays on what's still outstanding. Right-click the Smart List in the sidebar → Include Completed Tasks to bring them in; the same menu item then reads Exclude Completed Tasks for hiding them again. (The Starred Focus List offers the same toggle.)
Recipe Library
Every recipe below is a real, copy-pasteable query. Type it into the Global Search Bar (⌘F), confirm it returns what you expect, then click [+] to 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 (has none) | 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 (scheduled) | 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 (errands) | type: anylocation |
| Near a map location, via a Visit action | type: anylocation AND visit |
Lists and Groups
| Goal | Query |
|---|---|
| Tasks from the Work or Home lists | lists: Work, Home |
| Work and Home, only what's 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 |
| Recurring tasks | type: repeat |
| Projects only | type: proj |
| Empty projects (no active sub-tasks) | type: emptyproj |
| Projects or checklists that are high priority | type: (proj OR chck) AND hiprio |
| Has an attachment (audio or picture) | type: (audio OR pict) |
| Tasks captured from email, made this month | type: capturedmail created: 30d |
| Stalled: started long ago, not recurring | 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 |
Save-from-menu recipes
A few perspectives are quicker to build with the Search Options panel's date filters or the rule builder than by typing:
| Smart List | How |
|---|---|
| Someday | search → Search Options → Without Due Date → save (on All) |
| Next 3 Days | search → Search Options → Dynamic Range → 3 days → save (on All) |
| Quick Wins | type: duration — everything you've already sized |
| Review Inbox | lists: Inbox (completed tasks are left out by default) |
Tips
For complex multi-condition rules, build the rule visually using Search Presets in the Search Options panel, then click [+] to save. The keyword syntax is most useful for refining a saved rule, or for typing a one-off that's faster than navigating dialogs.
Soundex is brilliant for everyday "I remember the name vaguely" searches. Toggle it off only when you specifically need exact OR, exclusion, or wildcard searches.
A Smart List is just a perspective. Deleting one never deletes its tasks. Experiment freely.
