npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

vite-plugin-ai-annotator

v3.0.2

Published

AI-powered element annotator for Vite - Pick elements and get instant AI code modifications

Readme

vite-plugin-ai-annotator

AI-powered element annotator for Vite - Pick elements and get instant AI code modifications.

Watch the Tutorial

📺 Watch the Tutorial Video - See the plugin in action!

What is this?

Point at any element on your webapp, type a request, and AI modifies your code instantly.

  • Point directly at any element on your webapp
  • Type a short request like "make it bigger", "center it", "change color to blue"
  • Wait for AI to modify your code - it automatically finds and updates the source files
  • See instant results - your changes appear immediately in the browser

Save cognitive load, because it's precious.

Why use it?

Traditional workflow: inspect element → find source file → locate the code → make changes → check results.

With this plugin: point → describe → done.

Works with all Vite-supported frameworks:

  • ⚛️ React - Detects components, props, and state
  • 🟢 Vue - Understands composition/options API
  • 🅰️ Angular - Recognizes components and directives
  • 🟠 Svelte - Identifies components and stores
  • 📄 Vanilla JS - Works with plain HTML/CSS/JS
  • 🟦 Nuxt.js - Full support via Nuxt module (Nuxt 4+)

Installation

Option 1: Automatic Setup (Recommended)

Install the Claude Code plugin and let AI set everything up for you:

/plugin marketplace add nguyenvanduocit/claude-annotator-plugin
/plugin install claude-annotator-plugin@claude-annotator-plugin

Then ask Claude: "Set up ai-annotator for my project" - it handles the rest!

Option 2: Manual Setup

For Vite Projects

Step 1: Install the package
bun add -d vite-plugin-ai-annotator
Step 2: Add to your Vite config
import { defineConfig } from 'vite';
import annotator from 'vite-plugin-ai-annotator';

export default defineConfig({
  plugins: [
    annotator(),
  ],
});

For Nuxt.js Projects (Nuxt 4+)

Step 1: Install the package
bun add -d vite-plugin-ai-annotator
Step 2: Add to your nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    'vite-plugin-ai-annotator/nuxt'
  ],
  // Optional: Configure the annotator
  aiAnnotator: {
    port: 7318,
    autoSetupMcp: true,
    verbose: false,
  }
})

That's it! Nuxt handles the rest automatically.

Step 3: Start your dev server

bun dev

The annotator toolbar will automatically appear in your application. The plugin auto-writes a skill file (.claude/skills/ai-annotator/SKILL.md) so Claude Code knows how to read your feedback over the REST API on every restart.

Usage

With the channel plugin (push, recommended)

The Vite plugin prints these install commands on dev-server start when the channel plugin isn't enabled — copy/paste once:

/plugin marketplace add nguyenvanduocit/claude-annotator-plugin
/plugin install claude-annotator-plugin@claude-annotator-plugin
# Restart with the channel flag (Claude Code v2.1.80+; research preview)
claude --dangerously-load-development-channels plugin:claude-annotator-plugin@claude-annotator-plugin

After that the hint stays silent (the Vite plugin reads ~/.claude/settings.json to detect it; it never writes to that file). Set autoSetupChannelPlugin: false if you want to silence the hint without installing.

  1. Click the inspect button on the toolbar to enter feedback mode
  2. Click any element(s) you want to give feedback on, type a comment
  3. Click send — Claude Code's session immediately receives a <channel source="ai-annotator"> event with your session_id, page_url, and count
  4. Claude fetches the details from the REST API, edits the source files, and pushes a toast back to your toolbar with progress

Without the channel plugin (pull)

Same first three steps. Then ask Claude Code to apply your feedback — it follows the auto-installed skill, calls GET /api/sessions/<id>/feedback, edits the files, and DELETEs the feedback when done.

Example prompt: "Apply the feedback I just left in the browser."

Configuration

annotator({
  port: 7318,                     // Server port (default: 7318)
  autoSetupSkills: true,          // Auto-write AI tool skill files (default: true)
  autoSetupChannelPlugin: true,   // Print one-time install hint for the Claude Code
                                  // channel plugin if it isn't already enabled in
                                  // ~/.claude/settings.json (default: true; read-only)
  injectSourceLoc: true,          // Inject data-source-loc attrs into HTML (default: true)
  verbose: false,                 // Enable detailed logging (default: false)
})

Auto AI Skills Setup

When autoSetupSkills: true (default), the plugin writes skill/instruction files on every dev server start with the correct server address baked in. This means AI tools automatically know how to call the REST API:

| AI Tool | File | Format | |---------|------|--------| | Claude Code | .claude/skills/ai-annotator/SKILL.md | YAML frontmatter (name, description) | | Cursor | .cursor/rules/ai-annotator.mdc | alwaysApply: true | | Windsurf | .windsurf/rules/ai-annotator.md | trigger: always_on | | Codex | AGENTS.md | Marker-delimited section | | Copilot | .github/instructions/ai-annotator.instructions.md | applyTo: "**" | | Cline | .clinerules/ai-annotator.md | Plain markdown |

Files are updated on every server restart, so the address is always correct.

REST API

The server exposes a plain HTTP REST API at /api/*, usable by any HTTP client — no MCP required.

# List sessions
curl http://localhost:7318/api/sessions

# Get feedback
curl http://localhost:7318/api/sessions/<id>/feedback

# Inject JS
curl -X POST http://localhost:7318/api/sessions/<id>/inject-js \
  -H 'Content-Type: application/json' \
  -d '{"code": "document.title"}'

| Method | Endpoint | Body/Query | Description | |--------|----------|------------|-------------| | GET | /api/sessions | — | List connected browser sessions | | GET | /api/sessions/:id/page-context | — | Page URL, title, selection count | | POST | /api/sessions/:id/select | {mode?, selector?, selectorType?} | Trigger feedback selection | | GET | /api/sessions/:id/feedback | ?fields=xpath,attributes,styles,children | Get selected feedback items | | DELETE | /api/sessions/:id/feedback | — | Clear all selections | | POST | /api/sessions/:id/screenshot | {type?, selector?, quality?} | Capture screenshot | | POST | /api/sessions/:id/inject-css | {css} | Inject CSS into page | | POST | /api/sessions/:id/inject-js | {code} | Execute JS in page context | | GET | /api/sessions/:id/console | ?clear=true | Get captured console logs |

Happy coding! 🚀