Inline task syntax
This page is the complete reference for how an inline Operon task is written in Markdown, what every field means, and what type each field has. You rarely need to type this by hand, since the Task Creator and Task Editor build it for you, but this page lets you read any task line, understand a field you did not set, and edit safely.
The shape
An inline task is a Markdown checkbox, then the readable text, then any number of {{key:: value}} fields:
- [ ] Draft release notes {{operonId:: {{operonId}}}} {{status:: Project.InProgress}} {{priority:: A}} {{dateScheduled:: 2026-05-20}} {{dateDue:: 2026-05-31}}
- The checkbox shows completion state:
- [ ]open and- [x]done. Operon also tracks a cancelled state. - The text is plain Markdown. Normal
#tagsand[[wikilinks]]stay as themselves. - Each field is one
{{key:: value}}container. Order is flexible, but Operon writes them in a consistent canonical order.
The minimum valid inline task is just the first two parts plus identity: a checkbox, some readable text, and an operonId. Every other field is optional, so the shortest real task is simply:
- [ ] Buy milk {{operonId:: {{operonId}}}}
Operon reads its own fields only inside the {{key:: value}} container. That container is specific to Operon: it is not Dataview's [key:: value] inline field, and it is not an emoji-based task syntax. When Operon imports or converts a task written in another format, it translates the data into this {{key:: value}} form so the rest of Operon can read it.
Here {{operonId}} is a template variable, not part of the field syntax itself. What replaces it with a fresh, unique id is Operon, acting through one of its flows: the Task Creator, templates, conversions, the insertion commands, and the normalization that runs while you live-edit a note. So pasting the line into a note as a real line does resolve it; you never type an id by hand. Text shown inside a code block is never resolved, which is exactly why every copyable example on this page can display the variable safely. See operonId template variables.
The field names below are the canonical names, and they are exactly what Operon writes in an inline task's {{key:: value}}. Operon normalizes only the fields it manages to these canonical names; any custom key of your own is preserved exactly as you wrote it. In a file task, the same managed fields can appear under renamed frontmatter property names through Key mappings, and you can add fields of your own with Custom keys. The meaning stays the same everywhere the field appears.
Property types
Every field has a property type that tells Operon how to store, validate, and display its value, and which editor or picker to show. There are six types, plus Obsidian's automatic detection:
| Type | Holds | Example |
|---|---|---|
| Text | free text | Project.InProgress, flag |
| Number | a numeric value | 3600 |
| Date | a calendar day, YYYY-MM-DD |
2026-05-20 |
| Date & time | a day and time, YYYY-MM-DDTHH:MM:SS |
2026-05-20T09:00:00 |
| List | one or more values | [[Me]], [[Home]] |
| Checkbox | a true/false value (mainly for custom fields) | true |
| Automatic | Obsidian guesses the type | (auto) |
The type matters in two places:
- In a file task, fields live in frontmatter, where Obsidian shows a property type for each property. You can see and change it by right-clicking a property and choosing Property type. Operon's Key mappings already assign the correct type to every canonical field, so you normally never set it to Automatic by hand.
- In an inline task, the same type governs how the
{{key:: value}}is parsed and validated, and which picker the Task Editor shows for it.
When you create a custom key, you pick its type from this same list.
Fields you set
These are the fields you choose and edit, directly or through the Task Creator and Task Editor.
| Field | Type | What it is | Example |
|---|---|---|---|
status |
Text | Workflow stage, in Pipeline.Status form. |
Project.InProgress |
priority |
Text | Importance, one letter from S (highest) to F (lowest). | A |
dateDue |
Date | Deadline. | 2026-05-31 |
dateScheduled |
Date | When you plan to work on it. | 2026-05-20 |
dateStarted |
Date | Earliest date it can begin. | 2026-05-18 |
dateCompleted |
Date | When it was completed (set when you finish it). | 2026-05-30 |
dateCancelled |
Date | When it was cancelled (set when you cancel it). | 2026-05-29 |
datetimeStart |
Date & time | Start of a timed block on the Calendar. | 2026-05-20T09:00:00 |
datetimeEnd |
Date & time | End of that timed block. | 2026-05-20T10:30:00 |
estimate |
Number | Expected time to do it, in seconds. | 3600 |
duration |
Number | Time actually spent, in seconds (usually filled by the timer). | 5400 |
repeat |
Text | Recurrence rule, written as key=value pairs. See Recurring tasks. |
mode=schedule|freq=week|interval=1 |
datetimeRepeatEnd |
Date & time | When recurrence stops. | 2026-12-31T00:00:00 |
parentTask |
Text | The operonId of the parent task. See Parent and sub-tasks. |
xyz9876 |
assignees |
List | Who does the work. | [[Me]] |
contexts |
List | Environment or condition. | [[Home]] |
taskIcon |
Text | Icon name (Lucide). | flag |
taskColor |
Text | Hex color, without the #. |
4987a7 |
note |
Text | A short annotation. | waiting on review |
location |
Text | Coordinates as latitude, longitude. See Task chips. | 52.52, 13.40 |
links |
List | External web links. | https://example.com |
Fields Operon manages for you
You will sometimes see fields on a task that you never set. That is normal. Operon maintains these in the background to keep tasks connected, counted, and accurate. You can read them, but you should not hand-edit them. If you see one of these, this is what it is:
| Field | Type | What it is |
|---|---|---|
operonId |
Text | The task's durable identity (7-char). Operon generates it; do not edit or copy it. See Task identity and operonId. |
datetimeCreated |
Date & time | When this task instance was created. |
datetimeModified |
Date & time | When the task was last changed (updated automatically). |
progress |
Number | Completion percentage from 0 to 100. For a parent, it reflects how far its subtasks are done. |
directSubtaskCount |
Number | Number of direct subtasks. |
directDoneSubtaskCount |
Number | Direct subtasks that are done. |
directOpenSubtaskCount |
Number | Direct subtasks that are still open. |
treeDescendantCount |
Number | All subtasks beneath this one, at every level. |
treeDoneDescendantCount |
Number | Of those, how many are done. |
treeOpenDescendantCount |
Number | Of those, how many are open. |
totalEstimate |
Number | This task's estimate plus all of its subtasks', in seconds. |
totalDuration |
Number | This task's tracked time plus all of its subtasks', in seconds. |
blocking |
List | The operonIds of tasks this one is blocking (a dependency link). |
blockedBy |
List | The operonIds of tasks blocking this one. |
trackers |
List | Your completed time-tracking sessions, as time ranges. See Time tracking. |
activeTracker |
Date & time | The start time of a timer that is currently running. |
repeatSeriesId |
Text | Links a single occurrence to its recurring series. |
repeatOccurrenceDate |
Date | The recurrence slot date for a generated occurrence. |
reminders |
List | Reminder times or offsets for the task. |
timezone |
Text | The task's timezone, when one applies. |
related |
List | Related notes and references, managed through the editor. |
The last several (repeatSeriesId, repeatOccurrenceDate, reminders, timezone, activeTracker, related) are internal bookkeeping. They are stored in your Markdown so the file stays self-contained, but they are not meant to be edited by hand and are normally hidden from the field-management UI.
Values at a glance
- Status uses
Pipeline.Status, so both the pipeline and the stage are visible. See Pipelines and statuses. - Priority is a single letter from S (highest) to F (lowest). See Task priorities.
- Dates use
YYYY-MM-DD. Datetimes useYYYY-MM-DDTHH:MM:SSin local time. - Time fields (
estimate,duration, and the totals) are stored in seconds, but you normally set them through the Task Editor rather than typing seconds. - List fields (
assignees,contexts,links,blocking,blockedBy) hold one or more values separated by a semicolon and a space (;). To keep a literal semicolon inside a single value, escape it as\;. - Task links (
parentTask,blocking,blockedBy) reference other tasks by theiroperonId, not by title or path.
Copy-paste ready examples
Each block below is ready to paste into a note. The {{operonId}} template variables become real, unique ids the moment Operon sees the pasted lines, and a shared suffix such as {{operonId1}} links a child to its parent. None of these ids needs to be typed or invented. See operonId template variables.
A minimal task, just words and an id:
- [ ] Buy milk {{operonId:: {{operonId}}}}
A typical task with a status, priority, and due date:
- [ ] Review launch checklist {{operonId:: {{operonId}}}} {{status:: Project.InProgress}} {{priority:: A}} {{dateDue:: 2026-05-31}}
A pasted snippet that lets Operon fill the default status, default priority, current date, and current datetime:
- [ ] Follow up with reviewer {{operonId:: {{operonId}}}} {{status:: {{status}}}} {{priority:: {{priority}}}} {{dateScheduled:: {{date}}}} {{datetimeCreated:: {{datetime}}}} {{datetimeModified:: {{datetime}}}}
If your default status is Project.Brainstorming, your default priority is High, and the snippet is resolved at 2026-06-27T13:46:10, the task becomes:
- [ ] Follow up with reviewer {{operonId:: a1b2c3d}} {{status:: Project.Brainstorming}} {{priority:: High}} {{dateScheduled:: 2026-06-27}} {{datetimeCreated:: 2026-06-27T13:46:10}} {{datetimeModified:: 2026-06-27T13:46:10}}
Your real output uses your current Operon defaults and local time. See operonId template variables for the full variable list and the difference between raw pasted inline snippets and file task templates.
A task with tags and a context, which stay as ordinary Markdown:
- [ ] Email the supplier #work #procurement {{operonId:: {{operonId}}}} {{contexts:: [[Office]]}} {{dateScheduled:: 2026-05-20}}
A task with several values in its list fields, separated by ; :
- [ ] Run the planning workshop {{operonId:: {{operonId}}}} {{assignees:: [[Me]]; [[Sam]]}} {{contexts:: [[Office]]; [[Errands]]}} {{dateDue:: 2026-05-31}}
A parent task with two subtasks, wired by a shared id. The parent takes {{operonId1}}, and each child points its parentTask at that same suffix:
- [ ] Plan the launch {{operonId:: {{operonId1}}}} {{status:: Project.InProgress}} {{priority:: B}}
- [ ] Draft the announcement {{operonId:: {{operonId}}}} {{parentTask:: {{operonId1}}}} {{dateDue:: 2026-05-28}}
- [ ] Schedule the email {{operonId:: {{operonId}}}} {{parentTask:: {{operonId1}}}} {{dateScheduled:: 2026-05-29}}
A small recurring task that repeats every week:
- [ ] Weekly review {{operonId:: {{operonId}}}} {{status:: Project.Planned}} {{repeat:: mode=schedule|freq=week|interval=1}}
Let Operon write it
The safest way to produce correct syntax is to let Operon do it: create with the Task Creator, edit with the Task Editor, and convert with Operon commands. Hand-editing the text is fine; just be careful with operonId, which is the field that tells Operon which task it is looking at. See Task identity and operonId.
A quick rule of thumb for what is safe to touch by hand:
- Safe to edit directly: the readable text,
#tags, and simple values such asstatus,priority,dateDue,dateScheduled, andnote. - Let the Task Editor handle:
operonId,parentTask,blockingandblockedBy,repeat, and every field in the Fields Operon manages for you table above. These carry identity, task links, recurrence, and bookkeeping that has to stay consistent across the whole vault.