Skip to content

Releases: backnotprop/plannotator

v0.26.8

Choose a tag to compare

@github-actions github-actions released this 11 Aug 00:07
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates

Missed recent releases?
Release Highlights
v0.26.7 Pinpoint targets any element on HTML pages, smarter hover labels, zero-scan hit testing
v0.26.6 Fixed empty environment variables in sandboxed sessions (Bun 1.3.14 builds)
v0.26.5 HTML pinpoint element annotations, durable annotate submissions, installer fallback for old git, vim HUD cursor fix
v0.26.4 Skill-menu hover jitter fix (same-day patch on v0.26.3)
v0.26.3 Skill references in comments with / or $, reachable remote session URLs, worktree switcher tooltips
v0.26.2 Single-file diff tabs render fully, no more silently dropped review files, light/dark theme pairs, palette-matched code blocks
v0.26.1 GitButler 0.22.0 compatibility via capability-probed JSON flags
v0.26.0 Edit Mode (suggest by editing the diff), Guided Review virtualization, colorblind theme, safe uninstall, installer opt-outs, OpenCode 2 support
v0.25.1 Codex no longer launches on review open, annotate-last follows the live conversation, pi-todos mirror, Claude Opus 5, abandoned-gate dismissal
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes

What's New in v0.26.8

This release rebuilds how annotations look and behave on HTML pages, and it is the largest change to the annotate surface since pinpoint mode shipped. Nine PRs landed, three of them from first-time contributors @Snaylaker, @atomicflag, and @monkhai.

Placed comment markers replace inline highlights on HTML pages

Annotating a raw HTML page used to write highlight markup directly into the page's own DOM. That caused two visible bugs: multi-paragraph selections often turned only their first paragraph blue, and on some pages the injected markup broke the page's layout. Both had the same root cause, so both are gone the same way: nothing writes into the page anymore.

Annotations now appear as numbered comment bubbles projected onto a fixed overlay above the page. A bubble sits at the exact point you clicked, not a corner of the element, and it stays glued through scrolling, page re-renders, responsive reflows, and zoom. If the annotated element disappears or scrolls out of a clipped container, its bubble hides instead of floating over unrelated content, and it returns when the target does. Selections highlight through the same overlay, so highlights now always cover the full selection and can never disturb the page beneath.

The bubbles are real buttons: click one, or click the highlighted text itself, to jump to that annotation in the panel. Highlights brighten on hover so you can tell they are clickable. Bubble numbers match the numbering in the feedback your agent receives, so "see comment 3" means the same thing on screen and in the session. Committed highlights still print; annotating with Cmd+P in mind works the way it did before.

The implementation went through three adversarial review rounds, a 25-item QA gate with independent verification of every serious finding, and a follow-up hardening pass covering clipping, visibility, print, and per-frame performance on mutation-heavy pages.

Shift-click selects multiple elements for one comment

One comment can now cover several places on an HTML page. Make a pinpoint selection, hold Shift, and click more elements: each gains an outline and a chip in the composer, Shift-clicking a selected element removes it, and removing the first selection promotes the next one rather than cancelling the draft. Up to 16 additional targets ride on one comment, and after saving, every target shows a bubble carrying the same comment number. Feedback to the agent lists every selected element, so "these three buttons need the same fix" is one comment, not three.

HTML sessions open minimal, and stale preferences reset

Opening an HTML page to annotate now shows just the page: pinpoint input ready, tools hidden, sidebar and annotations drawer closed. Anything you change persists for your next HTML session, but only while you keep using HTML annotate. A preference untouched for a week expires back to these defaults, so a mode you tried once months ago never becomes a permanent surprise. Active users keep their setup; annotating refreshes the clock.

Pages with their own Content-Security-Policy are now annotatable

An HTML file carrying its own strict CSP meta tag (common in saved pages and generated reports) silently blocked the annotation script, leaving a page you could see but not annotate. The annotate viewer now removes the document's CSP meta tags before rendering. The iframe sandbox remains the security boundary, and the file on disk is untouched.

OpenCode: Qwen3.6 no longer corrupts the planning prompt

OpenCode sessions using Qwen3.6 hit a Jinja template conflict: Plannotator injected its planning instructions as multiple system-prompt parts, and Qwen's template mangled them. @atomicflag rewrote the injection to compose one consolidated system part. The review process surfaced a subtle evaluation-order bug and an escaping edge case, both fixed and regression-tested, and the QA gate then caught that the OpenCode 2 adapter still used the old multi-part path, so the fix now covers both OpenCode 1 and OpenCode 2 entry points.

Plan position survives window refocus in vim mode

Switching away from a plan review window and back again reset the vim cursor to the top of the document. @Snaylaker fixed the refocus path to preserve your position, so alt-tabbing to check something no longer costs you your place in a long plan.

Additional Changes

  • File headers show a hover state in code review. Diff file headers now tint on hover with a short transition, signaling that the header is clickable (it collapses the file). Contributed by @monkhai in #1256.
  • The legacy self-hosting docs route redirects to the canonical docs site. #1255

Install / Update

macOS / Linux:

curl -fsSL https://plannotator.ai/install.sh | bash

Windows:

irm https://plannotator.ai/install.ps1 | iex

Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".

OpenCode: Clear cache and restart:

rm -rf ~/.bun/install/cache/@plannotator

Then in opencode.json:

{
  "plugin": ["@plannotator/opencode@latest"]
}

