Releases: backnotprop/plannotator
v0.15.0
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.14.5 | GitLab merge request review, login page image fix, Windows install path fix |
| v0.14.4 | GitHub review submission, repo identifier in tab title, nested code fence parser fix, Pi paste URL wiring, file header gap fix |
| v0.14.3 | PR context panel, diff search in code review, OpenCode permission normalization, landing page redesign |
| v0.14.2 | OpenCode plan mode prompt replacement, Windows non-ASCII path fix, Pi link fix |
| v0.14.1 | Single submit_plan with auto-detect, viewed-file draft persistence, Bear nested tag fix |
| v0.14.0 | PR review via GitHub URL, /plannotator-last for annotating agent messages, OpenCode plan mode permissions fix, VS Code SSH proxy fix |
| v0.13.1 | OpenCode plan mode rewrite, Obsidian save fix |
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
What's New in v0.15.0
v0.15.0 adds live AI chat to code review, the ability to browse all your previous plans, a folder-based file viewer for referencing docs (e.g. Superpowers) during annotation, and full feature parity for the Pi extension. 11 PRs, 2 from external contributors, 1 first-time.
Live AI Chat in Code Review
You can now talk to an AI directly inside the code review UI. Select lines in a diff and click "Ask AI" to get context-aware explanations about what the code does and why it changed. Or open the AI sidebar tab to ask general questions about the changeset. Responses stream in real-time with full markdown rendering.
Plannotator works with the coding tools you already have installed. On startup, it checks which tools are available on your machine — Claude Code, Codex, Pi, OpenCode — and offers them as providers. You choose which one to use and which model to use with it in Settings. That choice persists across sessions. You can switch providers at any time. The only requirement is that the tool is installed and authenticated locally; Plannotator doesn't handle login or API keys itself.
Under the hood, each tool is accessed through a provider-agnostic layer (@plannotator/ai) that handles session lifecycle, streaming, and tool execution uniformly. Claude and Codex communicate via subprocess, Pi via RPC over JSONL/stdio, and OpenCode via HTTP + SSE. The OpenCode provider supports forked sessions, runtime permission approvals, and dynamic model discovery from connected providers.
Browse All Previous Plans
You can now view every plan you've approved or denied. The plannotator archive command opens a read-only browser of your plan history, with approved/denied badges and timestamps. During normal plan review, a new Archive sidebar tab gives you the same view without leaving the session, so you can reference past decisions while reviewing a new plan.
This replaces the old "Other Plans" UI and removes the dead /api/plan/history endpoint.
- #369, closing #362 reported by @andreivladmatei
Attach Folders for Reference During Review
A new Files tab in the sidebar gives you access to all markdown files in your project. Click any file to open it as a linked document with full annotation support. If you have docs, specs, or notes in directories outside the project root, add them in Settings and they show up as additional sections. Useful for power users who want their full documentation library at hand while reviewing or annotating plans.
Works in both plan mode and annotate mode. Directory sections are collapsible, and common non-content directories (node_modules, .git, dist, build, etc.) are excluded.
- #378, closing #367 requested by @andymac4182
Resizable Split Pane in Code Review
The split diff viewer now has a draggable divider between left and right panes. Drag to resize; the ratio is clamped to 20-80% and persisted via cookie storage. Double-click the handle to reset to 50/50. The implementation uses CSS custom properties that inherit into Pierre's shadow DOM, so resizing triggers zero re-renders of the diff component. The handle is hidden for add-only or delete-only files where Pierre renders a single column.
Pi Extension: Full Feature Parity
The Pi extension was missing a significant number of features that Claude Code and OpenCode users had access to. PR review, note-taking integrations (Obsidian, Bear, Octarine), plan saving with version history, editor annotations, the file browser, linked doc resolution with security checks, and the AI backbone were all absent or partially implemented. This release closes that gap entirely. Pi users now have access to every feature available on the other platforms.
The server was rewritten from a monolithic server.ts into a modular architecture split across domain-specific modules (serverPlan.ts, serverReview.ts, serverAnnotate.ts, plus shared handlers, reference resolution, annotations, integrations, PR support, and networking). A generated/ directory holds shared code copied from packages/shared/ at build time, so both Bun and Pi consume the same logic for storage, drafts, file resolution, and integrations.
A line-by-line parity audit then verified every endpoint, response shape, error case, and conditional across all three server types. This uncovered and fixed: missing error handling on several endpoints, a broken detectProjectNameSync that silently failed, a missing pasteApiUrl in Bun's annotate server that broke short URL sharing, and stale naming inconsistencies. An automated route parity test now runs in CI to prevent drift going forward.
Additional Changes
- OpenPackage manifest. Adds
openpackage.ymlfor installation viaopkg install plannotator(#368 by @TiagoJacinto) - Duplicate code review header fix (Pi). The
# Code Review Feedbackheading appeared twice when the Pi extension submitted review feedback. The wrapper no longer adds a redundant header (#370 by @dmmulroy) - Duplicate code review header fix (OpenCode). Same issue in the OpenCode plugin (#375, closing #374 reported by @nulladdict)
- Empty submit in annotate mode. The annotate UI no longer blocks submission when there are no annotations. Linked doc annotations are now counted in validation, fixing a case where annotations on linked documents couldn't be submitted (#376, closing #371 and #373 reported by @bman654)
- Sidebar resize handle fix. The left sidebar handle was visible on hover but couldn't be grabbed due to a touch area regression from v0.14.5. Fixed with asymmetric positioning that avoids covering scrollbars.
- Linked doc border styling. The border around linked documents (Obsidian files, project files, arch...
v0.14.5
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.14.4 | GitHub review submission, repo identifier in tab title, nested code fence parser fix, Pi paste URL wiring, file header gap fix |
| v0.14.3 | PR context panel, diff search in code review, OpenCode permission normalization, landing page redesign |
| v0.14.2 | OpenCode plan mode prompt replacement, Windows non-ASCII path fix, Pi link fix |
| v0.14.1 | Single submit_plan with auto-detect, viewed-file draft persistence, Bear nested tag fix |
| v0.14.0 | PR review via GitHub URL, /plannotator-last for annotating agent messages, OpenCode plan mode permissions fix, VS Code SSH proxy fix |
| v0.13.1 | OpenCode plan mode rewrite, Obsidian save fix |
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
What's New in v0.14.5
v0.14.5 adds GitLab merge request review support, bringing Plannotator's code review UI to a second hosting platform. Two community bug fixes round out the release. 3 PRs, 2 from external contributors, 1 first-time.
GitLab Merge Request Review
Plannotator can now review GitLab merge requests alongside GitHub PRs. Pass any GitLab MR URL to the review command and it works the same way: diff viewer, annotations, feedback submission, and the new PR context panel (summary, comments, pipeline status).
The platform is auto-detected from the URL. github.com routes through gh, and any URL containing /-/merge_requests/ routes through glab. Self-hosted GitLab instances are supported via the --hostname flag.
Under the hood, the existing GitHub implementation was extracted to packages/shared/pr-github.ts, and a parallel pr-gitlab.ts handles glab CLI interactions. The dispatch layer in pr-provider.ts routes by platform. The PRRef and PRMetadata types are now discriminated unions that carry the platform context throughout the stack.
GitLab's API surface differs from GitHub's in several ways that required specific handling. glab mr diff outputs bare diffs without the diff --git prefix, so the output is normalized before parsing. glab has no --jq flag, so JSON responses are parsed in full. Review submission requires three separate API calls (note, discussions, approve) rather than GitHub's single atomic endpoint, with inline comments submitted in parallel using Promise.allSettled for partial failure resilience.
The UI adapts to the platform: labels switch between PR/MR, icons between GitHub/GitLab, and issue number prefixes between # and !.
Annotate-Last Session Resolution After cd
/plannotator-last silently annotated the wrong message when a user changed directories during a Claude Code session. The command resolves the current session by matching process.cwd() against Claude Code's project slug, but after a cd the CWD no longer matches the session's original directory. The result: it finds a stale session from a previous day and opens that session's last message with no warning.
The fix introduces three-tier session resolution. First, it checks for PPID-based session metadata that Claude Code writes to ~/.claude/sessions/. If that's not available, it falls back to CWD-based slug matching, then to a recency heuristic. The PPID path is the most reliable because it ties directly to the running Claude Code process regardless of the shell's current directory.
This is a Claude Code-only bug. Codex uses CODEX_THREAD_ID, OpenCode and Pi use their SDK APIs, and none of them resolve sessions via CWD.
Additional Changes
- Fix duplicate Code Review header in Pi extension — the Pi extension's review command handler wrapped feedback in a
# Code Review Feedbackheading, butexportReviewFeedback()already includes that heading. The duplicate is removed, and two tests verify single-heading output. By @dmmulroy in #370.
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- feat: GitLab merge request review support by @backnotprop in #364
- fix: annotate-last resolves wrong session after cd by @janah01 in #366
- fix: remove duplicate 'Code Review' header in pi extension review feedback by @dmmulroy in #370
New Contributors
Contributors
@janah01 identified and fixed a subtle session resolution bug in /plannotator-last that caused it to silently annotate the wrong message after cd-ing during a Claude Code session. The three-tier resolution strategy in #366 ensures the command finds the correct session regardless of the shell's current directory.
@dmmulroy fixed the duplicate heading in Pi extension review feedback in #370, his second contribution after wiring the paste URL in v0.14.4.
Full Changelog: v0.14.4...v0.14.5
v0.14.4
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.14.3 | PR context panel, diff search in code review, OpenCode permission normalization, landing page redesign |
| v0.14.2 | OpenCode plan mode prompt replacement, Windows non-ASCII path fix, Pi link fix |
| v0.14.1 | Single submit_plan with auto-detect, viewed-file draft persistence, Bear nested tag fix |
| v0.14.0 | PR review via GitHub URL, /plannotator-last for annotating agent messages, OpenCode plan mode permissions fix, VS Code SSH proxy fix |
| v0.13.1 | OpenCode plan mode rewrite, Obsidian save fix |
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
What's New in v0.14.4
v0.14.4 adds the ability to post reviews (comments, approval) directly to GitHub from the code review UI, along with repo-aware tab titles, a parser fix for nested code fences, scroll-accessibility UI fixes, and two environment wiring fixes. 5 PRs, 3 from first-time contributors.
Post Reviews Directly to GitHub
The code review UI can now submit reviews to GitHub instead of (or in addition to) sending feedback to the local agent. When reviewing a PR, a toggle in the review panel switches between "Agent" and "GitHub" targets. In GitHub mode, clicking "Approve" or "Send Feedback" opens a popup for a review body comment, then posts the review via gh api with per-file, per-line comments mapped from your annotations.
This uses the GitHub pull request review API rather than gh pr review, because the CLI only supports general comments. The API call lets Plannotator attach each annotation to the exact file and line it references. After submitting, the PR opens in your browser and the agent receives a notification that the review was posted.
The squash-and-merge action from #348 is intentionally left for a follow-up, since it requires discussion around when automatic merging is appropriate.
- #352 by @rockneurotiko, partial progress on #348
Repo Identifier in Tab Title
Browser tabs now show the repository or directory name: myproject · Plannotator for plan review and myproject · Code Review for diffs. Previously every tab just said "Plannotator," which made it hard to tell them apart when working across multiple repos.
- #353 by @VincentHardouin, closing #342 filed by @ovitrif
Nested Markdown Code Fences
Plans that contain markdown examples with triple-backtick code blocks inside a four-backtick fence would break the parser. The outer block closed at the first triple-backtick line, producing two broken blocks instead of one. The parser now counts backticks in the opening fence and requires the same count (or more) to close it. Language tag extraction was also fixed to slice by the actual fence length rather than a hardcoded 3.
This PR also adds the first test file for the parser (8 tests).
Additional Changes
- Wire
PLANNOTATOR_PASTE_URLthrough Pi extension — the Pi extension readPLANNOTATOR_SHARE_URLbut never passedPLANNOTATOR_PASTE_URLto the browser UI, so self-hosted paste service configurations were silently ignored. Now wired through all three server types (plan, review, annotate). By @dmmulroy in #356. - Fix resize handle covering scrollbar — the resize handle's touch target extended 8px in both directions, overlapping the 6px scrollbar on the adjacent panel. A global CSS transition on
*also caused choppy scrolling. The handle now extends only outward from the panel edge, and transitions are narrowed to color properties. Closes #354, reported by @dillonoconnor. In #359.
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- feat: show repo identifier in tab title by @VincentHardouin in #353
- feat: approve and review PR to GitHub by @rockneurotiko in #352
- fix(parser): support nested markdown code fences by @brian-malinconico-axomic in #355
- fix(pi-extension): wire PLANNOTATOR_PASTE_URL through all servers by @dmmulroy in #356
- fix: prevent resize handle from covering scrollbar by @backnotprop in #359
New Contributors
- @VincentHardouin made their first contribution in #353
- @brian-malinconico-axomic made their first contribution in #355
- @dmmulroy made their first contribution in #356
Contributors
@rockneurotiko built the GitHub review submission feature in #352, adding the agent/GitHub toggle, per-line comment mapping, and the review body popup. This is his second PR to the project after the OpenCode permission fix in v0.14.3.
@VincentHardouin implemented repo-aware tab titles in #353, picking up the feature request filed by @ovitrif in #342.
@brian-malinconico-axomic fixed the nested code fence parsing in #355 and added the project's first parser test suite.
@dmmulroy wired the missing paste URL environment variable through the Pi extension in #356, fixing self-hosted paste service configurations.
@dillonoconnor reported the scrollbar interaction bug in #354.
Full Changelog: v0.14.3...v0.14.4
v0.14.3
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.14.2 | OpenCode plan mode prompt replacement, Windows non-ASCII path fix, Pi link fix |
| v0.14.1 | Single submit_plan with auto-detect, viewed-file draft persistence, Bear nested tag fix |
| v0.14.0 | PR review via GitHub URL, /plannotator-last for annotating agent messages, OpenCode plan mode permissions fix, VS Code SSH proxy fix |
| v0.13.1 | OpenCode plan mode rewrite, Obsidian save fix |
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
| v0.11.0 | Auto-save annotation drafts, comment popover, Obsidian vault browser, deny message framing fix, configurable OpenCode timeout |
What's New in v0.14.3
v0.14.3 brings two major additions to the code review UI and a community bug fix for OpenCode permissions. The review panel now surfaces PR context directly alongside the diff, and a search system lets you find text across all changed files. 4 PRs, 2 from external contributors.
See the new PR features with:
codex: !plannotator review <github-pr-url>
others: /plannotator-review <github-pr-url>
PR Context Panel in Code Review
When reviewing a GitHub PR, the review panel now shows three additional tabs: Summary, Comments, and Checks. These appear as icon buttons in the panel header and load lazily on first click.
The Summary tab displays the PR description with full markdown rendering, labels as colored badges, linked issues, and the PR's state (open, draft, merged, closed). The Comments tab shows the full conversation thread in chronological order, merging regular comments and review comments with state badges indicating whether a review approved, requested changes, or just commented. The Checks tab shows merge readiness, CI check results grouped by workflow, and review approval status.
All GitHub-authored HTML content is sanitized through DOMPurify before rendering. The data layer uses a runtime-agnostic provider in @plannotator/shared that abstracts gh CLI calls, so the same fetching logic works across Bun and Node runtimes.
These tabs only appear when reviewing a PR URL. Local diff reviews are unchanged.
Diff Search in Code Review
The file tree sidebar now includes a search input. Type a query (or press Cmd+F / Ctrl+F) to search across all changed files in the diff. Results replace the file tree, grouped by file with match count badges. Clicking a result navigates to that file and scrolls to the matching line.
The search engine parses unified diff patches into searchable lines, handling additions, deletions, and context lines separately. Each match gets a stable identifier tied to file, side, and line number, so highlights survive re-renders. Active matches highlight in amber; passive matches in yellow. The highlight system traverses shadow DOM boundaries to reach into the diff renderer's internals.
Keyboard navigation works throughout: Enter and F3 step forward through matches, Shift+Enter steps backward, and Escape clears the search and restores the file tree. For single-file diffs (which have no sidebar), Cmd+F falls through to the browser's native find.
The search engine and highlight utilities were originally written by @sercantor in #344. The sidebar integration and DiffViewer wiring are new in this PR.
- #347, closing #343 filed by @sercantor
OpenCode Permission Normalization Fix
When OpenCode users configure the deprecated tools field on the plan agent (e.g., "tools": { "edit": false }), OpenCode's config resolver converts it to permission.edit = "deny" as a plain string. Plannotator's config hook then spreads that value to merge additional rules. Spreading a string in JavaScript produces { "0": "d", "1": "e", "2": "n", "3": "y" }, which corrupts the permission ruleset and triggers four zod validation errors at startup.
The fix adds a normalizeEditPermission() step that converts string values to wildcard objects ("deny" becomes { "*": "deny" }) before the spread. Object values pass through unchanged. This handles both the deprecated tools path and users who write permission: { edit: "deny" } directly.
- #345 by @rockneurotiko, fixing #338 reported by @rockneurotiko
Additional Changes
- Landing page revamp for plannotator.ai with editorial column layout, interactive terminal demos simulating plan review and code review workflows, agent-specific install commands, a capabilities grid, and a build-time contributor strip via GitHub's GraphQL API. All screenshots converted to WebP (42MB down to 620KB). #349
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- fix: normalize permission.edit string on opencode plugin by @rockneurotiko in #345
- feat(review): VS Code-style diff search in file tree sidebar by @backnotprop in #347
- feat: landing page revamp by @backnotprop in #349
- feat(review): PR context panel — summary, comments, and checks by @backnotprop in #350
Contributors
@rockneurotiko reported the OpenCode permission corruption bug in #338 with a clear reproduction case showing the zod validation errors, then wrote the fix in #345 with full test coverage for all permission input shapes.
@sercantor filed the diff search feature request in #343 and built the search engine, highlight system, and React hook in #344. Those utilities were integrated into the sidebar in #347.
Full Changelog: v0.14.2...v0.14.3
v0.14.2
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.14.1 | Single submit_plan with auto-detect, viewed-file draft persistence, Bear nested tag fix |
| v0.14.0 | PR review via GitHub URL, /plannotator-last for annotating agent messages, OpenCode plan mode permissions fix, VS Code SSH proxy fix |
| v0.13.1 | OpenCode plan mode rewrite, Obsidian save fix |
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
| v0.11.0 | Auto-save annotation drafts, comment popover, Obsidian vault browser, deny message framing fix, configurable OpenCode timeout |
| v0.10.0 | Short URL sharing with E2E encryption, code suggestions in review UI, CJK input method support, customizable Obsidian filenames, XDG install fix |
| v0.9.3 | Linked document navigation & annotation, VS Code diff integration, toolbar dismiss fix, automated npm publishing |
What's New in v0.14.2
v0.14.2 is a stability patch with two fixes. It addresses OpenCode plan mode agents going rogue on feedback rounds, and fixes /plannotator-last failing on Windows when the project path contains non-ASCII characters.
OpenCode: Replace Plan Mode Prompt Instead of Stripping It
v0.14.1 simplified the submit_plan tool, but the prompt handling had a deeper problem. The messages.transform hook was stripping OpenCode's entire plan mode directive from the system prompt. That directive tells the agent what it cannot do during planning. With it gone, agents had no guardrails and began writing Python scripts via Bash to work around edit restrictions.
This release changes the approach: instead of removing OpenCode's prompt, Plannotator now replaces it with a tailored version. The replacement keeps the STRICTLY FORBIDDEN language for non-markdown edits and destructive bash commands, but explicitly allows .md file writing for plans, specs, and docs. The exploration-first workflow and source code protection remain intact.
The difference is subtle but load-bearing. Stripping the prompt left a gap that models filled with creative workarounds. Replacing it gives them clear boundaries that include the plan file exception.
Annotate-Last on Windows with Non-ASCII Paths
/plannotator-last reads Claude Code's session logs to find the last rendered assistant message. It locates the correct session directory by matching the current working directory against Claude Code's project slug format. The slug generation logic was only replacing / characters, but Claude Code normalizes paths more aggressively: any character outside [a-zA-Z0-9-] becomes a hyphen.
This mismatch caused /plannotator-last to silently fail on Windows paths containing Cyrillic characters, underscores, or spaces. The fix aligns projectSlugFromCwd with Claude Code's actual normalization regex and adds a case-insensitive fallback for directory lookup to handle Windows drive letter casing differences (C: vs c:).
- #340, closing #339 reported by @axelboman277
Additional Changes
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- docs: update link to the Pi coding agent by @blissdev in #337
- fix: align projectSlugFromCwd with Claude Code's path normalization by @backnotprop in #340
- fix: replace plan mode prompt instead of stripping it by @backnotprop in #341
New Contributors
Community
@ilmpc identified the root cause of the plan mode prompt issue in #328, reporting that agents were writing Python scripts to bypass edit restrictions after the prompt was stripped. That diagnosis directly shaped the fix in #341. @rcdailey contributed additional feedback in the same thread about submit_plan visibility across agents. @linxi-1214 also reported submit_plan not appearing in #328.
@axelboman277 filed a detailed bug report for the Windows non-ASCII path failure in #339, including the exact Cyrillic path and environment details that made the fix straightforward to verify.
Full Changelog: v0.14.1...v0.14.2
v0.14.1
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.14.0 | PR review via GitHub URL, /plannotator-last for annotating agent messages, OpenCode plan mode permissions fix, VS Code SSH proxy fix |
| v0.13.1 | OpenCode plan mode rewrite, Obsidian save fix |
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
| v0.11.0 | Auto-save annotation drafts, comment popover, Obsidian vault browser, deny message framing fix, configurable OpenCode timeout |
| v0.10.0 | Short URL sharing with E2E encryption, code suggestions in review UI, CJK input method support, customizable Obsidian filenames, XDG install fix |
| v0.9.3 | Linked document navigation & annotation, VS Code diff integration, toolbar dismiss fix, automated npm publishing |
| v0.9.0 | Plan Diff with two view modes, version history, sidebar redesign, terminology cleanup |
What's New in v0.14.1
v0.14.1 is a small patch with two fixes and one feature. It simplifies the OpenCode plan mode tool interface, adds viewed-file persistence to code review drafts, and fixes Bear's nested tag handling.
OpenCode: Single submit_plan with Auto-Detect
v0.14.0 patched OpenCode plan mode permissions, but the underlying tool interface was still more complex than it needed to be. Agents had two tools (submit_plan and submit_plan_file) and an 80+ line prompt that fought with OpenCode's own plan mode directive.
This release collapses both tools back into a single submit_plan(plan) that auto-detects whether the argument is markdown text or a file path. On the first submission, the agent passes plan text directly. On denial, the response includes the history path where the plan was saved, so the agent can edit that file with targeted changes and resubmit the path. The planning prompt drops from 80+ lines to roughly 25.
The auto-detection logic is straightforward: if the value is an absolute path ending in .md that exists on disk, treat it as a file path. Plan markdown virtually never satisfies all three conditions.
Persist Viewed Files in Code Review Drafts
The draft auto-save system (introduced in v0.11.0 for annotations) now includes viewed-file state. When reviewing a large diff, marking files as "viewed" is part of the workflow. Previously, a page refresh or browser restart lost that progress. Viewed files now save and restore atomically alongside annotations in the same draft file. The restore banner shows both counts when applicable. Old drafts without viewed files load correctly.
Bear Nested Tag Fix
Bear supports nested tags like plannotator/plans for hierarchical organization. The normalizeTags() function was stripping / characters from custom tags, collapsing plannotator/plans into plannotatorplans. The fix preserves slashes while still collapsing consecutive slashes and stripping leading/trailing ones.
- Authored by @MarceloPrado in #331
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- fix: preserve slashes in Bear tag normalization for nested tags by @MarceloPrado in #331
- fix: single submit_plan with text/path auto-detect for OpenCode by @backnotprop in #333
- feat: persist viewed files in code review drafts by @backnotprop in #335
Community
@MarceloPrado authored the Bear nested tag fix (#331), a follow-up to the configurable Bear tags feature he contributed in v0.13.0 (#283).
Community members who reported issues that shaped this release:
- @oronbz: #332 (persist viewed files in code review, with comparison to GitHub's review workflow)
- @rcdailey: #328 (feedback on submit_plan tool consolidation)
Full Changelog: v0.14.0...v0.14.1
v0.14.0
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.13.1 | OpenCode plan mode rewrite, Obsidian save fix |
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
| v0.11.0 | Auto-save annotation drafts, comment popover, Obsidian vault browser, deny message framing fix, configurable OpenCode timeout |
| v0.10.0 | Short URL sharing with E2E encryption, code suggestions in review UI, CJK input method support, customizable Obsidian filenames, XDG install fix |
| v0.9.3 | Linked document navigation & annotation, VS Code diff integration, toolbar dismiss fix, automated npm publishing |
| v0.9.0 | Plan Diff with two view modes, version history, sidebar redesign, terminology cleanup |
What's New in v0.14.0
v0.14.0 adds PR review via GitHub URL, a new /plannotator-last command for annotating agent messages, and a batch of fixes for OpenCode plan mode, the VS Code extension over SSH, and the review server. Seven of the nine PRs address user-reported issues. Three external contributors authored fixes, two of them first-time.
PR Review via GitHub URL
/plannotator-review now accepts a GitHub pull request URL. Run /plannotator-review https://github.com/owner/repo/pull/123 and the review UI opens with the PR's diff, metadata badge (title, number, link back to GitHub), and full annotation support. Authentication goes through the gh CLI, so private repos work if you're already authenticated. Expandable file context fetches from the GitHub API using the PR's base and head SHAs.
In PR mode, the diff switcher and staging buttons are hidden since you're reviewing a remote PR, not local changes. Everything else works the same: annotate lines, leave file-level comments, send feedback back to the agent.
The implementation introduces a runtime-agnostic PR provider (packages/shared/pr-provider.ts) that follows the same interface pattern as the existing ReviewGitRuntime, with a Bun wrapper in packages/server/pr.ts.
Annotate Last Agent Message
/plannotator-last extracts the last rendered assistant message from the current session and opens it in the annotation UI. Select text, add comments, mark deletions, attach images, and send structured feedback back to the agent. This works across all four harnesses:
| Harness | How it finds the message |
|---|---|
| Claude Code | Parses ~/.claude/projects/{slug}/*.jsonl session logs |
| Pi | ctx.sessionManager.getEntries() API |
| OpenCode | client.session.messages() SDK |
| Codex | Parses ~/.codex/sessions/ rollout JSONL files |
The UI adapts to the annotate-last context: the copy button reads "Copy message," the completion overlay says "annotations on the message," and the feedback export is titled "Message Feedback."
OpenCode Plan Mode Permissions and Prompt Fixes
v0.13.1 rewrote OpenCode plan mode, but OpenCode's upstream prompt and permission system fought the plugin at several points. The agent would get PermissionDeniedError when writing .md files in the plan directory. OpenCode's "STRICTLY FORBIDDEN" plan mode directive confused models into refusing file edits even when explicitly allowed. The submit_plan tool appeared outside of plan mode, leading to confusing agent behavior.
This release fixes all of that. The plugin now grants per-agent edit permission for *.md scoped to the plan agent only. It strips OpenCode's conflicting plan mode prompt from synthetic user message parts. It overrides the todowrite tool description to redirect to submit_plan, and injects a <system-reminder> reinforcing plan mode behavior on every turn. The validatePlanPath directory restriction is disabled so plans can be written anywhere the agent chooses within the XDG data path.
- #329, fixing #328 reported by @linxi-1214
VS Code SSH Remote: Proxy Race Condition and IPC Discovery
Two issues prevented the VS Code extension from working reliably over SSH Remote. First, the cookie proxy connected to the upstream Bun server before it was ready, showing "proxy error" on first load. The fix adds retry with exponential backoff (200/400/800ms) in the proxy, plus a silent auto-reload fallback in the webview wrapper.
Second, background processes spawned by Claude Code hooks don't inherit VS Code's PLANNOTATOR_BROWSER environment variable, so openBrowser() had no way to reach the extension. The fix introduces a file-based IPC registry at ~/.plannotator/vscode-ipc.json. The extension writes its IPC port keyed by workspace path, and openBrowser() reads it as a fallback. Multi-window setups are handled via longest-prefix workspace matching.
Additional Changes
- Review server CWD context flow — In tmux/server/attach setups, the OpenCode review server could use the wrong working directory for diff commands. The review flow now carries
cwdas explicit session context viaGitContext, so all endpoints (/api/diff,/api/file-content,/api/git-add) use the correct project directory. Authored by @jwyce in #323 - Disable external diff in git commands — Review-related
git diffcalls now include--no-ext-diffso external diff tools configured in the user's git config don't corrupt the output. Authored by @BruceChen7 in #320 /plannotator-lastdocumentation — Docs and install scripts updated for the new command (#327)
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- fix(review): disable external diff in git commands by @BruceChen7 in #320
- fix: proxy race condition + IPC discovery for VS Code SSH Remote by @7tg in #322
- fix: opencode review cwd context flow by @jwyce in #323
- feat: PR review support via GitHub URL by @backnotprop in #324
- feat: /plannotator-last — annotate the last agent message by @backnotprop in #325
- feat: add release process skill by @backnotprop in #326
- docs: add /plannotator-last to docs and install scripts by @backnotprop in #327
- fix: OpenCode plan mode permissions and prompt conflicts by @backnotprop in [#329](h...
v0.13.1
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.13.0 | Built-in themes, annotatable plan diffs, file-scoped code review comments, Octarine integration, unified review core, Pi remote sessions |
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
| v0.11.0 | Auto-save annotation drafts, comment popover, Obsidian vault browser, deny message framing fix, configurable OpenCode timeout |
| v0.10.0 | Short URL sharing with E2E encryption, code suggestions in review UI, CJK input method support, customizable Obsidian filenames, XDG install fix |
| v0.9.3 | Linked document navigation & annotation, VS Code diff integration, toolbar dismiss fix, automated npm publishing |
| v0.9.0 | Plan Diff with two view modes, version history, sidebar redesign, terminology cleanup |
| v0.8.5 | Pi coding agent support, auto-close countdown, image endpoint security fix, OpenCode package fix |
| v0.8.0 | Open source (MIT/Apache-2.0), annotate command, self-hosted share portal, resizable panels, mermaid controls, auto-close on approval, documentation site |
What's New in v0.13.1
v0.13.1 rewrites how Plannotator works with OpenCode's plan mode. The plugin now intercepts plan mode, injects its own planning workflow, and gives OpenCode users the same interactive browser-based review that Claude Code and Pi users already have. This release also fixes an Obsidian save failure on certain Bun versions.
OpenCode Plan Mode Rewrite
Previous versions of the OpenCode plugin had a fragile plan mode integration. Long plans caused JSON parse errors because the entire plan was passed as a tool call string argument. The agent wrote to a custom directory that OpenCode's permission system blocked. The browser review UI often failed to open. There was no support for the agent asking clarifying questions during planning.
This release replaces all of that with file-based plan storage. The agent writes its plan to a markdown file on disk, then calls submit_plan with the file path. Plans live in ~/.local/share/opencode/plans/, which is the XDG data path that OpenCode's permission system already allows. The agent picks the filename, and on feedback it revises the same file and resubmits. No content is lost between rounds.
The planning prompt now follows an exploration-first workflow: Explore the codebase, ask clarifying questions, write the plan, submit for review. Previously, agents would jump straight into writing a plan before understanding the code. For greenfield tasks where there is no codebase to explore, the agent skips to questions. The prompt is tool-neutral and avoids referencing specific tool names like write or edit, so it works with GPT models that use apply_patch.
Under the hood, the plugin strips OpenCode's native "STRICTLY FORBIDDEN: ANY file edits" directive from the system prompt and replaces it with Plannotator's own scoped rules, which allow the agent to create and edit plan files while still preventing codebase modifications. The submit_plan tool is hidden from subagents by default; users running custom subagent workflows like Superpowers or OhMyOpenCode can set PLANNOTATOR_ALLOW_SUBAGENTS=1 to make it visible.
Shared checklist utilities were extracted to @plannotator/shared for cross-plugin reuse of plan execution tracking.
- #318, closing #63 (file-based plans, requested by @DanielusG), #129 (JSON parse error, reported by @5trongHust), #152 (question support, requested by @fidelix), #183 (browser not opening, reported by @eromoe), and #289 (subagent access, reported by @sfpmld)
Obsidian Save Fix
Bun versions 1.1.43 through 1.1.45 introduced a regression where mkdirSync({ recursive: true }) throws EEXIST when the directory already exists. This broke Obsidian saves on the second attempt. The fix adds an existsSync guard before the mkdir call. It's a no-op on unaffected Bun versions and prevents the save failure on affected ones.
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- feat: Pi-style iterative planning for OpenCode plugin by @backnotprop in #318
- fix: guard Obsidian mkdir against Bun EEXIST regression by @backnotprop in #319
Community
Five long-standing feature requests and bug reports drove this release:
- @DanielusG requested file-based plans in #63, the oldest open issue on the tracker
- @5trongHust reported the JSON parse error on long plans in #129
- @fidelix requested question/answer support during planning in #152
- @eromoe reported the browser not opening after plan mode in #183
- @sfpmld reported subagent access to
submit_planin #289 - @Pollux12 reported the Obsidian save failure in #315
Full Changelog: v0.13.0...v0.13.1
v0.13.0
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.12.0 | Quick annotation labels, mobile compatibility, Graphviz rendering, markdown images with lightbox, linked doc navigation in annotate mode |
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
| v0.11.0 | Auto-save annotation drafts, comment popover, Obsidian vault browser, deny message framing fix, configurable OpenCode timeout |
| v0.10.0 | Short URL sharing with E2E encryption, code suggestions in review UI, CJK input method support, customizable Obsidian filenames, XDG install fix |
| v0.9.3 | Linked document navigation & annotation, VS Code diff integration, toolbar dismiss fix, automated npm publishing |
| v0.9.0 | Plan Diff with two view modes, version history, sidebar redesign, terminology cleanup |
| v0.8.5 | Pi coding agent support, auto-close countdown, image endpoint security fix, OpenCode package fix |
| v0.8.0 | Open source (MIT/Apache-2.0), annotate command, self-hosted share portal, resizable panels, mermaid controls, auto-close on approval, documentation site |
What's New in v0.13.0
v0.13.0 brings built-in themes, annotatable plan diffs, file-scoped code review comments, and deeper platform parity for the Pi extension. Six of the fourteen PRs in this release came from external contributors, three of them first-time.
Built-in Theme System
The UI now ships with eighteen built-in themes across dark, light, and system-adaptive modes, from high-contrast terminals to soft pastels. A theme grid in Settings lets you preview and switch instantly; your choice persists via cookies across sessions. Under the hood, all color tokens were consolidated into packages/ui/theme.css as CSS custom properties, which means the plan viewer, code review, and annotate UIs all share a single source of truth for color.
Annotatable Plan Diffs
Plan diff view (the comparison that appears when a coding agent resubmits after a denial) now supports annotations directly on diff content. Hover over an added, removed, or modified section and the annotation toolbar appears. Each annotation carries a diffContext field (added, removed, modified) that is included in the exported feedback, so the agent knows exactly which part of the diff your comment targets. This was a major refactor: the annotation highlighting infrastructure was extracted into a shared useAnnotationHighlighter hook, and the diff view uses its own block-level hover system rather than web-highlighter.
File-Scoped Comments in Code Review
The /plannotator-review UI now supports file-level comments in addition to line-level annotations. Each file header has a comment composer that lets you leave feedback about the file as a whole. These comments appear in the Review Panel alongside line annotations and are included in the exported feedback. Useful for high-level observations like "this file should be split" or "the approach here needs rethinking" that don't attach to any specific line.
- Authored by @sercantor in #303, closing #302
Octarine Notes Integration
Octarine joins Obsidian and Bear as a third notes app integration. Plan snapshots can be saved directly to Octarine on approval or denial. All three integrations now support an auto-save toggle. Enable it once in Settings and every plan decision writes to your notes app without prompting. Under the hood, all integration saves run in parallel with Promise.allSettled, so a slow or failing integration doesn't block the others.
Pi Extension: Remote Session Support
The Pi extension now detects SSH and devcontainer environments the same way the Claude Code hook does, using PLANNOTATOR_REMOTE, SSH_TTY, and SSH_CONNECTION. In remote sessions, it uses a fixed port and returns the URL for manual browser opening instead of trying to launch one. This brings Pi to full parity with Claude Code and OpenCode for remote development workflows.
- Authored by @fink-andreas in #299
Unified Review Core (Bun + Pi)
The review server had two implementations: one in the Bun-compiled hook, one in the Pi extension. They drifted apart over time, causing bugs like missing untracked file support in Pi. This release extracts a runtime-agnostic review core that both platforms consume. Diff assembly, file content retrieval, worktree handling, and stage/unstage all live in one place now. Regression tests cover the shared surface.
- #310, closing #307 reported by @0xbentang
Shared Feedback Templates
The deny feedback message that gets sent back to the agent was inconsistent across plan review, code review, and annotate mode. Each had its own phrasing and structure. This release unifies them into shared templates. It also adds an instruction to preserve the plan's # Title heading on resubmission, which fixes a version history issue where title changes would break slug-based plan grouping.
- #298, addressing #296 reported by @MarceloPrado
Configurable Bear Tags
Bear integration previously hardcoded the tag. You can now set custom tags and choose whether tags are prepended or appended to the note body. This PR also fixes a double-title bug where both the URL parameter title and the H1 in the note body were rendering.
- Authored by @MarceloPrado in #283
Additional Changes
- Favicon. All three server modes (plan review, code review, annotate) now serve an SVG favicon: purple rounded square with a white "P" and gold highlight stripe (#312 by @dgrissen2, idea from Discussion #269)
- LGTM approval fix. Approving in code review no longer tells the agent to "address all feedback." If you clicked LGTM, there is no feedback to address (#293, reported by @tobeycodes in #284)
- Non-blocking browser launch (Pi/Linux).
execSync(xdg-open)blocked the Pi extension's event loop on Linux. Replaced with detachedspawn().unref()(#292, reported by @dvic in #288) - Mobile context menu fix. Suppresses the native iOS Safari callout and Android Chrome context menu during text selection so the annotation toolbar isn't obscured (#281 by @grubmanItay)
- Tater sprite z-index fix. The tater mascot was rendering in front of the plan document due to a stacking context created by the mobile compat PR. Fixed (#308)
- review-renovate skill. New agent skill at
.agents/skills/review-renovate/for automated supply chain review of Renovate dependency PRs (#306)
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in `openco...
v0.12.0
Follow @plannotator on X for updates
Claude Code users, want to give feedback on approval? Please upvote & comment here.
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.11.4 | Git add from code review, bidirectional scroll navigation, clipboard paste for annotation images, VS Code IPC port stability |
| v0.11.3 | Expandable diff context, hierarchical folder tree, redesigned worktree controls, supply chain hardening |
| v0.11.2 | Git worktree support in code review, VS Code editor annotations in review, Obsidian auto-save & separator settings, session discovery, smart file resolution |
| v0.11.1 | VS Code extension for in-editor plan review, Pinpoint mode for point-and-click annotations, untracked files in code review |
| v0.11.0 | Auto-save annotation drafts, comment popover, Obsidian vault browser, deny message framing fix, configurable OpenCode timeout |
| v0.10.0 | Short URL sharing with E2E encryption, code suggestions in review UI, CJK input method support, customizable Obsidian filenames, XDG install fix |
| v0.9.3 | Linked document navigation & annotation, VS Code diff integration, toolbar dismiss fix, automated npm publishing |
| v0.9.0 | Plan Diff with two view modes, version history, sidebar redesign, terminology cleanup |
| v0.8.5 | Pi coding agent support, auto-close countdown, image endpoint security fix, OpenCode package fix |
| v0.8.0 | Open source (MIT/Apache-2.0), annotate command, self-hosted share portal, resizable panels, mermaid controls, auto-close on approval, documentation site |
What's New in v0.12.0
This is a community release. Ten of the fourteen PRs in v0.12.0 were authored by external contributors, spanning three major features and a sweep of cross-platform fixes. The annotation system gained preset labels for one-click feedback — no typing, just click and move on. The plan viewer now renders Graphviz diagrams alongside Mermaid, inline markdown images with a lightbox zoom, and renders all diagrams by default instead of showing raw source. And the entire UI works on mobile.
Quick Annotation Labels
Reviewing a plan often means the same feedback applies to multiple sections — "clarify this," "verify this assumption," "match existing patterns." Quick Labels turn those into one-click preset chips that appear above the annotation toolbar. Select text, click a label, done. No typing required.
Ten default labels ship out of the box, each with an emoji and a color-coded pill:
❓ Clarify this · 🗺️ Missing overview · 🔍 Verify this · 🔬 Give me an example · 🧬 Match existing patterns · 🔄 Consider alternatives · 📉 Ensure no regression · 🚫 Out of scope · 🧪 Needs tests · 👍 Nice approach
Several labels carry agent-facing tips that get injected into the feedback. For example, selecting a section and clicking "🔍 Verify this" tells the agent: "This seems like an assumption. Verify by reading the actual code before proceeding." The "🧬 Match existing patterns" label instructs the agent to search the codebase for existing solutions rather than introducing a new approach. These tips are invisible to the reviewer but shape how the agent responds.
When the feedback is exported, labeled annotations are grouped into a Label Summary section at the bottom — **🔍 Verify this**: 3 — so both the reviewer and the agent can see at a glance which patterns recur across the plan.
Labels are fully customizable in Settings. Add up to 12, reorder them, pick custom colors and tips, or remove the ones you never use. Settings persist across sessions via cookies.
A follow-up PR introduced a dedicated Quick Label editing mode alongside Markup, Comment, and Redline. In this mode, selecting text immediately shows a floating label picker — no toolbar intermediary. Alt+1 through Alt+0 keyboard shortcuts work in any mode for power users who prefer not to reach for the mouse.
- Authored by @grubmanItay in #268 and #272
Mobile Compatibility
Plannotator was desktop-only. That mattered less when the tool was purely a local dev workflow, but with shared URLs and team reviews becoming common, people were opening plan links on phones and tablets and getting a broken layout.
The UI now adapts fully below 768px. The header collapses into a hamburger menu. The annotation panel renders as a full-screen overlay with a backdrop and close button. Touch support covers resize handles, pinpoint annotations, text selection, and the toolstrip. Card action buttons are always visible on touch devices instead of appearing on hover. The Settings modal switches to a horizontal tab bar. The CommentPopover width is capped to the viewport so it doesn't overflow off-screen.
Desktop layout is completely unchanged — this is additive, not a redesign.
- Authored by @grubmanItay in #260
Graphviz Diagram Rendering
Plannotator has supported Mermaid diagrams since v0.6.8. Plans that use Graphviz for architecture diagrams, dependency graphs, or state machines were stuck with raw DOT source in a code block. The Viewer now renders graphviz, dot, and gv fenced code blocks using @viz-js/viz, with the same UX conventions as Mermaid: source/diagram toggle, zoom and pan controls, and an expanded fullscreen view.
- Authored by @flex-yj-kim in #266
Mermaid Diagram Improvements
The Mermaid viewer received a substantial UX overhaul. Diagrams now open in a proper expanded fullscreen mode with zoom in/out, fit-to-view, and wheel zoom. The source/diagram toggle was reworked for clarity. Wide diagrams no longer clip against container edges in both plan view and plan diff view. Safari stability issues with SVG rendering were resolved.
A separate PR changed both Mermaid and Graphviz diagrams to render by default instead of showing raw source code first — the source toggle is still one click away, but the visual rendering is now the default state.
- Authored by @flex-yj-kim in #264 and #279
- Issue #275 filed by @flex-yj-kim
Markdown Image Rendering
Markdown  syntax was silently treated as plain text — the ! character wasn't in the inline scanner, so images never rendered. They do now. Local image paths are proxied through the existing /api/image endpoint, and relative paths resolve correctly when annotating files outside the project root.
Clicking any rendered image opens a full-screen lightbox with the alt text as a caption. Press Escape or click the backdrop to dismiss.
- Authored by @dgrissen2 in #271
Linked Doc Navigation in Annotate Mode
The /plannotator-annotate command lets you annotate any markdown file, but clicking .md links inside that file would break — the annotate server was missing a /api/doc endpoint, so link requests returned raw HTML instead of JSON. This release adds the missing route and supports chained relative link navigation, so you can follow links between sibling markdown files without leaving annotate mode.
- Authored by @dgrissen2 in #276
VS Code Extension in SSH Remote Sessions
The VS Code extension sets PLANNOTATOR_BROWSER to its own open-in-vscode handler so plans open in editor tabs instead of external browsers. In SSH remote sessions, the shared openBrowser() function skipped browser launch entirely — ignoring the custom handler. The fix is a one-line condition change: if PLANNOTATOR_BROWSER is set, always call openBrowser() regardless of remote detection. This covers plan review, code review, and annotate mode.
Additional Changes
- Windows markdown path support —
plannotator annotatenow handles Windows drive-letter paths (C:\...,C:/...), Git Bash/MSYS paths (/c/...), and Cygwin paths (/cygdrive/c/...) in the shared markdown resolver ([...