> Content index: https://quillly.com/docs/llms.txt
> Canonical page: https://quillly.com/docs/syntax

---
title: Markdown syntax: pictures, CTAs, callouts and citations
description: The Markdown syntax Quillly adds: Mermaid, chart, HTML, SVG and screenshot pictures, call-to-action blocks and links, callouts and source citations.
keywords: markdown syntax, mermaid, callouts
published: 2026-09-24
updated: 2026-09-24
url: https://quillly.com/docs/syntax
word_count: 1892
---

# Markdown syntax: pictures, CTAs, callouts and citations

> The Markdown syntax Quillly adds: Mermaid, chart, HTML, SVG and screenshot pictures, call-to-action blocks and links, callouts and source citations.

Canonical: https://quillly.com/docs/syntax
Published: 2026-09-24

Quillly reads ordinary Markdown plus a few additions of its own: fenced blocks that become pictures, call-to-action blocks and links, callouts, and source citations. This page is the reference for that Markdown syntax, with every option Quillly accepts and an example you can copy for each. Your AI writes this syntax when it creates or updates a page, and anything else that sends Markdown to Quillly can use it too. In the editor, the same blocks come from the slash menu instead.

## The Markdown syntax of a fenced block

A fenced block starts with a line of three backticks followed directly by its kind, such as `image:mermaid`, and then its attributes. The lines after it are the body, written in the kind's own language. A line of three backticks on its own ends the block.

