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}}. Built-in and configured custom fields use their stable keys. Additional Vault Properties retain their source names and their own type rules. 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 supported editing types. Automatic describes a property without a verified native editing type:
| 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 | No verified native editing type; read-only in native controls | (unassigned) |
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 choose its supported type. For Vault Properties, Operon uses the declared property type and preserves existing inline interpretation; it does not make an Automatic field writable by guessing. See Task properties for the three property groups.
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 |
reminderDatetimes |
List | Reminders at fixed moments. See Reminders. | 2026-05-30T09:00:00 |
reminderRules |
List | Reminders at an offset from one of the task's dates. See Reminder rules. | dateDue.1d |
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]] |
taskType |
Text | Your own classification for the task. | Milestone |
taskIcon |
Text | Icon name (Lucide). | flag |
taskColor |
Text | Hex color, without the #. |
4987a7 |
taskImage |
Text | One task media reference, optionally as a named Markdown link. See Task images and galleries. | [Launch cover](Assets/cover.png) |
taskGallery |
List | Ordered task media references, including named Markdown links. See Task images and galleries. | Assets/front.png; [Brief](Assets/brief.pdf) |
note |
Text | An annotation that can contain multiple lines. | 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. |
timezone |
Text | The task's timezone, when one applies. |
related |
List | Related notes and references, managed through the editor. |
The last several (repeatSeriesId, repeatOccurrenceDate, 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. - Reminders come in two forms:
reminderDatetimesholds local datetimes, andreminderRulesholds a reference date and an offset joined by a dot, such asdateDue.1d. See Reminder rules. - 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.
Native Vault Property values
Additional native fields use the same {{key:: value}} container, but their value rules must not be confused with the older managed list fields above. The following examples assume Reviewed is declared Checkbox, Budget Number, and References List in Obsidian, with no conflicting custom definition:
- [ ] Review purchase {{operonId:: {{operonId}}}} {{Reviewed:: false}} {{Budget:: 0}} {{References:: Alpha; Alpha; "001"; 1; ""}}
Here false and 0 are real values. The native list preserves both Alpha entries and their order, the text 001, the number 1, and one empty text member. Native list members containing a semicolon must be quoted, such as "First; second"; they do not use the managed-list \; rule above. Let Operon write escapes for complex text.
A missing container means the property is absent. An empty native Number, Checkbox, Date, or Date & time container represents a null value; an empty Text container represents empty text, and an empty List container represents an empty list. {{References:: ""}} instead contains one empty text member. Do not replace an empty Checkbox value with false unless that is the intended value.
Existing custom fields can retain their earlier encoding. Do not manually rewrite all custom lists using the native rules or change a type just to make a warning disappear. Use the task controls and review conflicts. See Vault Properties for editing and support limits.
Notes: multiline text on one task line
The task description is the one-line readable text after the checkbox. The separate note field is the place for a longer, multiline annotation. Even when a note has several visual lines, an inline task remains one physical Markdown line. Operon stores each note line break as the two-character escape \n inside the field:
- [ ] Review the proposal {{operonId:: {{operonId}}}} {{note:: Check the budget\nAsk for the revised timeline\n\nShare the decision with the team}}
When Operon reads that task, the note has three text lines: “Check the budget”, “Ask for the revised timeline”, and “Share the decision with the team”, with a blank line before the last. If you need the visible characters \n in the note instead of a line break, write \\n; the doubled backslash keeps it literal.
Use the Task Editor or the shared text field editor popover for normal editing. They accept Shift+Enter and multiline paste for Notes, including empty lines. The description remains a single-line task field.
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 differences between raw pasted inline snippets, prepared Inline template properties, 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. - Native Vault Properties: use their declared types and native value rules above; preserve the difference between missing, empty, false, and zero.
- Task Gallery: keep its semicolon order and escape a literal semicolon as
\;; using the pickers is safer for complex paths. - Not a writable field:
__taskDataTypeis a Table-only inline/file helper and must not be added to task Markdown. - 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.