Obsidian plugin · CLI · MCP server

Inline comments and suggested edits, kept inside the note.

Select a passage, leave a comment on it, and propose a replacement that applies in one click. Comments are stored in the note's own frontmatter, so they travel with the file through sync, git and export. There is no sidecar database to fall out of step with the vault.

Install itComments from an agent$ git clone github.com/zachhannum/obelisk
Obsidian with the Obelisk sidebar open on a note called Chapter 3. Three passages in the prose are underlined and marked with a dagger. The sidebar lists them in document order: an agent's comment quoting one sentence and proposing a shorter one, with the replacement shown as a diff under an Apply button; a comment from a person with a reply beneath it; and a comment already resolved.Obsidian with the Obelisk sidebar open on a note called Chapter 3. Three passages in the prose are underlined and marked with a dagger. The sidebar lists them in document order: an agent's comment quoting one sentence and proposing a shorter one, with the replacement shown as a diff under an Apply button; a comment from a person with a reply beneath it; and a comment already resolved.

A note under review: an agent's proposal, a thread, and a passage already settled

An obelus was the mark an ancient editor drew in the margin of a manuscript to say: this passage is disputed.
Which is the whole plugin

Three front ends

One format. Read it from anywhere.

The storage format is the interface. Anything that can edit a file can leave a comment the plugin will render, so the same comments are reachable from inside Obsidian, from a shell, and from a model.

Plugin

Obsidian

Highlights in the editor, a sidebar in document order, threaded replies, and a composer that is Obsidian's own markdown editor, Cmd+B and [[ autocompletion included.

Command line

obelisk

Four verbs (list, comment, reply, resolve) over the same core. Writes touch frontmatter only and leave the body byte-identical, so they are safe while the note is open.

Model Context Protocol

obelisk-mcp

The same four verbs as MCP tools. Ask the agent you already have open to review a note, and its remarks appear in the sidebar of the note you are already reading.

Storage

Plain YAML, in the file it is about.

Everything lives under one frontmatter key. It is readable, diffable, and it survives a rename, a sync, and a git merge with no extra machinery. Unknown keys are put back on a round-trip, so a newer version's fields are never stripped by an older one.

Migration is a read-time fold rather than a sweep, so a vault that is only ever read is never dirtied.

chapter-3.md
---
title: Chapter 3
obelisk_schema: 3
obelisk:
  - id: cq7fk2m9x
    author: claude
    origin: { kind: agent, model: claude-opus-5, run: r7k2mq }
    created: 2026-08-29T14:02:11.000Z
    body: |-
      The relative clause is doing no work here.

      ```suggestion
      The horse bolted.
      ```
    anchor:
      from: { line: 12, col: 0 }
      to: { line: 12, col: 47 }
      quote: The horse, which had been standing there, bolted.
---

Anchoring

The quote is the anchor.

A comment attaches by searching the note for the exact text it was written on. Nothing fuzzy-matches, re-finds, or scores a near miss. An edit anywhere else in the note leaves it attached, whether that edit happens in Obsidian, in another editor, or in a git merge, because the quote is still the quote.

Quote found

…and by the time Marta reached the crossing, the horse, which had been standing there, bolted.

zach

Two clauses fighting over one sentence.

Quote gone

…and by the time Marta reached the crossing, the horse bolted.

zach

Two clauses fighting over one sentence.

† Detached. The quoted passage is no longer here

A comment whose passage is gone says so, in the sidebar, highlighting nothing. It never guesses at a new home and it never quietly disappears. Restore the text and it reattaches on its own, because detachment is derived on every read and never written down.

comment body
Two clauses fighting over one sentence, and the
first one never earns its keep.

```suggestion
The horse bolted.
```

Happy to be talked out of it; see the note in ch. 2.

Suggested edits

A proposal is markdown, not a field.

A suggested edit is a fenced suggestion block inside an ordinary comment, the way GitHub does it. It renders as a word-level diff against the quoted passage with an Apply button, so one comment can explain itself and propose the change at once, and a reply can offer a counter-proposal.

Applying refuses if the underlying text has changed since the proposal was written. That condition is the same one that decides whether the comment is attached at all, so a splice always lands on exactly the characters the commenter read.

How suggestions work

Agents

A review pass that lands in your sidebar.

A model reviews a note and its remarks appear as comments on the passages they are about, badged, with the whole pass behind one filter chip and one dismissal. Or you leave the comments and ask a model to read them, make the edits, and resolve them.

the CLI
$ obelisk list chapter-3.md
$ obelisk comment chapter-3.md \
    --quote "The horse, which had been standing there, bolted." \
    --body  "The relative clause is doing no work here." \
    --run   r7k2mq

comment cq7fk2m9x written to chapter-3.md
the MCP server
$ claude mcp add obelisk --scope user -- \
    node "$PWD/dist/mcp.mjs" --vault /path/to/vault

obelisk_list      obelisk_comment
obelisk_reply     obelisk_resolve

There is no way to pass a line or a column. A model asked for one will produce a plausible wrong number, and a plausible wrong number attaches a comment to the wrong paragraph without ever looking like an error. The quote has to appear in the note character for character; if it does not, nothing is written and the tool says why.

The rest of it

Everything else it does.

Markdown everywhere

Comments and replies render as real markdown: links, lists, callouts, embeds and math, exactly as they would in a note.

The editor you already use

Comments are written in Obsidian's own embedded editor, so shortcuts, list continuation and live preview behave as they do anywhere else.

Threaded replies

On any comment, stored alongside it, and markdown all the way down, suggestion blocks included.

Highlighting in the text

Commented passages carry an underline and a † that opens the comment in the sidebar. Overlapping comments nest.

Resolved, not hidden

A settled comment stays in the list, greyed, because it still marks its passage in the note. The Open filter is one chip away.

Undo instead of confirm

Deleting a comment, a single reply, or a whole agent pass offers an undo rather than a dialog asking whether you meant it.

Editable

Rewrite a comment in the composer that wrote it. The anchor is left alone: changing what you said never changes what you said it about.

Safe from outside

An external write re-reads the file first and refuses if it changed underneath, so a pass cannot lose an edit you were making.

Forward-compatible

A schema version sits beside the comments, and a malformed entry is dropped with a warning rather than taking the sidebar down.

Put the argument next to the sentence.

Obelisk is pre-release: not yet in the Obsidian community plugin directory, and not yet published to npm. Building it from source is a clone, npm install, and npm run build.