Annotant

Guide

How it works

Install

From nothing to a first comment on your app, in four steps.

1. Check the requirements

2. Install the plugin

Straight from GitHub, no clone needed:

claude plugin marketplace add annotant/annotant#stable
claude plugin install annotant@annotant

Or, inside a session: /plugin marketplace add annotant/annotant#stable, then /plugin install annotant@annotant.

3. Set it up in your project

Start Claude Code in your frontend project, and run:

/annotant:annotant init

That is the skill’s full name; see Commands.

init detects the framework, the dev URL, the check commands (type-check, lint) and the folders agents may edit. It asks, in one round, only what it could not detect, and whether to git-ignore the comments (recommended: they hold excerpts of your pages’ HTML). Then it writes:

Last, it builds the app for production and checks the widget is not in it (or says so when the build fails for another reason), then lists the files it changed.

When the frontend lives in a folder of the repository, name it after the command: /annotant:annotant init web installs Annotant in web/. The folder is resolved from the current directory, else from the repository root. On a monorepo root that is not itself an app, init asks which of its apps to use.

4. Start commenting

/annotant

(/annotant web for a folder.) Then open your dev app in the browser, its dev server running as usual: a small strip of icons shows in the bottom right corner of the page. Click the Comment icon (hover one for its name), write what to change and send it: an agent starts, its progress shows live under your comment, and it answers in the same thread. In the widget tells the rest.

No icons? See the widget does not show.

Commands

Command What it does
/annotant:annotant init [dir] Install in this project, or its folder dir (asks only what it cannot detect)
/annotant [dir] Watch the app: open your dev app and comment
/annotant stop Stop watching
/annotant status The server, the agents at work and the comments waiting
/annotant:annotant update Migrate an older install
/annotant:annotant uninstall Remove Annotant from the project

Plugin skills are prefixed with the plugin name, hence /annotant:annotant; /annotant is a command of the plugin’s hooks, and runs at once, even while Claude is answering. /annotant:annotant with no mode watches too, through the skill.

While it watches

Work on in the same session: the comments go straight to their agents, never through your conversation. When an agent ends, its one-line answer shows in the session’s transcript (Claude does not read it), and a question it asks in the thread shows as a notification too. Closing the session stops the server; /annotant starts it again, and nothing is lost.

In a git worktree, both commands find the project in the main checkout when the worktree lacks .annotant.json.

Updating

The stable branch holds the released versions; main is where development happens and does not work without a build. Get new versions with claude plugin marketplace update annotant, or turn on auto-update for the marketplace in /plugin; the changelog lists what each brings. After an update, /annotant:annotant update migrates a project installed by an older version.

Coming from Code Buddy, Annotant’s former name: remove the old plugin and its marketplace (claude plugin uninstall code-buddy@code-buddy, then claude plugin marketplace remove code-buddy), install Annotant as in step 2, and run /annotant:annotant update in each project: it moves .code-buddy.json and .code-buddy/ to .annotant.json and .annotant/, and updates the loader and .gitignore.

Uninstalling

/annotant:annotant uninstall removes the loader snippet (and a file init created only for it), .annotant.json and the .gitignore entry. It asks before deleting .annotant/, which holds your comments. A dev-only change init made to the Content Security Policy stays: revert it by hand. Remove the plugin itself with claude plugin uninstall annotant@annotant, or from /plugin.

In the widget

While the panel is closed, the tools sit in a small strip of icons in the bottom right corner, their names and shortcuts in the tooltips; a tool in progress shows its Cancel there.

Troubleshooting

The widget does not show

When the dev app shows no strip of icons in its bottom right corner:

A comment waits, or an agent seems stuck

When a comment seems to wait for nothing, run /annotant status. For each project it watches, it tells the server’s state and address (or why it stopped), the agents at work (their comment, agent, model and for how long), the comments waiting for a free agent in order, and the server’s last error line. The status line counts the comments waiting too.

When an agent shows no progress under its comment, edits a file another agent is changing, or seems stuck, turn on the hook log. It writes one line for each decision the plugin’s hooks make about the agents working on comments.

In any Claude Code session:

/annotant-debug on

It is on in every session within 5 seconds, with no restart. Then follow it from a terminal:

tail -f ~/.cache/annotant/hook.log

or run /annotant-debug (no word) to see its last 20 lines. Turn it off with /annotant-debug off; the log stays where it is. Without the command, touch ~/.cache/annotant/debug turns it on and removing that file turns it off. The log keeps its last 128 to 256 KB.

Each line reads <time> <agent> <comment> <what happened>; the agent is main for your own session, and the comment - when there is none:

… main - hooks loaded in a new session (Claude Code 2.1.287)
… a53927e6… e329bcbb… started on claude-haiku-5-5, the comment classified trivial
… a53927e6… e329bcbb… started for NEW
… a53927e6… e329bcbb… locked api/presets.py
… a53927e6… e329bcbb… recorded edit done "../api/presets.py"
… a53927e6… e329bcbb… run ended (answered or asked): released 1 lock(s)
Line What it means
hooks loaded in a new session The hooks run in that session. No line at all after starting a session: they did not load (Annotant needs Claude Code 2.1.287 or later).
locked <file> The agent holds that file, named from the repository root, until its run ends.
waiting for <file>, held by comment <id> Another comment’s agent is changing it; the agent waits up to 6 seconds.
refused <file>: still held by comment <id> The wait ran out: the agent releases its locks, re-reads and retries.
no lock for <file>: outside <repository> Files outside the git repository take no lock.
refused a Bash write: <command> The agent tried to write files from Bash, where they cannot be locked; it is told to use Edit or Write.
recorded <step> A step shown under the comment, once the agent claimed it, until its run ends or stops.
run ended …, agent stopped … The agent answered, asked, or stopped: its locks are released.
turn ended: <its last line> The agent ended its turn: the next comment in line may start.
hook.mjs failed: <error> The agent’s hook could not run: its tool ran without a lock or a step.
started on <model>, … The model the comment’s agent runs on, its effort when routing set one (at medium effort), and how the classifier sorted the comment.
started for NEW, sent the follow-up /annotant started the comment’s agent, or passed the reader’s reply or edit to the one already started.
the comment still waits: sent the reply again The reader answered as the agent ended its turn, unread: it goes to the agent again.
turn ended with the comment working: … The agent ended its turn neither answering nor asking: the comment stops, and the reader sends it again from its thread.
could not start an agent: <why> Claude Code refused the agent (background tasks turned off, say); a notification says so too.
stopped: the reader ended the comment The reader stopped, resolved or deleted the comment while its agent worked.

Security

To report a vulnerability, see the security policy.

This page on GitHub