Turn any website into a collaborative review board.

One <script> tag turns your live page into a review surface. Highlight, draw, pin and comment — anchored to the real content, saved in the browser, shared as a single JSON file.

>_ <script src="https://cdn.jsdelivr.net/npm/@reviewjs/annotate/annotate.js" defer></script>

↑ This page is live — select a sentence, press R to draw, P to pin, A for comments.

yoursite.com/launch-plan
GO-TO-MARKET

Q3 launch plan

We open with a two-week teaser, then give early access to our waitlist of 12,000 subscribers before the public announcement.

Paid social runs alongside, with the hero video as the centerpiece across every channel.

2
JD
Jane Doe
2m ago · highlight
#2

Can we pull the waitlist email a week earlier? Momentum matters.

Reply…
Drops into anything that renders HTML
ReReact NxNext.js VuVue SvSvelte WPWordPress WfWebflow ShShopify
01 — The tools

Feedback that points at the real thing

Screenshots go stale and chat threads lose context. Six tools keep every note attached to the exact pixel, paragraph or region it’s about — each carrying its own threaded comment.

H

Highlight

Select any text to highlight and comment on the exact words — re-anchors even after edits.

Text-aware anchors. Stores the selected quote plus nearby context so feedback follows copy changes instead of becoming a dead screenshot.

R

11Rectangle

Draw a box around any region — a misaligned button, a whole section, anything.

Region-level markup. Captures the exact page area for layout, spacing, alignment, and responsive QA notes.

C

12Circle

Ring anything that needs a closer look. Each mark carries its own colored thread.

Visual callouts. Pulls attention to specific details such as icons, image crops, labels, badges, and small design misses.

P

Pin

Drop a precise point marker on a single pixel and attach a note to it.

Pixel-precise notes. Best for tiny targets: typos, broken links, awkward tap areas, and one-off UI defects.

D

Freehand

Sketch directly over the design when words won’t do — ink it in.

Drawn direction. Adds rough paths, crop lines, arrows, and markup shapes without switching to a design tool.

+

Section note

Hover any paragraph or heading for a comment button in the margin.

Block comments. Attaches discussion to a heading, paragraph, or content block when the feedback is about the whole section.

02 — Why reviewjs

The right amount of tool

It lives in the browser and exports JSON. Add a feedback endpoint to receive comments directly, or your own backend to collect every reviewer’s comments in one place.

~40KB
Minified + gzipped
0
Dependencies
1
Script tag to install
100%
Local by default

One script tag

No build step, no framework, no signup. Paste a line, reload, review.

Works everywhere

Plain HTML, React, Vue, Svelte, WordPress, Webflow, Shopify, static sites.

Local-first & private

Without a backend, comments stay on the reviewer’s device until they export or send feedback.

Portable

Reviewers export feedback as JSON and send it; you import it with one click.

Polished UI

Floating toolbar, Figma-style comments panel, auto light/dark, full shortcuts.

Dependency-free

Vanilla JavaScript, zero runtime dependencies, every evergreen browser.

Tracked to done

Mark comments Open, In progress, Resolved or Won’t fix, assign them, and see each one’s history.

Optional backend sync

Point it at a server you host and every reviewer’s comments land in one review. Invite links, no accounts.

Smart re-anchoring

Notes that survive your edits

Each text annotation stores the exact quote plus a short prefix and suffix. On load it re-finds that text, so highlights stay put even after you rewrite copy or the layout reflows. Delete the text entirely and the comment is kept, gracefully marked “orphaned.”

v1 the quick brown fox jumps
↓ you edit the paragraph
v2 a very quick brown fox leaps
✓ comment re-anchored automatically
03 — Sharing

Your feedback never leaves the page

No server and no database required — by default every comment is saved to localStorage on the reviewer’s own device. Sharing is one explicit, privacy-friendly round-trip.

REVIEWER’S BROWSER

Highlight, draw, pin and comment. Notes are saved locally, instantly.

review.json
YOUR BROWSER

Click Import, pick the file — every note reappears anchored in place.

Optional · self-hosted

Or collect every comment on your own server

Set data-api and data-review-id, and comments sync to a server you run. Reviewers join through an invite link and see their own notes plus your replies; you see all of them. Changes made offline are queued and sent when the connection returns.

Start from the dependency-free reference server. Leave both attributes off and nothing is sent anywhere.

<script
  src="https://cdn.jsdelivr.net/npm/@reviewjs/annotate/annotate.js"
  data-api="https://reviews.example.com"
  data-review-id="homepage-redesign"
  defer
></script>
04 — How it compares

The whole category is rented. This one you own.

Every major visual-feedback tool is paid SaaS that asks your reviewers to log in, install an extension, and trust a vendor to host your feedback. annotate.js is the local-first, open-source alternative.

