thymer docs
Documentation/Search and navigation/Query language reference

Query language reference

Thymer has one query language. It works in the search panel, in live query blocks, in collection view filters and dynamic collections, in a collection’s Related section, in the Journal’s Upcoming section, in the Backlinks filter, in the Tasks overview, and in the CLI and MCP search commands. This page lists all of it.

A query finds lines: paragraphs, headings, tasks and every other kind of line in your pages. Add @page to find pages instead. Matching ignores case and accents. The query box suggests filters as you type and explains what is wrong when a query can’t run. Search Help in the command palette has a short summary inside the app.

Words and phrases

Query Matches
budget Lines that contain “budget” anywhere, also inside a longer word such as “budgets”
release notes Lines that contain both words, in any order
"release notes" Lines that contain the exact phrase

For pages, words also match the title, the values of Text, Number and URL properties, and the names of attached files. A quote you haven’t closed yet counts as closed, so results stay put while you type.

Combining terms

Syntax Meaning
a b Both; a space works like AND
a AND b, a && b Both
a OR b, a || b Either
NOT a, !a Not a
(a OR b) AND c Parentheses group terms

AND binds more strongly than OR, so a OR b c means a OR (b AND c). Use parentheses for anything else: (a OR b) c. A missing closing parenthesis is added for you.

NOT applies to the word, filter or comparison right after it: not @done, not #draft, @todo and not @scheduled, not @Projects.Status="Done". Put parentheses around several terms: not (#draft or #archived).

Tasks

Filter Matches
@task Every task
@todo Tasks that are not done
@done Tasks that are done
@due Open tasks that have a date
@overdue Open tasks whose last date is before today
@assigned Tasks that mention someone
@unassigned Tasks that mention nobody
@scheduled Tasks on anyone’s Journal
@scheduled=@me, @scheduled=ada Tasks on a particular person’s Journal

Canceled tasks are not done, so @todo, @due and @overdue include them; add not @canceled to leave them out.

Each task flag has a filter of its own:

Flag Filter
In progress @inprogress or @wip
Blocked @waiting
Cost/Money related @billing
Important/Urgent @important
Question/Discuss @discuss
Alert @alert
Starred @starred
Done @done
Canceled @canceled

A due date is a date on the task itself. Scheduling puts the task on someone’s Journal for a day. A task can have either, both or neither, so @due and @scheduled find different tasks.

@scheduled tells whether a task is on a Journal, not on which day. Date filters look at the dates written in a task, not at the Journal day it is planned for, so @scheduled=@me @thisweek finds tasks on your Journal that also have a date this week written in them. To see tasks by the day they are planned for, open the Journal. See Tasks and The Journal.

People

Filter Matches
@me Lines that mention you
@ada, @"Ada Lovelace" Lines that mention a member, by handle, full name or email
@mention Lines that mention anyone
@mention=ada, @mention=@me The same as @ada and @me
@created_by=ada, @modified_by=@me Lines and pages someone created, or changed last

A name has to match in full; case doesn’t matter. If the word after @ can be read as a date, it is one: @june is the month of June. Write @mention=june to find a member called June.

Filter Matches
@page Pages instead of lines; @document and @record work too
@heading, @text, @quote, @list, @task, @image, @file Lines of that type; @list covers bulleted and numbered lists
@type=heading The same by type name: text, heading, task, quote, ulist, olist, image, file, document
@link Lines with a web link
@link="github" Lines with a web link whose address contains the text
@linkto="Website launch" Lines that link to that page
@Projects, @"Meeting notes" Everything in that collection
@collection=Projects The same

@page budget finds pages with “budget” in the title or in a property. Quote a name that contains a space.

Dates

A line’s dates are the dates written in it. A page’s dates are the values of its Date & Time properties. A date filter matches when any of them falls in the range. Quote an expression that contains a space or a colon.

Kind Examples
Days @today, @tomorrow, @yesterday, or @tod, @tom, @yes
Weekdays @monday, @tue, @"next monday", @"last friday", @-tuesday for last Tuesday
Weeks @thisweek, @nextweek, @lastweek, @"week 10", @"week 1 of 2025"
Months and years @thismonth, @"next month", @march, @"June 2026", @thisyear, @"last year"
Days of a month @"aug 13", @"13 aug", @jan1st, @9th, @"aug 13 2026", @"2nd of May 2025"
Quarters @q1, @"2024 q4"
Relative @"in 3 days", @"5 days", @"3 days ago", @"2 weeks from now", @"last 3 months", @"next 4 weeks"
Ranges @"monday to friday", @"9th to 12th", @"2026-10-01 to 2026-10-31", @2026-10-01..2026-10-31
Times @3pm, @430pm, @15:21, @morning (6am to 12pm), @afternoon (12 to 5pm), @evening (5 to 10pm)
Day and time @"tomorrow 3pm", @"3pm wed", @"monday at 9am", @"friday noon", @"friday 2pm to 4pm"
Exact @2026-10-09, @"2026-10-09 15:00", @"15/04/2023", @"Oct 9 2026 3:21 PM"

