# Task Token Reference

> Every token a task can carry — what you type in a note, what you type in the Todo panel's filter box, and why the two are not the same thing.

Source: https://docs.docgraph.app/panels/task-tokens/

A todo's properties live in its own text, so everything about a task is something you type. The catch — and the thing worth getting straight before anything else — is that the same prefixes mean **two different things** depending on where you type them.

This page is the lookup table. For how the feature works and what it's for, see [Todos & Task Properties](https://docs.docgraph.app/panels/todo/).

## Two places, two grammars [!both]

{/* A Card's code block cannot shrink, so each `1fr` column resolves to its
    min-content and the grid overflows the content column into the table of
    contents. `min-width: 0` lets the column shrink and hands the overflow to
    the code block's own scrollbar, where it belongs. */}
<style>{`
  .card-grid > .card { min-width: 0; }
  .card-grid > .card pre { overflow-x: auto; }
`}</style>

<CardGrid>
	<Card title="In a note — recording a fact">
		Typed into a task line. Values are **absolute**: a date is frozen the moment you pick it, because a date that re-evaluates every morning is a lie in a document.

		```text
		- [ ] send the deck @sarah from:@omar due:@@2026-09-01T17:00 #work
		```
	</Card>
	<Card title="In the Todo panel — asking a question">
		Typed into the panel's search box. Values are **relative and comparative**: buckets, ranges and states that only mean anything against today.

		```text
		@sarah due:overdue #work is:open
		```
	</Card>
</CardGrid>

<Aside type="tip" title="The one rule to remember">
In a note, `due:` is always followed by `@@` and a real date. In the filter box it never is — there you write `due:overdue`, `due:<2026-09-01`, `due:none`.

**The `@@` is the tell.** It marks a stored value, not a query.
</Aside>

## In a note [!partial]

Four tokens you type, plus one the app writes for you. They're read in HTML and Markdown alike (except the created time, which only HTML can store — and chips and menus are HTML-only), and only inside a task line — `@sarah` in an ordinary paragraph stays a name in a sentence.

| Token | Property | Notes |
| --- | --- | --- |
| `@name` | **Assigned to** | Name several if you like; all of them stick. Case is folded, so `@Sarah` and `@sarah` are one person. A token ends at a space, so two-word names join with a hyphen. |
| `from:@name` | **Assigned by** | Who handed you this. Singular — "who gave me this" has one answer, so a second one is ignored. |
| `due:@@date` | **Due** | `due:@@2026-09-01` for a day, `due:@@2026-09-01T17:00` for a time. First one wins. |
| `start:@@date` | **Start** | Same shape as `due:`. Nothing enforces start ≤ due; they're two independent facts. |
| `#tag` | **Tag** | The ordinary hashtag you already have everywhere else — it just also filters here. |
| *(nothing)* | **Created** | Written automatically, invisible in the text, never typed. HTML only: Markdown can't carry it, so `.md` tasks have none. |

### The menus write them for you [!partial]

Type `@` inside a task and a menu offers every name already used anywhere in your vault, plus whatever you're typing as a new one. It opens after `from:@` too.

