Changelog
What shipped, when, and why
Entry-by-entry notes for @lossless-group/lfm, following the
Lossless changelog conventions.
-
The measurements that justified path resolution are now reproducible, and they moved
Every default in resolve-path.ts was argued from a table nobody could re-run. The script that regenerates it is now committed — and it turns out the original count treated image embeds as navigational links, which shifted every percentage that used the corpus as a denominator. All six conclusions survive; only the digits moved.
-
Wikilinks stop needing a hand-written resolver
createPathResolver turns Obsidian path resolution into configuration instead of code — an index cascade that rescues the 28% of wikilinks written with no folder at all, a collision policy that refuses to guess, and 5µs per link so it never becomes the reason a build is slow.
-
0.5.1 — the code-fence formats are importable from JSR, which they never were
`deno.json` declared two exports where `package.json` declared six, and the four it omitted were the entire fence-format registry. Published, shipped in the tarball, and unreachable for every consumer installing from JSR — which is all nine of them. Four lines, plus a test so the two maps can't drift apart again.
-
0.5.0 — carousels, eyebrow headings, a table-of-contents contract that knows what an aside is, and the first tests
Three capabilities that were each specified separately and land together so you upgrade once: `:::image-carousel` normalized to one payload, `$$`/`&&` editorial heading blocks, and an outline that can finally tell a real section from an `###` buried in a callout. Plus 124 tests, which found a callout bug on their first run.
-
LFM gets a test suite, and the test suite immediately earns its keep
161 assertions across every plugin and every diagram handler, zero new dependencies — plus a demo page whose numbers are computed by the real pipeline at build time. Writing them found a bug that had been shipping for months: a callout nested inside a callout was never transformed.
-
Headings get an eyebrow, and the outline finally admits which ones are asides
Markdown gives you one line where editorial practice has always used three. `$$` and `&&` bind an eyebrow and a subheading to the heading they sit against — and the table-of-contents outline that shipped a release ago can now tell a real section from an `###` buried in a callout.
-
Image carousels join the standard library — and the filename timestamp turns out to be a run stamp, not a capture stamp
`:::image-carousel` normalizes into one renderer-ready payload: alias collapsed, slides extracted, order resolved. Sequence variants sort chronologically by the ISO stamp in the filename — which works because the sort is stable, and which needed to be, because that stamp records when a batch was processed rather than when each screen was captured.
-
0.4.1 — a code-fence registry that ships empty, and seven handlers that cost nothing
Diagram fences normally mean a routing table inside somebody's renderer, edited once per format and reimplemented once per site. This inverts it: remarkCodeFences knows no formats, you register what you want, and seven handlers ship without adding a single dependency.
-
0.4.0 — remarkHeadingIds: one definition of what a fragment URL says
Every heading now gets a stable, unique anchor id computed in one place, plus a document outline on the tree. This exists because the fleet had two different slug algorithms and they disagreed — the same heading produced different anchors depending on which site rendered it, and nothing deduped collisions.
-
Code fences get a format registry — YANG and JSON Schema render as trees, PlantUML needs no renderer at all
Seven fence handlers — YANG and JSON Schema render as trees, PlantUML encodes to a URL with no renderer at all, Vega-Lite parses for a client chart, Graphviz and Mermaid just claim their language. None add a dependency. The mechanism underneath ships knowing nothing: remarkCodeFences has an empty registry and you name the formats you want.
-
remarkLosslessWikilinks ships in 0.3.0 — site-resolved Obsidian wikilinks for the LFM pipeline
0.3.0 lands a new plugin that turns Obsidian's [[Page|Display]] syntax into proper hyperlinks — with one design constraint baked in: LFM never decides where a wikilink points. Sites supply a resolver function; LFM owns the syntax. The package now does internal vs external routing, anchors, alias displays, and graceful plain-text fallback for unresolved links — all behind one new option on parseMarkdown.
-
New callout features in @lossless-group/lfm
remark-callouts grew up: multi-line callouts no longer silently fall through, hyphenated type names like [!llm-response] now parse, Obsidian's foldable [!type]- syntax is supported, and the pipeline doc codifies the policy that callout bodies must support every LFM feature — directives, citations, embeds, even nested callouts.
-
Initial pass at a Lossless Flavored Markdown splash page
LFM gets its own GitHub Pages landing page — three-stage STC diagram, asymmetric hero, manuscript-flavored type, and a package boundary that won't let the splash bleed into JSR.
-
LFM Inline Link Substitutions: OG fetch foundation + `:::link-preview` / `:::link-rollup` directives end-to-end
First end-to-end vertical slice of inline link substitution — URL classifier → OG fetcher → `:::link-preview` / `:::link-rollup` directives → Astro card renderer, with all eight spec formats rendering real OpenGraph metadata on the page.
-
remark-citations plugin — hex-code footnote renumbering and structured definition parsing
-
Fixed Slides Directive Rendering in Reader Layout