Markdown Syntax

Templates are written in a small markdown-style syntax. This page covers every element you can use, plus how variables and conditionals work.

Headers

A line beginning with one or more # characters followed by a space is a header.

# Morning Routine

Tasks

A task is an empty checkbox [] followed by whitespace and a label. Consecutive tasks are grouped together.

[] Make the bed
[] Brush teeth
[] Pack lunch

The checkbox must be exactly [] — any marker between the brackets, a second checkbox, or a missing label is reported as an error.

Paragraphs

Any other non-blank line is treated as prose. Consecutive prose lines are joined with a space into a single paragraph. A blank line ends the current paragraph (or task group) and starts a new block.

Remember to stretch before
you start your workout.

This is a separate paragraph.

Fill Lines

A fill line pairs a label and a value, separated by exactly five dots: ...... Consecutive fill lines are grouped together, similar to tasks.

Current Weather.....20F
Current Precipitation Chance.....89%

A run of four or six dots is not a separator and is left as ordinary text. Either side may contain !name variables, which are interpolated the same way as elsewhere in the document.

Current Weather.....!current

Code Blocks

A run of lines fenced by ``` on its own line is a code block. Every line between the fences is kept exactly as written.

```
some information
```

Nothing inside a fence is interpreted as markup. #, [], ....., && and !name are all left as plain text. Variables are never interpolated inside a fence, so a code block never contributes anything to a template's variable list.

Leading whitespace and blank lines are preserved, which makes code blocks the place to put content whose exact layout matters — tables, diagrams, or charts you have laid out by hand.

```
08/12  273.2  #############
08/13  272.2  #########
08/14  272.2  #########
              +---+---+---+---+
              270 271 272 273 274
```

A code block ends whatever block came before it, the same way a blank line does. Fences may be used inside a conditional block — a } inside a fence is plain text and will not close the conditional. An opening fence with no matching ``` is reported as an error.

Variables

A variable is written as !name, where the name may contain letters, numbers, and underscores. When a template is exported, each variable is replaced with the value you provide (or its configured default).

# !day Checklist
[] Email !owner the report

Each variable's type is inferred from how it is used:

TypeInferred when
textThe variable is used inside a line — a header, task label, or paragraph. Its value must be a string.
yes / noThe variable is used as a condition (see Conditionals below). Its value must be a boolean.
conflictThe same name is used both as text and as a condition. No single value can satisfy both uses, so the conflict must be resolved.

Substituted values are inserted literally — they are never re-parsed as markup. A variable that is referenced but not provided, or provided with the wrong type, prevents the document from resolving.

Conditionals

A condition uses a boolean variable to include or exclude content. It is written as !name && …. When the variable is true, the governed content is included; when false, it is dropped entirely.

Inline form

The rest of the line after && is the single item governed by the condition.

!includeNotes && [] Review meeting notes

Block form

Follow && with { to govern every line up to a closing } on its own line.

!weekend && {
[] Sleep in
[] Go for a long walk
}

The condition variable must be a boolean. The block must be closed with }, otherwise an error is reported.