A weekday, month or day of the month without a year means the next one to come, and the current month counts as passed. In October, @march is next March and @9th is the 9th of November; in June, @june is next June, so use @thismonth for this one. Add the year to look back: @"march 2026", @"june 5 2026".

@"5 days", @"in 3 days" and @"30 days ago" are single days. @"2 weeks from now" and @"2 weeks ago" are whole weeks, and @"3 months ago" and @"1 year ago" whole months: in October, @"3 months ago" is July. @"next 2 weeks" and @"last 3 months" are the weeks or months right after or before the current one. A time without a day, such as @3pm or @"3pm to 5pm", matches lines that have a time but no date, such as “call Ada at 3pm”. To search a time on a particular day, add the day: @"friday 2pm to 4pm". A day with a time also matches lines with that date and no time.

Weeks start on the day set in Settings → Date & Time, and dates are read in your own time zone.

Comparing dates

Put a date filter on the left, then an operator, then a date. The @ in front of the date is optional, so @due <= today and @due <= @today are the same:

@due <= today
@due < 2026-11-01
@date = "this week"
@modified_at >= yesterday
@created_at < "2026-01-01"
@time = "3pm to 5pm"
Left side Looks at
@due Dates on open tasks
@date Dates in any line, and the Date & Time properties of pages
@created_at, @modified_at When a line or page was created or last changed; an edit anywhere in a page changes the page
@time Times of day without a date, with = and != only

The date on the right is usually a range, such as today or "this week". Then = means within it, != outside it, < before it starts, <= before it ends, > after it ends, and >= from its start on. So @due <= today is everything due today or earlier. A line with several dates matches =, <= and >= when one of its dates does, and < and > only when all of them do.

Tags

Query Matches
#research Lines with exactly that tag
#projects/ Tags under #projects, such as #projects/alpha
#client- Tags that start with client-, such as #client-acme
@hashtag=research The same as #research

Collection properties

Write the collection’s name, a dot, the property’s name, an operator and a value. Quote a name or a value that contains a space.

@Projects.Status="In progress"
@Projects.Owner=@me
@Handbook."Review date" < today
@Projects.Owner=""

A property filter matches the page and every line on it. Add @page to list only the pages, or @task for the tasks on them: @Projects.Owner=@me @page lists your projects, and @Projects.Status="In progress" @overdue the overdue tasks in active projects.

Every collection also has Title, Created and Modified: @Projects.Title=launch, @Projects.Created >= "this month".

Type Operators
Text, URL = contains, === is exactly, != doesn’t contain, !== isn’t exactly; <, <=, >, >= compare alphabetically
Number =, !=, <, <=, >, >=
Date & Time All of them, with a date on the right as in Comparing dates above; a time without a day doesn’t work here
Choice = and !=, with the full label of an option in any case
User = and !=, with a handle, a name, an email or @me
Page Link = when a linked page’s title contains the text, != when none does
Tag = and !=; the # is optional, and #client/ matches every tag under #client
File, Image = when the file name contains the text, === is exactly, !=, !==

An empty value finds pages where the property is empty, ="", or filled in, !="". : works the same as =. For Choice, User, Tag, Page Link and Date & Time, === and !== work the same as = and !=. Formula properties are computed when they are shown, so they can’t be queried.

When a name doesn’t match, the error lists what you can use: the collections, the properties of that collection, the options of a Choice property, or the members.

Built-in properties

These work on any line or page, written as @name, an operator and a value.

Property Matches
@text="budget", @text==="send the invoice" The text of a line, or a page’s title: = contains, === is exactly, and !=, !==
@type=task The line type; see Pages, line types and links above
@date, @due, @time Dates and times; see Comparing dates above
@created_at, @modified_at When it was created or last changed
@created_by, @modified_by Who created it or changed it last
@mention=ada Who it mentions
@scheduled=ada Whose Journal the task is on
@collection=Projects The collection it belongs to
@link="github" A web link whose address contains the value
@linkto="Website launch" A link to that page, by title or guid
@hashtag=research A tag
@guid=…, @pguid=…, @rguid=…, @backref=… A line by its guid, its parent’s guid or its page’s guid, or the lines that a guid refers to; for scripts and plugins

Where queries work

The search panel, ⌘⇧FCtrl+Shift+F, takes any query. See Search.

Live query blocks

A live query block runs its query inside a page and keeps the results current. See Live queries.

Collection views and dynamic collections

A view’s filter, set in Collection Settings… → Views, decides which of the collection’s pages the view shows. Use the collection’s properties with its name in front, built-in filters such as @created_at or @modified_by, and words for the titles: @Projects.Status!="Done", @Projects.Owner=@me, @Projects.Modified >= "last week", @modified_by=@me. Relative dates move along by themselves, so a view filtered on @Projects."Due date" < today stays current. @me in a view filter means whoever is looking, so one shared view of @Projects.Owner=@me shows each person their own projects. A view without a filter shows all of the collection’s pages. See Views.

In a dynamic collection, each view has its own filter, which picks pages from that view’s source collections with the whole language. Put the collection’s name in front of each property, and join several collections with OR: @Projects.Status!="Done" OR @Issues.Status!="Done". See Dynamic collections.

Collection Settings… → Related runs a query at the top of every page in the collection, with $currentpage for the page being viewed and $currentcollection for its collection. These two variables work only there. See Related content on every page for examples.

The Journal’s Upcoming section

Upcoming, at the top of each Journal page, is the Journal collection’s Related query. By default it shows open tasks that are yours, because they mention you or are on your Journal, and unassigned tasks that are Important or Alert, or that have a due date and are on nobody’s Journal. Of those it lists the tasks due that day, the overdue ones, and Important or Alert tasks without a due date, leaving out tasks already on the page. The default query:

@todo && (@mention=$journaluser || @scheduled=$journaluser || (((@important || @alert) && @unassigned) || (@due && @unassigned && !@scheduled))) && ((!@due && (@important || @alert)) || (@due >= $journaldate && @due <= $journaldate) || @overdue) && @backref!=$journalpage

To change it, open Collection Settings… → Related on the Journal. Three variables are filled in for each Journal page: $journaldate for its day, $journaluser for the person whose Journal it is, and $journalpage for the page itself. An empty query brings back the default.

Filter backlinks, at the top of the Backlinks section, takes a query and shows only the backlinks that match. The section’s sort menu orders backlinks by Recent, by Journal date or by Page title.

The CLI and MCP

thymercli search "@todo @me" --limit 50 runs a query from the terminal, and the MCP search tool takes the same syntax. See The CLI and Connect an AI agent with MCP.

When a query doesn’t work

The query box shows what it couldn’t understand. The messages you are most likely to see:

Message What to check
Unknown magic tag A misspelled filter, or a word after @ that is no date, member or collection. Quote names that contain a space.
No collection, No property The collection or property name isn’t right. The message lists the ones there are.
You can only filter on fields in the current collection A view filter names another collection. Use the view’s own collection.
Invalid property The value isn’t an option of that Choice property. Use an option’s full label; the message lists them.
No such user No member has that handle, name or email. The message lists the members.
Cannot parse date The date isn’t one Thymer understands. Quote a date that contains spaces, such as @"next monday".
Filtering time range w/o date is not supported A Date & Time property needs a date, not only a time.
Invalid matching operator That type doesn’t take that operator, such as > on a Choice. See Collection properties above.
Unsupported field type “formula” Formula properties can’t be queried.

When a query runs but finds less than you expected:

  • A date without a year means the next one. Add the year for dates in the past: @created_at < "june 5 2026".
  • @due and @overdue skip done tasks, and @todo includes canceled ones.
  • Date filters look at the dates written in lines and at Date & Time properties, not at the Journal day a task is planned for.
  • A view that shows nothing has a filter that matches nothing, or one that can’t run. Start from a single property filter in Collection Settings… → Views and add terms back one at a time.
  • Search and live query blocks stop at 100 results. Narrow the query to see the rest.

Examples

The collection examples use a few typical collections: Projects with Status, Owner, Due date and Priority; Meetings with Date, Participants and Project; Customers with Stage, Next contact and Estimated value; and a Handbook with Owner and Review date. Put in your own collection and property names.

Your tasks

Query Finds
@todo @me Your open tasks
@todo and (@me or @scheduled=@me) Your open tasks, mentioned or on your Journal
@scheduled=@me @todo Open tasks on your Journal, on any day
@todo @me not @scheduled Your open tasks that aren’t planned for a day yet
@todo @me not @due Your open tasks without a due date
@important @me Your tasks flagged Important
@inprogress @me What you have in progress
@todo @me @"Meeting notes" Your open tasks from meeting notes
@done @me @modified_at = thisweek Your done tasks that were last changed this week

Due dates

Query Finds
@due = today Tasks due today
@due = tomorrow Tasks due tomorrow
@due = thisweek Tasks due this week
@due = nextweek Tasks due next week
@due <= today not @canceled Tasks due today or earlier
@overdue Overdue tasks
@overdue @me Your overdue tasks
@due >= today @due <= "in 14 days" Tasks due in the next two weeks
@due < "dec 1 2026" Tasks due before December 1, 2026
@due = "june 2026" Tasks due in June 2026
@todo not @due @important Important tasks without a deadline

Created and changed

Query Finds
@task @created_at < "june 5 2026" Tasks created before June 5, 2026
@task @created_at = "june 2026" Tasks created in June 2026
@task @created_at = "q3 2026" Tasks created in the third quarter of 2026
@page @created_at = thisweek Pages created this week
@page @created_at >= "30 days ago" Pages created in the last 30 days
@page @modified_at >= yesterday Pages changed since yesterday
@page @modified_at < "2026-01-01" Pages nobody has changed since 2025
@modified_by=@me @modified_at = today Lines you changed today
@created_by=ada @created_at = lastweek What Ada wrote last week
@done @modified_at = thisweek Done tasks that were last changed this week
@todo @created_at < "3 months ago" Open tasks older than about three months

Team and people

Query Finds
@todo @mention=ada Ada’s open tasks
@scheduled=ada @todo Open tasks on Ada’s Journal
@overdue @unassigned Overdue tasks nobody owns
@todo @unassigned @Meetings Open actions from meetings that nobody owns
@assigned @todo not @me Open tasks assigned to someone other than you
@me not @task Lines that mention you and aren’t tasks
@waiting Blocked tasks
@discuss Tasks marked Question/Discuss
@alert or @important Tasks flagged Alert or Important

Projects and other collections

Query Finds
@Projects @page Every project page
@Projects.Owner=@me @page Your projects
@Projects.Status="In progress" @page Active projects
@Projects.Status!="Done" @Projects."Due date" < today @page Projects past their due date
@Projects.Owner="" @page Projects without an owner
@Projects.Owner=@me @todo Open tasks in your projects
@Projects.Status="In progress" @overdue Overdue tasks in active projects
@Projects.Priority="High" @todo Open tasks in high-priority projects
@Meetings.Date = lastweek @page Last week’s meetings
@Meetings.Date = lastweek @todo Open actions from last week’s meetings
@Meetings.Participants=@me @page Meetings you took part in
@Meetings.Project="Website launch" @todo Open actions from meetings about one project
@Customers.Stage="Trial" @page Customers in their trial
@Customers."Next contact" <= today @page Customers to contact today or earlier
@Customers."Estimated value" >= 10000 @page Customers worth 10,000 or more
@Handbook."Review date" < today @page Handbook pages due for a review
@Handbook.Owner="" @page Handbook pages nobody owns
Query Finds
@heading launch Headings that contain “launch”
"launch plan" @page Pages with “launch plan” in the title or a property
@quote budget Quotes that mention the budget
#research Lines tagged #research
#projects/ Lines with any tag under #projects
#idea not @task Ideas that aren’t tasks yet
#research @thismonth Tagged lines with a date this month
not (#draft or #archived) Lines tagged neither #draft nor #archived
@linkto="Website launch" Everything that links to a page
@task @linkto="Website launch" @todo Open tasks that link to a page
@link="figma" Lines with a Figma link
@image @Projects Images on project pages
@file @created_at >= "last month" Files added since the start of last month

Dates written in lines

Query Finds
@today Lines with today’s date in them
@thisweek @task Tasks with a date this week
@"next monday" Lines with next Monday’s date
@"monday to friday" @task Tasks with a date from Monday to Friday
@3pm Lines with the time 3pm and no date
@"tomorrow 3pm" Lines for tomorrow at 3pm, and lines dated tomorrow without a time
@"q3 2026" @page Pages with a Date & Time property in the third quarter of 2026

View filters

These go in Collection Settings… → Views, in a view of the Projects collection.

Filter Shows
@Projects.Status!="Done" Projects that aren’t done
@Projects.Owner=@me Each viewer’s own projects
@Projects.Owner="" Projects without an owner
@Projects.Status="Planned" OR @Projects.Status="In progress" Planned and active projects
@Projects.Priority="High" @Projects.Status!="Done" Open high-priority projects
@Projects."Due date" = thisweek Projects due this week
@Projects."Due date" < today @Projects.Status!="Done" Late projects
@Projects.Created >= "this month" Projects created this month
@Projects.Modified < "2026-01-01" Projects nobody has changed since 2025
launch Projects with “launch” in the title

These go in Collection Settings… → Related.

Query Shows at the top of each page
@task @linkto=$currentpage Tasks that link to the page
@todo @linkto=$currentpage Open tasks that link to the page
@linkto=$currentpage @page Pages that link to the page
@task @linkto=$currentcollection Tasks that link to the collection