Playwright fixture
npm install --save-dev @ingcreators/annot-playwright.
Drop the annotator fixture into
test.extend, attach annotated screenshots to
the HTML report from a try/catch in a few lines.
Annot turns the Playwright tour you already maintain into always-fresh user manuals + Excel screen specifications. Same MDX, dual rendering targets, drift between docs and UI caught as a CI lint step. SVG-first under the hood — annotate one screenshot or a hundred from a fixture.
import { test, expect, rectForBoundingBox } from "@ingcreators/annot-playwright";
test("login form is reachable", async ({ page, annotator }) => {
await page.goto("https://example.com/login");
// Capture, annotate, attach to the HTML report.
const btn = page.getByRole("button", { name: "Sign in" });
const box = (await btn.boundingBox())!;
await annotator.annotateScreenshot(page, {
annotationsSvg: rectForBoundingBox(box, { stroke: "#ff5252" }),
});
});
Each card maps to a published npm package. The same SVG annotation format flows through every one — annotate from a test, an agent, a CLI, or by hand in the editor.
npm install --save-dev @ingcreators/annot-playwright.
Drop the annotator fixture into
test.extend, attach annotated screenshots to
the HTML report from a try/catch in a few lines.
Generate a docs site and an Excel screen-specifications spreadsheet from the same MDX, kept in sync with Playwright snapshots. Drift caught as a CI lint step.
npm install -g @ingcreators/annot-mcp. Nine
tools for Claude Desktop / Claude Code / Cursor — annotate
URLs, capture aria snapshots, propose drift fixes, translate
screen specs.
npm install @ingcreators/annot-annotator. The
same SVG annotation engine as the in-browser editor,
callable from any Node script — no browser, no Electron, no
tab in CI.
Apache-2.0 across every package. PWA, Chrome extension, desktop app, headless annotator, Playwright fixture, MCP server, and the living-product-docs trio all live in one monorepo.
Author one screen spec; the Astro adapter renders it as a
docs page, the Excel adapter renders it into a customer
template populated via Named Ranges and
{var} placeholders. A Playwright tour
re-syncs both on every CI run — drift between the MDX and
the live UI surfaces as a per-line warning on the PR diff.
---
annot:
id: SC-001
title: Login screen
xlsx:
book: Screen specifications
sheet: SC-001 Login
---
import Screen from "@ingcreators/annot-product-docs-astro/components/Screen.astro";
import Overlay from "@ingcreators/annot-product-docs-astro/components/Overlay.astro";
<Screen id="login" src="./shots/login.png">
<Overlay match={{ role: "textbox", name: "Email" }} number={1}>
Email — enter your registered email address.
</Overlay>
<Overlay match={{ role: "button", name: "Sign in" }} number={2}>
Click to send the auth request to the server.
</Overlay>
</Screen>
Everything publishes under @ingcreators/ on npm.
Most users start with annot-playwright; if you're
shipping product docs, the annot-product-docs
trio is the dedicated path.
The fixture, plus three pure SVG-fragment helpers.
Stdio MCP server with nine tools for Claude / Cursor / Continue.
Core + Astro adapter + Excel adapter for living product docs.
The headless annotator. Use directly without Playwright.
The SVG annotation format + storage types.
The same SVG format powers a free in-browser editor at
annot.work/app. Capture with the Chrome extension,
drop a file in, or paste from the clipboard. Local-first
storage; optional sync to GitHub, Google Drive, or Annot Cloud.