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
Floating popover next to your selection. Threaded replies, mark-as-done, reopen, edit, delete.
Every change propagates to every open tab in <1s via Server-Sent Events. Auto-reconnects.
Mention by GitHub login. In-app notifications with deep links to the relevant comment.
Paste a public or private repo URL. Private docs gated on every read by re-verifying your GitHub repo access.
When the upstream file gets new commits, you see a banner. Sync re-anchors comments to new content automatically.
Comments whose quoted text no longer exists surface in a dedicated section — drag-select new text to re-anchor.
BYOK Anthropic API key. Resolved comments → Claude produces a new revision; word-level diff before accepting.
Streamable HTTP at
/mcp. Agents read docs, comment, reply, resolve, and trigger revisions.Per-user
mmk_… tokens with read / write / admin scopes for scripts and agents.Deleted docs sit in Trash for 30 days. Daily purge sweep handles the eventual hard delete.
Shared URLs look meaningful in Slack, iMessage, Discord, X. Private docs share a generic card so titles don't leak.
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
| Component | Technology |
|---|---|
| Backend | Go + gorilla/mux |
| Frontend | React 19 + TypeScript + Vite |
| Database | MongoDB Atlas |
| MCP server | mark3labs/mcp-go (streamable HTTP) |
| Realtime | Server-Sent Events (in-process hub) |
| AI revision | Anthropic Messages API (Claude Opus 4.7), BYO key |
| Secrets at rest | AES-256-GCM via a per-user vault |
| Deploy | Single 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 touchedget_document— Full markdown content + metadatalist_comments— Threads on a doc, filterable by open/resolved/alladd_comment— Anchor a new thread to a verbatim substring of the docreply— Reply to an existing threadresolve_comment/reopen_comment— Lifecyclerevise_with_ai— Run Claude over the doc + selected resolved threads (preview by default,accept: trueto save as a child doc)
License
MIT — View on GitHub