Markdown syntax
f8xt uses marked with GFM mode enabled and breaks set to false. Seven custom extensions add wiki-links, math, footnotes, and highlights on top of the standard and GFM syntax. The parser also passes raw HTML tags through; DOMPurify sanitizes the output in the preview pane with a fixed allowlist of tags and attributes.
Headings
One to six hash characters at the start of a line produce <h1> through <h6>. Each heading element gets a data-heading attribute set to its level number. Inline syntax inside a heading (bold, links, wiki-links) is parsed.
# Heading 1 ## Heading 2 ### Heading 3 #### Heading 4 ##### Heading 5 ###### Heading 6
Bold and italic
Double asterisks or underscores produce <strong>. Single asterisks or underscores produce <em>. Triple asterisks produce both. The closing delimiter must match the opening delimiter.
**bold text** _also bold_ *italic text* _also italic_ ***bold and italic***
Strikethrough
Double tildes wrap text in a <del> element. This is a GFM extension, not part of the original markdown spec.
~~deleted text~~
Highlight
Double equals marks wrap text in a <mark class="accent-highlight"> element. Content inside the delimiters is parsed as inline markdown, so you can nest bold, links, or wiki-links within a highlight. This is a custom extension, not standard or GFM.
==highlighted text==
Inline code
Single backticks wrap text in a <code> element. The content is escaped, so HTML tags inside backticks render as plain text.
console.log('hello')Code blocks
Fenced code blocks use triple backticks. An optional language identifier after the opening fence is added as a class on the <code> element (without a language- prefix). Four-space indented blocks also work but cannot specify a language.
```javascript const x = 1; ```
Blockquotes
A line starting with > followed by a space wraps the content in a <blockquote>. Blockquotes can be nested.
> First level > > Nested level
Lists
Unordered lists use -, *, or + followed by a space. Ordered lists use a number, period, and space. Nesting requires indentation of two or more spaces relative to the parent item.
- First item - Second item - Nested item 1. Numbered one 2. Numbered two
Task lists
GFM task lists render checkboxes. An unchecked item uses [ ] and a checked item uses [x] (lowercase x). The rendered <input> elements have type="checkbox" and are disabled in the preview pane.
- [ ] Unchecked task - [x] Completed task
Links
Standard markdown links use square brackets for the text and parentheses for the URL. Angle-bracket autolinks (<https://...>) and bare URL autolinks are both enabled by GFM mode.
[link text](https://example.com) <https://example.com>
Images
Image syntax is a link preceded by an exclamation mark. The alt text goes inside the brackets. DOMPurify allows <img> with src, alt, width, height, loading, and decoding attributes.

Tables
GFM pipe tables require a header row, a separator row with dashes, and body rows. Colons in the separator set alignment: left (:---), right (---:), or center (:---:).
| Column A | Column B | | :--- | ---: | | Left-aligned | Right-aligned |
Horizontal rules
Three or more hyphens, asterisks, or underscores on a line produce an <hr>. They cannot appear in the middle of a paragraph; they must sit on their own line.
--- *** ___
Line breaks
Because breaks is set to false, a single newline inside a paragraph does not produce a <br>. To force a line break, end the line with two or more spaces before the newline.
First line Second line
Wiki-links
Three link types point to internal pages by name rather than URL. Each renders as a <span class="wiki-link"> with a data-page attribute holding the target name and a data-type attribute set to page, journal, or whiteboard. Clicking a wiki-link in the preview or rich text editor navigates to the referenced note.
| Syntax | data-type | Links to |
|---|---|---|
[[Page Name]] | page | A note page |
((Journal Name)) | journal | A journal entry |
{{Whiteboard Name}} | whiteboard | A whiteboard canvas |
Inline math
Single dollar signs wrap a LaTeX expression that KaTeX renders inline. The expression cannot span multiple lines. A dollar sign preceded by a backslash is treated as a literal character, not a math delimiter. A dollar sign followed by a digit is also treated as literal (to avoid catching prices like $5).
The equation $E = mc^2$ is famous.
On a parse error, KaTeX renders a <span class="katex-error"> showing the raw LaTeX instead of the formatted equation. The KaTeX options throwOnError and strict are both set to false, so errors display inline rather than throwing.
Block math
Double dollar signs on their own line render a display-mode equation. The opening $$ must appear at the start of a line. The rendered output is a <div class="math-block"> with KaTeX HTML inside.
$$
\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}
$$KaTeX is configured with trust: false, which disables commands like \htmlclass and \style that could inject HTML or CSS from inside a math block.
Footnotes
A line starting with -# followed by a space produces a <p class="footnote"> element. Inline markdown inside the footnote text is parsed, so bold, links, and wiki-links all resolve. This is not the standard [^1] footnote syntax; it is a custom extension that renders a styled paragraph rather than a numbered reference.
-# This text appears as a footnote.
Raw HTML
The markdown parser passes raw HTML tags through unchanged. In the preview pane, DOMPurify filters the output against an allowlist before rendering. The rich text editor does not run DOMPurify, so HTML entered there is rendered as-is.
DOMPurify allows these tags: h1 through h6, p, br, hr, div, span, pre, code, blockquote, ul, ol, li, dl, dt, dd, table, thead, tbody, tr, th, td, a, img, em, strong, del, ins, mark, sub, sup, abbr, kbd, var, samp, details, summary, figure, figcaption, ruby, rt, rp, iframe, video, audio, source, picture, style, section, article, aside, header, footer, nav, main, input, and button.
Allowed attributes: href, src, alt, title, class, id, style, target, rel, width, height, frameborder, allowfullscreen, allow, name, type, value, placeholder, disabled, checked, colspan, rowspan, scope, headers, start, reversed, loading, decoding, crossorigin, integrity, and nonce.
DOMPurify strips all data-* attributes (ALLOW_DATA_ATTR: false) and removes all on* event handler attributes (onerror, onclick, etc.). The tags script, object, embed, applet, form, textarea, and select are removed entirely.
<details> <summary>Click to expand</summary> Hidden content here. </details> <video src="clip.mp4" controls></video>
Quick reference
| Syntax | Output element | Origin |
|---|---|---|
# heading | <h1> through <h6> | Standard |
**text** | <strong> | Standard |
*text* | <em> | Standard |
~~text~~ | <del> | GFM |
==text== | <mark class="accent-highlight"> | Custom |
`code` | <code> | Standard |
```lang | <pre><code> | Standard |
> quote | <blockquote> | Standard |
- item | <ul><li> | Standard |
1. item | <ol><li> | Standard |
- [ ] / - [x] | <input type="checkbox"> | GFM |
[text](url) | <a> | Standard |
 | <img> | Standard |
| table | | <table> | GFM |
--- | <hr> | Standard |
[[Page]] | <span class="wiki-link"> | Custom |
((Journal)) | <span class="wiki-link"> | Custom |
{{Whiteboard}} | <span class="wiki-link"> | Custom |
$latex$ | <span class="math-inline"> | Custom |
$$latex$$ | <div class="math-block"> | Custom |
-# text | <p class="footnote"> | Custom |
<tag> | Raw HTML (sanitized) | HTML passthrough |