Skip to main content

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.

Smart List rule builder

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 thisSoundex can still find
plumverplumber
StevenStephen
alexnderAlexander
JonJohn

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.

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 (F while 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.

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.
note

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:

PatternBehaviorExample
wordA bare word matches anywhere inside a word, not just whole wordsjectproject, subject, rejected
word1 word2Implicit AND — matches tasks containing both wordsnew job
word1 OR word2OR — matches either wordCall OR new
word1 AND word2Explicit AND (same as a plain space)new AND job
word -word2Excludes a wordnew job -find
!wordExcludes a word (alternate syntax)!work
word*Prefix wildcard — anchors the match to the start of a wordnew*new, newer, newest, but not renew
*wordSuffix wildcard — anchors the match to the end of a word*bookbook, 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 taskPair it with structured keywords for a broad text base
note

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 jobFind a new job, Call: Mum, tell about my new job
  • new job -findCall: Mum, tell about my new job
  • a dayGet a haircut one day, Buy a new car some day
  • Call OR newBuy 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)
tip

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

PresetMatches
alltasksAny task (Project, Checklist, Sub-task, or Task) — flat view
taskTop-level plain Tasks only (no projects, checklists, or sub-tasks)
subtasksSub-tasks only
projProjects
chckChecklists
emptyprojProjects with no active sub-tasks
emptychckChecklists with no active sub-tasks

type: Presets — Actions

PresetMatches
actionTasks with any Action attached
callCall action
smsMessage action
emailMail action
browseBrowse (URL) action
visitVisit (Address / Maps) action
googleGoogle (web search) action

type: Presets — Attachments, Notes, and Capture

PresetMatches
audioTasks with audio attachments
pictTasks with picture attachments
noteTasks with notes
capturedmailTasks captured from an email (they carry a mail-capture identifier)

type: Presets — Priority

PresetMatches
prioWith any priority
noprioWithout priority
hiprioHigh priority
medprioMedium priority
lowprioLow priority

type: Presets — Status and Tracking

PresetMatches
starredStarred tasks
alarmsWith alarms set
repeatRecurring tasks
durationWith a duration assigned
inprogressNot-completed tasks whose start date or duration window is currently active
scheduledNot-completed tasks with a future start date
pausedTasks belonging to a paused tag

type: Presets — Tags and Locations

PresetMatches
anytagTasks with at least one tag
notagTasks without any tag
anylocationTasks with at least one location
nolocationTasks without a location

type: Presets — Has a Date

PresetMatches
dueHas a due date
nodueNo due date
startHas a start date
nostartNo start date

type: Presets — Due Date

PresetMatches
duetodayDue today
todayDue today (alias for duetoday)
duetomorrowDue tomorrow
tomorrowDue tomorrow (alias for duetomorrow)
duethisweekDue this week

type: Presets — Start Date

PresetMatches
starttodayStarts today
starttomorrowStarts tomorrow
startthisweekStarts this week

type: Presets — Start or Due Date

PresetMatches
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 (alias for anythisweek)
note

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

PresetMatches
overduePast-due, across every list (including lists you've hidden from All)
tasksoverduePast-due, but respecting the lists you've excluded from All
donetodayCompleted today
doneyesterdayCompleted yesterday
donethisweekCompleted 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.

note

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
note

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).

note

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 RangeNext 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:

PropertyMatches
Taskis / is not a given type; is / is not in progress, paused, or scheduled
Notehas / doesn't have a note
Repeatingis / is not repeating
Due Dateis / is not: Any Date, No Date, Overdue, Today, Tomorrow, This Week
Start Dateis / is not: Any Date, No Date, Today, Tomorrow, This Week
Any DateToday, Tomorrow, This Week — the start or due date
Durationhas / doesn't have a duration
Completioncompleted / not completed Today
Alarmhas / doesn't have an alarm
Starredis / is not starred
PriorityAny, No, Low, Medium, High
Tagis set / is not set
Locationis set / is not set
Pictureattached / not attached
Audioattached / not attached
Actionis / 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

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 priority (has none)type: noprio AND !repeat

Dates and Scheduling

GoalQuery
Due todaytype: duetoday
Anything happening today (start or due)type: anytoday
Due tomorrowtype: duetomorrow
Due this weektype: duethisweek
Everything this week (start or due)type: anythisweek
Overduetype: overdue
Overdue or due todaytype: overdue OR duetoday
Starts in the future (scheduled)type: scheduled
In progress right nowtype: inprogress
No due date at all (a Someday list)type: 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 location (errands)type: anylocation
Near a map location, via a Visit actiontype: anylocation AND visit

Lists and Groups

GoalQuery
Tasks from the Work or Home listslists: Work, Home
Work and Home, only what's 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
Recurring taskstype: repeat
Projects onlytype: proj
Empty projects (no active sub-tasks)type: emptyproj
Projects or checklists that are high prioritytype: (proj OR chck) AND hiprio
Has an attachment (audio or picture)type: (audio OR pict)
Tasks captured from email, made this monthtype: capturedmail created: 30d
Stalled: started long ago, not recurringtype: inprogress AND !repeat created: >14d
Waiting on someone, or anything urgenttags: waiting OR type: hiprio
Recently createdcreated: 2d
Recently completedcompleted: 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 ListHow
Somedaysearch → Search Options → Without Due Date → save (on All)
Next 3 Dayssearch → Search Options → Dynamic Range → 3 days → save (on All)
Quick Winstype: duration — everything you've already sized
Review Inboxlists: Inbox (completed tasks are left out by default)

Tips

tip

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.

tip

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.

tip

A Smart List is just a perspective. Deleting one never deletes its tasks. Experiment freely.