---
title: 'Document'
description: 'A markdown document on the canvas'
updated: 2026-08-14
---

# Document

**Node type:** `utility:document`  
**Category:** `Helpers`

## Description

A canvas-native markdown page. Use it for the writing that belongs WITH a
board and not in another tab — a film brief with its logline and character
sheets, a template's usage notes, the shot list a group of nodes implements.

Like the Sticky Note it is an annotation: no ports, no run button, never
executes, never costs credits. Unlike the sticky it renders GitHub-flavored
markdown (headings, lists, tables, code, links) and embeds images, so a brief
can show the assets it describes.

## Dark and light

Documents are **dark by default** — a white page is a floodlight on a dark
canvas. The sun/moon button in the sheet header (and in the fullscreen header)
flips that document between dark and light paper, and the choice is saved with
the workflow, per document. Two briefs on one board can differ.

Documents created before this existed have no saved choice, and those render
dark like everything else.

Shared boards and embeds render whatever the author saved. There is no toggle
there — nothing to save it to.

If you embed a board with `/embed/flow/<id>?theme=light` (or `?theme=dark`),
that choice also applies to the documents on it, so a brief does not sit as a
dark slab in the middle of a light embed. It only changes what the embed
displays — the author's saved choice is never overwritten. With no `?theme` on
the URL, documents show exactly what the author saved.

## Editing

- **Double-click** the body to edit the raw markdown.
- **Click outside**, or press **Escape**, to go back to the rendered view.
  (Escape only leaves edit mode; a second Escape does whatever Escape does on
  the canvas.)
- Drag the corners to resize. New documents start at 640 x 760.

## Full screen

Click the **expand** icon in the sheet header (or open a document's link, see
below) to read it as a page: a ~960px reading column with larger type, the same
markdown and the same live references as the sheet on the canvas.

- **Edit** from the pencil icon, or double-click the page.
- **Escape** unwinds one level: editing → reading → back to the canvas.
- Edits made full screen and edits made on the canvas are the same edit, saved
  the same way. There is no "apply".

## Sharing a document

The **link** icon copies `/'flow/<workflow>?activeNode=<node>'` to your
clipboard — the same link shape the `...` menu on any node writes. Paste it into
a chat and the recipient lands on your board with the camera on that node, and,
because it is a document, with the reader already open.

Two details worth knowing:

- Closing the reader drops `?activeNode` from the address bar, so a refresh
  does not re-open it. Closed means closed.
- The multi-node form of the link (`?activeNode=id1,id2`, which fits the camera
  around several nodes) selects them but never opens a reader — with more than
  one target there is no single document the link is "about".

## Referencing nodes with @

A document can point at another node on the board and render **that node's
current output** inline:

```markdown
@[Hero still](node:cm3x8k2p0001)
```

An image node renders its image, a video or audio node its player, a text node
its text. The reference is **live**: re-roll the node, or promote a different
result from its carousel, and every brief that mentions it updates. This is the
reason to use a mention instead of pasting a CDN url — a pasted url keeps
showing the old asset and gives you no way to notice.

To get the token, open a node's `...` menu and choose **Copy mention (for a
document)**, then paste it into the document body. (Typing `@` in the document
does not yet open a picker — that is a follow-up.)

The part in brackets is just a label for readability; the `node:` id is the
address, so renaming a node never breaks a reference. A mention that cannot
resolve — the node was deleted, or it has not produced anything yet — renders as
an amber chip that says so, rather than quietly leaving a hole in the brief.

## Images

Embed with normal markdown image syntax and any URL the browser can load —
including a CDN url copied from a generated result:

```markdown
![the hero shot](https://cdn.example.com/renders/hero.png)
```

Images are constrained to the width of the page, so a 4K still will not blow
out the sheet.

## Security note

Raw HTML in the source is **escaped, not rendered** — a `<script>` tag shows up
as literal text. Documents travel with the workflow when a board is shared,
forked from a blueprint, or published as a template, so HTML pass-through is
deliberately off and must stay off.

The same applies to what a mention pulls in: a referenced node's text output is
rendered as text, never re-parsed as markdown, so a node cannot inject headings,
links or HTML into someone else's brief. Referenced media is only rendered from
`http(s)` or same-site urls.

## Canvas ports

_No input ports._

## Sidebar config

_No sidebar config fields._

## Outputs

_No outputs._

---

Documentation index: fetch https://www.wireflow.ai/llms.txt for the full list of Wireflow docs.
