markupmarkdown: Google Docs for Markdown — comment, edit & ship .md files

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

Drag-select → comment
Floating popover next to your selection. Threaded replies, mark-as-done, reopen, edit, delete.
Native markdown editor
CodeMirror 6 with syntax highlighting, light/dark theme, sticky formatting toolbar, find & replace, live preview. ⌘S saves a new revision.
Push to GitHub
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.
Soft edit lock
Whoever clicks Edit first holds the lock. Other viewers see a banner; releases on save, cancel, or disconnect.
3-way merge
When upstream changes and local edits collide, a 3-way diff surfaces clean merges, conflicts, and a per-region pick-a-side UI.
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.
Revision tree
Every save (manual edit or AI revision) creates a new child doc. Breadcrumbs jump between versions; the home list dedups to the latest leaf.
MCP server
Streamable HTTP at /mcp. Agents read docs, comment, reply, resolve, edit, merge, and push to GitHub.
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 and revision — share a .md PRD, 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

ComponentTechnology
BackendGo + gorilla/mux
FrontendReact 19 + TypeScript + Vite
EditorCodeMirror 6 + @codemirror/lang-markdown + search
DatabaseMongoDB Atlas
MCP servermark3labs/mcp-go (streamable HTTP)
RealtimeServer-Sent Events (in-process hub)
AI revisionAnthropic Messages API (Claude Opus 4.7), BYO key
GitHub round-tripGitHub Contents + Pulls API via the user's OAuth token
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
  • edit_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) thread
  • list_revisions — Walk the revision chain of a doc
  • merge_document — Run the 3-way merge engine
  • push_to_github — Open a PR or commit directly
  • 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