Scoria

Reading view

Reading view is the note as a finished document: no markers, no cursor, links you click. Ctrl + E (markdown:toggle-preview) toggles between it and editing.

Whether a note opens here depends on your vault: defaultViewMode in app.json is either preview (reading view) or editing, and Scoria follows it.

What is rendered

Everything in this list is drawn from the same parse tree the editor and the metadata cache use, so what you read and what the cache believes cannot disagree.

HeadingsLevels 1–6, scaled
ParagraphsWith soft line breaks — a single newline is a <br> unless strictLineBreaks is on
Emphasis*italic*, **bold**, ~~strike~~, ==highlight==
Inline codeWith the monospace font
Links[[Wikilinks]], Markdown links, and bare URLs — all clickable
TagsClickable, and counted in the Tags pane
ImagesLocal files, with Obsidian's size hints: ![[pic.png|200x100]]
EmbedsWhole notes, #Heading sections and #^block references, nested up to four deep
ListsBulleted, numbered, and task items with checkboxes
QuotesA bar per nesting level
CalloutsWith Obsidian's type colors and their fold state
TablesWith column alignment, laid out as described below
Code blocksWith a language label; long lines scroll rather than wrap
FrontmatterAs a properties block at the top of the note
FootnotesNumbered by order of first reference, collected at the end

Clicking things

  • A wikilink or Markdown link to a note opens it.
  • [[Note#Heading]] opens the note scrolled to that heading.
  • [[Note#^block-id]] opens it scrolled to that block.
  • A tag searches the vault for it.
  • A footnote reference jumps to the definition.
  • A link inside an embedded note works, and opens the note it points at — not the note the embed is in.

How tables lay out

Obsidian renders a table as an HTML table, which means the browser's automatic table layout decides the columns. Scoria reproduces that with the real font metrics:

  1. Each column wants the width of its widest cell.
  2. Each column needs at least the width of its longest unbreakable word.
  3. If the sum of the wishes fits the note's width, every column gets its wish.
  4. Otherwise the slack between each column's minimum and its wish is shared out in proportion.

The practical consequence, and the reason it was worth implementing rather than giving every column an equal share: a table with one long identifier in it does not break that identifier across lines, and a narrow column does not get the same width as a wide one.

Fenced code blocks never wrap. A long line scrolls sideways inside its own block.

Long notes

The view lays out one item per top-level block, measured lazily, so only what is on screen is ever laid out. A 50,000-line note opens and scrolls like a short one.

Not yet

The gaps, honestly — none of these are in reading view today:

Not drawnWhat you see instead
Math ($x$, $$x$$)The source text, unrendered
HTML in a noteThe tags as literal text
Remote images (https://…)Nothing; local images work
Canvas and Bases filesThe file is recognized but does not open
Heading foldingHeadings do not collapse
Toggling a task checkboxCheckboxes render but are not clickable here — toggle them in Live Preview
Copy buttons on code blocksSelect and copy
PDF export—

Frontmatter edge cases match Obsidian: a <script> in a note is removed, unknown HTML elements are unwrapped, and a raw <a> gains target and rel.

Next

Source: sites/scoria/content/docs/app/reading-view.md