Type `due:` or `start:` and you get **Today · Tomorrow**, then timed rows — **This morning**, **This afternoon** and **This evening** (each only while it's still ahead) and **Tomorrow morning** — then **In 3 days · Next week · Next Monday**, plus **Pick a date & time…** for anything else. Type a `2026-09-01` yourself and it's offered first, as typed. Whatever you choose, the absolute date is what lands in your note.

In a `.md` note the same menus open, with a shorter date list — **Today · Tomorrow · In 3 days · Next week**, plus whatever you type (`due:@@friday 5pm` still resolves) — and no date picker.

### What will and won't become a token

| Written | Result |
| --- | --- |
| `ask @sarah.` | Assignee **sarah** — the full stop stays punctuation. |
| `mail user@example.com` | Nothing. A token must start a word. |
| `the @@decorator` | Nothing. `@@` is the date sigil, never a name. |
| `met @sarah @@2026-08-20` | Assignee only. A bare date is a **mention**, not an implicit due date. |
| `` `@sarah` `` in code | Nothing. Code spans, fences and link text are all skipped. |
| `due:@@soon` | Nothing — it isn't a date. Your text stays exactly as written. |

## In the Todo panel's search box [!both]

A bigger grammar, because this one asks questions. Plain words still just search, and anything the box doesn't recognise stays plain text rather than quietly narrowing to something you didn't mean.

<Tabs>
	<TabItem label="People & tags">

| Filter | Matches |
| --- | --- |
| `@sarah` | Assigned **to** sarah — `to:sarah`, `assignee:sarah` and `assigned:sarah` are the same |
| `from:@omar` | Assigned **by** omar — `by:omar` is the same |
| `with:sarah` | Either field — sarah is involved somehow. `person:sarah` is the same |
| `#work` | Carries that tag |
| `is:unassigned` | Nobody named in an `@`. `is:assigned` is the inverse |
| `no:assignee` | Same as `is:unassigned`. `has:assignee` (or `has:person`) is `is:assigned` |

The `@` after a colon is optional: `from:omar` and `from:@omar` match the same tasks.

	</TabItem>
	<TabItem label="Dates">

`due:`, `start:` and `created:` all take the same values.

| Value | Means | Best for |
| --- | --- | --- |
| `overdue` | Before today, and still open. `late` is the same | `due:` |
| `today` | Exactly today | any |
| `week` | Within 7 days — *including* what already slipped. A bare `7d` is the same | `due:` `start:` |
| `upcoming` | Later than today; for `start:`, "not started yet". `later` and `future` are the same | `due:` `start:` |
| `started` | Today or earlier | `start:` |
| `last7` `last30` `older` | Backward-looking windows | `created:` |
| `none` | Has no such date at all. `never` is the same | any |
| `any` | No date filter — `all` is the same | any |
| `2026-09-01` | That exact day | any |
| `<today` `>=2026-09-01` | Before / after — `<` `<=` `>` `>=` | any |
| `+7d` `-3d` | That many days from today. The `+` is optional: `5d` is `+5d` | any |
| `2026-09-01..2026-09-30` | A range, both ends included | any |

`today`, `tomorrow` and `yesterday` work anywhere a date does, so `due:<tomorrow` reads exactly as it looks.

`7d` on its own is the **week** window, not the single day a week out — write `+7d` for that day. Inside a comparison or a range it's a day again, so the box's placeholder example `due:<7d` means *due before the day a week from today*: everything due in the next six days, plus anything overdue.

	</TabItem>
	<TabItem label="State & text">

| Filter | Matches |
| --- | --- |
| `is:open` `is:done` | Unchecked / checked — overrides the Active·Done·All pills. `is:active` and `is:todo` mean `is:open`; `is:checked` means `is:done` |
| `-is:open` `-is:done` | The other state — `-is:open` is `is:done`, and the reverse |
| `status:open` `status:done` | Same as `is:open` and `is:done`. Any other `status:` value is the property filter under **Properties** |
| `is:overdue` | Short for `due:overdue` |
| `has:due` `has:start` `has:created` `has:assignee` | Has that property at all, whatever its value |
| `no:due` `no:start` `no:created` `no:assignee` | The inverse of `has:` |
| `deck` | Plain text, matched against the task's words *and* its file path |
| `"send the deck"` | That exact phrase |
| `-draft` | Excludes — works on tokens too: `-@sarah`, `-#work`, `-from:@omar` |

	</TabItem>
	<TabItem label="Properties">

`key:value` matches a property stored **on the todo** — the ones in its [properties window](https://docs.docgraph.app/editing/block-properties/#properties-on-todos) — against the whole value, ignoring case. These keys are recognised:

| Key | Example |
| --- | --- |
| `status` | `status:blocked` |
| `priority` | `priority:high` |
| `owner` `source` `estimate` `review-by` | `estimate:2h` |

`-priority:high` excludes. Any other `name:value` isn't a filter and stays plain text — that includes `type:`, `section:`, `level:`, `language:` and `origin:`, which describe a block's place in a note rather than anything stored on a todo. A todo's stored properties exist only in HTML notes, so a `.md` task never matches one of these.

	</TabItem>
</Tabs>

<Aside type="caution" title="`-due:overdue` isn't a filter">
"Not overdue" would have to decide whether a task with **no** due date counts, and either answer surprises somebody — so it falls back to a plain text search rather than guessing. Use `no:due`, or a comparison like `due:>today`.
</Aside>

Everything here is also clickable: the **Filters** fold-out builds the same query with buttons, and whatever is active shows as a row of chips under the box. Each chip's ✕ removes exactly its own clause — including deleting just that token out of what you typed.

## If you just want the answer

| You want | Where | What to type |
| --- | --- | --- |
| Give a task to Sarah, due next Monday | Note | `@sarah due:` then pick **Next Monday** |
| Record that Omar asked you for it | Note | `from:@omar` |
| Everything you owe Sarah that has slipped | Panel | `@sarah is:overdue` |
| Everything Omar gave you, still open | Panel | `from:@omar is:open` |
| This week's work, oldest deadline first | Panel | `due:week` + sort by **Due date** |
| Tasks nobody owns | Panel | `is:unassigned` |
| Things sitting around since before July | Panel | `created:<2026-07-01` |
| Work that hasn't begun yet | Panel | `start:upcoming` |
| A filter you'll want every morning | Panel | Set it up, then **bookmark** → name it |

Tokens are stored as plain text inside the task itself, so they survive copy-paste, sync, and any other editor. Nothing here is a separate database — which is also why a property can never detach from the task it belongs to.
