Tintero Developers

Document schema

Every node and mark that can appear in a Tintero content file: 35 nodes and 17 marks, read out of the schema the editor builds.

On this page

A chapter's text is ProseMirror JSON, and this page is its whole vocabulary: every type name you can meet inside files/<id>.json, what each one is allowed to contain, and which attributes it carries with what defaults. Whether you are writing something that reads Tintero documents or a plugin that produces them, this is the list to keep open beside you.

22 of the 35 nodes and 7 of the 17 marks are Tintero's own. The rest are standard Tiptap and behave the way they do everywhere else. The badge on each entry says which, because the two halves have very different amounts of documentation in the world: the standard ones are described on prosemirror.net, and the Tintero ones are described here and nowhere else.

What this is a schema of

Tintero has one function whose job is to answer "every node and mark any document in this project could use", used when a remote edit arrives for a file whose editor is closed. This page is that schema, extracted by running it. It is not a list anyone maintains, so it cannot fall behind the editor: add a node in Tintero and it turns up here on the next sync, with its real attributes and its real defaults.

Unknown types, and what to do with them

There is no version field in a Tintero project, so a document can contain a node type that your reader has never heard of, and that is not damage. It means the file was written by a newer Tintero than the list you built against.

Pass what you do not recognise through untouched. A node you drop is a scene marker, a bookmark or a stretch of dialogue that the writer will find missing later, and nothing will have told them. The same goes the other way: writing a node type that is not on this list produces a file Tintero cannot open, and the check that runs before a plugin's write lands is not a schema check, so nothing will stop you.

Nodes (35)

Nodes are the structure. Every one of them has a type, and most carry a content array holding the nodes inside them. The root of a document is always doc.

action bookmark centered character dialogue inlineAudioPlayer lyrics page-break paragraph parenthetical resizableImageClean scene section shot slugline synopsis table tableCell tableHeader transition ttsPause ttsSoundTag

The 22 nodes above exist only in Tintero. The rest of the list is standard.

action #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "action"

blockquote #

standard
contains
block+
group
block
flags
block-level, defining
from
starterKit
indent 0
marginLeftMm null
marginRightMm null
firstLineMm null

bookmark #

Tintero
contains
nothing, it is a leaf
group
inline
flags
inline, leaf, atom, not selectable
from
bookmark customExtensions/bookmark-node.ts
id ""

bulletList #

standard
contains
listItem+
group
block list
flags
block-level
from
starterKit

No attributes. In the file it is { "type": "bulletList" } and whatever it holds.

centered #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "centered"

character #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "character"

codeBlock #

standard
contains
text*
group
block
marks
none allowed
flags
block-level, defining, code
from
starterKit
marginLeftMm null
marginRightMm null
firstLineMm null
language null

dialogue #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "dialogue"

doc #

standard
contains
block+
group
none
flags
block-level
from
starterKit

No attributes. In the file it is { "type": "doc" } and whatever it holds.

hardBreak #

standard
contains
nothing, it is a leaf
group
inline
flags
inline, leaf, not selectable
from
starterKit

No attributes. In the file it is { "type": "hardBreak" } and whatever it holds.

heading #

standard
contains
inline*
group
block
flags
block-level, defining
from
starterKit
textAlign null
indent 0
marginLeftMm null
marginRightMm null
firstLineMm null
level 1

horizontalRule #

standard
contains
nothing, it is a leaf
group
block
flags
block-level, leaf
from
starterKit

No attributes. In the file it is { "type": "horizontalRule" } and whatever it holds.

inlineAudioPlayer #

Tintero
contains
nothing, it is a leaf
group
block
flags
block-level, leaf, atom
from
inlineAudioPlayer customExtensions/inline-audio-player.ts
src null
title null

listItem #

standard
contains
paragraph block*
group
none
flags
block-level, defining
from
starterKit
indent 0

lyrics #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "lyrics"

orderedList #

standard
contains
listItem+
group
block list
flags
block-level
from
starterKit
start 1
type null

page-break #

Tintero
contains
nothing, it is a leaf
group
block
flags
block-level, leaf, atom
from
screenplay customExtensions/screenplay.extension.ts
class "page-break"

paragraph #

Tintero
contains
inline*
group
block
flags
block-level
from
paragraph customExtensions/dialog-paragraph.ts
textAlign null
indent 0
marginLeftMm null
marginRightMm null
firstLineMm null
dialog false

parenthetical #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "parenthetical"

resizableImageClean #

Tintero
contains
nothing, it is a leaf
group
block
flags
block-level, leaf, draggable
from
resizableImageClean customExtensions/resizable-image-clean.ts
src null
alt null
title null
width null
height null
data-alignment "center"
data-reference-url null
data-scale null

