The paste format
What the Import box accepts, key by key. The same markdown a vault holds as files, with two differences that matter.
The shape of a document
One paste can carry any number of blocks. A block starts at a ---fence and its body runs until the next block's fence or the end of the document. There is no separator to write and no wrapper to add.
--- title: "Sam Dash" slug: wg-dash group: congress kind: person --- # Sam Dash **Definition.** Chief counsel to the Senate Watergate Committee, who led the questioning that drew out Dean's and Butterfield's testimony. **See also.** [[wg-ervin-committee|Senate Watergate Committee]], [[wg-the-tapes::investigated|The White House Tapes]] --- title: "The White House Tapes" slug: wg-the-tapes group: evidence kind: document --- # The White House Tapes …
Frontmatter keys
Nine keys are read. title is the only one required — everything else is inferred or omitted.
| Key | What it does |
|---|---|
title | Required. If absent, the first # heading in the body is used. If there is neither, the block is an error and will not import. |
slug | The node's identity. Normalised on the way in. If absent it is derived from the title — which is the single most common cause of a batch that imports cleanly and links to nothing. See below. |
lens | Which lens this node belongs in, by slug. Absent means “the lens the importer is pointed at”, which is what you want for an ordinary single-lens paste. A value naming a lens you do not have is an error, with a did-you-mean. |
group | A group key declared in this lens. Undeclared imports with a warning and lands ungrouped; absent does the same without the warning. |
kind | The entity type — person, event, document. Kinds are not declared anywhere, so anything is accepted; take one the lens already uses rather than inventing a category. |
event_date | The date the entry is about, distinct from when you wrote it. Must be YYYY-MM-DD or it is ignored with a warning. |
aliases | Other names for the same thing. A bare string, or a list — ["Deep Throat", "W. Mark Felt"]. |
visibility | public (default) or restricted. Restricted keeps the node yours in every lens it appears in, and it is never sent to a hosted model. Any other value reads as public. |
status | A free-text workflow marker of your own — seed, needs-sources. The app stores it and does not interpret it. |
Everything else is reported and dropped
Invent a key — phase, confidence, source — and the preview says so by name, then imports the node without it. That is deliberate: the node is fine and refusing it would punish you for a model being better informed than the importer. But the value is lost, so put facts in the body.
synced_hashis skipped silently on purpose — it is the sync tool's bookkeeping and reporting its loss would alarm somebody who never wrote it. typeis skipped silently by this lane and takes the database's own default instead — it is a record marker rather than something you set, and it is the one key here that is neither read nor reported. If you meant the entity type, that is kind.Slugs
Lowercase, alphanumeric, dash-separated. Whatever you supply is normalised the same way a link target is, so a slug and a link to it cannot disagree about what canonical means:
- lowercase everything
- replace every run of non-
[a-z0-9]with a single- - strip leading and trailing
-
| Written | Becomes |
|---|---|
"Jon Snow" | jon-snow |
"R'hllor, Lord of Light" | rhllor-lord-of-light |
slug: WG Dash | wg-dash |
slug: explicitly whenever your lens tags its slugs. Slugs are unique across your whole account, so most lenses prefix them — wg-, got-. Without the key, title: "Sam Dash" becomes sam-dash, which is inconsistent with the lens and breaks every sibling link pointing at [[wg-dash]]. The file lane never has this problem, because there the filename is the slug.Links
Four forms, all of them valid anywhere in a body:
| Form | Meaning |
|---|---|
[[wg-dash]] | A plain edge. The slug is also what the reader sees. |
[[wg-dash|Sam Dash]] | A plain edge with a human label. The slug still resolves. |
[[wg-the-tapes::investigated]] | A typed edge. The relation must be declared in the lens. |
[[wg-the-tapes::investigated|The Tapes]] | Both. |
[[atvi::owns=51|Activision Blizzard]] | A typed edge carrying a value — everything after the first =, kept verbatim. Usually a share (owns=51), but not always — a title in the same slot (officer-of=Chairman) is equally valid. |
[[atvi::owns=51@2013-10-11..2016-01-05]] | A span — when the edge held. Everything after the last @ is the range. Leave either side of the ..empty for “since” (@2023-10-13..) or “until” (@..2016-01-05). |
[[atvi::owns=51@2013-10-11]] | No .., so this is a point: that day alone, not “from then on”. The ..is what makes a span open-ended, on purpose — a silent “and thereafter” is the kind of default that turns a typo into a claim. |
[[atvi::owns=12@2016]] | Write the precision you have. A bound may be a year (@2016), a month (@2016-03) or a day. It is stored as the first day of that period alongside the precision it was claimed at, so @2016 stays the year 2016 rather than becoming the 1st of January. |
A trailing #anchor is parsed and ignored. Never put | inside a label — it splits the field.
owns=51 and owns=49 to the same target with no dates is a contradiction, not two edges; only the first is kept. Give them different spans and they stop being a contradiction: they become two facts about two times, and both are kept. What a value actually asserts, and the shape column a lens can declare for a relation, is covered in Typed relations.Direction
- Directed relations (parent-of, authorized, investigated) go on the source only, pointing at the target.
- Symmetric relations (allied-with, sibling-of) go on both endpoints, or the graph reads correctly from one side only.
Creating lenses in a paste
A block that carries authority: or a taxonomy section is read as a lens rather than a node — that is how the importer tells the two apart, since both open with ---.
--- title: Rome slug: rome authority: web --- ## Groups <!-- key | Label | #color | familyKey --> - republic | The Republic | #2dd4c8 - empire | The Empire | #f0a830 ## Relations <!-- value | Label | directed|symmetric | #color --> - succeeded | Succeeded | directed | #3ea6ff
| Key | Notes |
|---|---|
title | Required. A lens needs a name. |
slug | Required, and never guessed from the title. A vault lens takes its slug from its folder; a paste has no folder, and an invented identity is a lens the author never named. |
parent | The macro lens's slug, on each child. Omit on the macro lens itself and on a standalone lens. A parent may appear later in the document — macro-first is the usual order and both work. |
authority | Always web. A pasted lens is owned by the app; vault is accepted with a warning and corrected on the way in. |
Lenses and nodes can share one document — lenses are created first, then nodes, and a node uses lens: to say which room it belongs in. Nodes naming a lens that could not be created are held back and reported rather than filed somewhere arbitrary.
The Relations table, in full
Four columns are the floor. Two more are optional and purely additive — a five-field row is read as ending on #color, so a bare fifth word is always the shape, never the direction column:
## Relations <!-- value | Label | directed|symmetric | #color | shape | down|invert --> - owns | Owns | directed | #c14953 | weighted | down - subsidiary-of | Subsidiary of | directed | #7c4a8c | tree | invert
| Column | Notes |
|---|---|
shape | Optional, 5th. One of tree, chain, dag, weighted, many. Omitted or unrecognised falls back to many, the least constrained. |
down / invert | Optional, 6th — only meaningful with a shape present. invert flips the edge before laying out a chart; down, blank, or anything else is the ordinary reading. |
Neither column ever blocks an import — a shape only produces a warning on the graph, never a rejection. What each shape catches, and when a relation wants invert, is covered in Typed relations.
What the preview tells you
| Status | Meaning |
|---|---|
| ready | Will import. |
| exists · skip | A node with that slug is already here. A collision, not an error — nothing is overwritten. |
| error | Will not import, and says why. Missing title, a title with no letters or digits to form a slug, an unknown lens, or two blocks claiming one slug. |
| warn | Will import, with something undeclared, unresolvable or dropped. See the warnings table in Bring your own AI. |
Nothing is written until you confirm, and after you do the app reports counts in plain words: how many nodes were created, how many lenses were made, how many already existed and were left alone, and how many were held back.
See also
- Bring your own AI — how to get a model to produce this format correctly.
- My links didn't connect anything — the slug failure, in detail.
- My import came in with warnings — each warning and its cause.