Fellow Markdown

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.

BlockSyntax
Heading# H1 through ###### H6. A subtitle on the same heading uses # Title<br>Subtitle
ParagraphPlain text on its own line
Bullet- text
Numbered item1. 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.

  • assignees is a comma-separated list of email:status pairs, with status one of not_done, done, wont_do. Example: {[email protected]:not_done}. The status is required on every entry.
  • dueDate is YYYY-MM-DD.
  • completeBy (action items only) is any (default, omit it) or all: 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}