{"_id":"@perpetio/redline","_rev":"20-660fbad697623f9dc36a7d28e370ef8c","name":"@perpetio/redline","dist-tags":{"latest":"2.4.0"},"versions":{"2.1.1":{"name":"@perpetio/redline","version":"2.1.1","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","_id":"@perpetio/redline@2.1.1","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"homepage":"https://redlinejs.com","bugs":{"email":"hello@redlinejs.com"},"bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"dist":{"shasum":"e922b2124abe8c9e372cb767b13e04bf79e93277","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.1.1.tgz","fileCount":15,"integrity":"sha512-oPVDil/xeIgIowcJjlQ+Lpd07HTonR5Cel/yqJckxKhP/d00U6J1/yTyv3qbT4JkP4SNwtkIN70N4c77JTQE5Q==","signatures":[{"sig":"MEUCIQC+eeiD0If5NSS8HrtcS7XiVFbCDOnShjXwI2WQLq5l9gIgeN1dXnsA6nkpBqd4FWZH9SZG12O/mMUYcAM3G5CbY6c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDs4yAnFqM7ahgs57xpaPkoy1Bu3s0YKR71GgjAkTrtQAIhAJpaAeqVpQHTV5xwfr30GJqNo/+HZz8/Rvkbonposjo8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795481},"main":"redline.js","types":"redline.d.ts","unpkg":"redline.js","module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"gitHead":"2a39b328c52f2ff78c124e250770f8e0b26edef9","_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"jsdelivr":"redline.js","_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/redline_2.1.1_1794605139383_0.24025215257803467","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"@perpetio/redline","version":"2.1.2","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","_id":"@perpetio/redline@2.1.2","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"homepage":"https://redlinejs.com","bugs":{"email":"hello@redlinejs.com"},"bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"dist":{"shasum":"81614d6fee99f536c34521e9fbc593cf2e60ebe1","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.1.2.tgz","fileCount":15,"integrity":"sha512-OmlHvNAkHJ5HX3afTTfrJMm7p1YMvEhkVzRE0NIV8p9qWb5aLEJ/uY6ebM/n9iUkZ662Kp5Tx7j2Jv89qBhLwg==","signatures":[{"sig":"MEUCIBYvfKo//+UDtsVB8hD86KjhbghCBf/gGckwd8/S6BPiAiEA69Tx2LLdqBt1bHiFFOFAxT7zLvsHd2My7FEBJzMnSPI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC8ZF3nePex5RhoEKUkH9bRDxgs+Wq/UmMgb4hTf823swIhAL49k1AL276XNIAwEK2rFxfkQ2orV8YDAEzKBxRk7SZm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":801127},"main":"redline.js","types":"redline.d.ts","unpkg":"redline.js","module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"gitHead":"b467332181a04c42b706b4b1c7def1c96c796221","_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"jsdelivr":"redline.js","_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/redline_2.1.2_1794642154100_0.5517396315269383","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@perpetio/redline","version":"2.2.0","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","_id":"@perpetio/redline@2.2.0","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"homepage":"https://redlinejs.com","bugs":{"email":"hello@redlinejs.com"},"bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"dist":{"shasum":"0fe9451ab18e2916cef06c07eeb11dd33069df8d","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.2.0.tgz","fileCount":15,"integrity":"sha512-AftmnoLxUonnDqniR/enQRojjmrW5coeZxfF5tUqlLwxgOJu4BDcvnYiPW9iYI0HumSig0WYQ+sNe1Lx+D345w==","signatures":[{"sig":"MEUCIAEgciYP5/BeZQjV05q203qxgk37r/P5Pz+XpgLQw3s3AiEA+YN73C9t2WR6igYwxFFSzXkKE2dP9T8jlXtr0HnS+qA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDytRysd6hEFZMVGhDFftyb8urrt1fEH68RX/xB0md/lAIhAOBq2M6nbd+aQ3efxsueSVbhaCwHLVoa0vEIDC4qLzFq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806298},"main":"redline.js","types":"redline.d.ts","unpkg":"redline.js","module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"gitHead":"7ad23bc461c757a6cbd141bb1bf9d60288ee0e65","_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"jsdelivr":"redline.js","_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/redline_2.2.0_1794653735407_0.8897981103984163","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@perpetio/redline","version":"2.2.1","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","_id":"@perpetio/redline@2.2.1","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"homepage":"https://redlinejs.com","bugs":{"email":"hello@redlinejs.com"},"bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"dist":{"shasum":"8f1e8abb2bb499a8ac0540c82acdec5f06e40b65","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.2.1.tgz","fileCount":15,"integrity":"sha512-boEOd8oWxQ8toR9NIZtml+K6pPW1BpaGqNF6kRg/93GBNFqaQQZOP3J9NKtyop93lLMGq7thIFPVIZiEDhiYgQ==","signatures":[{"sig":"MEUCIQDnmLHFPqMEyDSTIIUg2m4NFBDKBUwpak2ACI1c9dVS/QIgemXmlwTPM5X3zKnDQMRXU6rr7/2q59RiuEFAMuseagc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDt/smF8pflbaR4v+dGcoygmGi1ZE6S4ZfEC2WDo1gOSAiEA+6xJVa444fOf4+X379GgGWEoj3iy7y00WuzA8Ey1ODI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":807994},"main":"redline.js","types":"redline.d.ts","unpkg":"redline.js","module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"gitHead":"b8385965002cc6a6bbe3daf32c56a67a403a64ff","_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"jsdelivr":"redline.js","_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/redline_2.2.1_1794656151746_0.8758947821239405","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"@perpetio/redline","version":"2.2.2","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","_id":"@perpetio/redline@2.2.2","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"homepage":"https://redlinejs.com","bugs":{"email":"hello@redlinejs.com"},"bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"dist":{"shasum":"6a94b9272c313258647e3e2e2cfe8ea6a6fd1273","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.2.2.tgz","fileCount":15,"integrity":"sha512-Rnkl9TN38uOpOa59HQA9M6dBVR4/YMrfZEAdl5deJF6vAp7pOYb6BEe3uq+UFLWKU09qTKWVaX+W0lZd2sj37A==","signatures":[{"sig":"MEQCIDqU1ocfjDXuZY7iycT9r+boKyn3GEEuNm6r/EYM2jWbAiAGuEfa0xsI8ASS0iU6s+wP0uxZZYgheBwCWizCLyN6Qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBfE56oJ/ohWXy71CYXN4rP/Sc9V11cxkhvwcPw8f0lLAiEA4I3emloZyEABuAj1R8lUe0ju22SmQukBdYDHH4uQLOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":810233},"main":"redline.js","types":"redline.d.ts","unpkg":"redline.js","module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"gitHead":"779f8163bd8dbd01870db06b525c3b1a17512b1f","_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"jsdelivr":"redline.js","_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/redline_2.2.2_1794669912999_0.8900610294939671","host":"s3://npm-registry-packages-npm-production"}},"2.2.3":{"name":"@perpetio/redline","version":"2.2.3","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","_id":"@perpetio/redline@2.2.3","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"homepage":"https://redlinejs.com","bugs":{"email":"hello@redlinejs.com"},"bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"dist":{"shasum":"8b47d78444219a396c7f7b5d94b6cf6872a62345","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.2.3.tgz","fileCount":15,"integrity":"sha512-cbBAsMzYm/KErrQpr+YwAEalxG/i2SuMSf/NkI8rtnoD18K1Aq8oLD4nCJXWPD9UJCQf5nbiOZJAe6LwIXeshg==","signatures":[{"sig":"MEYCIQDUfdMtY4zIAL1uaxlg0Tt2GREiwmFdpBfJOv2CnFHwqQIhAI2ccci7UV2bA06Fw+NF9j1wPOOZz6ZP1Hg396KZL8ax","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGR3GtegnU+9a9Sh2CTMTdRGNofIlTSrcIumsdfeRiQmAiA8zaUCuxFnTuamuQeiimIhQI2ukdICdBHT8KIkgwWF+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":810239},"main":"redline.js","types":"redline.d.ts","unpkg":"redline.js","module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"gitHead":"54decae5bd07a60b821cdb026e619ae9bfcc580a","_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"jsdelivr":"redline.js","_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/redline_2.2.3_1794684263523_0.6012760754798525","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@perpetio/redline","version":"2.3.0","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","_id":"@perpetio/redline@2.3.0","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"homepage":"https://redlinejs.com","bugs":{"email":"hello@redlinejs.com"},"bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"dist":{"shasum":"7a2efc1f8b0f0dc1fcf826384379c42d70f27830","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.3.0.tgz","fileCount":15,"integrity":"sha512-llPAqpwm+6fcNXoKN0TDy1eD1m1fyrIVMU1v/nmZiCQz14G98MLyx+HM1O/GxBlTzvJCKerE050H/YnHnDUeaw==","signatures":[{"sig":"MEUCIQCpraNmp+1SpmSSdCfxKnY2/bgzhtoxxuzig8ALNbcG8gIgVOWht0cr97PZXfgJ/kmbGEg0wbAXqqL7eV4iNIh8xHU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDBCs1EgVSHpaGS1xGM1PMJHLf7Vei1gEKt4oI2YBE0qgIhANWFlw013fV0ujvyqH4nM25i6svQosk35yZaW/DXtYIv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":827238},"main":"redline.js","types":"redline.d.ts","unpkg":"redline.js","module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"jsdelivr":"redline.js","_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/redline_2.3.0_1794739832285_0.6651100617262748","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"_id":"@perpetio/redline@2.4.0","bin":{"redline-mcp":"bin/redline-mcp.cjs","annotate-mcp":"bin/redline-mcp.cjs"},"bugs":{"email":"hello@redlinejs.com"},"dist":{"shasum":"29c0f2371634da034c1cedc4529dbbbef76930a6","tarball":"https://registry.npmjs.org/@perpetio/redline/-/redline-2.4.0.tgz","fileCount":15,"integrity":"sha512-V00L5p27HT9NwlspIUCBjLJvcZXYF9CYep9Xjpfl19fpjM5B8Xf5d6ihb2pQf7WJSu74CpUYfuBD3EF1S4wqtA==","signatures":[{"sig":"MEUCIC1F9Xa0e4k8BHl43WhrMJYYKnWoy3Dy3FWd7bnj1EpDAiEArXcYGMdAY2z1ox5RmLLKW8/CptUt1p7/0QxOrrnpXX4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDepqjzQY7zQRbo65dBPAe1FLkYXDZGW0lBo+ieBhPG9AiAl40vuHE5U4rpkyiLqy9ZF9tQpF8QysGrCvfY48jfNUQ=="}],"unpackedSize":859066},"main":"redline.js","name":"@perpetio/redline","types":"redline.d.ts","unpkg":"redline.js","author":{"name":"Yuriy Berdnikov"},"module":"redline.mjs","exports":{".":{"import":{"types":"./redline.d.mts","default":"./redline.mjs"},"default":"./redline.js","require":{"types":"./redline.d.cts","default":"./redline.js"}},"./redline.js":{"types":"./redline.d.cts","default":"./redline.js"},"./redline.mjs":{"types":"./redline.d.mts","default":"./redline.mjs"},"./package.json":"./package.json"},"license":"SEE LICENSE IN LICENSE","version":"2.4.0","_npmUser":{"name":"ybperpeio","email":"contact@perpet.io"},"homepage":"https://redlinejs.com","jsdelivr":"redline.js","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"_npmVersion":"11.6.0","description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","directories":{},"maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"_nodeVersion":"24.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/redline_2.4.0_1794764088144_0.6880118662992891"}}},"time":{"created":"2026-11-13T05:35:52.734Z","modified":"2026-11-15T17:34:48.485Z","0.0.0-stage":"2026-11-13T05:35:52.734Z","1.0.0":"2026-11-13T05:38:31.707Z","1.0.1":"2026-11-13T14:20:17.413Z","1.0.2":"2026-11-13T15:27:36.556Z","2.0.0":"2026-11-13T17:52:20.094Z","2.1.0":"2026-11-13T19:48:08.284Z","2.1.1":"2026-11-13T21:25:39.592Z","2.1.2":"2026-11-14T07:42:34.208Z","2.2.0":"2026-11-14T10:55:35.523Z","2.2.1":"2026-11-14T11:35:51.856Z","2.2.2":"2026-11-14T15:25:13.112Z","2.2.3":"2026-11-14T19:24:23.628Z","2.3.0":"2026-11-15T10:50:32.400Z","2.4.0":"2026-11-15T17:34:48.252Z"},"bugs":{"email":"hello@redlinejs.com"},"author":{"name":"Yuriy Berdnikov"},"license":"SEE LICENSE IN LICENSE","homepage":"https://redlinejs.com","keywords":["redline","website-feedback","visual-feedback","website-annotation","annotation","design-review","qa","comments","feedback","review","mcp","mcp-server","model-context-protocol","ai-agents","coding-agent","claude-code","codex","cursor","react","vue","nextjs","wordpress","vanilla-js","typescript"],"description":"A review layer for any website, built for coding agents. Reviewers comment on the live page; Claude Code, Codex or Cursor reads each comment over MCP with the exact element, fixes it and resolves it. One script tag, no dependencies.","maintainers":[{"name":"ybperpeio","email":"contact@perpet.io"}],"readme":"# Redline\n\n[![Redline — Point. Comment. Ship the fix. Visual website feedback with exact context for coding agents.](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/docs/images/npm-banner.jpg)](https://redlinejs.com)\n\n**Point at the problem. Your agent ships the fix.**\n\nRedline adds visual feedback to any website. Highlight text, circle a detail,\nor pin a comment to the exact element. Share the feedback with your team, copy\nit into your coding agent, or connect the included MCP server so the agent can\nread, reply, and resolve comments directly.\n\n**No runtime dependencies · TypeScript included · No account needed for local reviews**\n\n[Try the live demo](https://redlinejs.com) · [Quick start](#quick-start) ·\n[Examples](#examples) · [Connect your agent](#ai-agents-mcp) ·\n[Configuration](#configuration) · [API](#javascript-api)\n\n## Quick start\n\n### Install from npm\n\n```bash\nnpm install @perpetio/redline\n```\n\nStart Redline after your page has rendered:\n\n```js\nimport Redline from '@perpetio/redline';\n\nRedline.init({\n  project: 'my-website',\n  startOpen: true,\n  spa: true,\n});\n\n// On unmount or hot reload, call Redline.destroy().\n```\n\nThe review toolbar appears on your page. Press `P` and click an element to\nleave your first comment. Without `startOpen: true`, Redline starts as a small\n**Review** button. Use `spa: true` to keep separate comments for each route.\n\n### Or add one script tag\n\nNo bundler needed. Paste this before `</body>`:\n\n```html\n<script\n  src=\"https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/redline.js\"\n  data-project=\"my-website\"\n  data-start-open=\"true\"\n  defer\n></script>\n```\n\nThat's the whole installation. Comments stay in the reviewer's browser until\nthey export or send them. [Redline Cloud](https://app.redlinejs.com) is optional\nwhen you want a shared review with your team and clients.\n\nTo self-host, download [redline.js](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/redline.js)\nand use your own script URL. The same package is also available on\n[unpkg](https://unpkg.com/@perpetio/redline@2.3.0/redline.js).\n\n## From feedback to a fix\n\n![Redline running on a creative studio website: two comments anchored to page elements, a floating annotation toolbar, and the comments panel with Copy and Download controls.](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/docs/images/npm-review.png)\n\n*An actual Redline review of the included playground. The comments are sample feedback.*\n\n| You do this | Redline carries the context |\n| --- | --- |\n| **Point at what needs changing.** Highlight text, draw a box, or pin a comment. | The element's label, selector, surrounding heading, position, and styles travel with the note. |\n| **Hand it to your coding agent.** Press `M` to copy Markdown, or connect over MCP. | In React, Vue, and Svelte development builds, the note can also name the component and source file. |\n| **Close the loop.** Your agent replies and updates the comment's status over MCP. | Reviewers see the reply and the resolved status on the same page. |\n\n## Examples\n\nThe package includes a working playground and small integrations you can copy.\n\n| Start here | What you get |\n| --- | --- |\n| [Review playground](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/examples/playground.html) | A complete HTML page to annotate, with **Pin a comment** and **Copy feedback for AI** buttons. |\n| [Minimal HTML](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/examples/plain-html.html) | A small page with one CDN script tag. |\n| [React / Next.js component](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/examples/react.jsx) | Mount once, follow route changes, and clean up on unmount. |\n| [Vue 3 component](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/examples/vue.vue) | The same setup using `onMounted` and `onUnmounted`. |\n\nTo run the playground after installing the package:\n\n```bash\nnpx serve node_modules/@perpetio/redline --listen 4200\n```\n\nOpen **http://localhost:4200/examples/playground.html**. This serves the installed\npackage locally; no API key, build step, or review backend is required. The links\nabove show the example source; use the local server to run the playground.\n\n### Add your own feedback button\n\nThe public API also lets you connect review tools to your app's own controls:\n\n```js\nimport Redline from '@perpetio/redline';\n\nRedline.init({ project: 'my-website', spa: true });\n\n// Call from your button's click handler:\nfunction leaveFeedback() {\n  Redline.setTool('pin');\n}\n\n// Read the open comments as Markdown for a coding agent:\nfunction getFeedbackForAgent() {\n  return Redline.markdown({ detail: 'detailed' });\n}\n```\n\nSee [framework integration](#framework-integration) for React, Next.js, Vue,\nSvelte, Angular, WordPress, and other sites.\n\n---\n\n## Why Redline?\n\n- **One import or script tag.** No runtime dependencies, framework requirement, or account for local reviews.\n- **Useful context for coding agents.** Copy Markdown with element details, or use MCP to read, reply, and resolve feedback.\n- **Works everywhere.** Plain HTML, React, Vue, Svelte, WordPress, Webflow,\n  Shopify, static sites — anything that renders HTML in a browser.\n- **Local-first & private.** Comments stay on the reviewer's device until they\n  explicitly export or send feedback to an endpoint you configure.\n- **Portable.** Reviewers export their feedback as JSON and send it to you; you\n  import it with one click and see every note in place.\n- **Polished UI.** A floating toolbar, a Figma-style comments panel, light/dark\n  themes that auto-adapt to your page, and full keyboard shortcuts.\n- **Dependency-free.** Vanilla JavaScript with no runtime dependencies.\n\n---\n\n## Features\n\n| Tool | What it does |\n|------|--------------|\n| ✏️ **Highlight** | Select any text to highlight and comment on it |\n| ▭ **Rectangle** | Draw a box around any region |\n| ◯ **Circle** | Circle anything that needs attention |\n| 📍 **Pin** | Drop a point marker anywhere |\n| ⧉ **Several elements** | One comment on up to 20 elements: Shift+click them with the Pin tool, or turn on **Select several**, then **Comment on N elements** |\n| 〰️ **Freehand** | Sketch directly on the page |\n| ➕ **Section note** | Hover any paragraph/heading for a margin comment button |\n| ⏸ **Freeze motion** | Pause CSS animations, transitions, Web Animations and video to comment on a moving page (`F`). Not frozen: JavaScript loops (`requestAnimationFrame`, GSAP, canvas), content inside shadow roots, content inside iframes (same-origin ones as well as cross-origin YouTube and Vimeo embeds), SVG SMIL animations, and animated GIF and WebP images. Freezing is refused while the tools are hidden. |\n| ⠿ **Draggable toolbar** | Drag the grip to move the toolbar; it remembers the spot. With the grip focused, arrow keys move it, Shift moves it further, and Home resets it. Double-click the grip to reset it too. |\n\nPlus: threaded replies, resolve/reopen, search & filter, deep-links to a single\ncomment (`#an=<id>`), an \"off\" mode that collapses to a small launcher, and a\n**Download / Copy / Import** round-trip for sharing. A built-in\n[MCP server](#ai-agents-mcp) lets your coding agent read, answer and resolve\nthe comments itself.\n\n### Comment on several elements\n\nFor notes like \"these three cards have different padding\":\n\n1. Press `P` for the Pin tool.\n2. Shift+click each element. On a touch screen, turn on **Select several** in\n   the hint at the top and tap them. Picking an element again drops it.\n3. Click **Comment on N elements** in the bar at the bottom, or press Enter.\n\nThe comment gets one marker, on the first element. While it is open or\nhovered, every element is outlined with its number. Its card lists the\nelements; click one to scroll to it. Esc clears the selection, and a second\nEsc leaves the tool.\n\nWith a review backend, these comments need one that knows the `group` type:\nthe reference server from this release on. An older server answers `422`,\nand the comment stays in this browser; a toast says so.\n\n### Shadow DOM and iframes\n\nAnnotations reach into open shadow roots and same-origin iframes. Each shadow\nroot or iframe adds a segment to the selector, joined with ` >>> `:\n\n```\n#app-shell >>> div.shell > x-panel >>> button[aria-label=\"Save\"]\n#checkout-frame >>> #pay-button\n```\n\nEach segment is looked up inside the shadow root or iframe the previous one\nfound. The markers stay in your page and follow the iframe when it scrolls,\nreloads or changes. A marker whose element is scrolled out of the iframe's\nview is hidden until it scrolls back; opening its comment scrolls the iframe\nto it. Versions before 1.6 don't understand ` >>> `: they may show\nthese comments as missing their anchor, or re-anchor one by its name to a\nmatching element in the page's light DOM.\n\n| Where | Pin, rectangle, circle, freehand, several elements | Section note | Text highlight |\n|-------|-----|-----|-----|\n| Open shadow root | yes | yes | no |\n| Same-origin iframe (nested up to 3 deep) | yes | no | no |\n| Closed shadow root | the host element | the host's block | no |\n| Cross-origin iframe | the `<iframe>` element | no | no |\n\nLimits:\n\n- No text highlights inside shadow roots or iframes.\n- No section notes inside iframes.\n- A cross-origin iframe's contents can't be reached. While a drawing tool is\n  on, a transparent shield over the frame takes the click, so the pin or shape\n  lands on the `<iframe>` element itself. Page content drawn over the frame,\n  such as a fixed header, still takes its own clicks.\n- Shortcuts aren't seen while focus is inside a cross-origin iframe.\n- An iframe's padding, transforms and zoom aren't accounted for, so markers\n  are off in a scaled frame (a device preview, for example).\n- A closed shadow root can't be looked into, so a comment there is on its\n  host.\n- Iframes inside shadow roots aren't found.\n\n---\n\n## Configuration\n\nConfigure with `data-` attributes on the script tag — all optional:\n\n```html\n<script\n  src=\"https://cdn.jsdelivr.net/npm/@perpetio/redline/redline.js\"\n  data-project=\"marketing-site\"\n  data-accent=\"#bd3426\"\n  data-theme=\"auto\"\n  data-position=\"bottom-right\"\n  data-start-open=\"true\"\n  data-note=\"Focus on the hero copy and pricing — flag anything off-brand.\"\n  data-spa=\"true\"\n  data-post-url=\"https://feedback.example.com/feedback\"\n  data-share-email=\"https://github.com/org/repo/issues/new?title=Review%20{page}&amp;body={summary}\"\n  defer\n></script>\n```\n\n| Attribute | Default | Description |\n|-----------|---------|-------------|\n| `data-project` | `\"\"` | Namespace for stored comments. Keep separate sites apart. |\n| `data-page` | `location.pathname` | Page key comments are grouped under. |\n| `data-accent` | — | Brand color for primary buttons & the active tool. |\n| `data-theme` | `auto` | `light`, `dark`, or `auto` (sniffs your page background). |\n| `data-position` | `bottom-right` | `bottom-right` or `bottom-left`. |\n| `data-blocks` | sensible default | CSS selector for \"section note\" (+) targets. |\n| `data-start-open` | `false` | Set to `true` to show the review toolbar immediately instead of the collapsed Review pill. |\n| `data-note` | — | Author's note to reviewers — what should be reviewed. Shown when they start and atop the comments panel. |\n| `data-spa` | `false` | Watch `pushState`, `replaceState`, and `popstate` for page changes. |\n| `data-post-url` | — | URL that receives an explicit HTTP POST of the current page's export JSON. Adds **Send feedback**. |\n| `data-share-email` | — | Email address or URL template for **Share**. `{page}`, `{count}`, and `{summary}` become URL-encoded values for a prefilled GitHub, GitLab, Jira, or other issue URL. |\n| `data-capture` | `styles,components` | Extras each new comment records besides the element description: `styles`, `components`, both, or `off`. Component and source info only exists in development builds. |\n| `data-editor-url` | — | \"Open in editor\" link template, e.g. `vscode://file/Users/me/app/{path}:{line}`. `{path}`, `{line}`, `{column}` come from the comment's source file. |\n\nFor programmatic setup, import the ES module and call `init(config)`:\n\n```bash\nnpm install @perpetio/redline\n```\n\n```js\nimport Redline from '@perpetio/redline';\n\nRedline.init({\n  project: 'marketing-site',\n  accent: '#bd3426',\n  spa: true,\n  postUrl: '/feedback',\n});\n// Call Redline.destroy() when unmounting or during hot reload.\n```\n\nThe classic script still supports `window.RedlineConfig` set before it loads.\nFor a script injected after page load, call `window.Redline.init(config)`.\n`init()` can be called again after `destroy()` without leaving listeners behind.\nTypeScript declarations are included in the package.\n\n---\n\n### Redline Cloud (`data-workspace`)\n\nWith Redline Cloud, comments sync to a review instead of staying in the browser. Create the review at [app.redlinejs.com](https://app.redlinejs.com); its Setup tab has your workspace's snippet, the same for every site and review, and its Guests tab hands out the invite links:\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@perpetio/redline/redline.js\"\n        data-workspace=\"ws_…\" defer></script>\n```\n\nEach site address in the workspace is linked to one review, and everyone who\nopens the tools on that site shares it: your team, guests and their invite\nlinks. Creating a review links its site. The Setup tab's **Linked sites** moves\nor removes a link, and **Settings → Connect to Redline** in the toolbar links a\nsite that isn't linked yet. The widget asks Redline Cloud for the site's review\nonly when someone opens the tools or arrives with an invite or sign-in link,\nand remembers the answer.\n\nAlready have the default snippet on your site? Open **Settings → Connect to\nRedline** in the toolbar. Redline Cloud fills in the site's name (from\n`data-project`, else its address) and address, creates or picks the review,\nand brings you back signed in. That browser remembers the workspace, so the\npage works like a `data-workspace` page there; teammates connect the same way,\nand invite links made on the page carry the workspace. **Disconnect** in\nSettings forgets it. Put the workspace snippet on the site when everyone\nshould get the review without connecting.\n\nIf your site sends a Content-Security-Policy, allow Redline's addresses in it:\n`script-src` for the address you load `redline.js` from (for example\n`https://cdn.jsdelivr.net`), `connect-src https://api.redlinejs.com` for\nRedline Cloud, and on `localhost` `connect-src http://127.0.0.1:7335` for your\nlocal coding agent. When the policy blocks Redline Cloud, Settings says so.\n\n| Attribute | Meaning |\n|---|---|\n| `data-workspace` | Your Redline Cloud workspace. Without it (and without `data-review-id`) the page stays local-only, exactly as above, until someone connects it from Settings in their browser. |\n| `data-review-id` | Pins the page to one review instead of the site's linked review. `local` connects a page on `localhost` or `127.0.0.1` to your coding agent (see [AI agents](#ai-agents-mcp)). |\n| `data-post-retries` | `0` to `5`, default `3`. Retries for `data-post-url` after a network error, timeout, `408`, `429` or `5xx`. |\n| `data-credentials` | `omit` (default), `same-origin` or `include`. Whether `data-post-url` requests carry cookies. Requests to Redline Cloud never do. |\n\nReviewers arrive through a personal link, `https://your-site/page?an_invite=…`.\nThe token is stored for that review in the reviewer's browser and removed from\nthe address bar, then exchanged for a 24-hour session on every load. Only the\nsite addresses registered on the review may use it.\n\n- If the landing page forwards to another page before redline.js runs (a `/`\n  stub with a meta refresh, a script redirect) and drops the query string, the\n  token is recovered from the same-origin referrer, so the link still works.\n  Cross-origin referrers are never used.\n- When the backend refuses (link revoked or expired, review closed, address not\n  registered, or no link at all), the panel says why and what to do next, and\n  comments stay in the browser; Download or Copy sends them by email.\n- In a synced review there is nothing to submit: the footer reads \"Sent to the\n  review\" as soon as a comment is posted.\n\n**Settings** in the toolbar has two sections. **Redline Cloud** connects the site\n(**Connect to Redline**), signs you in on a connected site (**Sign in with Redline**,\nalso in the sign-in box as **Continue with Redline**), and once you're signed in as\na member offers **Open dashboard**, which opens the review in Redline Cloud. On a\npage with the default snippet it creates or picks the review for you. **Coding agent**\nshows the review's coding agent and when it last connected, with a link to set it up,\nor on `localhost` the switch for your local agent.\n\nThe backend is Redline Cloud: workspaces, members, guests and the agent are managed in the portal at [app.redlinejs.com](https://app.redlinejs.com). Local mode needs no backend: it runs inside `redline-mcp` on your computer.\n\n#### Screenshots\n\nIn a Redline Cloud review, each new comment comes with a screenshot of the page around what it marks, taken in the reviewer's browser (no permission prompt). The portal shows it with the comment, and `annotate_get_comment` hands it to your coding agent.\n\n- Password fields are always blank. Add `data-redline-mask` to anything else that must not appear (account numbers, personal data): it is drawn as a black box.\n- Images from other domains that don't allow CORS, iframes, and some canvas and video content show as grey boxes.\n- Turn screenshots off per review in the portal: Review → Setup → Screenshots.\n\n#### Team reviews and mentions\n\nIn a synced review, everyone in the review sees every comment and can reply.\nType `@` in a comment or reply to mention someone: they get a count on the\nRedline button and a **Mentions** list across pages. Mention `@Agent` to hand\na comment to your coding agent; its MCP tools take `mentioned: true` to work\nonly on those. Only the creator and the review's authors can edit, resolve or\ndelete a comment. To keep reviewers' comments private from each other, turn on **Private review** in the review's Setup tab.\n\n#### People and invites\n\nAuthors invite people from the panel. Open **People** (the icon next to\nImport) and choose **Invite someone**. Enter a name, an optional email, a role,\nand when the link expires (30 days by default). Copy the link and send it;\nthe person opens the site through it and is signed in.\n\nFrom the list you can copy a link again, replace it with **New link**, or\nrevoke it, which signs the person out at once. Only authors who signed in with\nan invite see People. Authors manage the same guests in the portal's Guests tab.\n\nIn Redline Cloud,\nauthors can email invite links. People can also sign in on any device with a\none-time email link, and mentioned people get one email per batch of\nmentions, which they can switch off.\n\n## Framework integration\n\nFor a bundler, install `@perpetio/redline`, call `init()` after mount, and\ncall `destroy()` on unmount. Use `spa: true` when your router changes paths\nthrough the History API. Dynamic content is watched and re-anchored after it\nrenders. The classic script remains available for static pages.\n\n### React and Next.js\n\nMount it once at the app root with a `useEffect`:\n\n```jsx\n// components/FeedbackLayer.jsx\nimport { useEffect } from \"react\";\nimport Redline from \"@perpetio/redline\";\n\nexport default function FeedbackLayer() {\n  useEffect(() => {\n    Redline.init({ project: \"my-react-app\", accent: \"#bd3426\", spa: true });\n    return () => Redline.destroy();\n  }, []);\n  return null;\n}\n```\n\n```jsx\n// App.jsx\nimport FeedbackLayer from \"./components/FeedbackLayer\";\n\nexport default function App() {\n  return (\n    <>\n      <FeedbackLayer />\n      {/* your app */}\n    </>\n  );\n}\n```\n\n**Next.js (App Router):** mark `FeedbackLayer` as a client component with\n`\"use client\";` at the top, then render it inside `app/layout.jsx`.\n\n### Vue 3\n\n```vue\n<!-- App.vue -->\n<script setup>\nimport { onMounted, onUnmounted } from \"vue\";\nimport Redline from \"@perpetio/redline\";\n\nonMounted(() => {\n  Redline.init({ project: \"my-vue-app\", accent: \"#10b981\", spa: true });\n});\nonUnmounted(() => Redline.destroy());\n</script>\n```\n\nFor a static Vue page, the classic `<script>` tag also works in `index.html`.\n\n### WordPress\n\n**Option A — no code.** Install a \"header/footer scripts\" plugin (e.g. *WPCode*\nor *Insert Headers and Footers*) and paste this into the **footer** box:\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@perpetio/redline/redline.js\" data-project=\"my-wp-site\" defer></script>\n```\n\n**Option B — theme code.** Add to your theme's `functions.php`:\n\n```php\nfunction redline_enqueue() {\n  wp_enqueue_script(\n    'redline',\n    'https://cdn.jsdelivr.net/npm/@perpetio/redline/redline.js',\n    array(),\n    '2.3.0',\n    true // load in footer\n  );\n}\nadd_action( 'wp_enqueue_scripts', 'redline_enqueue' );\n```\n\n> Tip: wrap the enqueue in `if ( current_user_can('edit_posts') )` to show the\n> review tools only to logged-in editors.\n\n### Svelte and SvelteKit\n\n```svelte\n<!-- src/routes/+layout.svelte -->\n<script>\n  import { onMount } from \"svelte\";\n  import Redline from \"@perpetio/redline\";\n  onMount(() => {\n    Redline.init({ spa: true });\n    return () => Redline.destroy();\n  });\n</script>\n\n<slot />\n```\n\n### Angular\n\nAdd the classic script before `</body>` in `src/index.html`. Enable SPA mode\nso feedback stays grouped by route as the Angular router changes paths:\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@perpetio/redline/redline.js\"\n        data-project=\"my-angular-app\" data-spa=\"true\" defer></script>\n```\n\n### Plain HTML, Webflow, Shopify, and Squarespace\n\nPaste before `</body>` (or into the platform's \"custom code / footer\" field):\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@perpetio/redline/redline.js\" defer></script>\n```\n\n---\n\n## Element identification and AI agents\n\nEvery new comment records the element it is about: a readable label\n(`Button \"Start free trial\"`), a stable selector that prefers ids and\n`data-testid`, the nearest heading, its classes and size, computed styles,\nand, in React, Vue or Svelte development builds, the component chain and\nsource file (`src/components/PlanCard.tsx:42:7`). The Pin tool outlines the\nelement under the cursor before you click, and the click never reaches the\npage.\n\n**Copy → Copy for AI agent** puts Markdown made for coding agents on the\nclipboard, at Compact, Standard or Detailed level. Press `M` for the same.\nPaste it into Claude Code, Cursor or any agent:\n\n```markdown\n## 1. Button \"Start free trial\"\nPin · open · Jane Doe\n> Should say \"Start 14-day trial\", legal asked for it.\n\n- Selector: `[data-testid=\"start-trial\"]`\n- Component: `<Pricing> <PlanCard> <Button>` · `src/components/PlanCard.tsx:42:7`\n- Under heading: \"Pricing\"\n```\n\nResolved and won't-fix comments are left out. From code:\n`Redline.markdown({ detail: \"detailed\" })` returns the text and\n`Redline.copy()` copies it.\n\n## AI agents (MCP)\n\n`redline-mcp` is an MCP server that gives your coding agent the review\ncomments directly. The agent reads what reviewers left, replies, and moves\neach comment to in progress, resolved or won't fix. Reviewers see all of it in\nthe panel, with the agent's replies labelled Agent. Connected to a review in\nRedline Cloud or running in local mode, it needs Node.js 20 or later.\n\nAnyone who can comment on a review can write to your agent. Don't pair an\n`open: true` review with an agent on a site that strangers can reach.\n\n### Quick start (local)\n\n1. In your project folder, register the server with your coding agent.\n   Local mode requires **Node.js 20 or later**.\n\n   **Claude Code:**\n\n   ```bash\n   claude mcp add redline -- npx -y -p @perpetio/redline@latest redline-mcp\n   ```\n\n   **Codex:**\n\n   ```bash\n   codex mcp add redline -- npx -y -p @perpetio/redline@latest redline-mcp\n   ```\n\n   Inside a project that already depends on `@perpetio/redline`,\n   `npx redline-mcp` works too.\n\n   It starts a review backend for the folder on `127.0.0.1:7335`, and keeps\n   its data in `.annotate/` in the project folder. That folder has its own\n   `.gitignore`, so nothing is committed.\n2. Open the page you are developing, on `localhost` or `127.0.0.1`, with any\n   Redline snippet that has no `data-review-id`:\n\n   ```html\n   <script src=\"https://unpkg.com/@perpetio/redline\"></script>\n   ```\n\n   Click **Settings** (the gear) in the Redline toolbar and turn on **Send\n   comments to my coding agent**. The switch is remembered for that site, and\n   the status next to **Coding agent** shows whether the agent's server is\n   running. To turn it\n   on from code instead, add `data-review-id=\"local\"`.\n3. Leave some comments, then tell the agent: \"work through the Redline\n   comments\".\n\nA second agent session in the same folder attaches to the first one's backend.\nThe address is fixed, so one project at a time can use local mode; use a\nRedline Cloud review for another project.\n\n### Other clients\n\nAny MCP client that can start a stdio server works. The usual JSON config:\n\n```json\n{\n  \"mcpServers\": {\n    \"redline\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"-p\", \"@perpetio/redline@latest\", \"redline-mcp\"]\n    }\n  }\n}\n```\n\nLocal mode keeps its data in `.annotate/` in the folder the client starts the\nserver in. Clients that don't start servers in the project folder (Claude\nDesktop starts them in `/`) need the folder given explicitly:\n`\"args\": [\"-y\", \"-p\", \"@perpetio/redline@latest\", \"redline-mcp\", \"--data-dir\", \"/absolute/path/to/project/.annotate\"]`,\nor the client's `cwd` setting.\n\n### Tools\n\n| Tool | What it does |\n|---|---|\n| `annotate_list_pending` | Open and in-progress comments, oldest first, as Markdown plus JSON. Optional `page` filter. |\n| `annotate_get_comment` | One comment in full: styles, position, replies and activity. |\n| `annotate_reply` | Adds a reply to a comment thread. |\n| `annotate_set_status` | Sets `in_progress`, `resolved`, `wont_fix` or `open`. A note is posted as a reply first, and `wont_fix` needs one. |\n| `annotate_watch` | Waits for new or changed comments, then returns them. |\n\n### Remote mode\n\nTo work against a review in Redline Cloud instead of the local one, pass the\nreview and the review's agent invite:\n\n```bash\nnpx -y -p @perpetio/redline@latest redline-mcp --review rvw_… --invite agt_…\n```\n\n`REDLINE_REVIEW` and `REDLINE_INVITE` work in place of the flags. Create the agent token in the review's Agent tab at [app.redlinejs.com](https://app.redlinejs.com); it shows this command ready to copy.\nSettings → Coding agent on the review's pages shows whether your agent is\nrunning right now, or when it last was.\n\n### Troubleshooting\n\nRun `npx -y -p @perpetio/redline@latest redline-mcp doctor` in the same folder (with\nthe same flags or variables in remote mode). It prints a line per check, starting with the\nmode, and exits 1 if one fails.\n\n- **`127.0.0.1:7335 is used by redline-mcp for another project folder`**: one\n  project at a time can use local mode. Stop the other agent session, or use a\n  Redline Cloud review.\n- **`127.0.0.1:7335 is in use by another program`**: local mode needs that\n  port. Stop the program, or use a Redline Cloud review.\n- **`--port`, `--host` and `--api`** were removed in 2.0. Local mode always\n  runs on `127.0.0.1:7335`, and remote mode always connects to Redline Cloud.\n\n## Sharing comments\n\nSharing is an explicit action:\n\n1. A reviewer opens the **Comments panel** (toolbar list icon or press `A`).\n2. They click **Download** (⬇) to save a `redline-<page>-<date>.json` file.\n3. They send you that file.\n4. You open the same page, click **Import** (⬆), pick the file — every comment\n   reappears anchored in place.\n\nReviewing a whole site? When other pages have comments too, the footer offers\n**All pages** under the buttons: one file with every page's comments. Import it\non any page of the site and each comment goes back to the page it was made on\n(the project name may differ between the two browsers).\n\nTo paste feedback directly into another tool, click **Copy** to copy the same\ncomplete, import-compatible JSON payload to the clipboard.\n\nYou can also drive this from code (see the API below).\n\n### Send feedback to your server\n\nSet `data-post-url` on the classic script or `postUrl` in `init(config)`.\nReviewers will see a **Send feedback** button. It POSTs the same JSON export\nto your endpoint with `Content-Type: application/json`. A successful response\nmust have a 2xx status. Sending does not delete the browser's local comments.\n\nEvery POST body carries a top-level `deliveryId`. It stays the same across the\nretries of one submit, so store it and answer a repeat with success without\nsaving twice (the example receiver does). Failed sends are retried up to\n`data-post-retries` times (default 3, at most 5) on network errors, timeouts,\n`408`, `429` and `5xx`; other statuses such as `400` are not retried. Waits are\n1 s, 2 s, 4 s…, or the receiver's `Retry-After` (seconds or an HTTP date, capped\nat 30 s). A cross-origin browser reads `Retry-After` only if the receiver lists\nit in `Access-Control-Expose-Headers`.\n\n```html\n<script src=\"/redline.js\" data-post-url=\"https://feedback.example.com/feedback\" defer></script>\n```\n\nAny endpoint that accepts a JSON `POST` works as the receiver. Answer `2xx`\nonce the feedback is stored. Retries reuse the body's `deliveryId`, so a\nrepeat can return the first result. Before exposing a receiver publicly, add\nyour site's authentication and rate limits.\n\n### Prefill an issue\n\n`data-share-email` also accepts an issue creation URL. The values of\n`{page}`, `{count}`, and `{summary}` are URL encoded before substitution.\nFor example:\n\n```html\n<script src=\"/redline.js\"\n  data-share-email=\"https://github.com/org/repo/issues/new?title=Review%20{page}&amp;body={summary}\"\n  defer></script>\n```\n\nThe issue link contains a short comment summary. Download or send the full\nJSON when teammates need to import annotations and their anchors.\n\n---\n\n## JavaScript API\n\nA global `window.Redline` is available once the classic script loads. The\nES module exports the same controller as default, plus named `init` and\n`destroy` functions. The module does not start until `init(config)` is called.\n\n```js\nRedline.open();              // show the review layer and open the comments panel\nRedline.close();\nRedline.toggle();\nRedline.enable();            // show the review layer\nRedline.disable();           // collapse to the launcher\nRedline.setTool(\"highlight\");// show the layer, then choose cursor | highlight | rect | circle | pen | pin\nRedline.comments();          // → array of comment objects for this page\nRedline.focus(id);           // scroll to & highlight a comment\nRedline.export();            // trigger the JSON download for this page\nRedline.export({ scope: \"site\" }); // one file with every page's comments\nRedline.import();            // open the file picker\nawait Redline.submit();      // POST the JSON export to postUrl\nRedline.refresh();           // manually re-read the current page when spa is off\nRedline.destroy();           // remove UI, observers, and event listeners\nRedline.init({ spa: true });  // start again with programmatic settings\nRedline.clear();             // delete all comments on this page (local)\nRedline.toast(\"Saved!\");     // show a toast\nRedline.markdown({ detail: \"standard\" }); // Markdown for AI agents (\"\" when nothing is open)\nawait Redline.copy();                     // copy that Markdown; { format: \"json\" } copies the export\nRedline.setFrozen(true);     // pause page animations, transitions and media; returns the new state\nRedline.isFrozen();          // true while motion is frozen\nwindow.addEventListener(\"annotate:freeze\", e => console.log(e.detail.frozen));\nRedline.version;             // \"2.3.0\"\n```\n\n### Comment shape\n\n```json\n{\n  \"id\": \"c…\",\n  \"page\": \"marketing-site:/pricing\",\n  \"url\": \"https://example.com/pricing\",\n  \"type\": \"highlight\",\n  \"author\": \"Jane Doe\",\n  \"text\": \"This price looks out of date.\",\n  \"color\": \"#f59e0b\",\n  \"anchor\": { \"exact\": \"…\", \"prefix\": \"…\", \"suffix\": \"…\" },\n  \"geom\": null,\n  \"target\": { \"label\": \"Paragraph \\\"…\\\"\", \"selector\": \"…\", \"…\": \"…\" },\n  \"resolved\": false,\n  \"replies\": [],\n  \"createdAt\": \"2026-06-16T10:00:00.000Z\",\n  \"updatedAt\": \"2026-06-16T10:00:00.000Z\"\n}\n```\n\n`target` is present on comments made with 1.6 or later; see docs/backlog/wire-protocol.md for every field.\n\n---\n\n## Keyboard shortcuts\n\n| Key | Action | Key | Action |\n|-----|--------|-----|--------|\n| `V` | Browse | `P` | Pin |\n| `H` | Highlight | `A` | Comments panel |\n| `R` | Rectangle | `O` | Show / hide tools |\n| `C` | Circle | `Esc` | Cancel |\n| `D` | Freehand | `?` | Shortcuts card |\n| `M` | Copy for AI agent | `F` | Freeze motion |\n\n---\n\n## Browser support\n\nModern evergreen browsers (Chrome, Edge, Firefox, Safari). Uses standard DOM\nAPIs only — no polyfills required. Gracefully no-ops where `localStorage` is\nunavailable (private mode, sandboxed iframes).\n\n---\n\n## License\n\nThe widget and local mode are free to use in personal and commercial\nprojects under the terms in [LICENSE](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/LICENSE).\nRedline is not open source.\n\nRedline is built on the source code of\n[annotate.js](https://reviewjs.github.io/annotate/), used under the MIT\nLicense. Its copyright notice, \"Copyright (c) 2026 annotate.js contributors\",\nis kept in [LICENSE](https://cdn.jsdelivr.net/npm/@perpetio/redline@2.3.0/LICENSE).\n\nRedline Cloud is a subscription service by Perpetio OÜ, provided under its\n[Terms of Service](https://redlinejs.com/terms) and\n[Privacy Policy](https://redlinejs.com/privacy).\n","readmeFilename":"README.md"}