Every tool below is available on the web app and in the extension, on any page, with no account. Each answers to a single key, chosen to match Figma where Figma has an equivalent, so the muscle memory carries over. The toolbar itself drags anywhere on screen, reorders by dragging a tool, and collapses to a fan when you want the page back.
| Tool | Key | What it does |
|---|---|---|
| Move | V | Scroll and click the page underneath without drawing on it. |
| Pen | P | Freehand stroke, the fastest way to circle something. |
| Highlight | ⇧H | A translucent marker pass over anything on the page. |
| Line | L | A straight segment between two points. |
| Arrow | A or ⇧L | The same line with a head on it, for pointing at a thing. |
| Rectangle | R | A box around a region. |
| Circle | O | An ellipse from its centre out. |
| Text | T | A typed label placed directly on the page. |
| Comment | C | A pinned thread with replies, status, priority and an owner. |
| Selection | S | Select real text and comment on it, or propose an exact rewrite. |
| Area | G or F | Draw a region and attach a note to the whole of it. |
| Eraser | E | Remove strokes without clearing the page. |
| Inspector | I | Capture one element's CSS selector, styles and a prompt for a coding agent. |
| Multi-select | X | Marquee several elements and copy them as one agent task. |
| Measure | M | Pixel distances and gaps between two elements, the way Figma shows them. |
| Guide | U | Drag a ruler guide out to check alignment. Everyone on the link sees it. |
Undo and redo are ⌘Z and ⌘⇧Z, and Clear all empties the page in one step. Everything you draw is an operation in one stream, which is why a ruler guide you drag out appears on everyone else's screen too rather than staying a private overlay on yours.
A comment pin is a thread. It has replies, and it carries the fields a review actually needs to move: five statuses (open, in progress, resolved, approved, dismissed) and four priorities (low, medium, high, urgent). Assign one to a teammate or to an AI agent. @mention anyone already working on the page. Attach up to four images per comment, or paste a screenshot straight from the clipboard.
Each comment also records the browser, operating system and viewport size it was written on, so a bug report that only reproduces at one width says so without anyone having to ask.
The selection tool goes one step further. Select real text on the page, then either comment on it or write the exact replacement you want. MarkLayer renders that as a diff, and the same diff travels into the Markdown export and into an AI agent's view of the thread, so nobody retypes the correction.
Open the same link as someone else and you see each other's cursors move, with names, as the marks appear. There is no collaborator limit and no seat to buy.
Voice and video run peer to peer over WebRTC, negotiated through the same room. You get microphone and camera selection, an output device picker, a speaking indicator, and a connection-quality readout. It falls back to a TURN relay when a network refuses a direct connection. Nobody installs anything to join.
Sharing is a link. The unguessable id in it is the access token, which is why a recipient needs no account and no extension, and why there is no invite flow to sit through. You can also have MarkLayer email the link.
A link is deleted 90 days after the last time anyone opened it, and any view, comment or edit resets that clock, so an active review never expires underneath you. You can set a shorter expiry explicitly, up to 30 days, when a link should not outlive the round.
If you want more control than that, signing in with a magic link (no password) lets you claim a link, switch it between can edit and can view, set its own expiry date, and see everything you own in one dashboard. The room enforces view-only everywhere a write could land, not just by hiding the toolbar. The account is optional and free; annotating and viewing never require one.
Connect a destination from the panel on any share link. Chat destinations post on their own as annotations arrive. Issue trackers wait for you to pick a specific annotation and file it, which is what stops a review from manufacturing forty tickets nobody asked for.
| Destination | Fires | What happens |
|---|---|---|
| Slack | Automatic | Posts each new batch of annotations to an incoming webhook. |
| Microsoft Teams | Automatic | The same batch, formatted for a Teams incoming webhook. |
| Discord | Automatic | The same batch, trimmed to fit Discord’s 2,000-character ceiling. |
| Webhook | Automatic | A structured JSON body to any public endpoint you control. |
| Linear | You pick one | Files a single annotation as a Linear issue and hands you the link. |
| GitHub | You pick one | Opens a GitHub issue on a repository from one annotation. |
| Jira | You pick one | Creates a Jira issue in the project and issue type you name. |
Be clear about the direction: this is one way out. MarkLayer creates the Linear, GitHub or Jira issue and gives you the link to it, and nothing about that issue's later life comes back. If you need a comment to close when the ticket closes, you want a bug tracker, and the honest recommendation is BugHerd orMarker.io.
One detail worth knowing, because most tools do the opposite: for Linear, GitHub and Jira the API token never reaches our server. The room stores only the repository, project key or team id. The token stays in the browser of whoever set it up. A room holds five destinations at once.
MarkLayer ships an MCP server, marklayer-mcp, that turns a review into a work queue an agent can actually work through rather than just read. Install it in Claude Code with one line:
claude mcp add marklayer -- npx -y marklayer-mcp| Tool | What the agent can do |
|---|---|
marklayer_connect_room | Join a share link, by URL or by bare id. |
marklayer_room_info | Read the page under review, its viewport and its timestamps. |
marklayer_read_page | Read the page’s headings, text, links and controls with their selectors. |
marklayer_list_annotations | Backfill everything outstanding, filtered by status. |
marklayer_get_annotation | Pull one annotation in full, including the reply thread. |
marklayer_watch_annotations | Long-poll for new work and for anything handed to this agent by name. |
marklayer_acknowledge | Mark a comment in progress so the human sees it has been picked up. |
marklayer_resolve | Close a comment and post the summary as a reply. |
marklayer_dismiss | Decline a comment, with a reason that is required rather than optional. |
marklayer_reply | Ask a clarifying question without moving the status. |
marklayer_create_annotation | Leave a comment of its own, anchored to an element. |
marklayer_suggest_edit | Propose exact replacement text, shown to the human as a diff. |
The part that matters is that the human watching sees all of it happen. A comment flips to in progress when the agent picks it up, and lands as resolved with a written summary underneath. When an agent asks a question, it appears as a reply on the thread the person already has open.
Feeding it is the inspector. Point at any element and MarkLayer captures its CSS selector, its computed styles, a text fingerprint and, on a React or Vue page, the component behind it, then formats the lot as a prompt. Multi-select does the same for a whole set of elements and copies them as one task. There is also a plain HTTP API with no auth, so an assistant can mint share links for a list of URLs on its own. Seehow that compares to other tools' MCP servers.
Paste a link to a PDF or an image, or upload one up to 25MB. PDF text stays selectable, so a highlight binds to the words rather than to a coordinate, and every mark records which page it was made on. Images accept PNG, JPEG, GIF, WebP and AVIF.
One share link can hold a project of up to 50 pages, switched through a tab strip. Add a page by pasting its URL, and the Markdown export covers the whole project with a section per page.
Two tools switch off on a file, and it is better to say so than to let you find out: the element inspector and measure need HTML elements to point at, and a PDF has none. Annotations sit in a layer over the file rather than being written into it, so there is no annotated PDF to download afterwards. Readhow to annotate a PDF andhow to annotate an image for the full picture.
Preview a page at desktop, tablet or mobile width from the viewer, without touching the annotations. This is the part of MarkLayer that took the most work and shows the least: a comment binds to the element it was left on, by CSS selector with a text fingerprint as a fallback, plus a fractional offset inside that element's box. When the layout reflows or a single-page app re-renders the DOM underneath, the mark re-resolves and lands back on the right thing instead of floating off to a coordinate that no longer means anything.
Comments do not have to stay in MarkLayer. From the panel on any share link you can copy every comment, reply and highlighted selection as Markdown or download it as a .md file, with statuses, authors, device metadata and suggested edits as diff blocks. You can also export the annotated page as a PNG, which captures the live page with the drawings over it.
The web app is the main route: paste a URL at marklayer.app and MarkLayer fetches the page, overlays the canvas, and gives you the address bar as the share link before you have drawn anything. Nothing to install, for you or for the people you send it to.
The free extension exists for the pages a proxy cannot reach: anything behind a login, internal tools, and localhost. It annotates in place in the browser you are already signed into, and it asks for only three permissions (activeTab, scripting, contextMenus), none of which grant standing access to your browsing. Both routes produce the same share link, and the recipient installs nothing either way.
It captures no console logs and no network requests, which is what the $39 to $79 tier at Marker.io and BugHerd is priced for. Nothing syncs back from Jira, Linear or GitHub. Both surfaces are desktop only today, and a phone will tell you so. There is no list of your past links unless you sign in, because without an account there is nothing to look them up against. And on a PDF or an image, the inspector, measure and multi-select are off.
If every comment needs an owner, a status and a ticket in a tracker that stays in step, buy the tracker. MarkLayer is the visual feedback layer in front of it. Thefull audit of 21 feedback tools, with prices read off each vendor's own page, includes what MarkLayer does worse.
Nothing. There is no paid plan, no trial, no per-seat price, no usage cap and no feature held back for a tier that does not exist. MarkLayer is Apache-2.0 licensed, so it cannot be withdrawn from under a workflow you have built on it, and you can self-host the whole thing on your own Cloudflare account. See pricing and theaudit of what "free" means at other tools.
Paste any URL at marklayer.app and annotate the live page in your browser. No install, no account, no sign-up. Recipients of your share links don't need to install anything either.
Annotate a page