scene #

Tintero
contains
block+
group
block
flags
block-level
from
scene customExtensions/scene-extension.ts
sceneId null
sceneType "main_continuity"

section #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
level 1
class "section"

shot #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "shot"

slugline #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "slugline"

synopsis #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "synopsis"

table #

Tintero
contains
tableRow+
group
block
flags
block-level, isolating
from
table customExtensions/custom-table.ts
wrapperWidth null
wrapperMargin null

tableCell #

Tintero
contains
block+
group
none
flags
block-level, isolating
from
tableCell customExtensions/custom-table-cell.ts
colspan 1
rowspan 1
colwidth null
align null
backgroundColor null
verticalAlign null

tableHeader #

Tintero
contains
block+
group
none
flags
block-level, isolating
from
tableHeader customExtensions/custom-table-cell.ts
colspan 1
rowspan 1
colwidth null
align null
backgroundColor null
verticalAlign null

tableRow #

standard
contains
(tableCell | tableHeader)*
group
none
flags
block-level
from
tableRow

No attributes. In the file it is { "type": "tableRow" } and whatever it holds.

taskItem #

standard
contains
paragraph block*
group
none
flags
block-level, defining
from
taskItem
checked false

taskList #

standard
contains
taskItem+
group
block list
flags
block-level
from
taskList

No attributes. In the file it is { "type": "taskList" } and whatever it holds.

text #

standard
contains
nothing, it is a leaf
group
inline
flags
block-level, leaf
from
starterKit

No attributes. In the file it is { "type": "text" } and whatever it holds.

transition #

Tintero
contains
text*
group
block
flags
block-level, defining
from
screenplay customExtensions/screenplay.extension.ts
marginLeftMm null
marginRightMm null
firstLineMm null
class "transition"

ttsPause #

Tintero
contains
nothing, it is a leaf
group
inline
flags
inline, leaf, atom
from
ttsPause customExtensions/tts-annotations.ts
ms 500

ttsSoundTag #

Tintero
contains
nothing, it is a leaf
group
inline
flags
inline, leaf, atom
from
ttsSoundTag customExtensions/tts-annotations.ts
tag "laugh"

Marks (17)

Marks are formatting, and anything else laid over a stretch of text rather than wrapped around it. They live in a marks array on the text node itself, so a bold word inside a paragraph is simply a text node carrying { "type": "bold" }.

bold #

standard
group
none
from
starterKit

No attributes. In the file it is { "type": "bold" } and whatever it holds.

code #

standard
group
none
flags
excludes _, code
from
starterKit

No attributes. In the file it is { "type": "code" } and whatever it holds.

customHighlight #

Tintero
group
none
flags
not inclusive
from
customHighlight customExtensions/custom-highlight.ts
data-highlight-id null
class "highlight-error"
suggestions []
data-character-id null
data-worldbuilding-id null
style null
data-assigned-color null

dialogMark #

Tintero
group
none
flags
not inclusive
from
dialogMark customExtensions/dialog-mark.ts
class "dialog-mark"

highlight #

standard
group
none
from
highlight
color null

intelligentQuote #

Tintero
group
none
flags
not inclusive
from
intelligentQuote customExtensions/intelligent-quote.ts
class "intelligent-quote"

italic #

standard
group
none
from
starterKit

No attributes. In the file it is { "type": "italic" } and whatever it holds.

noteHighlight #

Tintero
group
none
from
noteHighlight customExtensions/note-highlight.ts
id null
class "note"

strike #

standard
group
none
from
starterKit

No attributes. In the file it is { "type": "strike" } and whatever it holds.

subscript #

standard
group
none
from
subscript

No attributes. In the file it is { "type": "subscript" } and whatever it holds.

superscript #

standard
group
none
from
superscript

No attributes. In the file it is { "type": "superscript" } and whatever it holds.

textStyle #

standard
group
none
from
textStyle
color null
fontSize null
fontFamily null

ttsEmotion #

Tintero
group
none
flags
not inclusive
from
ttsEmotion customExtensions/tts-annotations.ts
emotion "neutral"

ttsVoice #

Tintero
group
none
flags
not inclusive
from
ttsVoice customExtensions/tts-annotations.ts
voice ""
label ""

underline #

standard
group
none
from
underline

No attributes. In the file it is { "type": "underline" } and whatever it holds.

Generated from the schema Tintero builds at runtime, through getBackgroundSchema(). Behaviour that adds no node and no mark is listed separately, on editor extensions.