Many authoring conventions, one canonical AST.
Obsidian callouts, remark-directive blocks, and (eventually) Markdoc all produce the same MDAST node. Adding a new authoring syntax means a new normalizer plugin — no consumer changes, no renderer rewrites.
CoreASTNormalization
Tables, task lists, strikethrough, autolinks — GitHub-flavored markdown enabled by default.
GFM is the floor, not the ceiling. Tables and task lists come for free; they are also the substrate for the bare-link auto-unfurl detector.
GFMTables
Block, leaf, and inline directives — :::box, ::badge, :abbr — for naming regions of content.
Directive nodes are the lingua franca your renderer dispatches on. LFM normalizers emit directive nodes from many input syntaxes so one downstream component handles them all.
DirectivesSyntax
Obsidian “> [!type] Title” blocks normalized into directive nodes — same downstream shape, two upstream syntaxes.
Authors writing in Obsidian get callout previews in their editor. Authors writing in plain markdown can use :::callout{type="warning"}. Both end up as the same :::callout directive node.
CalloutsObsidian
Hex-code footnotes get renumbered to display indices and lifted into a structured citation dataset.
Author with stable hex IDs ([^a1b2c3]); LFM renumbers them to readable indices at parse time and assembles the full dataset on tree.data.citations.ordered — parsed dates, source domains, raw text — so a Sources component can render the canonical bibliography.
CitationsFootnotes
Build-time OpenGraph enrichment. Cards and rollups carry full metadata before the page ships.
remarkOgFetcher walks the tree, finds external links and :::link-preview directives, fetches OG metadata, and annotates the AST with LinkPreviewData. Configurable cache, separate TTLs for hits and failures.
OpenGraphBuild-timeCards
A URL on its own line becomes the embedded player or rich card the author meant.
Strict matching: the paragraph must have exactly one child that is a link whose visible text equals its URL. v0.2.2 ships YouTube video / shorts / playlist and Vimeo as stable, with Loom, Spotify, and SoundCloud planned.
EmbedsYouTubeVimeo
Site-resolved Obsidian wikilinks for the LFM pipeline.
Turns [[Page|Display]] into proper hyperlinks with one design constraint: LFM never decides where a wikilink points. Sites supply a resolver function; LFM owns the syntax. Internal vs external routing, anchors, alias displays, and graceful plain-text fallback for unresolved links.
WikilinksObsidianResolver