markupmarkdown: Google-Docs-style commenting on Markdown files

markupmarkdown

Google-Docs-style commenting for any Markdown file. Paste a GitHub URL or upload a .md, drag-select text, leave a margin comment. Threaded replies, @-mentions, realtime sync, AI revision via Claude — and an MCP server so AI agents review alongside humans.

The problem

Markdown is where a lot of real product thinking lives now — PRDs, RFCs, design docs, release notes, prompt libraries. But the tools for reviewing it are miserable:

  • GitHub PRs force every discussion through a code-review workflow. Fine for production code, painful for a quick "this paragraph is unclear" on a brainstorming doc you haven't even branched yet.
  • HackMD / Notion / Dropbox Paper lock your content into their format, pull you out of .md, and require everyone to make an account.
  • Pasting into Google Docs drops all your formatting and now you have two sources of truth.

You just want to drag-select a sentence and leave a comment. Like Google Docs. On a real Markdown file. And in 2026 you probably also want an agent on your review team — but you don't want to give that agent your whole identity, and you definitely don't want it shipping changes without you signing off.

What it does

markupmarkdown is a small self-contained web app: one Go binary plus a React SPA plus MongoDB. Open any Markdown file by URL (raw or github.com/.../blob/.../*.md) or upload one. Drag-select text in the rendered document to leave a margin comment with threaded replies. Every change propagates to every other open tab in under a second via Server-Sent Events. Resolve threads when you're done. Hand the resolved threads to Claude and watch it produce a clean revised version. Agents can join the same review through an MCP server: they read what humans read, leave threads humans can approve, and (with explicit human sign-off) apply the resolved feedback as a new revision.

Humans + AI agents on the same documents

The MCP server at /mcp exposes the review surface to AI agents: read documents, leave threads anchored to text spans, reply to humans, resolve, and trigger AI revisions with explicit human sign-off. Agent-authored comments carry a visible bot badge so humans can scan a thread and instantly see who's whom. The same access checks, rate limits, and validation apply to MCP and REST — no agent-only fast path.

Features

Drag-select → comment
Floating popover next to your selection. Threaded replies, mark-as-done, reopen, edit, delete.
Realtime sync
Every change propagates to every open tab in <1s via Server-Sent Events. Auto-reconnects.
@-mentions + bell
Mention by GitHub login. In-app notifications with deep links to the relevant comment.
GitHub-aware ingest
Paste a public or private repo URL. Private docs gated on every read by re-verifying your GitHub repo access.
Source-change detection
When the upstream file gets new commits, you see a banner. Sync re-anchors comments to new content automatically.
Orphan re-anchor flow
Comments whose quoted text no longer exists surface in a dedicated section — drag-select new text to re-anchor.
AI revision via Claude
BYOK Anthropic API key. Resolved comments → Claude produces a new revision; word-level diff before accepting.
MCP server
Streamable HTTP at /mcp. Agents read docs, comment, reply, resolve, and trigger revisions.
Personal access tokens
Per-user mmk_… tokens with read / write / admin scopes for scripts and agents.
Soft delete + Trash
Deleted docs sit in Trash for 30 days. Daily purge sweep handles the eventual hard delete.
OG link unfurls
Shared URLs look meaningful in Slack, iMessage, Discord, X. Private docs share a generic card so titles don't leak.
BYO Anthropic key
AES-256-GCM encrypted at rest. Deletable any time. Your usage, your bill, your data.

Use cases

  • PRD review — share a `.md` PRD, have product, eng, and design leave inline comments without anyone touching a PR.
  • RFC / design doc commentary — same workflow, more rigor. Resolve threads as decisions get made; let Claude integrate the resolved feedback into a v2.
  • Release notes drafting — collaborate on Markdown release notes pulled from your repo, then push the final version back when it's ready.
  • Prompt library / SKILL.md review — review the prompt files agents will actually read, with the humans who own them, while the agents themselves can comment too.
  • README / docs polish — open any GitHub README in markupmarkdown, drag-select awkward sentences, leave comments, generate a revision.

Tech stack

ComponentTechnology
BackendGo + gorilla/mux
FrontendReact 19 + TypeScript + Vite
DatabaseMongoDB Atlas
MCP servermark3labs/mcp-go (streamable HTTP)
RealtimeServer-Sent Events (in-process hub)
AI revisionAnthropic Messages API (Claude Opus 4.7), BYO key
Secrets at restAES-256-GCM via a per-user vault
DeploySingle Fly.io machine (~12 MB Alpine image)

Self-host

Prerequisites: Go 1.25+, Node 20+, MongoDB Atlas (free tier works), a 32-byte master key.

# Clone
git clone https://github.com/jonradoff/markupmarkdown.git
cd markupmarkdown

# Backend
cd backend
cp .env.example .env       # fill in MONGODB_URI + ENCRYPTION_KEY
go run ./cmd/markupmarkdown

# Frontend (separate terminal)
cd frontend
npm install && npm run dev

Open http://localhost:4720/. Deploy to Fly with fly launch — the included Dockerfile is a two-stage build, final image is ~12 MB.

MCP integration

The streamable HTTP MCP server is exposed at /mcp. The full agent guide — conventions, identity model, rate limits, scope hierarchy — is served live at /SKILL.md (and embedded in the Go binary so the deployed URL is always in sync). Tools:

  • list_documents — Docs the calling identity has touched
  • get_document — Full markdown content + metadata
  • list_comments — Threads on a doc, filterable by open/resolved/all
  • add_comment — Anchor a new thread to a verbatim substring of the doc
  • reply — Reply to an existing thread
  • resolve_comment / reopen_comment — Lifecycle
  • revise_with_ai — Run Claude over the doc + selected resolved threads (preview by default, accept: true to save as a child doc)

License

MIT — View on GitHub