Fellow Markdown is the format the API uses for reading and writing note content. It is GitHub-Flavored Markdown plus Fellow extensions for the things Fellow notes have and plain markdown doesn't: action items with assignees and due dates, talking points, mentions, tags, and highlights.
The format round-trips: the content_fellow_markdown you read from a note is exactly what you can send back to POST /note/{id}/agenda. Block order in the markdown is the order in the note. Blocks are separated by a blank line; consecutive list items may sit on adjacent lines.
Blocks
The marker at the start of a line sets the block type. Structural properties (heading level, checkbox state, indentation) live in the syntax itself, never in attribute braces.
| Block | Syntax |
|---|---|
| Heading | # H1 through ###### H6. A subtitle on the same heading uses # Title<br>Subtitle |
| Paragraph | Plain text on its own line |
| Bullet | - text |
| Numbered item | 1. text (numbers are cosmetic; order is what counts) |
| Action item | - [ ] open, - [x] done, - [!] won't do |
| Talking point | - ( ) open, - (x) done |
| Divider | --- on its own line |
Action items are for assigned work and can have multiple assignees. Talking points are for discussion topics and accept at most one assignee.
Indent nested items with two spaces per level. Nesting is flat: a block carries an indent level rather than children.
Tables, blockquotes, and fenced code blocks are not supported and are rejected with a validation error. Present tabular data as bulleted lists under headings instead.
Inline formatting
**bold**, *italic*, ~~strikethrough~~, <u>underline</u>, `code`, ==highlight==, [coloured text]{colour=#hex}, and [label](https://url) links. A line break inside a block is <br>. Escape a literal marker with a backslash: \*, \#, \:.
Mentions, tags, and emoji
- Mention:
[Display Name](mention:[email protected]), using the person's primary email address in your workspace. An email that doesn't match anyone is rejected with a validation error. - Tag:
#tagname. It becomes a tag only if it already exists in your workspace; otherwise it stays plain text. - Link pill:
[Display Text](link-pill:https://example.com). - Custom emoji:
:shortcode:. Renders only if the emoji exists in your workspace, otherwise stays text.
Block attributes
Everything that isn't a structural marker goes in one optional trailing brace per block: {key=value ...}, space-separated. Only include non-default values — a plain paragraph has no brace at all.
assigneesis a comma-separated list ofemail:statuspairs, with status one ofnot_done,done,wont_do. Example:{[email protected]:not_done}. The status is required on every entry.dueDateisYYYY-MM-DD.completeBy(action items only) isany(default, omit it) orall: whether one or every assignee must finish. For assigned items the checkbox is derived from assignee statuses, so update the assignee entry rather than just flipping the checkbox.- Quote values containing spaces:
{placeholder="Enter text"}. - Opaque tokens (
attachmentId,keyResultId,guidanceId) pass through verbatim. Never invent them; only reuse tokens already present in content you read. - Identity attributes (
blockId,entityId) are internal. Never write them; they are never returned.
Example
## Talking Points
Quick context for the sync. See the [roadmap](https://fellow.app/roadmap) and #planning.
- ( ) Review Q1 goals {[email protected]:not_done dueDate=2024-12-01}
- (x) Recap last week
- [ ] Send the summary {[email protected]:not_done,[email protected]:not_done completeBy=all}
