Help

Search and navigation

Finding content with search, the query builder, and keyboard shortcuts.

How to find all nodes with a specific word?

There are multiple ways to search for a specific word. Say you're looking for all nodes with the word "bottle" in it:

  • Option 1: Use the global search (Cmd/Ctrl+S) and enter "bottle", then Option+Enter, and the search will be made into a search node in your workspace and shown in a panel
  • Option 2: Cmd/Ctrl+K, then "Find nodes with text='bottle' as list"
  • Option 3: In a search node, enter >LINKS TO::@bottle to find only linked items to the node
  • Option 4: In a search node, if you're searching for a node that has this word within its field's value, enter the field in the search and the value /bottle/. Be sure to put the slashes as shown; this will run the value as a regex match

Find all nodes that use a specific field

You can find nodes solely based on the fields they have. This is defined by using the field definition. This is one reason to either:

  • Define a single field for a Deadline, then you can retrieve every node regardless if they're a task, project, homework, etc.
  • Define multiple fields for the same purpose, but to work in different contexts that are not meant to cross over, such as per workspace, per template, or for an isolated workflow

To find all nodes that use a certain field, whether it is filled or empty, insert the field (either the field definition or just the field, empty) into the search query.

To find all nodes with the field that has a field value, insert the field and the operator Set (use @-mention and type "set" to find the system node).

How to find all tags that extend a tag?

One way is to create this search node:

>system field Tags : #tag (use supertag that was extended)
IS TAG

How can I search for content that is nested?

There are several ways to find content that is nested within one or more nodes:

Search within

The global search (Cmd/Ctrl+S) and the command "Search within" allows you to make that node and its contents the sole scope for your search.

Search within (query)

When defining a query in a search node, you can scope the search by adding a reference to the node you'd like to search within.

Variations of PARENTS DESCENDANTS

When creating a search node in a supertag template, you can make it a scoped search which looks at all descendants within each supertag instance by using the search operator PARENTS DESCENDANTS and its variations. For more on scoped search operators, see Search nodes.

Field initialization

Nodes can "clone" attributes from parent/ancestor nodes through field initialization settings. This can help you resurface things based on related attributes. For instance, if your meeting is about a certain client, your #meeting tag may have a field called Client where your "Acme Inc." client is defined. Then, when you are taking meeting notes and define a #task there, your task can have the same Client field inherit the field value "Acme Inc.", which connects it to the same client as the meeting. Then you can separately search for all tasks that are related to that particular client. For more on field initialization, check out Fields.

Find references in one workspace owned by another

To find all references in a workspace that are owned by another workspace:

  1. Go to your workspace home
  2. Create this search as a direct child of the workspace home node:
GRANDPARENTS DESCENDANTS WITH REFS
>NOT GRANDPARENTS DESCENDANTS

To limit the search to specific workspaces, add the system field Workspace and specify the workspaces you want to target there.

Find nodes based on ancestor field value

There is no way to build a search that is able to read the fields of an ancestor node. But, using title expressions, you can grab the field value of an ancestor node and have it part of the title of the node you're running the search on, making that information searchable.

Use the ${sys:owner} title expression to pick up content from ancestor nodes and their fields. To do this, use ${sys:owner.Field}, and repeat sys:owner as many levels up as you need to go to target the right ancestor.

In the case of Readwise highlights, you usually need to go up two levels.

Now with the information you need from the ancestor node baked into the title of the highlight itself, it can be used to search and filter those nodes. While this solution came up in the context of the Readwise integration, it is a reusable pattern that can be applied elsewhere.

Get the task list on daily notes

You may have seen a Tana Outliner setup that had a task list on the daily notes page, or even had one from early prototypes, and it somehow disappeared now. There is a simple way to get it back:

  1. Go to any daily note, and make a search that looks for all #task nodes NOT DONE
  2. Run it to confirm it's fetching the right things
  3. Adjust how you want your tasks to look (set all view options here, like Display, Group, Sort options)
  4. Confirm changes to the view options and the query
  5. Right-click on the title of the search, and select "Move to Related content"

Retrieve tasks dated for today

On the daily page (or any calendar node):

Create a search that uses PARENT in the field value of the Date field of the task.

With PARENT/GRANDPARENT in a date field: you can append with -3 or +3 (use any number) to hit a specific date before/after the PARENT date, respectively. Example: PARENT+3 = Any match on date 3 days from today.

You can use GT/LT search operators (greater than or less than) together with PARENT to match a range of dates before/after today. Example: >GT : PARENT-3 and >LT : PARENT = Any match between today and three days ago.

If not on a day node:

Use FOR RELATIVE DATE [term] as keyword field value for the Date field of the task, and insert today as the term, without the brackets.

It depends on what you want to find, the context of the search (which part of the graph it is made in), and the time scale/granularity you are looking for. Below are possible queries you can use to find date-related things in Tana Outliner.

A quick legend:

  • > : Typing this key starts a field anywhere in Tana Outliner, so we prefix fields with this sign when writing out queries in text
  • LT/GT: Less than/Greater than field operators
  • text : Text in this style is meant to be written out

I want to find all overdue items from a deadline date field...

Based on what the time is right now (most efficient graph-wise):

>LT : >your deadline field : FOR RELATIVE DATE today

Based on the date in a date field of parent node:

>LT : >your deadline field : PARENT.date field

Based on the date of an ancestor calendar node:

>LT : >your deadline field : PARENT / GRANDPARENT

I want to find deadline dates that fall within a range (let's say, a week)...

Based on what the time is right now, and this/last/next week/month/year:

>your deadline field : FOR RELATIVE DATE this/last/next week

Relative to a date field of the parent node:

>LT : >your deadline field : PARENT.date field
>GT : >your deadline field : PARENT.date field-7

Relative to the date of a calendar node:

>LT : >your deadline field : PARENT
>GT : >your deadline field : PARENT-7

I want to find nodes based on their location in the journal nodes...

To pick up the date based on the calendar node they are nested under, use system field "Date from calendar node". For field value, use any variation from the above examples depending on need and context.

I want to find nodes relative to the search node's location in a journal node...

Relative to parent: PARENTS DESCENDANTS (example: a search node on a day page limits search to only nodes that live on the parent Day page)

Relative to grandparent: GRANDPARENTS DESCENDANTS (example: a search node on the day page limits search to only nodes that live on the grandparent Week page)

For both operators, add WITH REFS to include references in the search.

I want to find nodes based on when they were created/edited/done (replace X with a number):

  • CREATED LAST X DAYS
  • EDITED LAST X DAYS
  • DONE LAST X DAYS

I want to find nodes based on when they were created/edited/done relative to a date field of the parent node:

Use system fields Created time, Last edited time, and Done time. As field value, write out PARENT.date field.

To read about these search operators and more, check out Search nodes.

Find nodes with empty descriptions

You can use regex to find this:

Add a reference to the area you want to search within
>NOT >Node description:: /.+/

How to find URL nodes

While there isn't a search operator to target URL nodes, they all use a system-defined node to store the URL. You can grab the field definition for it in one of the URLs, and it will retrieve all nodes that use this field, which will be mostly URL nodes.

Note that you can paste the URL search node into the search to limit the search to only children within that node.

CHILD OF vs PARENTS DESCENDANTS

The search operators CHILD OF and PARENTS DESCENDANTS are similar, but have some key differences:

  • With CHILD OF, the target node is the node that you reference in it, and the results will only be direct children of the referenced node, including references
  • With PARENTS DESCENDANTS, the target node is the parent relative to the search node, and the results will match any descendant (children, grandchildren, great grandchildren etc.) of the target node, ignoring reference nodes
  • With PARENTS DESCENDANTS WITH REFS, the same as PARENTS DESCENDANTS except it includes reference nodes

Logic behind the query builder

The query builder uses what's called "prefix" (or "Polish") notation. The operator comes before the operands. Instead of writing x AND y you write AND x y.

This style of writing things avoids the need for parentheses to disambiguate things. Consider this ambiguous example: x AND y OR z. This could mean x AND (y OR z) or it could mean (x AND y) OR z.

But with prefix notation, there is no need for parentheses because it is not possible to write the ambiguous form. You would have to write either:

AND x OR y z

or:

OR z AND x y

Furthermore, the query builder makes this even easier to read by using indentation and by putting each operand on its own line:

OR z
   AND x
       y

As an added bonus, because of this clean way of representing the logic of the query, it is easy to rearrange a query by dragging and dropping entire clauses around, something which would be much harder to do if the logical operators were in the middle and there were loads of brackets in the way.

And remember: if you are struggling to read the prefix version of your query, the linter text at the bottom of the query builder translates it into standard infix notation with parentheses, with everything in the same order you'd write it in English.

Can I customize sidebar search, recents, or supertags?

No. The sidebar items Recents, Supertags and AI chats are system views that can't be modified, as Tana Outliner needs to ensure they work well for all users. They may be updated by Tana Outliner at any time, which would overwrite any changes made by you if customization were allowed.

If you want to set up a similar search tailored for your needs, you can create a search node and re-create the basic searches with these operators:

AI chats search: Use the appropriate system search operators for AI chat nodes.

Recents search: Use the IS ENTITY search operator + EDITED BY (USER EMAIL) ANYTIME + ANY ACCESSIBLE WORKSPACE (workspaces you have added in the sidebar) + NOT IS CALENDAR NODES to filter out calendar nodes. Replace (User email) with your Tana Outliner user email.

Supertags search: Use IS TAG + ANY ACCESSIBLE WORKSPACE.

How to add or remove custom keyboard shortcuts?

You can define custom shortcuts for any command in the command line (Cmd/Ctrl+K), all the way down to setting specific tags or field values.

To trigger shortcut recording, open the command line, find the command you want to set a shortcut for, and hit Cmd/Ctrl+Shift+K.

To remove or rerecord custom keyboard shortcuts, go to Settings in the Home node or Cmd/Ctrl+K, then "Open Settings", and look under "Private keyboard shortcuts" for a list of all custom shortcuts you've set.

Create search nodes using Tana Outliner Paste?

Yes you can. There is a basic syntax for this which you can read about in the Tana Outliner Paste documentation.

Example of a task search:

%%tana%%
- %%search%% Fei's tasks
  - OR::
    - [[#task]]
    - [[#CS todo]]
  - Assigned to::
    - [[Fei-Ling Tseng]]
  - NOT DONE

Where is the calendar in Tana Outliner?

Tana Outliner doesn't technically have something called "the" calendar. What the app does have is calendar views, date fields, and daily notes (also called calendar nodes).

You can arrange child nodes in a calendar view defined by the date field you pick in the view, and you can take notes within the daily notes/calendar nodes like a journal.

In more detail:

The calendar view: A "view", like view as table, view as list, view as cards, or view as calendar, is a setting on a node that determines how its children will be displayed. In the case of a search node, the search results are the children. One calendar view might show completely different things than another calendar view for the exact same period.

Date fields: What displays in a calendar view depends on which date field(s) you select in the view options. For example #todo nodes, found by a search node, might have multiple date fields such as Created date, Due date, Date started, etc. Depending on what you select, the #todo nodes can appear on the date(s) of any or all of the above date fields.

Daily notes: When you press the Today button in the sidebar, you are taken to your daily notes, formerly called calendar nodes. These nodes represent different date granularities (day/week/month/year) and are connected to the dates they represent via the date object (via @today for example). But it is not common to view the calendar nodes in a calendar view, for instance.

So, to summarize: there is no such thing as "the calendar" in Tana Outliner. The closest thing would be nodes with date information that are displayed in a calendar view.

Search and navigation - Tana Outliner Help