A fully local agentic coding plugin that intercepts plan mode and opens an annotation UI in your browser. Mark up the plan, send structured feedback to the agent, and receive a revised version — iterate as many times as you need until you're ready to approve.
FAQ
open-plan-annotator is a Claude Code plugin with 1 hand-picked skill for development work, indexed on Flowy. Install it with the command on its page. It includes plan-review-triggers. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add ndom91/open-plan-annotator> /plugin install open-plan-annotator@open-plan-annotator
Repo: ndom91/open-plan-annotator
A fully local agentic coding plugin that intercepts plan mode and opens an annotation UI in your browser. Mark up the plan, send structured feedback to the agent, and receive a revised version — iterate as many times as you need until you're ready to approve.
Select text to strikethrough, replace, insert, or comment — then approve the plan or request changes
Everything runs locally.

open-plan-annotator is package-managed as a plugin within your harness of choice. The main plugin package then installs the specific local platform runtime it needs for your host (linux/darwin, x86_64/arm64, etc). After installing the plugin, your agent will call open-plan-annotator autonomously when you ask it to "make a plan" or any similar such comment, including in claude-code specifically as a hook when exiting PlanMode. Alternatively, you can call it yourself explicitly via the exposed command. See below for more details.
Install from inside Claude Code:
/plugin marketplace add ndom91/open-plan-annotator
/plugin install open-plan-annotator@ndom91-open-plan-annotator
What you get:
ExitPlanMode hook: opens the annotation UI whenever Claude submits a plan/annotate-plan [task description]: asks Claude to draft a plan and send it to the UIopen-plan-annotator: runtime command invoked by the hookThird-party marketplace auto-update is disabled by default in Claude Code. Enable auto-update for the ndom91-open-plan-annotator marketplace in the Marketplace UI if you want updates automatically.
Add the plugin to your OpenCode config (opencode.json or .opencode/config.json):
{
"plugin": ["open-plan-annotator@1.8.7"]
}
What you get:
annotate_plan: tool the agent calls after drafting a markdown planopen-plan-annotator: runtime command spawned by the pluginRestart OpenCode after installing or updating so it reloads the package-managed runtime.
Install the Pi extension:
pi install npm:@open-plan-annotator/pi-extension
What you get:
annotate_plan: tool the agent calls after drafting a markdown plan/annotate-plan [plan markdown]: command for manually reviewing supplied text or the latest assistant messageopen-plan-annotator: runtime command used by the extensionManual review examples:
/annotate-plan
/annotate-plan # Plan\n\n1. Do the thing
Install globally if you want to run the CLI directly:
bun add -g open-plan-annotator
npm install -g open-plan-annotator
This adds the open-plan-annotator command. To verify the resolved runtime:
open-plan-annotator doctor
You can also review a Markdown plan directly from disk, which is useful for agents without a native plugin:
open-plan-annotator review /absolute/path/to/plan.md
The command opens the same local review UI and blocks until approval or requested changes. It prints review result JSON to stdout when the user is done.
Generic agent setup instructions are available with:
open-plan-annotator agent-setup
open-plan-annotator help agent
/plugin -> "Installed" -> open-plan-annotator entry and select "Update", then restart Claude Code.opencode.jsonc plugins open-plan-annotator entry, then restart OpenCode.open-plan-annotator.| Action | Shortcut | Description |
|---|---|---|
| Delete | d | Strikethrough selected text |
| Replace | r | Replace selected text with new content |
| Insert | s | Insert text after the selection |
| Comment | c | Attach a comment to selected text |
| Approve | Cmd+Enter | Approve the plan and proceed |
| Request Changes | Cmd+Shift+Enter | Send annotations back to the agent |
bun run dev
Starts the Bun server on port 3847 with a test plan and the Vite dev server on port 5173 with HMR.
bun run lint # check
bun run lint:fix # auto-fix
bun run format # format
docs/architecture.mddocs/operations.mddocs/release.mdMIT
.claude-plugin/
marketplace.json
plugin.json
.github/
assets/
header2.jpg
screenshot_005.png
workflows/
ci.yml
.gitignore
AGENTS.md
bin/
open-plan-annotator.mjs
biome.json
bun.lock
CLAUDE.md
commands/
annotate-plan.md
docs/
architecture.md
operations.md
release.md
hooks/
hooks.json
LICENSE
opencode/
bridge.js
config.js
config.test.ts
index.js
index.test.ts
package.json
packages/
pi-extension/
extensions/
index.js
package.json
README.md
runtime-darwin-arm64/
package.json
README.md
runtime-darwin-x64/
package.json
README.md
runtime-linux-arm64/
package.json
README.md
runtime-linux-x64/
package.json
README.md
README.md
scripts/
build-platforms.mjs
check-package-files.mjs
install-runtime.mjs
release.sh
session-context.mjs
update-release-metadata.mjs
server/
api.ts
feedback.test.ts
feedback.ts
historyKey.test.ts
historyKey.ts
historyLifecycle.test.ts
index.ts
launch.ts
runtime/
decision.ts
decisionCache.ts
devPlan.ts
history.ts
html.ts
input.test.ts
input.ts
preferences.ts
tsconfig.json
types.ts
updateCheck.test.ts
updateCheck.ts
version.ts
shared/
agentSetup.mjs
cliHelp.mjs
cliHelp.test.ts
cliMode.mjs
cliMode.test.ts
packageManager.mjs
packageManager.test.ts
piExtension.mjs
piExtension.test.ts
planReview.mjs
planReview.test.ts
runtimeEnv.mjs
runtimeEnv.test.ts
runtimeResolver.mjs
runtimeResolver.test.ts
updateHints.mjs
updateHints.test.ts
updateMessage.mjs
updateMessage.test.ts
versionInfo.mjs
versionInfo.test.ts
skills/
plan-review-triggers/
SKILL.md
ui/
bun.lock
components/
AnnotationCard.tsx
AnnotationSidebar.tsx
AnnotationToolbar.tsx
App.tsx
Block.test.tsx
Block.tsx
CommentPopover.tsx
CommentTooltip.tsx
DiffViewer.tsx
DocumentChrome.tsx
Header.tsx
HighlightedCode.tsx
PlanDocument.tsx
ShortcutBar.tsx
TableOfContents.tsx
ThemeProvider.tsx
UpdateBanner.tsx
VersionSidebar.tsx
hooks/
useAnnotations.ts
useDecision.ts
useKeyboardShortcuts.ts
usePlan.ts
useTextSelection.ts
index.html
index.tsx
package.json
public/
apple-touch-icon.png
favicon-96x96.png
favicon.ico
favicon.svg
site.webmanifest
web-app-manifest-192x192.png
web-app-manifest-512x512.png
styles/
globals.css
tsconfig.json
types/
shiki-langs.d.ts
utils/
annotationSerializer.ts
cn.ts
hash.ts
inlineMarkdown.tsx
markdown.test.ts
markdown.ts
offsetResolver.ts
vite.config.ts© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic