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.
Pages, line types and links
| 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
Search
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.
Related
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.
Backlinks
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". @dueand@overdueskip done tasks, and@todoincludes 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 |
Content, tags and links
| 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 |
Related queries
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 |