Annotate any webpage in seconds. Export for ChatGPT, Claude, or Cursor. One script tag — nothing else.
<script src="https://unpkg.com/@kibkalo/tack"></script> Click an element and say what's wrong, type the replacement straight in, or push its size and colour around and watch the page update. Copy, and your agent gets the exact before and after.
Real capture, not a mockup — the tool running on an ordinary page.
You see the bug. You know exactly what's wrong. But explaining where it is? That's the hard part.
One <script> tag. Sleeps until activated — zero overhead.
Append #tack to your URL. No reload.
Say what should change — or type the new text straight in.
Copy, download, or send the review as a link.
Then reload and hit Check what was applied to see which notes your agent actually landed.
The worst thing an annotation tool can do is hand your AI the same twelve notes it already fixed. So Copy for AI exports this page's notes and clears them — with Undo, and Restore last export in the ⋯ menu if you need them back. Reviewing several pages? ⋯ → Copy all pages bundles everything into one file, grouped by URL.
Copy exports only what you annotated here. No surprise pile-up from yesterday's review of /pricing.
Walk the whole site, then bundle every note into one Markdown file, grouped by URL.
Undo on every destructive action, plus a restore for the last export. Nothing is ever deleted behind your back.
Click a headline and its current text is already in the box. Change it, and the export carries an exact replacement instead of a description. Nothing to interpret, nothing to get wrong:
Works on attributes too — alt, placeholder, aria-label, href. And the export tells your AI to apply these verbatim, and to stop and ask if the current text has moved on since the review.
Notes compress into the URL itself. Send it to a developer and they open your review on the real page — pins in place, text edits intact. No account, no backend, no install on either end. The tools that come closest need a server of theirs in the middle for this.
A designer opens your production site through the bookmarklet, marks up six things, and pastes one link into Slack. That's the entire workflow.
Tack remembers what each annotated element looked like when you flagged it. After your agent finishes, reload the page and hit Check what was applied. Elements that changed go green, ones that didn't stay amber, ones that vanished get flagged.
You get an answer in a second, without reading a diff and without trusting the summary your agent wrote about its own work. A text rewrite is checked exactly against the wording you asked for. A freeform note has nothing exact to compare against, so green there means "this element changed" — a reason to look, not proof.
Three anchors per note — element text, section heading, CSS selector — plus a protocol that says which to trust and in what order. Selectors go stale after a refactor; text usually doesn't. Your AI gets told that up front, instead of guessing. Where your dev server stamps the source file onto the DOM, that becomes a fourth anchor and goes to the top. Hand over more than one note and the file also tells the agent to reconcile them before editing and report back a checklist.
Agentation is the closest thing to Tack, and it's good. It's also a React component you install into your codebase. That single difference decides most of this table.
Swipe the table sideways to see every column →
| Tack | Agentation | Vibe Annotations | Drawbridge | |
|---|---|---|---|---|
| Install | 1 script tag | npm + edit your app | Extension + MCP | Extension |
| Framework | Any | React 18+ only | Any | Any |
| Build step | None | Required | None | None |
| Pages you don't own | Yes (bookmarklet) | No | Localhost only | Yes |
| Ship to production | Yes, dormant | Dev-only | No | No |
| Size (gzip) | 15 KB | 115 KB | Extension + server | Extension |
| License | MIT | PolyForm Shield | MIT | Custom |
| Rewrite text in place | Yes | No | No | No |
| Adjust styles, live preview | Yes | No | No | No |
| Share review as a link | Yes, no server | Needs their server | No | No |
| Verify what was applied | Yes, offline | Via MCP only | No | No |
| Multi-select | Yes | Yes | No | No |
| Agent sync loop (MCP) | Not yet | Yes | Yes | No |
| Component source file | No | Yes (React) | Yes (React/Vue) | No |
| Layout / wireframe mode | No | Yes | No | No |
Compared against agentation 3.0.2 on 2026-08-05, using its published npm package and docs; the Vibe Annotations column was re-checked against its own site and repository on 2026-08-06, which corrected two rows in Tack's favour that were wrong in ours. Sizes are gzip of the shipped bundle — gzip -c -9 tack.min.js | wc -c against the same for their dist/index.mjs. Rows marked as missing mean "not documented", not "impossible". If something here is out of date, open an issue and it gets fixed.
Until #tack appears in the URL hash, Tack registers one idle keyboard listener and stops: no toolbar, no elements added, no network requests, nothing read from the page. That's why you can leave it in a production build and review the live site — or send the link to someone who has no local checkout.
Once you activate it, it's honest about what it does: a floating toolbar in the corner, clicks and hovers caught so they annotate instead of navigate, and an overlay drawn above your page. It never rewrites or inserts content into the elements you annotate — the whole UI lives in one isolated shadow-root container appended to <body>, and marks are drawn over the page rather than inside it, so <img>, inputs and SVG survive intact. Freeze and style preview do change how the page looks while they are on, and both revert when you turn them off. Press ✕ and every trace is gone.
Tack is running on this page. Activate it and try the whole thing on us.