markupmarkdown 1.0: Google Docs for Markdown — review, check & ship .md files with humans + AI agents

markupmarkdown 1.0

Google Docs for Markdown — grown into the complete review platform where humans and AI agents ship .md files together. Threaded margin comments, review states that gate pushes, one-click suggested edits, CI-style doc checks with reusable policies, AI auto-review of every revision, and a one-click GitHub round-trip. The file in your repo stays the source of truth; humans hold the keys.

The problem

Markdown is where real product thinking lives now — PRDs, RFCs, design docs, release notes, and the files that steer AI agents: CLAUDE.md, SKILL.md, prompt libraries. But the tools for reviewing and shipping it are miserable:

  • GitHub PRs anchor comments to diff hunks — fine for code, broken for prose. You can't even comment on a sentence the diff didn't touch.
  • HackMD / Notion / Dropbox Paper pull your content out of .md and into their format — a second source of truth that drifts from the repo.
  • Pasting into Google Docs mangles the formatting and now someone hand-reconciles the review back into the file.

And in 2026 your review team includes agents. You want them reading what humans read, proposing concrete edits humans can accept in one click, and reviewing every revision automatically — but with their own identity (not yours), and never shipping anything without a human signing off.

What it does

markupmarkdown is a small self-contained web app: one Go binary, a React SPA, MongoDB. Open any Markdown file by URL (raw or github.com/.../blob/.../*.md) or upload one. Drag-select text to leave threaded margin comments. Click Edit for a native CodeMirror editor. Set a review state — approve, request changes, comment — exactly like a pull request, except anchored to prose. Attach suggested edits that render as tracked changes and apply in one click (or all at once). Define checks — required sections, banned placeholder text, exact terminology — save them as a named policy, and apply that policy across every matching doc in your org. Then push the approved revision back to GitHub as a PR or direct commit. Requesting changes, failing checks, or an unaccepted agent revision all gate that push — with an honest override for humans in a hurry.

Unlike Google Docs, edits happen on the actual markdown. No conversion, no second source of truth — the file in your repo stays canonical through the entire loop.

AI agents are first-class reviewers — humans hold the keys

Agents join through an MCP server with their own scoped tokens and visible bot badges — never your identity. They read docs, leave threads, propose one-click suggested edits, and set review states. Summon one on demand (“Request review”), subscribe it as a standing reviewer on every future revision, or flag a token as auto-review and the server itself reviews each revision with Claude within a minute — anchored suggestions, rationales, and an honest verdict, billed to your own API key. Run an agent audit across an entire markdown index (“review every _PRD with my reviewer”) in one click, and watch it all live from the ⚡ agent activity indicator. Anything an agent authors waits at a gate until a human explicitly accepts it.

CI for prose: checks, policies & gates

Deterministic lint rules for documents — required sections (picked from the doc's own headings), banned words like TBD, exact term spelling (“Beamable”, never “beamable”), heading-depth caps, and raw regex for power users — every rule live-previewed against the doc as you compose it. Save a rule set as a named policy (“PRD Standard”) and docs link to it: improve the policy once, every linked doc updates. On an index you own, map filename patterns to policies (_PRD → PRD Standard) with per-file exceptions — new matching docs pick the policy up automatically, forever. The doc's Checks button carries the verdict: green ✓ or red ✗ with the failing count. Failing checks gate the push. This is docs-as-code, fully assembled.

Markdown indexes: organize every .md across your team's repos

Paste one GitHub URL and get a shareable, filterable index of every .md in a repo, user profile, or org — scanned in parallel, cached server-side, access-gated for private repos. Save filename-filter tabs (claude.md, _PRD) for one-click navigation; pin a default for visitors. Indexes are also where org-scale governance lives: policy pattern mapping and index-wide agent audits both operate from here. Each row clicks through to the canonical doc so comments aggregate instead of fracturing.

Features

Drag-select → comment
Threaded replies, mark-as-done, reopen, @-mentions with notifications. Anchored to prose, not diff lines.
Review states + push gates
Approve / request changes / comment per revision. A requested change blocks Push to GitHub until addressed or explicitly overridden.
Suggested edits
Comments carry concrete replacements, rendered as tracked changes (red strikethrough / green insert). Apply in one click — or Apply All in one revision.
Doc checks + named policies
Preset-driven lint rules with live preview; reusable policies linked across docs; index-wide pattern mapping with exceptions.
Auto-review (AI)
Flag a token auto-review: the server reviews every revision with Claude — anchored suggestions + honest verdict — on your own key.
Review requests & standing reviewers
Summon a human or agent in one click; subscribe them to every future revision. Fulfillment is implicit — reviewing completes the request.
Agent audits
One click summons your reviewer across every matching file in an index. Watch progress from the ⚡ activity indicator.
Agent-proposed revisions
Anything an agent writes lands as proposed — pushback refuses to ship it until a human accepts. Leaked tokens can't self-accept.
Native markdown editor
CodeMirror 6: syntax highlighting, sticky toolbar, find & replace, live preview, soft edit lock. ⌘S saves a revision.
Comments survive rewrites
Fuzzy anchor recovery re-attaches comments through punctuation churn, word swaps, and reflowed sentences — conservatively, with provenance.
Push to GitHub
One click: PR from a new branch or direct commit. Drift detection + 3-way Claude merge when upstream moved.
Shareable .md indexes
Repo, user, or org → instant filterable library of every markdown file. Cached, refreshable, private-repo access-gated.
Human URLs
mumd.metavert.io/owner/repo/blob/main/PRD.md Just Works — gists too.
AI revision via Claude
Resolved threads → a clean revised version, streamed live, word-diffed before accepting. BYO Anthropic key.
Realtime everything
Comments, reviews, and checks propagate to every open tab in <1s via SSE.
MCP server + tokens
17 tools at /mcp; per-user scoped tokens (read/write/admin); live agent guide at /SKILL.md.
Revision tree
Every save is a new child doc with breadcrumbs; comments carry forward and re-anchor.
Security posture
AES-256-GCM secrets at rest, SSRF-guarded ingest, per-token audit trails, private docs re-verified against GitHub on every read.

Use cases

  • PRD review and revision — product, eng, and design comment inline; the auto-reviewer critiques each revision; checks enforce the PRD template; the approved version ships as a PR.
  • CLAUDE.md / SKILL.md governance — the markdown that steers your agents, reviewed like the production artifact it is: org-wide CLAUDE.md indexes, placeholder-text checks, agent + human review, gated pushes. See How to Write a CLAUDE.md.
  • CI for prose — map “PRD Standard” onto every _PRD in the org; every revision gets checked and auto-reviewed within a minute of saving. See Docs as Code.
  • RFC / design doc commentary — resolve threads as decisions land; let Claude integrate the resolved feedback into a v2; commit it back.
  • README / docs polish — open any GitHub README, drag-select awkward sentences, apply suggestions, 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 review & 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 ~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 (embedded in the binary, tested against drift). Seventeen tools:

  • list_documents / get_document / list_comments / list_revisions — the reading surface
  • list_review_requestscheck first each session: docs a human has summoned you to review
  • add_comment / reply / resolve_comment / reopen_comment / patch_anchor / delete_comment — threads
  • add_suggestion — comment + concrete replacement; reviewers apply in one click
  • set_review_state — approve / request changes / comment; changes_requested gates the push
  • edit_document / revise_with_ai / merge_from_github — revisions (agent-authored ones await human acceptance)
  • push_to_github — PR mode only over MCP; blocked by pending gates unless a human overrides

License

MIT — View on GitHub. See how it compares: HackMD · Notion · Obsidian · Typora · StackEdit · Google Docs · GitHub PRs · VS Code.