Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ dist
dist-ssr
*.local

# npm pack output
*.tgz

# OpenCode plugin build artifact (generated from hook dist)
apps/opencode-plugin/plannotator.html

# Editor directories and files
.vscode/*
!.vscode/extensions.json
Expand Down
9 changes: 8 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ plannotator/
│ ├── hooks/hooks.json # PermissionRequest hook config
│ ├── server/index.ts # Bun server (reads stdin, serves UI)
│ └── dist/index.html # Built single-file app
├── apps/opencode-plugin/ # OpenCode plugin
│ └── index.ts # Plugin with submit_plan tool
├── apps/mcp/ # General MCP Server
│ ├── index.ts # MCP server with submit_plan tool
│ └── README.md # Integration documentation
├── packages/
│ ├── ui/ # Shared React components
│ │ ├── components/ # Viewer, Toolbar, Settings, etc.
Expand Down Expand Up @@ -75,6 +80,7 @@ enum AnnotationType {
INSERTION = "INSERTION",
REPLACEMENT = "REPLACEMENT",
COMMENT = "COMMENT",
GLOBAL_COMMENT = "GLOBAL_COMMENT",
}

interface Annotation {
Expand Down Expand Up @@ -142,7 +148,8 @@ type ShareableAnnotation =
| ["D", string, string | null] // [type, original, author]
| ["R", string, string, string | null] // [type, original, replacement, author]
| ["C", string, string, string | null] // [type, original, comment, author]
| ["I", string, string, string | null]; // [type, context, newText, author]
| ["I", string, string, string | null] // [type, context, newText, author]
| ["G", string, string | null]; // [type, comment, author] - global comment
```

**Compression pipeline:**
Expand Down
65 changes: 48 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,38 @@
<p align="center">
<img src="apps/marketing/public/og-image.webp" alt="Plannotator" width="100%" />
<img src="apps/marketing/public/og-image.webp" alt="Plannotator" width="80%" />
</p>

# Plannotator

Interactive Plan Review: Mark up and refine your plans using a UI, easily share for team collaboration, automatically integrates with Claude Code plan mode.
Interactive Plan Review for AI Coding Agents. Mark up and refine your plans using a visual UI, share for team collaboration, and seamlessly integrate with **Claude Code** and **OpenCode**.

<p align="center">
<a href="https://www.youtube.com/watch?v=a_AT7cEN_9I">Watch video</a>
</p>
<p align="center">
<a href="https://www.youtube.com/watch?v=a_AT7cEN_9I">
<img src="apps/marketing/public/youtube.png" alt="Watch the demo" width="600" />
</a>
</p>
<table>
<tr>
<td align="center" width="50%">
<h3>Claude Code</h3>
<a href="https://www.youtube.com/watch?v=a_AT7cEN_9I">
<img src="apps/marketing/public/youtube.png" alt="Claude Code Demo" width="100%" />
</a>
<p><a href="https://www.youtube.com/watch?v=a_AT7cEN_9I">Watch Demo</a></p>
</td>
<td align="center" width="50%">
<h3>OpenCode</h3>
<a href="https://youtu.be/_N7uo0EFI-U">
<img src="apps/marketing/public/youtube-opencode.png" alt="OpenCode Demo" width="100%" />
</a>
<p><a href="https://youtu.be/_N7uo0EFI-U">Watch Demo</a></p>
</td>
</tr>
</table>

## Install

**Install the `plannotator` command so Claude Code can use it:**
**New:**

- We now support auto-saving approved plans to [Obsidian](https://obsidian.md/).

## Install for Claude Code

**Install the `plannotator` command:**

**macOS / Linux / WSL:**

Expand All @@ -42,14 +57,30 @@ irm https://plannotator.ai/install.ps1 | iex

See [apps/hook/README.md](apps/hook/README.md) for detailed installation instructions including a `manual hook` approach.

---

## Install for OpenCode

Add to your `opencode.json`:

```json
{
"plugin": ["@plannotator/opencode"]
}
```

That's it! Restart OpenCode and the `submit_plan` tool will be available.

---

## How It Works

When Claude Code calls `ExitPlanMode`, this hook intercepts and:
When your AI agent finishes planning, Plannotator:

1. Opens Plannotator UI in your browser
2. Lets you annotate the plan visually
3. Approve → Claude proceeds with implementation
4. Request changes → Your annotations are sent back to Claude
1. Opens the Plannotator UI in your browser
2. Lets you annotate the plan visually (delete, insert, replace, comment)
3. **Approve**Agent proceeds with implementation
4. **Request changes** → Your annotations are sent back as structured feedback

---

Expand Down
2 changes: 1 addition & 1 deletion apps/hook/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "plannotator",
"description": "Interactive Plan Review: Mark up and refine your plans using a UI, easily share for team collaboration, automatically integrates with plan mode hooks.",
"version": "0.1.0",
"version": "0.3.0",
"author": {
"name": "backnotprop"
},
Expand Down
37 changes: 35 additions & 2 deletions apps/hook/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ curl -fsSL https://plannotator.ai/install.cmd -o install.cmd && install.cmd && d

---

[Plugin Installation](#plugin-installation) · [Manual Installation (Hooks)](#manual-installation-hooks)
[Plugin Installation](#plugin-installation) · [Manual Installation (Hooks)](#manual-installation-hooks) · [Obsidian Integration](#obsidian-integration)

---

Expand Down Expand Up @@ -68,4 +68,37 @@ When Claude Code calls `ExitPlanMode`, this hook intercepts and:
1. Opens Plannotator UI in your browser
2. Lets you annotate the plan visually
3. Approve → Claude proceeds with implementation
4. Request changes → Your annotations are sent back to Claude
4. Request changes → Your annotations are sent back to Claude

## Obsidian Integration

Approved plans can be automatically saved to your Obsidian vault.

**Setup:**
1. Open Settings (gear icon) in Plannotator
2. Enable "Obsidian Integration"
3. Select your vault from the dropdown (auto-detected) or enter the path manually
4. Set folder name (default: `plannotator`)

**What gets saved:**
- Plans saved with human-readable filenames: `Title - Jan 2, 2026 2-30pm.md`
- YAML frontmatter with `created`, `source`, and `tags`
- Tags extracted automatically from the plan title and code languages
- Backlink to `[[Plannotator Plans]]` for graph connectivity

**Example saved file:**
```markdown
---
created: 2026-01-02T14:30:00.000Z
source: plannotator
tags: [plan, authentication, typescript, sql]
---

[[Plannotator Plans]]

# Implementation Plan: User Authentication
...
```

<img width="1190" height="730" alt="image" src="https://github.com/user-attachments/assets/1f0876a0-8ace-4bcf-b0d6-4bbb07613b25" />

Loading