noteloom
← Back to blogWhat's new in noteloom 0.3.0: comments, templates, and version history

28 July 2026

What's new in noteloom 0.3.0: comments, templates, and version history

Three additions this release, all built on the same store/registry primitives everything else in noteloom uses — no separate subsystem bolted on for any of them.

Comments

Select a range, leave a comment on it; click or hover the highlighted text later to view, reply, resolve, or delete it — the familiar Google Docs/Notion interaction. The built-in UI needs exactly one prop:

commentAuthorId turns on the floating toolbar's Comment button and every popover. Add showCommentsPanel for a persistent sidebar listing every thread, unresolved first. Omit commentAuthorId and pass onComment instead for full control over the composer UI.

<NoteloomEditor editor={editor} commentAuthorId={currentUser.id} showCommentsPanel />

Templates

Two kinds. A document template seeds a whole new editor — it's just a document JSON, so useEditor({ doc: template.doc }) already covers it. A block template is a reusable snippet insertable anywhere via "/", built by capturing content from a real (even throwaway) store:

Once registered, typing "/agenda" shows it in the slash menu next to every built-in block — no special-cased UI, since registerBlockTemplates hooks into the same registry every real block type does.

const agendaSnippet = captureBlockTemplate(draftStore, ['h1', 'li1']);

registerBlockTemplates(registry, [
  { id: 'agenda', label: 'Meeting agenda', keywords: ['agenda'], roots: agendaSnippet.roots },
]);

Version history

Point-in-time snapshots — periodic, manual, or both — stored in IndexedDB alongside offline persistence and templates, but in their own object store. Restoring reuses the exact same applyDocumentTemplate function templates already use, so there was no new "restore" primitive to add:

const snapshotter = createPeriodicVersionSnapshotter({ store: editor.store, docId, intervalMs: 5 * 60 * 1000 });
// ...later:
<button onClick={() => applyDocumentTemplate(editor.store, version.doc)}>Restore</button>
⚠️

Update — 0.3.1 replaced this manual pattern (and removed createPeriodicVersionSnapshotter entirely) with a self-contained <VersionHistory docId /> component: automatic capture, author attribution, and a word-level diff view. See the Version history doc and the 0.3.1 post for the current API.

🆕

All three compose freely with live collaboration and offline persistence — a comment thread, a saved template, or a version snapshot all survive a peer disconnecting or the page reloading.


Upgrading

npm install noteloom@0.3.0 — no breaking changes to the existing useEditor()/<NoteloomEditor> API. Everything from 0.2.0 (collaboration, offline persistence, voice typing, mobile support) works exactly as before; these three are additive.

The measure of a good addition isn't just what it does — it's how little the rest of the API had to change to make room for it.

Read the full docs for each — Comments, Templates, and Version history — or see all three alongside every other block and inline type on the Full example page.

Read the Comments doc
noteloom.qusere.in/playground

A real, live noteloom instance embedded inside the article. Want the full thing? Open the Playground.