markupmarkdown
Google Docs for Markdown. Comment on, edit, and ship .md files like real documents. Threaded margin comments, a native CodeMirror editor with formatting toolbar and find & replace, one-click GitHub round-trip (open a PR or commit directly), 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 and editing 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 your formatting and now you have two sources of truth.
You just want to drag-select a sentence and leave a comment. You want to edit the document inline when you have a small fix in mind. And when you're done, you want one button that pushes the result back to the file in your repo. 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. Or click Edit to open a native CodeMirror editor — formatting toolbar, find & replace, live preview, ⌘S to save as a new revision. 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 for a clean revised version. Push any revision back to GitHub as a pull request or a direct commit. Agents 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.
Unlike Google Docs, edits happen on the actual markdown. No visual mirror, no second source of truth — the file in your repo stays canonical, and the round-trip back to GitHub is one click.
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, edit the doc, push to GitHub, and trigger AI revisions — all with explicit human sign-off on anything destructive. 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.
CodeMirror 6 with syntax highlighting, light/dark theme, sticky formatting toolbar, find & replace, live preview.
⌘S saves a new revision.One click pushes any revision back. Open a PR from a new branch (prefilled title and body) or commit directly to
main. Uses your OAuth token — no separate PAT.Whoever clicks Edit first holds the lock. Other viewers see a banner; releases on save, cancel, or disconnect.
When upstream changes and local edits collide, a 3-way diff surfaces clean merges, conflicts, and a per-region pick-a-side UI.
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.
Every save (manual edit or AI revision) creates a new child doc. Breadcrumbs jump between versions; the home list dedups to the latest leaf.
Streamable HTTP at
/mcp. Agents read docs, comment, reply, resolve, edit, merge, and push to GitHub.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 and revision — share a
.mdPRD, have product, eng, and design leave inline comments; make the small wording fixes inline; push the cleaned-up version back as 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; commit the result back to the repo.
- Release notes drafting — collaborate on Markdown release notes pulled from your repo, then commit 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 and propose edits.
- README / docs polish — open any GitHub README, drag-select awkward sentences, leave comments or edit inline, push the revision back as a PR.
Tech stack
| Component | Technology |
|---|---|
| Backend | Go + gorilla/mux |
| Frontend | React 19 + TypeScript + Vite |
| Editor | CodeMirror 6 + @codemirror/lang-markdown + search |
| 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 |
| GitHub round-trip | GitHub Contents + Pulls API via the user's OAuth token |
| 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— Lifecycleedit_document— Save a new manual revision (full content)patch_comment_anchor— Move a comment's anchor (or pin it doc-level)delete_comment— Remove an agent's own (or token-owner's) threadlist_revisions— Walk the revision chain of a docmerge_document— Run the 3-way merge enginepush_to_github— Open a PR or commit directlyrevise_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