![The parts of a fenced image block: three backticks, the image:mermaid kind, the attributes, the body and the closing backticks](https://quillly.com/serve/v1/019c64a2-a62f-7793-aa68-2c78316d3309/images/b2e65db2fa16d806a4e021f61e3722904e721a05.webp)

> [!NOTE]
> A code block ends at the first line that starts with three backticks, so a code block cannot show a whole fenced block. The examples below give the first line and the body as two separate blocks. To use one, type three backticks and then the first line, add the body, and close with a line of three backticks.

## Pictures made from code

The same Markdown syntax covers five kinds of block that are drawn into pictures when you save the page:

| Kind | The body is | In the editor |
| --- | --- | --- |
| `image:mermaid` | A diagram in Mermaid syntax | **Diagram** in the slash menu |
| `image:chart` | A chart configuration in JSON | **Chart** |
| `image:html` | HTML, with Tailwind classes available | **Custom visual** |
| `image:svg` | One SVG drawing | **Custom visual**, then the SVG kind |
| `image:screenshot` | The address of a web page to capture | Not available, ask your AI |

Every kind takes the same attributes on its first line:

| Attribute | What it does |
| --- | --- |
| `alt="…"` | Describes the picture. It becomes the image's alt text, and the SEO score counts a picture without one as missing. Write it in double quotes. |
| `caption="…"` | Text shown under the picture. An *italic line* right after the block works too. |
| `align=left`, `align=center` or `align=right` | Where the picture sits. Center is the default. |
| `width=720` | The picture's width on the page, in pixels. Diagrams, charts, HTML and SVG are also drawn at this width, from 320 to 1600, and the default is 800. |

When the page is saved, Quillly draws each block on a white card, with your site's primary colour as the accent and your domain in a small label in the bottom corner, and serves the result as an ordinary image. Until a picture is ready, the page shows the block's code instead. A picture is drawn again when its code, its width or your primary colour changes.

### Diagrams: image:mermaid

The body is a [Mermaid](https://mermaid.js.org/intro/) diagram: a flowchart, a sequence diagram, a mind map or any other type Mermaid supports.

First line, after the three backticks:

```text
image:mermaid alt="A flow from draft to published, with an optional review step" width=520
```

Body:

```text
flowchart TB
  A[Draft] --> B[Review]
  B --> C[Published]
  A -->|Publish now| C
```

It renders like this:

![A flow from draft to published, with an optional review step](https://quillly.com/serve/v1/019c64a2-a62f-7793-aa68-2c78316d3309/images/cd3345e3d876c19292dd362ed8e836ff56877407.webp)

Write flowcharts top to bottom with `flowchart TB`. A [left-to-right flowchart](https://mermaid.js.org/syntax/flowchart.html) with more than three boxes shrinks to fit the column, and the SEO score flags it. Mermaid runs in strict mode, so click actions and links inside the diagram are ignored.

### Charts: image:chart

The body is a [Chart.js](https://www.chartjs.org/docs/latest/) configuration written as JSON, with `type`, `data` and, if you like, `options`.

First line:

```text
image:chart alt="Bar chart of monthly visits to the Acme docs from January to June"
```

Body:

```json
{
  "type": "bar",
  "data": {
    "labels": ["Jan", "Feb", "Mar", "Apr", "May", "Jun"],
    "datasets": [
      { "label": "Docs visits", "data": [1284, 1570, 1893, 2210, 2468, 2931] }
    ]
  },
  "options": {
    "plugins": { "title": { "display": true, "text": "Visits to the Acme docs, 2026" } }
  }
}
```

It renders like this:

![Bar chart of monthly visits to the Acme docs from January to June](https://quillly.com/serve/v1/019c64a2-a62f-7793-aa68-2c78316d3309/images/4f45457ddeeab843198ba9ec498c26de6edbdf07.webp)

The body must be valid JSON, so it cannot contain functions or comments. Animation is turned off, and datasets without their own colours get a palette that starts with your site's primary colour. Pie, doughnut, polar area and radar charts are drawn wide, with the legend on the right, unless the options say otherwise.

### Custom visuals: image:html

The body is HTML. [Tailwind utility classes](https://tailwindcss.com/docs/styling-with-utility-classes) work, and so do these CSS variables: `var(--brand)` holds your site's primary colour, and `var(--ink)`, `var(--surface)`, `var(--border)` and `var(--muted)` hold the card's text, background, border and muted colours.

First line:

```text
image:html alt="Two cards comparing median load time before and after caching" width=720
```

Body:

```html
<div class="grid grid-cols-2 gap-4">
  <div class="rounded-xl border p-6">
    <p class="text-sm text-gray-500">Before caching</p>
    <p class="mt-1 text-4xl font-bold">4.2 s</p>
    <p class="mt-2 text-sm">Median load time</p>
  </div>
  <div class="rounded-xl border-2 p-6" style="border-color: var(--brand)">
    <p class="text-sm text-gray-500">After caching</p>
    <p class="mt-1 text-4xl font-bold" style="color: var(--brand)">0.9 s</p>
    <p class="mt-2 text-sm">Median load time</p>
  </div>
</div>
```

It renders like this:

![Two cards comparing median load time before and after caching](https://quillly.com/serve/v1/019c64a2-a62f-7793-aa68-2c78316d3309/images/1ee37b80347e29d650c787b04fb071712f9a5576.webp)

Scripts, event handlers, frames and links to other files are removed before drawing. The drawing has no internet access, so a picture inside the HTML must be written into it, as inline SVG or a `data:` address. Most pictures in these docs are drawn this way.

### Vector drawings: image:svg

The body is one `<svg>` element. It is centred and scaled down to fit the width.

First line:

```text
image:svg alt="Three boxes in a row: write, check and publish"
```

Body:

```html
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 520 110" width="520" height="110" font-family="Inter, sans-serif" font-size="16">
  <rect x="10" y="30" width="140" height="50" rx="10" fill="none" stroke="#b9502a" stroke-width="2"/>
  <text x="80" y="60" text-anchor="middle" fill="#211d1a">Write</text>
  <path d="M150 55 H 190" stroke="#a8a29e" stroke-width="2"/>
  <rect x="190" y="30" width="140" height="50" rx="10" fill="none" stroke="#b9502a" stroke-width="2"/>
  <text x="260" y="60" text-anchor="middle" fill="#211d1a">Check</text>
  <path d="M330 55 H 370" stroke="#a8a29e" stroke-width="2"/>
  <rect x="370" y="30" width="140" height="50" rx="10" fill="#b9502a"/>
  <text x="440" y="60" text-anchor="middle" fill="#ffffff">Publish</text>
</svg>
```

It renders like this:

![Three boxes in a row: write, check and publish](https://quillly.com/serve/v1/019c64a2-a62f-7793-aa68-2c78316d3309/images/2d1b80f54dc85fc2e1af7bf3ab9ab489c05e3860.webp)

The same clean-up as HTML applies, and a block without an `<svg>` element fails. [MDN's SVG reference](https://developer.mozilla.org/en-US/docs/Web/SVG) lists the elements you can use.

### Screenshots: image:screenshot

This Markdown syntax is different from the other kinds: the body is a few `key: value` lines that name a public web page to capture.

First line:

```text
image:screenshot alt="The pricing table on the Acme pricing page"
```

Body:

```text
url: https://acme.com/pricing
selector: .pricing-table
wait_for: .pricing-table
width: 1280
```

| Key | What it does |
| --- | --- |
| `url` | Required. The public http or https address to capture. |
| `selector` | Captures one element, the first that matches this CSS selector, instead of the whole view. |
| `scroll_to` | Scrolls this element into view before a capture of the view. |
| `wait_for` | Waits up to 8 seconds for this element to appear before capturing. |
| `full_page` | `true` or `yes` captures the whole page, cut off at 6,000 pixels tall. |
| `width` | The browser width, from 320 to 1920 pixels. The default is 1280. |

A `#` starts a comment at the end of a line. An unknown key or a missing `url` fails the block. A capture of an error page, a bot check or a blank page is not published, so the block stays as code until you fix the address or the selector.

## Call-to-action blocks

A `cta` block is a box with a heading, a line of text and a button. In Markdown syntax, its body is `key: value` lines.

First line: `cta`, straight after the three backticks.

Body:

```text
heading: Ready to publish your first page?
body: Connect your AI and ask it for a page about your product.
button: Connect your AI | https://quillly.com/docs/connect-your-ai
variant: card
```

| Key | What it does |
| --- | --- |
| `heading` | The bold first line. |
| `body` | The sentence under it. |
| `button` | The button's label, a vertical bar, then its address. Only the first bar splits them. Without an address, the block has no button. |
| `variant` | `card` for a bordered box, the default, or `banner` for a full-width band in your primary colour. |

Other lines are ignored, and when a key appears twice the last one wins. A button with a full address opens in a new tab, and one that starts with `/` or `#` stays in the same tab. In the editor, choose **CTA** from the slash menu. On blog posts, the SEO score expects about one call to action per 800 words, with one near the end. Docs pages, changelog entries and news stories are not scored on them.

This is the example above, drawn on this page:

> **Ready to publish your first page?**
> Connect your AI and ask it for a page about your product.
> → [Connect your AI](https://quillly.com/docs/connect-your-ai)

## Call-to-action links

The Markdown syntax is a `{cta=…}` suffix straight after a link, with a short name of your choice, which marks the link as a call to action:

```text
[Start your free trial](https://acme.com/signup){cta=signup}
```

The link looks like any other link. Clicks on it are counted as call-to-action clicks in Analytics, with the link's text, its address and where on the page it sits. It also counts toward the SEO score's call-to-action check, like a block. In the editor, click a link and choose **Tag as call-to-action**. The Markdown version of a page, and **Copy page** on docs, leave the `{cta=…}` part out.

## Callouts

A quote that starts with a marker becomes a callout with a title, an icon and a colour. The Markdown syntax is the one [GitHub uses for alerts](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax), and callouts work on blog posts, docs pages, changelog entries and news stories.

| Marker | Title | Colour in most themes |
| --- | --- | --- |
| `[!NOTE]` or `[!INFO]` | Note | Blue |
| `[!TIP]` | Tip | Green |
| `[!IMPORTANT]` | Important | Green |
| `[!WARNING]` | Warning | Amber |
| `[!CAUTION]` or `[!DANGER]` | Caution | Red |

```markdown
> [!WARNING]
> Deleting a website also deletes its pages.
```

A quote whose first words are a label, such as `Note:` or `**Tip:**`, also becomes a callout, titled with that word:

```markdown
> **Tip:** Number every page in a section, in steps of 10.
```

The marker must open the quote, and a quote inside another quote stays a plain quote. The editor draws a quote with a marker as a callout while you write. [Writing docs pages](https://quillly.com/docs/writing-docs) shows callouts next to the other docs features, and the note near the top of this page is one.

## Source citations

A citation ties a few words to the sources that back them. Its Markdown syntax is an HTML span around the words, with the sources in `data-sources` as a JSON list. Each source has a `url` and a `title`, and quotation marks inside the list are written as `&quot;`:

```html
Quillly treats a page that answers 404 as a broken link <span class="qs-citation" data-sources="[{&quot;url&quot;:&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404&quot;,&quot;title&quot;:&quot;404 Not Found&quot;}]">because the page no longer exists</span>.
```

What a citation does:

- The SEO score counts it as a source, in the same check as links to other sites.

- The editor shows a small pill with the source's site after the cited words.

- On your published page, the cited words are plain text, with no pill and no link. Link to a source as well when readers should be able to open it.

- The Markdown version of the page keeps the span, so AI agents that read it see the sources.

The editor has no button that adds a citation. Your AI adds them when it writes from sources. News stories have their own list of sources as well, described in [News stories and sources](https://quillly.com/docs/news).

## Common questions

### Why does my page show code where a picture should be?

The picture is not drawn yet, or its code has an error. Open the block in the editor: its preview shows the error, such as a Mermaid syntax mistake or JSON that does not parse. After a fix, the picture is drawn when you save.

### Why is my picture in the wrong colours?

Pictures are always drawn on a white card, even on pages shown in dark mode, and their accent is your site's primary colour, not a section look. Change the primary colour on the [Brand](https://quillly.com/docs/brand) page and the pictures are drawn again.

## Related

- [The editor](https://quillly.com/docs/editor): the slash menu items that make the same blocks.

- [Writing docs pages](https://quillly.com/docs/writing-docs): numbered steps, callouts and the rest of the docs template.

- [Web Stories](https://quillly.com/docs/web-stories): a different Markdown syntax, for story slides.
