in-page feedback · for the web

Point at
the problem

Stakeholders drop pinned, threaded comments straight onto the page. The screenshot, the URL and the element come attached. No more "the button on the thing looks wrong".

How it works

Three steps, no host-app rewrite

  1. Drop in the widget

    One script tag or one component. It renders in a shadow root, so it cannot inherit or leak a single style from the host page.
  2. Anyone leaves a pin

    Click anywhere on the page. Markup captures the element, the route and an optional annotated screenshot, then opens a thread on the spot.
  3. Triage in the dashboard

    Threads stream in live. Reply, mention a teammate, resolve. The digest lands in Slack, so nobody chases screenshots in DMs.
Works withScript tagReactVueSolid

Install

One script tag is the whole integration

No build step, no host CSS to reconcile, no framework coupling. The install guide has the React, Vue and Solid variants of the same call, and the version is pinned so a future major release can't change your page without you.

Read the install guide
html
<script type="module">
  import { init } from 'https://esm.sh/@pixelmatters/markup@1.31.5'

  init({
    apiUrl: 'https://your-deployment.convex.site',
    apiKey: 'markup_…',
  })
</script>

For agents

Your agent reads the feedback

Markup speaks the Model Context Protocol. Point Claude Code or Cursor at a project and it resolves the route it's editing, reads what people reported about that page, and acts on it before touching the code.

  • list_threads
  • get_thread
  • search_comments
  • reply_to_thread
Set up the MCP server
  • OAuth 2.1, no pasted keysA client registers itself and the user approves it in the browser.
  • Never more than the personAccess is re-resolved from live project membership on every call.
  • Scoped to one projectAn agent sees the threads for the project it was authorised against.

good is not good enough

Feedback is the shortest path to craft. Collect it from the people who use what you build, on the page, with the screenshot and the element already attached. Then reply where the work happens.