MarkLayer features
On this page
- The 16 annotation tools
- Comments that behave like work, not like sticky notes
- Real-time collaboration, voice and video
- Sharing, access control and how long a link lives
- Send feedback to Slack, Teams, Linear, GitHub, Jira, Trello, Notion and more
- What an AI coding agent can do with a link
- PDFs, images and multi-page projects
- Marks that survive a responsive reflow
- Getting the feedback out
- The web app, the extension and a script tag
- What MarkLayer does not do
- What all of this costs
- Frequently asked questions
- Read next
The 16 annotation tools
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.
Comments that behave like work, not like sticky notes
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.
Some bugs are easier to show than to describe, so a comment can also carry a video note: up to two minutes from the camera or the screen, transcribed so an agent reading the room can act on what was said. When the notes pile up, the board in the annotation panel lays every one out by status, and you can change a card's status or assignee from its menu.
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.
Real-time collaboration, voice and video
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, access control and how long a link lives
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, rather than by hiding the toolbar. The account is optional and free; annotating and viewing never require one.
A link you own can also take a password. Anyone opening it, including an agent connecting over MCP, has to enter it first, and repeated wrong guesses are throttled. Changing or removing the password signs out everyone who had unlocked it, so it works as a way to cut access after a review, not only before one.
Send feedback to Slack, Teams, Linear, GitHub, Jira, Trello, Notion and more
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. |
| Zapier | Automatic | The same JSON to a catch hook, to start a Zap. Needs a paid Zapier plan. |
| 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. |
| Trello | You pick one | Adds a card to the list you name from one annotation. |
| Notion | You pick one | Files one annotation as a page under the Notion page you name. |
| ClickUp | You pick one | Files one annotation as a task in the ClickUp list you name. |
This is one way out. MarkLayer creates the issue, card, page or task 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 or Marker.io.
Unlike most tools, MarkLayer never sends the API token for Linear, GitHub, Jira, Trello, Notion or ClickUp to its server. The room stores only the repository, project key, list or page id. The token stays in the browser of whoever set it up. A room holds five destinations at once.
What an AI coding agent can do with a link
Every share link is also an MCP server, at the same address plus /mcp. It turns a review into a work queue an agent can actually work through rather than just read, and connecting Claude Code needs nothing installed:
claude mcp add --transport http marklayer https://marklayer.app/s/<id>/mcpThe Details panel on every link shows that command with the id filled in, and the MCP setup pagehas the same for Claude, Codex, Cursor and VS Code. For a client that only runs local servers, the same tools ship on npm as marklayer-mcp, installed once for every room:claude mcp add marklayer -- npx -y marklayer-mcp.
| Tool | What the agent can do |
|---|---|
marklayer_read_page | The page's headings, text, links and controls, each with the selector that finds it. |
marklayer_room_info | The URL under review, the viewport it was annotated at, and timestamps. |
marklayer_list_annotations | Everything left on the page, filtered by status. |
marklayer_get_annotation | One annotation in full, with its reply thread and any attached images. |
marklayer_get_feedback | One read of the room: counts by status, open items, checklist progress, poll tallies. |
marklayer_watch_annotations | Wait for new comments, and for anything assigned to the agent by name. |
marklayer_acknowledge | Flip a comment to in progress so the reviewer sees it was picked up. |
marklayer_resolve | Close a comment and post what changed as a reply. |
marklayer_dismiss | Decline a comment. The reason is required, and the reviewer reads it. |
marklayer_reply | Ask a question on the thread without moving its status. |
marklayer_create_annotation | Leave its own comment, pinned to an element, one per finding. |
marklayer_suggest_edit | Propose exact replacement text, shown to the reviewer as a diff to accept. |
marklayer_share_preview | Open a review room on a preview URL and return the link to send a human. |
marklayer_set_next_steps | Publish a checklist of planned changes, each tied to the comments it answers. |
marklayer_complete_next_step | Tick a step off while the reviewers watch. |
marklayer_ask | Put a multiple-choice question to the room and read the votes back. |
marklayer_connect_room | Switch to another share link by URL or id. |
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.
It works the other way too. When an agent has built something, it can open a review room on the preview URL and send you the link instead of describing the change. A later preview of the same repository and branch becomes the next version of that room, and reviewers step between versions. The agent can post its plan as a checklist that ticks off as the work lands, and ask the room to vote when it needs a decision rather than an opinion.
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.
PDFs, images and multi-page projects
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.
Marks that survive a responsive reflow
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.
Getting the feedback out
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, the extension and a script tag
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.
The third route is for your own site. Paste one script tag into a page, or into every page of a project, and visitors comment on the live site itself, with no extension and no account. Copy the tag from the share popover, which also notes what a strict Content Security Policy has to allow.
What MarkLayer does not do
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, GitHub or Trello. 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.
What all of this costs
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.
Frequently asked questions
- How many annotation tools does MarkLayer have?
- Sixteen, and every one of them is free. Move, pen, highlight, line, arrow, rectangle, circle, text, comment, selection, area, eraser, inspector, multi-select, measure and guide. Each has a single-key shortcut, and the toolbar can be dragged anywhere on screen and reordered to suit how you work.
- Can MarkLayer send annotations to Jira, Linear, GitHub or Trello?
- Yes. Open the panel on a share link, connect Linear, GitHub, Jira or Trello, then file any single annotation as an issue and MarkLayer hands you the link to it. This is one way out: MarkLayer creates the issue, and nothing about that issue flows back. Slack, Microsoft Teams, Discord and a plain JSON webhook work differently, posting every new batch of annotations automatically. A room can hold five destinations at once.
- Do the Jira, Linear, GitHub and Trello tokens get stored on your server?
- No. For the four issue trackers, the room stores only the parts that are not secret, such as the repository name or the project key. The API token stays in the browser of whoever set it up and is sent straight to Linear, GitHub, Jira or Trello when they file something. Chat webhooks are different: the webhook URL is the credential, so it is stored with the room, and anyone holding the share link can see its last four characters and remove it.
- What can an AI coding agent do with a MarkLayer link?
- 17 things, over MCP. An agent can join the room, read the page, list and watch annotations, acknowledge one so the human sees it is being worked on, resolve it with a summary, dismiss it with a reason, reply with a question, leave comments of its own, propose an exact text edit rendered as a diff, open a review room on a preview it built, publish a checklist of planned changes and tick it off, and put a poll to the reviewers. Every share link is the server, at its own address plus /mcp, so connecting needs nothing installed: claude mcp add --transport http marklayer https://marklayer.app/s/<id>/mcp. The same tools ship on npm as marklayer-mcp for clients that only run local servers. Setup for Claude, Codex, Cursor and VS Code is at marklayer.app/mcp.
- Can I get my comments out of MarkLayer?
- Yes, two ways, both in the panel on the right of any share link. Copy or download every comment, reply and highlighted selection as Markdown, where a suggested edit arrives as a fenced diff block that pastes straight into a ticket or a coding agent. Or export the annotated page as a PNG, which captures the page and the drawings over it.
- Does a comment have a status and an owner?
- Yes. Every comment carries one of five statuses (open, in progress, resolved, approved, dismissed) and one of four priorities (low, medium, high, urgent). You can assign it to a person or to an AI agent, @mention anyone already working on that page, and attach up to four images per comment. Approved is the one status an agent never sets: it is the person who asked for the change confirming the fix.
- Do I need an account to use any of this?
- No. Every feature on this page works with no sign-up, no email and no install, for you and for anyone you send a link to. An optional account exists if you want it: sign in with a magic link and you can claim your links, switch one to view only, set its expiry and see them all in one dashboard. Nothing behind the account costs money, and nothing in front of it is degraded to sell it.
- Does MarkLayer work on more than one page at a time?
- Yes. A share link can hold a project of up to 50 pages, each with its own annotations, switched through a tab strip at the top of the viewer. Add a page by pasting its URL. The Markdown export covers every page in the project in one document, with a section per page.
Read next
Try MarkLayer
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