What's Changed

  • fix(vim): preserve plan position on refocus by @Snaylaker in #1252
  • Fix OpenCode plugin Jinja template corruption with Qwen3.6 by @atomicflag in #1114
  • feat(annotate): shift-click multi-element selection for raw-HTML pinpoint by @backnotprop in #1254
  • fix(marketing): redirect self-hosting guide to canonical docs by @backnotprop in #1255
  • feat(review): add file header hover state by @monkhai in #1256
  • feat(annotate): placed comment markers for raw-HTML annotation by @backnotprop in #1257
  • fix: QA-gate hardening for the v0.26.8 feature set by @backnotprop in #1258
  • fix(ann...
Read more

v0.26.7

Choose a tag to compare

@github-actions github-actions released this 10 Aug 06:09
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


What's New in v0.26.7

One change, and it transforms how annotating HTML pages feels: pinpoint mode now targets any element on the page.

Pinpoint targets what your cursor is on

Since v0.26.5, raw-HTML annotate sessions default to pinpoint input. But pinpoint could only target a fixed list of "semantic" HTML tags: headings, paragraphs, tables, sections. Real prototype and report pages are built from styled divs and spans, so hovering a small chip or an icon button selected the whole enclosing section, and some elements could not be selected at all.

Pinpoint now resolves the element actually painted under your cursor, whatever its tag. Chips, icon buttons, badges, custom cards: all individually annotatable. Elements smaller than 16px promote to their parent so you are not pixel-hunting, and containers are selected the natural way, by pointing at their padding or any spot not covered by a child. The whole interaction stays mouse-only and matches how pinpoint already feels on markdown documents. Hover labels got smarter too: a div with a rowchip class now labels as "rowchip", using its aria-label, role, or class names instead of a bare tag name.

Under the hood the hover path no longer rebuilds a document-wide element graph every frame; it is a per-event hit-test with zero document scans, which also retires the performance debt noted in the v0.26.5 pinpoint release. Anchor restoration keeps every fail-closed guarantee, and data-testid-style attributes (data-test-id, data-cy, data-qa) now count as trusted element identity for restoring annotations onto regenerated pages. One honest limit: an element with no text and no identifying attribute can be annotated in-session, but its pin does not restore on a later reopen; a pin that cannot verify its target refuses to guess.

The change went through two adversarial review rounds; the first round removed an anchoring mechanism that could have restored a pin onto the wrong sibling, in favor of failing closed.


Install / Update

macOS / Linux:

curl -fsSL https://plannotator.ai/install.sh | bash

Windows:

irm https://plannotator.ai/install.ps1 | iex

Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".

OpenCode: Clear cache and restart:

rm -rf ~/.bun/install/cache/@plannotator

Then in opencode.json:

{
  "plugin": ["@plannotator/opencode@latest"]
}

Pi: Install or update the extension:

pi install npm:@plannotator/pi-extension

What's Changed

  • feat(annotate): hit-test pinpoint targeting for raw-HTML sessions by @backnotprop in #1251

Full Changelog: v0.26.6...v0.26.7

v0.26.6

Choose a tag to compare

@github-actions github-actions released this 10 Aug 04:15
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


What's New in v0.26.6

v0.26.6 is a rebuild-only patch: no Plannotator code changed, but every binary is now compiled with Bun 1.3.14 instead of 1.3.11.

Env vars now work inside OS sandboxes

Binaries built with Bun 1.3.11 loaded an empty environment whenever a parent of the working directory was unreadable, which is the normal state inside OS-level sandboxes (Seatbelt on macOS, Landlock on Linux, tools like nono). Every PLANNOTATOR_* variable was silently ignored there: remote mode never activated, fixed ports were dropped, and no warning explained why. This was oven-sh/bun#27802, fixed upstream in Bun 1.3.13.

We had pinned Bun to 1.3.11 in April because 1.3.12 broke macOS binary signing outright. Before unpinning we verified both directions: a 1.3.14 build reads env vars correctly under an unreadable ancestor, and cross-compiled macOS binaries carry the same valid linker signature as the known-good releases and launch cleanly.

The release pipeline also gained two permanent guardrails: macOS binaries are now smoke-launched after every build (the April signing breakage shipped because only Linux and Windows were), and a new check runs the freshly built binary from a directory with an unreadable ancestor and asserts env vars still load.


Install / Update

macOS / Linux:

curl -fsSL https://plannotator.ai/install.sh | bash

Windows:

irm https://plannotator.ai/install.ps1 | iex

Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".

OpenCode: Clear cache and restart:

rm -rf ~/.bun/install/cache/@plannotator

Then in opencode.json:

{
  "plugin": ["@plannotator/opencode@latest"]
}

Pi: Install or update the extension:

pi install npm:@plannotator/pi-extension

What's Changed

  • fix(ci): bump Bun build pin to 1.3.14 for sandbox env loading by @backnotprop in #1250

Community

@SierraJC filed #1249 with a complete diagnosis: the exact upstream Bun issue, the fix version, and a one-line repro that distinguishes "binary cannot see the variable" from "binary mishandles the variable". Reports like this make patches fast.

Full Changelog: v0.26.5...v0.26.6

v0.26.5

Choose a tag to compare

@github-actions github-actions released this 10 Aug 00:56
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


Missed recent releases?
Release Highlights
v0.26.4 Skill-menu hover jitter fix (same-day patch on v0.26.3)
v0.26.3 Skill references in comments with / or $, reachable remote session URLs, worktree switcher tooltips
v0.26.2 Single-file diff tabs render fully, no more silently dropped review files, light/dark theme pairs, palette-matched code blocks
v0.26.1 GitButler 0.22.0 compatibility via capability-probed JSON flags
v0.26.0 Edit Mode (suggest by editing the diff), Guided Review virtualization, colorblind theme, safe uninstall, installer opt-outs, OpenCode 2 support
v0.25.1 Codex no longer launches on review open, annotate-last follows the live conversation, pi-todos mirror, Claude Opus 5, abandoned-gate dismissal
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.1 Annotate accepts parent-relative ../ file paths
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes
v0.23.1 Startup no longer hangs on large or slow directory trees, Ask AI input stays visible after long responses
v0.23.0 Plan approval fix for Claude Code 2.1.199+, annotate mode version diff, binary-only --minimal install, reviews post without attribution

What's New in v0.26.5

This release makes annotate feedback durable, rebuilds how you annotate raw HTML pages, and fixes real bugs reported from the field: lost Pi feedback after a reload, a vim cursor hiding behind the HUD, and an installer failure on older git. Seven PRs, two from external contributors, including a first contribution from @Whamp.

Your annotate feedback can no longer be lost

When you submitted annotate feedback after the invoking agent had already timed out, the server settled the decision with nobody listening and deleted your draft. The feedback then existed nowhere. Reported by @0okay after exactly this happened on Windows.

Now the server writes your submitted feedback to a durable record under your data directory before it deletes the draft, so a vanished consumer can no longer take your work with it. If the record cannot be written, the draft is kept as the recovery copy instead. This applies to single local file sessions; URL, folder, and last-message sessions stay fully stateless, and disabling annotate history keeps everything stateless as before.

Annotating HTML pages: pinpoint-first

Raw-HTML annotate sessions got a rework. Pinpoint is now the default input: hover highlights the element under your cursor, a click pins it and opens the comment composer directly, and each element annotation gets a numbered badge. Drag selection is still one toggle away, and your choice is remembered separately from markdown sessions.

Pages also open minimal: the first session hides the toolstrip, tab flags, and sidebar so you see just the page, and every session after that opens with exactly the chrome you last left visible.

Under the hood, element annotations now carry a verified CSS anchor so they restore to the same element when you re-open a page, even after the page was regenerated. Restoration is deliberately fail-closed: when the anchor cannot be trusted, the annotation falls back to text search, and text that moved elsewhere in the page is followed rather than mis-pinned. The feature shipped through two adversarial review rounds plus a 25-item QA sweep, which hardened anchor verification, capped selection sizes, kept pin badges out of printed pages, and bounded anchor building so a click on deeply nested markup can never freeze the tab.

Pi: feedback delivers after a reload

A Plannotator browser tab can outlive a Pi /reload. When feedback arrived from such a tab, the extension rejected the freshly reloaded runtime as the same stale session (reload preserves Pi's session id) and the feedback was dropped with an error. @Whamp diagnosed the root cause and fixed it: the extension now tracks an in-process runtime token, so a reload counts as a new active runtime and both feedback and notifications route to it. Comes with a regression test simulating the exact reload scenario.

Vim: the cursor stays out from under the HUD

Document vim navigation used to pin the cursor target flush against the viewport edge, exactly where the sticky action bar and the key HUD float, so j/k motion at the top or bottom of a document hid the caret behind an overlay. @rNoz reported it and fixed it: cursor movement now reveals its target with a scrolloff-style margin sized to the viewport, so keyboard motion keeps the caret visible the way mouse scrolling always did.

The installer works on older git

install.sh failed its skills step with a misleading "network or git error" on systems whose git predates 2.25 (for example a stale Xcode Command Line Tools git), because git clone --sparse does not exist there. Reported by @dubbl-a. All three installers now probe for the capability and fall back to a plain shallow clone, surfacing the real git error when something else goes wrong. A follow-up in this release also pins the probe to a stable locale, so localized git builds take the fallback correctly too.

Additional Changes

  • Windows Codex wording corrected. The README claimed Codex hooks are disabled on native Windows while the installer called them experimental and printed setup steps. The docs now agree: experimental, with manual steps (#1241 reported by @dustintran333)
  • Print stays clean. Printing an annotated HTML page no longer bakes pin badges or pinpoint overlays into the output; inline annotation marks remain printable on purpose (#1245)
  • CI now runs every DOM suite. Eight DOM-gated test files were silently skipping in CI, including the vim and HTML-annotate suites; they are wired in and enforced on every run

Install / Update

macOS / Linux:

curl -fsSL https://plannotator.ai/install.sh | bash

Windows:

irm https://plannotator.ai/install.ps1 | iex

Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".

OpenCode: Clear cache and restart:

rm -rf ~/.bun/install/cache/@plannotator

Then in opencode.json:

{
  "plugin": ["@plannotator/opencode@latest"]
}

Pi: Install or update the extension:

pi install npm:@plannotator/pi-extension

What's Changed

Read more

v0.26.4

Choose a tag to compare

@github-actions github-actions released this 07 Aug 22:20
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


Missed recent releases?
Release Highlights
v0.26.2 Single-file diff tabs render fully, no more silently dropped review files, light/dark theme pairs, palette-matched code blocks
v0.26.1 GitButler 0.22.0 compatibility via capability-probed JSON flags
v0.26.0 Edit Mode (suggest by editing the diff), Guided Review virtualization, colorblind theme, safe uninstall, installer opt-outs, OpenCode 2 support
v0.25.1 Codex no longer launches on review open, annotate-last follows the live conversation, pi-todos mirror, Claude Opus 5, abandoned-gate dismissal
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.1 Annotate accepts parent-relative ../ file paths
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes
v0.23.1 Startup no longer hangs on large or slow directory trees, Ask AI input stays visible after long responses
v0.23.0 Plan approval fix for Claude Code 2.1.199+, annotate mode version diff, binary-only --minimal install, reviews post without attribution
v0.22.0 Git-status "All changes" default review view, Commits panel with per-commit diffs, Guided Review, Pi + GitHub Copilot CLI review engines

What's New in v0.26.4

v0.26.4 is a same-day patch on v0.26.3: hovering a human-only skill in the new reference menu caused a constant jitter (the hover warning changed the menu's size, which moved the row out from under the pointer, which hid the warning, in a loop). The menu no longer labels human-only skills at all; since their instructions are injected into the feedback automatically, the distinction did not need surfacing at pick time. Every row now renders identically and hovering can no longer change the menu's geometry (#1236).

The full v0.26.3 notes follow.

This release adds skill references in comments, gives remote sessions a URL you can actually open from another device, and fixes two small UI annoyances. Nine PRs, including a first contribution from @ivgiuliani.

Reference agent skills in your comments with / or $

While writing a comment in plan review or annotate mode, type / or $ and a menu of your installed agent skills appears: everything discovered under ~/.claude/skills, ~/.codex/skills, and ~/.agents/skills, including skills installed as symlinks. Arrow keys, Tab, Enter, or a click inserts the reference; a comment can carry several. Nothing is preselected, so a stray / or $ in ordinary typing never hijacks Enter, and prose like "a POST /agents endpoint" or "$5/mo" is never mistaken for a reference.

Referenced skills change what the agent receives. The exported feedback lists each one with an explicit instruction that you are asking the agent to invoke it. Skills marked disable-model-invocation: true cannot be invoked by the agent, so for those the feedback includes the skill's instructions directly, inside clearly fenced markers, labeled as included at your request. The menu shows a quiet badge on human-only skills so you know which treatment applies before you pick one.

The feature landed alongside its own hardening pass, driven by a pre-release QA sweep: a render loop triggered by human-only references was fixed, case-colliding skill names across roots resolve exactly, and the injection markers cannot be forged by a hostile skill body, even with invisible Unicode characters.

Remote sessions advertise a URL you can reach

Until now a remote session (SSH, devcontainer, Tailscale) printed http://localhost:19432, which is useless from the phone or laptop you actually want to review on. Set PLANNOTATOR_URL_HOST to a hostname or IP that resolves on your network (a Tailscale MagicDNS name, a tailnet IP) and every advertised session URL uses it.

The override is display-only and deliberately strict: it accepts a bare hostname, IPv4, or bracketed IPv6, and anything carrying a scheme, port, path, or credentials warns once and falls back to localhost. Binding is still governed by PLANNOTATOR_REMOTE, and local sessions ignore the override entirely (with a warning telling you why), so a tailnet-only name can never break same-machine workflows. It can also be set persistently via ~/.plannotator/config.json ({ "urlHost": "host" }).

Full branch names in the worktree switcher

Long branch names in the review header's worktree switcher were truncated with no way to read the rest. Hovering an entry now shows the complete branch name as a tooltip.

Additional Changes

  • "Hide tools" now hides everything. In HTML annotate sessions, hiding the tools also hides the collapsed sidebar tab flags on the left edge, so the page gets the full window (#1226)
  • Archive sharing docs corrected. The docs now describe what archive mode actually does with sharing (#1176, closing #1172)
  • Test reliability. The PowerShell installer tests tolerate pwsh cold starts (#1227) and the diff renderer's test mocks restore correctly regardless of file order (#1230)

Install / Update

macOS / Linux:

curl -fsSL https://plannotator.ai/install.sh | bash

Windows:

irm https://plannotator.ai/install.ps1 | iex

Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".

OpenCode: Clear cache and restart:

rm -rf ~/.bun/install/cache/@plannotator

Then in opencode.json:

{
  "plugin": ["@plannotator/opencode@latest"]
}

Pi: Install or update the extension:

pi install npm:@plannotator/pi-extension

What's Changed

  • fix(review): show the full branch name when hovering the worktree switcher by @ivgiuliani in #1223
  • feat: add PLANNOTATOR_URL_HOST display-only override for advertised URLs by @backnotprop in #1225
  • fix(annotate): hide the collapsed sidebar tab flags when tools are hidden by @backnotprop in #1226
  • test(install): give the PowerShell scanner tests room for pwsh cold start by @backnotprop in #1227
  • feat(comments): reference agent skills with / or $ in plan review and annotate comments by @backnotprop in #1229
  • fix(test): make the @pierre/diffs mock restore actually restore by @backnotprop in #1230
  • docs: correct archive sharing posture by @backnotprop in #1176
  • fix(editor): stop the skill-content priming effect from re-render looping by @backnotprop in #1234
  • fix(skills): harden skill references before first release by @backnotprop in #1235
  • fix(skills): remove the human-only menu treatment and its hover jitter by @backnotprop in #1236

New Contributors

Community

@ivgiuliani noticed truncated branch names in the worktree switcher and fixed it directly. First contribution, and a clean one.

@centdix filed the original request for network-reachable session URLs ([#657](https...

Read more

v0.26.3

Choose a tag to compare

@github-actions github-actions released this 07 Aug 21:39
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


Missed recent releases?
Release Highlights
v0.26.2 Single-file diff tabs render fully, no more silently dropped review files, light/dark theme pairs, palette-matched code blocks
v0.26.1 GitButler 0.22.0 compatibility via capability-probed JSON flags
v0.26.0 Edit Mode (suggest by editing the diff), Guided Review virtualization, colorblind theme, safe uninstall, installer opt-outs, OpenCode 2 support
v0.25.1 Codex no longer launches on review open, annotate-last follows the live conversation, pi-todos mirror, Claude Opus 5, abandoned-gate dismissal
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.1 Annotate accepts parent-relative ../ file paths
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes
v0.23.1 Startup no longer hangs on large or slow directory trees, Ask AI input stays visible after long responses
v0.23.0 Plan approval fix for Claude Code 2.1.199+, annotate mode version diff, binary-only --minimal install, reviews post without attribution
v0.22.0 Git-status "All changes" default review view, Commits panel with per-commit diffs, Guided Review, Pi + GitHub Copilot CLI review engines

What's New in v0.26.3

This release adds skill references in comments, gives remote sessions a URL you can actually open from another device, and fixes two small UI annoyances. Nine PRs, including a first contribution from @ivgiuliani.

Reference agent skills in your comments with / or $

While writing a comment in plan review or annotate mode, type / or $ and a menu of your installed agent skills appears: everything discovered under ~/.claude/skills, ~/.codex/skills, and ~/.agents/skills, including skills installed as symlinks. Arrow keys, Tab, Enter, or a click inserts the reference; a comment can carry several. Nothing is preselected, so a stray / or $ in ordinary typing never hijacks Enter, and prose like "a POST /agents endpoint" or "$5/mo" is never mistaken for a reference.

Referenced skills change what the agent receives. The exported feedback lists each one with an explicit instruction that you are asking the agent to invoke it. Skills marked disable-model-invocation: true cannot be invoked by the agent, so for those the feedback includes the skill's instructions directly, inside clearly fenced markers, labeled as included at your request. The menu shows a quiet badge on human-only skills so you know which treatment applies before you pick one.

The feature landed alongside its own hardening pass, driven by a pre-release QA sweep: a render loop triggered by human-only references was fixed, case-colliding skill names across roots resolve exactly, and the injection markers cannot be forged by a hostile skill body, even with invisible Unicode characters.

Remote sessions advertise a URL you can reach

Until now a remote session (SSH, devcontainer, Tailscale) printed http://localhost:19432, which is useless from the phone or laptop you actually want to review on. Set PLANNOTATOR_URL_HOST to a hostname or IP that resolves on your network (a Tailscale MagicDNS name, a tailnet IP) and every advertised session URL uses it.

The override is display-only and deliberately strict: it accepts a bare hostname, IPv4, or bracketed IPv6, and anything carrying a scheme, port, path, or credentials warns once and falls back to localhost. Binding is still governed by PLANNOTATOR_REMOTE, and local sessions ignore the override entirely (with a warning telling you why), so a tailnet-only name can never break same-machine workflows. It can also be set persistently via ~/.plannotator/config.json ({ "urlHost": "host" }).

Full branch names in the worktree switcher

Long branch names in the review header's worktree switcher were truncated with no way to read the rest. Hovering an entry now shows the complete branch name as a tooltip.

Additional Changes

  • "Hide tools" now hides everything. In HTML annotate sessions, hiding the tools also hides the collapsed sidebar tab flags on the left edge, so the page gets the full window (#1226)
  • Archive sharing docs corrected. The docs now describe what archive mode actually does with sharing (#1176, closing #1172)
  • Test reliability. The PowerShell installer tests tolerate pwsh cold starts (#1227) and the diff renderer's test mocks restore correctly regardless of file order (#1230)

Install / Update

macOS / Linux:

curl -fsSL https://plannotator.ai/install.sh | bash

Windows:

irm https://plannotator.ai/install.ps1 | iex

Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".

OpenCode: Clear cache and restart:

rm -rf ~/.bun/install/cache/@plannotator

Then in opencode.json:

{
  "plugin": ["@plannotator/opencode@latest"]
}

Pi: Install or update the extension:

pi install npm:@plannotator/pi-extension

What's Changed

  • fix(review): show the full branch name when hovering the worktree switcher by @ivgiuliani in #1223
  • feat: add PLANNOTATOR_URL_HOST display-only override for advertised URLs by @backnotprop in #1225
  • fix(annotate): hide the collapsed sidebar tab flags when tools are hidden by @backnotprop in #1226
  • test(install): give the PowerShell scanner tests room for pwsh cold start by @backnotprop in #1227
  • feat(comments): reference agent skills with / or $ in plan review and annotate comments by @backnotprop in #1229
  • fix(test): make the @pierre/diffs mock restore actually restore by @backnotprop in #1230
  • docs: correct archive sharing posture by @backnotprop in #1176
  • fix(editor): stop the skill-content priming effect from re-render looping by @backnotprop in #1234
  • fix(skills): harden skill references before first release by @backnotprop in #1235

New Contributors

Community

@ivgiuliani noticed truncated branch names in the worktree switcher and fixed it directly. First contribution, and a clean one.

@centdix filed the original request for network-reachable session URLs (#657), and @maxim and @prvnsmpth added the deployment details (Tailscale setups, concrete environment variable shape) that the implementation followed.

Full Changelog: v0.26.2...v0.26.3

v0.26.2

Choose a tag to compare

@github-actions github-actions released this 06 Aug 07:57
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


Missed recent releases?
Release Highlights
v0.26.1 GitButler 0.22.0 compatibility via capability-probed JSON flags
v0.26.0 Edit Mode (suggest by editing the diff), Guided Review virtualization, colorblind theme, safe uninstall, installer opt-outs, OpenCode 2 support
v0.25.1 Codex no longer launches on review open, annotate-last follows the live conversation, pi-todos mirror, Claude Opus 5, abandoned-gate dismissal
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.1 Annotate accepts parent-relative ../ file paths
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes
v0.23.1 Startup no longer hangs on large or slow directory trees, Ask AI input stays visible after long responses
v0.23.0 Plan approval fix for Claude Code 2.1.199+, annotate mode version diff, binary-only --minimal install, reviews post without attribution
v0.22.0 Git-status "All changes" default review view, Commits panel with per-commit diffs, Guided Review, Pi + GitHub Copilot CLI review engines
v0.21.4 Markdown math rendering, PR Overview panel with annotatable description and comments, agent instructions in code review, media parsing fixes

What's New in v0.26.2

This release fixes two review regressions that shipped in v0.26.0, both reported by users within a day of release, and brings two visible improvements: pick separate light and dark themes, and code blocks that match your palette. Updating from v0.25.x? The full v0.26.0 feature notes are embedded in the v0.26.1 release notes.

Fixed: single-file diff tabs render fully again

In v0.26.0 and v0.26.1, opening a file as its own tab (clicking it in the file tree or sidebar, including PR review) showed only the changed hunks: the "N unmodified lines" bars between hunks had no expand controls and clicks did nothing, so surrounding code could not be revealed. The all-files scroll view was unaffected, which made the breakage feel random.

The cause was the diff renderer upgrade in v0.26.0. The renderer began identifying content by cache key and defaulting that key to the file name, so when the tab swapped its initial partial diff for the full expandable one, the renderer saw the same name and kept serving the stale partial render forever. The single-file view now derives cache keys from content, the same invariant the all-files view already followed.

Fixed: no more silently dropped files in review diffs

The more serious of the two. In v0.26.0 and v0.26.1, certain files rendered as empty cards: listed in the tree with a modified badge but no counts, no hunks, and no way to see the change. The diff totals quietly excluded them, so nothing indicated content was missing. A reviewer could approve believing they had seen everything. Affected shapes included renamed files carrying uncommitted edits, and repositories where an object was absent from git's local object database (partial clones, for example).

The cause sat in the large-file memory bound introduced in v0.26.0. Its size probe asks git's object database how big each changed object is, but git reports a computed hash for worktree content it examined during rename detection, a hash for content that was never stored as an object. The probe got "missing" and treated missing as infinitely large, so the file was excluded and stubbed as binary. The probe now treats content it cannot find in the object database by checking the file on disk instead, and "missing" is no longer assumed oversized. The memory bound itself is unchanged: genuinely oversized files still render as stubs, and those stubs now say so on screen ("This file is over the 5 MB review limit") instead of appearing silently empty.

This was reported by a user on X with side-by-side screenshots comparing Plannotator against their editor's diff view, exactly the evidence that cracked it. Thank you.

Pair a light theme and a dark theme

Settings > Theme now assigns each half of a pair: pick which palette is your light theme and which is your dark theme, and System mode switches between your two choices as your OS scheme changes (Kanagawa Lotus by day, Kanagawa Wave at night). Previously, choosing a dark-only palette pinned the mode and disabled system switching entirely. The pair persists to ~/.plannotator/config.json, so it survives Plannotator's random ports and applies across every host. Existing theme choices migrate automatically.

One syntax highlighter, palette-matched code blocks

Plannotator shipped two syntax highlighters: highlight.js for markdown code blocks, and Shiki inside the diff renderer. Code blocks now use the same Shiki instance the diff pane already loads, which means they finally render in your active palette (all built-in themes, colorblind included, light and dark) instead of a fixed dark style. highlight.js is removed entirely, along with a never-executed WebAssembly engine the diff renderer bundled. The plan review bundle shrank by about 1.3MB and the code review bundle by about 2.2MB.

Bare code fences (no language tag) now render as plain monospaced text instead of getting auto-detected highlighting, matching how GitHub and most markdown renderers behave. Prose quoted inside fences no longer gets colored like code.

Additional Changes

  • Self-hosting docs corrected. The guide no longer claims the portal bundles Highlight.js (#1221)

Install / Update

macOS / Linux:

curl -fsSL https://plannotator.ai/install.sh | bash

Windows:

irm https://plannotator.ai/install.ps1 | iex

Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".

OpenCode: Clear cache and restart:

rm -rf ~/.bun/install/cache/@plannotator

Then in opencode.json:

{
  "plugin": ["@plannotator/opencode@latest"]
}

Pi: Install or update the extension:

pi install npm:@plannotator/pi-extension

What's Changed

  • fix: render language-less code blocks as plain text by @zeke in #1212
  • feat: pair a light theme and a dark theme, switched by mode by @backnotprop in #1217
  • perf: single Shiki highlighter, palette-matched code blocks, drop highlight.js by @backnotprop in #1218
  • fix: mint content-derived diff cache keys so single-file tabs render fully by @backnotprop in #1219
  • fix: stop stubbing files whose worktree content the size probe cannot find by @backnotprop in #1220
  • docs: self-hosting page no longer claims a bundled Highlight.js by @backnotprop in #1221

New Contributors

Community

@zeke reported the auto-detected highlighting problem with a screenshot that made the case instantly (#1210) and fixed it himself the same day. First contribution.

@kunaaal13 designed the theme pair system in a file-accurate proposal that was adopted nearly as written (#1211); parts 2 and 3 (custom user themes, separate fonts) remain open.

And to the reporter on X whose side-by-side editor comparison exposed the silently dropped fil...

Read more

v0.26.1

Choose a tag to compare

@github-actions github-actions released this 05 Aug 18:48
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


Missed recent releases?
Release Highlights
v0.26.0 Edit Mode (suggest by editing the diff), Guided Review virtualization, colorblind theme, safe uninstall, installer opt-outs, OpenCode 2 support
v0.25.1 Codex no longer launches on review open, annotate-last follows the live conversation, pi-todos mirror, Claude Opus 5, abandoned-gate dismissal
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.1 Annotate accepts parent-relative ../ file paths
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes
v0.23.1 Startup no longer hangs on large or slow directory trees, Ask AI input stays visible after long responses
v0.23.0 Plan approval fix for Claude Code 2.1.199+, annotate mode version diff, binary-only --minimal install, reviews post without attribution
v0.22.0 Git-status "All changes" default review view, Commits panel with per-commit diffs, Guided Review, Pi + GitHub Copilot CLI review engines
v0.21.4 Markdown math rendering, PR Overview panel with annotatable description and comments, agent instructions in code review, media parsing fixes
v0.21.3 File comments in code review, unified click-to-highlight comments, VS Code clipboard/keyboard bridge, Codex Ask AI on app-server transport, CLI subcommand help

What's New in v0.26.1

A single-fix patch: code review works again in GitButler workspaces running GitButler CLI 0.22.0. Because this patch landed a day after v0.26.0, the full v0.26.0 feature notes are included below; if you are updating from v0.25.x, everything in both sections is new to you.

GitButler 0.22.0 compatibility

GitButler's CLI changed its JSON output flag twice this year. Their June change removed --json in favor of a global --format json, which is the syntax Plannotator's GitButler integration used and the one GitButler 0.21.x accepts. Their July cleanup then reverted it: GitButler 0.22.0 accepts only --json and rejects --format outright, so opening a review in a GitButler workspace on 0.22.0 failed immediately with a contract error.

Plannotator now probes capability instead of assuming a spelling. It tries --format json status first, and only when that fails with the specific unexpected-argument rejection does it retry once with --json status. Real status failures never retry and still fail loudly. The accepted spelling is remembered for the session, so 0.22.0 installs pay the failed probe once. If a future GitButler rejects both spellings, the error names both and the minimum supported version. The fix lives in the shared GitButler core, so the Bun and Pi runtimes both get it.


What's New in v0.26.0

v0.26.0 introduces Edit Mode, makes Guided Review fast on large changesets, adds a colorblind theme and a safe uninstall command, and hardens the installer, the review server, and the OpenCode plugin. Thirty-two PRs shipped in this release; seven came from external contributors plus one co-authored port, and four contributors landed their first PR.

Edit Mode: author suggestions by editing the code

A new experimental way to give review feedback: click Edit on a file in the all-files review view and fix the code right there in the diff. When you finish, your net changes become ordinary suggestion annotations, the same shape the suggestion editor produces, with the original code in a fenced Replaces: block and your replacement in Suggested code: so the applying agent can validate the anchor. You can also select text mid-edit and turn the selection into an annotation. The browser never writes to your files on disk; the agent applies the suggestions from your feedback.

Edit Mode is off by default behind Settings > Editor > "Edit Code to Suggest". A one-time announcement dialog introduces the feature with an embedded screen recording of the flow and an explicit enable switch. The switch is deliberate design: the first draft used a primary "Turn it on" button, which reads as a generic continue and invites reflex clicks, so the opt-in became a switch you must consciously flip before the neutral Done button applies it.

Two fixes landed before release from our own QA pass: Discard now repaints the pristine diff immediately instead of leaving edited pixels on screen until an async rerender, and the same repaint removes a brief flash of stale content on the Suggest path.

Guided Review handles large changesets

Guided Review used to mount a full code viewer for every file in the guide. On a large guide that meant hundreds of live viewers, around a million shadow DOM elements, 770MB of heap, and scrolling at 4 frames per second, with the view taking close to a minute to open. A shared viewport coordinator now keeps at most 8 file viewers mounted at once and swaps the rest for lightweight placeholders as you scroll. The same guide now opens in around a hundred milliseconds, holds ~140MB, and scrolls at full frame rate. Section reviewed-state, annotations, and search behave exactly as before.

Colorblind theme

A new built-in theme designed for red-green color vision deficiency, which covers most color blindness. Additions render blue and deletions orange across diff backgrounds, gutters, indicators, and syntax highlighting, in both light and dark. The palette was tuned with CIEDE2000 color-difference measurements under simulated deuteranopia and protanopia; the worst-case separation between "added" and "removed" improves from 1.7 (indistinguishable) to 9.0 (clearly distinct). A separate tritanopia variant was evaluated and skipped on the data: the default palette already reads correctly for tritanopes.

Safe uninstall

plannotator uninstall removes the binary, skills, hooks, and per-agent integrations, and walks through every host it recognizes (Claude Code, Codex, OpenCode, Gemini, Kiro, and friends) before touching the binary. Your data is preserved by default: plans, history, drafts, and settings stay unless you pass --purge. --dry-run shows the full removal list without deleting anything, and --yes skips the confirmation for scripted use. Host cleanup is required, not optional: if a host's cleanup fails, the uninstall stops with manual guidance rather than leaving a half-removed install behind.

Review server memory stays bounded on huge files

Staging a very large text file used to balloon the review server; a 51MB file drove resident memory to around 240MB. Tracked files above 5MiB are now excluded from the rendered diff and shown as bounded stubs, the same treatment untracked files already had. A follow-up fix hardened the failure path: the original implementation probed object sizes with one git cat-file --batch-check call, and if that single call failed, every file in the review rendered as "Binary files differ" with no visible error. The size bound is now enforced by git itself through core.bigFileThreshold, so a failed probe degrades gracefully instead of blanking the review.

Installer: opt-outs, credential-free provenance, and honest failures

The install scripts gained a family of opt-outs: --skip-codex, --skip-gemini, --skip-kiro, --skip-opencode, and now --skip-skills, each with a matching environment variable and skipInstall co...

Read more

v0.26.0

Choose a tag to compare

@github-actions github-actions released this 05 Aug 16:29
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


Missed recent releases?
Release Highlights
v0.25.1 Codex no longer launches on review open, annotate-last follows the live conversation, pi-todos mirror, Claude Opus 5, abandoned-gate dismissal
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.1 Annotate accepts parent-relative ../ file paths
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes
v0.23.1 Startup no longer hangs on large or slow directory trees, Ask AI input stays visible after long responses
v0.23.0 Plan approval fix for Claude Code 2.1.199+, annotate mode version diff, binary-only --minimal install, reviews post without attribution
v0.22.0 Git-status "All changes" default review view, Commits panel with per-commit diffs, Guided Review, Pi + GitHub Copilot CLI review engines
v0.21.4 Markdown math rendering, PR Overview panel with annotatable description and comments, agent instructions in code review, media parsing fixes
v0.21.3 File comments in code review, unified click-to-highlight comments, VS Code clipboard/keyboard bridge, Codex Ask AI on app-server transport, CLI subcommand help
v0.21.2 Custom reviews as Agent Skills, Cursor + OpenCode review engines, whole-file/general findings, deleted-annotation fix, Codex Ask AI outside git repos

What's New in v0.26.0

v0.26.0 introduces Edit Mode, makes Guided Review fast on large changesets, adds a colorblind theme and a safe uninstall command, and hardens the installer, the review server, and the OpenCode plugin. Thirty-two PRs shipped in this release; seven came from external contributors plus one co-authored port, and four contributors landed their first PR.

Edit Mode: author suggestions by editing the code

A new experimental way to give review feedback: click Edit on a file in the all-files review view and fix the code right there in the diff. When you finish, your net changes become ordinary suggestion annotations, the same shape the suggestion editor produces, with the original code in a fenced Replaces: block and your replacement in Suggested code: so the applying agent can validate the anchor. You can also select text mid-edit and turn the selection into an annotation. The browser never writes to your files on disk; the agent applies the suggestions from your feedback.

Edit Mode is off by default behind Settings > Editor > "Edit Code to Suggest". A one-time announcement dialog introduces the feature with an embedded screen recording of the flow and an explicit enable switch. The switch is deliberate design: the first draft used a primary "Turn it on" button, which reads as a generic continue and invites reflex clicks, so the opt-in became a switch you must consciously flip before the neutral Done button applies it.

Two fixes landed before release from our own QA pass: Discard now repaints the pristine diff immediately instead of leaving edited pixels on screen until an async rerender, and the same repaint removes a brief flash of stale content on the Suggest path.

Guided Review handles large changesets

Guided Review used to mount a full code viewer for every file in the guide. On a large guide that meant hundreds of live viewers, around a million shadow DOM elements, 770MB of heap, and scrolling at 4 frames per second, with the view taking close to a minute to open. A shared viewport coordinator now keeps at most 8 file viewers mounted at once and swaps the rest for lightweight placeholders as you scroll. The same guide now opens in around a hundred milliseconds, holds ~140MB, and scrolls at full frame rate. Section reviewed-state, annotations, and search behave exactly as before.

Colorblind theme

A new built-in theme designed for red-green color vision deficiency, which covers most color blindness. Additions render blue and deletions orange across diff backgrounds, gutters, indicators, and syntax highlighting, in both light and dark. The palette was tuned with CIEDE2000 color-difference measurements under simulated deuteranopia and protanopia; the worst-case separation between "added" and "removed" improves from 1.7 (indistinguishable) to 9.0 (clearly distinct). A separate tritanopia variant was evaluated and skipped on the data: the default palette already reads correctly for tritanopes.

Safe uninstall

plannotator uninstall removes the binary, skills, hooks, and per-agent integrations, and walks through every host it recognizes (Claude Code, Codex, OpenCode, Gemini, Kiro, and friends) before touching the binary. Your data is preserved by default: plans, history, drafts, and settings stay unless you pass --purge. --dry-run shows the full removal list without deleting anything, and --yes skips the confirmation for scripted use. Host cleanup is required, not optional: if a host's cleanup fails, the uninstall stops with manual guidance rather than leaving a half-removed install behind.

Review server memory stays bounded on huge files

Staging a very large text file used to balloon the review server; a 51MB file drove resident memory to around 240MB. Tracked files above 5MiB are now excluded from the rendered diff and shown as bounded stubs, the same treatment untracked files already had. A follow-up fix hardened the failure path: the original implementation probed object sizes with one git cat-file --batch-check call, and if that single call failed, every file in the review rendered as "Binary files differ" with no visible error. The size bound is now enforced by git itself through core.bigFileThreshold, so a failed probe degrades gracefully instead of blanking the review.

Installer: opt-outs, credential-free provenance, and honest failures

The install scripts gained a family of opt-outs: --skip-codex, --skip-gemini, --skip-kiro, --skip-opencode, and now --skip-skills, each with a matching environment variable and skipInstall config key. Skipping means the installer writes nothing for that scope and never removes what a previous install wired. Attestation verification (--verify-attestation) now works with zero GitHub credentials by fetching the attestation bundle from GitHub's public API, falling back to authenticated gh only when needed. Both designs came from a single unusually rigorous report by @astradevkin, including the discovery of the public attestations endpoint.

Two honesty fixes shipped alongside: a failed skills checkout used to report success because of a POSIX errexit subtlety (the failure now aborts loudly, which is exactly why --skip-skills exists for offline installs), and installs on Windows PowerShell below 7.2 no longer die on git writing progress to stderr. The installer also authenticates its version lookup when a GitHub token is present, avoiding the anonymous 60-requests-per-hour rate limit on shared networks.

OpenCode 2 support (experimental)

Plan review now works on OpenCode 2 through a V2 plugin adapter that shares the same host-...

Read more

v0.25.1

Choose a tag to compare

@github-actions github-actions released this 30 Jul 12:44
Immutable release. Only release title and notes can be modified.

Follow @plannotator on X for updates


Missed recent releases?
Release Highlights
v0.25.0 Vim keyboard controls, Approve with Notes, scriptable annotate gates, persistent Guided Reviews, memory and file-watching hardening
v0.24.2 Annotate YAML/JSON/TOML config files, XDG data directory support, Codex model catalog update, Cursor sandbox escape hatch
v0.24.1 Annotate accepts parent-relative ../ file paths
v0.24.0 PR/MR artifact gallery, GitButler review support, port ranges, expanded comment editor, OpenCode + Pi fixes
v0.23.1 Startup no longer hangs on large or slow directory trees, Ask AI input stays visible after long responses
v0.23.0 Plan approval fix for Claude Code 2.1.199+, annotate mode version diff, binary-only --minimal install, reviews post without attribution
v0.22.0 Git-status "All changes" default review view, Commits panel with per-commit diffs, Guided Review, Pi + GitHub Copilot CLI review engines
v0.21.4 Markdown math rendering, PR Overview panel with annotatable description and comments, agent instructions in code review, media parsing fixes
v0.21.3 File comments in code review, unified click-to-highlight comments, VS Code clipboard/keyboard bridge, Codex Ask AI on app-server transport, CLI subcommand help
v0.21.2 Custom reviews as Agent Skills, Cursor + OpenCode review engines, whole-file/general findings, deleted-annotation fix, Codex Ask AI outside git repos
v0.21.1 Annotate-last blank-page fix on multi-message sessions

What's New in v0.25.1

Eight pull requests landed since v0.25.0, six of them from community members, and four authors made their first contribution. The release stops code review from launching Codex when you never asked for it, teaches plannotator last which conversation you are actually in, adds Claude Opus 5 to the model pickers, and mirrors approved plan checklists into editable pi-todos. Two fixes came out of pre-release QA rather than a report.

Opening a review no longer launches Codex

Constructing the AI runtime ran Codex model discovery immediately, which meant that simply opening a code review spawned a codex app-server process. Users who had Codex installed but never intended to use it got a stray process, and on macOS the launch could raise a Gatekeeper prompt in front of a review they were trying to read.

Discovery is now deferred until a Codex session actually starts, or until you explicitly select Codex in the provider picker. Selecting Codex activates it and refreshes the model list on that gesture, so the real catalog and per-model reasoning-effort options still appear before you pick anything. Saved model preferences are left alone rather than being overwritten by a placeholder.

plannotator last follows the live conversation

Two separate bugs made plannotator last annotate the wrong message.

In Claude Code, /rewind does not remove anything from the session transcript. It re-parents the next message to an earlier point and leaves everything after that orphaned in the file forever. Reading the file bottom-up therefore offered messages that were no longer part of the conversation. The message picker now walks the conversation tree from the newest entry back to the root, so rewound branches stay out. On a linear session the result is identical to before, and a transcript whose structure cannot be trusted falls back to the previous behavior rather than returning nothing.

In GitHub Copilot CLI, plannotator last picked a session by file order and would silently annotate a stale transcript instead of the live one. Copilot CLI exposes no environment fingerprint, so the fix walks the process ancestry and matches it against Copilot's own session lock files, which identifies the live session deterministically even with several sessions open in the same directory.

Approved plan checklists mirror into pi-todos

Under Pi, an approved plan's checklist lived only in the plan and the progress widget. If you also use pi-todos, your todos and your plan were two separate lists.

On plan approval, Plannotator now detects pi-todos and mirrors the approved checklist into it, closing each todo as the agent completes the corresponding step. Sync is one-way, so reordering or rewording a todo can never desync plan execution. The mirror is additive: the existing progress widget stays exactly as it was, because pi-todos renders its list on demand rather than continuously, and replacing a live display with files behind a keystroke would be a downgrade. It is inert when no provider is present, and PLANNOTATOR_TODO_PROVIDER=off turns it off entirely.

Abandoned annotate gates stop waiting forever

A structured annotate gate (--gate --json) blocks until the reviewer decides. If every review surface was closed without a decision, nothing ever settled and the calling script waited indefinitely.

Each open review surface now holds a lease over a heartbeat stream. Once at least one client has connected, closing the last one starts a 30-second reconnect window; reconnecting inside that window continues the same review, and expiry resolves the gate as the same dismissed decision an explicit Close produces. The saved annotation draft is deliberately kept, so an abandoned review can still be recovered. Page lifecycle events are not used for this, because reload and navigation fire the same events as abandonment and cannot be told apart. A session that never receives a client never auto-dismisses, so browser-launch failures still need a timeout on the caller's side, and remote sessions keep the behavior off because a tunnel disconnect would read as an abandoned review.

Claude Opus 5

Claude Opus 5 is available in the Ask AI model picker and in the review-agent model list that Review Agents, Code Tour, and Guided Review launch from. Launched review jobs now default to Opus 5 instead of Opus 4.7. Existing saved model preferences are untouched: this changes the default for anyone who has not chosen a model.

Approving with notes now reaches Amp and Droid

Approve with Notes shipped in v0.25.0, but the Amp and Droid adapters dropped the feedback field on approved decisions. Approving with annotations sent a bare "Approved." and the notes were lost. Both adapters now surface the notes, using the same wording the other runtimes already emit.

Additional Changes

  • Reopening search selects the existing query. Pressing Cmd/Ctrl+F in code review with text already in the search box now focuses the input and selects its contents, so typing replaces the old query instead of appending to it. Matches how browser find behaves. By @omederos in #1152
  • Pi no longer crashes after plan approval in headless sessions. Pi 0.69 and later invalidate an extension's session context on teardown, and every call on a stale context throws. The post-approval continuation timer polled that context, so a session ending underneath it (headless plan runs, or /new immediately after approving) killed the whole Pi process. The continuation now cancels instead, and the fire-and-forget browser open no longer crashes Pi through an unhandled rejection when a launcher fails. Closing #1140
  • The pi-todos mirror stays inside the project. Found in pre-release QA: a repository sh...
Read more