Playwright fixture
npm install --save-dev @ingcreators/annot-playwright. Drop the annotator fixture intotest.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 intotest.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-docstrio 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 atannot.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.