Markdown CollabA VS Code extension for reviewing Markdown with Claude Code (and other agentic AIs). Comments are anchored to the text and stored inline in the Three ways to use it:
You can also flip the direction and ask Claude to be the reviewer: right-click a Quick start
That's it — Claude reads the comments, edits the doc, posts a reply per thread. You toggle resolved when you're satisfied. How to use, day to dayAdding a commentOpen the Inline Comments view ( Any selection works — even a single word. Only empty or whitespace-only selections are ignored. Sending the batch to ClaudeOnce you've left one or more unresolved comments, click Send N to Claude at the top of the comments sidebar (the count updates live). The button is disabled when nothing is unresolved. Reviewing repliesClaude addresses each comment, edits the doc in place, and appends a reply with what it changed. The reply lands as a thread reply in VS Code. Toggle the thread to Resolved when satisfied; reply with more questions if not. Asking Claude to review (Claude-initiated threads)The flow above is human-to-Claude: you leave comments, Claude addresses them. v0.29 added the reverse direction — Markdown Collab: Ask Claude to Review This Doc (right-click a The extension prompts for an optional focus directive — a free-form sentence telling Claude what to look for, e.g. "check API examples for correctness" or "find marketing-y tone." Leave it blank for a general review. The last five focus directives you've used are offered in a quick-pick so you don't retype the common ones. Claude reads the doc and opens one inline-comment thread per substantive concern it finds. There's no cap on thread count — if 30 things warrant a thread, Claude leaves 30. The sidebar grows two affordances when Claude-initiated threads exist:
A thread counts as "reviewed" once you reply or resolve it; the indicator clears automatically. The detection uses the existing inline-thread JSON — no schema change, no migration needed. Files larger than 50 KB prompt a soft confirm before sending (Claude's review can use significant context on big docs). In review mode the skill never edits prose — every concern goes in a thread for you to gate. Expect "Reviewed Comments that survive doc editsComments are anchored to a text selection, not a line number. When Claude rewrites a passage that has a comment, the skill instructs it to update the anchor text to match — so comments survive revisions. If a rewrite removes the anchored passage entirely, the thread's markers go with it and the thread surfaces as unanchored in the Inline Comments view — re-anchor it by selecting fresh text and leaving the note again. The live editor (WYSIWYG + AI co-editing)Prefer editing rendered Markdown directly? Right-click a It's built for one human + Claude on the same machine — not multi-user network sync:
The comment panel matches the inline view: collapse threads, an always-on reply box, resolve, delete a single comment or a whole thread, and send one thread (or the whole file) to Claude. Reviewing pull requests / merge requestsRun Markdown Collab: Review PR / MR to review the Markdown files changed in a GitHub Pull Request or GitLab Merge Request. It uses your existing
Requires the Choosing a send modeThe Send to Claude button delivers the comment payload one of four ways. Pick one once via
Don't know which to pick? Leave Send mode details
|
| Command | Purpose |
|---|---|
Markdown Collab: Install Claude Skill |
Write ~/.claude/skills/vs-markdown-collab/SKILL.md and the bundled helpers (mdc-tail.mjs, mdc-channel.mjs). |
Markdown Collab: Initialize AGENTS.md |
Append a convention block to <workspace>/AGENTS.md (for non–Claude-Code agents). |
Markdown Collab: Open Inline Comments View |
Open the rendered view with an inline-threads sidebar. Comments are stored inside the .md file. The right-click action on .md files. |
Markdown Collab: Open Live Editor |
Open the WYSIWYG live editor with the comment panel — you and Claude co-edit the same .md (single human + Claude, no relay). |
Markdown Collab: Review PR / MR |
Review the Markdown files changed in a GitHub PR or GitLab MR via the gh / glab CLI. |
Markdown Collab: Ask Claude to Review This Doc |
Ask Claude to act as the reviewer (v0.29+). Prompts for an optional focus directive, then sends a Review Mode payload through the configured send mode. Claude opens one thread per concern; you triage in the sidebar. |
Markdown Collab: Send Unresolved Comments to Claude |
Same as the Send to Claude button — usable from palette. |
Markdown Collab: Start Claude Review Terminal |
Spawn a fresh integrated terminal and launch claude. |
Markdown Collab: Copy Claude Prompt |
Copy a short "address the comments on this file" prompt to clipboard. |
Markdown Collab: Reset Send Mode |
Clear the remembered ask choice for the current workspace. |
Settings
| Setting | Default | Purpose |
|---|---|---|
markdownCollab.sendMode |
ask |
One of ask, terminal, channel, mcp-channel, clipboard. See Choosing a send mode. |
Storage layout
Inline view (default). Threads live inside the .md file itself. Anchored spans are wrapped in paired HTML comments and threads are serialized as <!--mc:t {JSON}--> lines inside a fenced region at the end of the file:
The <!--mc:a:k7q3p-->quick brown fox<!--mc:/a:k7q3p--> jumps…
<!--mc:threads:begin-->
<!--mc:t {"id":"k7q3p","quote":"quick brown fox","status":"open","comments":[{"id":"c1","author":"ronica","ts":"2026-05-13T12:00:00Z","body":"too cliched"}]}-->
<!--mc:threads:end-->
The markers are invisible in any rendered preview (they're HTML comments). Commit the .md file as-is — review state ships with the document.
The only files Markdown Collab writes under .markdown-collab/ are runtime state for the channel send modes. Add them to .gitignore:
<workspace>/
└── .markdown-collab/
├── .events.jsonl ← channel-mode event log (gitignore)
├── .events.acked.jsonl ← addressed-event ids (gitignore)
└── .channel.json ← mcp-channel endpoint descriptor (gitignore)
.markdown-collab/
Troubleshooting
Click did nothing, no toast. Your markdownCollab.sendMode is set to a stale value (e.g., ipc from before 0.11). v0.12.1+ falls back to ask and warns; if you're on something older, change the setting to terminal.
Channel mode: tailer started, but lines don't arrive at Claude.
- Make sure you're on v0.13.1+ (uses
fs.writeSyncto flush per line). - Make sure Claude actually subscribed via
Monitor/BashOutput.TaskOutput block=truewaits for completion and will hang forever — wrong tool. - If your harness has only
TaskOutput, switch toterminalmode. Channel mode requires a streaming primitive.
mcp-channel: "Channels are not currently available." One of: Claude Code <v2.1.80, logged in with API key / Bedrock / Vertex (not claude.ai), or your org has channelsEnabled: false. Diagnose with claude /status and claude --version. Otherwise, use terminal.
A thread shows up as unanchored. The anchored passage was deleted or rewritten beyond recognition, so its markers are gone. Re-anchor it by selecting fresh text in the Inline Comments view and leaving the note again.
Development
npm install
npm run compile
npm test
Unit tests run under Vitest. The VS Code API surface is stubbed in src/test/vscode-stub.ts for tests of pure helpers.
Press F5 in VS Code to launch an Extension Development Host for manual verification.
To produce a .vsix for distribution:
npx @vscode/vsce package
Releases: bump the version in package.json, prepend a ## X.Y.Z — <date> block to CHANGELOG.md, commit, then tag vX.Y.Z and push the tag. The release workflow gates on the CHANGELOG entry's existence and pulls the section into the GitHub Release notes automatically.
Out of scope (v1)
- Real-time multi-user (multi-human) collaboration. The live editor is single human + Claude; "collab" here means human ↔ AI, not multiple people editing at once.