annotate.jsBugHerdMarker.ioUserbackPastel
PriceFree · MITfrom ~$39/mofrom ~$39/mofrom ~$79/mofrom ~$29/mo
Open sourceYesNoNoNoNo
Reviewer login requiredNoneAccountAccountPortalGuest friction
Install1 script tagExtensionScript + extensionSDK / widgetProxy / link
Where feedback livesYour browser or your serverVendor cloudVendor cloudVendor cloudVendor cloud
Works offline / self-hostYesNoNoNoNo
Visual tools (draw/pin/ink)Full setPin + boxPin + boxPin + drawPin + box
Runtime dependenciesNoneHosted appHosted appHosted appHosted app

Competitor pricing and capabilities are approximate, based on publicly listed 2026 plans, and change often. The honest trade-off: SaaS tools add hosted sync, real-time multiplayer and built-in Jira/Asana integrations. annotate.js can sync to a backend you host, and leaves the rest to your own workflow. annotate.js is for teams who’d rather own a tiny, private layer than rent a heavy one.

05 — Who it’s for

One layer, many reviews

Anywhere people need to point at a page and say “this, right here.”

Design

Design QA

Box misalignments and circle off-brand color on the staging build before a release ships.

Agencies

Client feedback

Let clients mark up the staging site directly — no Loom, no spreadsheet of bugs, no logins to chase.

Content

Copy editing

Editors highlight sentences and leave revisions in context, on the live article, not in a separate doc.

Docs

Docs review

Readers flag confusing steps right on the published page, where the confusion actually happens.

QA

Bug triage

Pin the exact element, attach a note, and export the batch straight to your tracker.

Teaching

Critique & grading

Annotate student work and portfolios with threaded, resolvable comments — private to each machine.

06 — Anywhere

One rule everywhere: load it once, after render

It’s a plain browser script, so the recipe is the same for every stack. Copy, paste, ship.

…and more: Angular Astro Squarespace Static sites Plain HTML Anything with a browser
Make it yours

Configured with plain data-attributes

No config files, no init code. Set a brand color, a project namespace, a default theme and a reviewer briefing — all on the script tag itself.

  • data-accent — match your brand in one hex code.
  • data-theme — light, dark, or auto (it sniffs your page background).
  • data-project — keep separate sites’ comments cleanly apart.
  • data-note — brief reviewers on exactly what to look at.
index.html
<!-- one tag, fully configured -->
<script
  src="https://cdn.jsdelivr.net/npm/
       @reviewjs/annotate/annotate.js"
  data-project="marketing-site"
  data-accent="#6d28d9"
  data-theme="auto"
  data-position="bottom-right"
  data-note="Focus on the hero copy
       & pricing — flag anything off-brand."
  defer
></script>
Questions

Good things to know

Where are comments stored?
In the reviewer’s own browser via localStorage, namespaced by project and page. Reviewers can export JSON, or use Send feedback if you configure an endpoint. Sending happens only when they choose it. If you set data-api, comments sync to your own review backend instead.
Does it work with my framework?
Yes. Use the plain browser script, or import the ES module and call init(config) after mount and destroy() on unmount. Recipes for React, Next.js, Vue, Svelte, WordPress and plain HTML are in the README.
What happens if the underlying text changes?
Each text annotation stores the exact quote plus a short prefix and suffix. On load it re-finds that text, so notes survive copy edits and layout reflows. If the text is deleted entirely, the comment is kept but shown as “orphaned” rather than silently lost.
Can I show it only on staging, or only to editors?
Yes. Load the script conditionally — e.g. only on a staging domain, or only for logged-in editors. Since it’s one tag, you control exactly when and where it appears.
What does it cost?
Nothing. annotate.js is open source under the MIT license, free for personal and commercial use. No seats, no projects limit, no trial clock.
Can I collect comments from many reviewers in one place?
Yes, with a backend you host. Add data-api and data-review-id to the script tag, and every reviewer’s comments sync to it. Reviewers join through an invite link or your own auth. Each reviewer sees only their own comments and your replies; as the review owner you see everything, set statuses and assign work. The repository includes a dependency-free reference server to start from.
Which browsers are supported?
Every modern evergreen browser — Chrome, Edge, Firefox and Safari. It uses standard DOM APIs only, with no polyfills, and gracefully no-ops where localStorage is unavailable (private mode, sandboxed iframes).
07 — Get started

Put a review layer on your site today

Copy one script tag, reload, and start marking up the live page. No build step, no framework, no signup.

Need a receiver? See the Node sample.

>_ <script src="https://cdn.jsdelivr.net/npm/@reviewjs/annotate/annotate.js" defer></script>
Read the docs

Local by default · every evergreen browser · no account required

Copied to clipboard