Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.17.1 | Pi PR review parity, parseRemoteUrl rewrite, cross-repo clone fixes, diff viewer flash fix |
| v0.17.0 | AI code review agents, token-level annotation, merge-base diffs |
| v0.16.7 | Gemini CLI plan review, install script skills directory fix |
| v0.16.6 | Perforce support, Pi shared event API, suggested code prefill, file tree expand fix |
| v0.16.5 | Resize handle scrollbar fix, VS Code Marketplace publish |
| v0.16.4 | Compound planning improvement hook, GitHub Enterprise + self-hosted GitLab, dockview workspace, new themes |
| v0.16.3 | Pi phase configuration, CLI help, untracked file discovery fix, review scroll reset |
| v0.16.2 | Draggable comment popovers, cross-file annotation visibility, custom diff fonts, OpenCode verbose log fix |
| v0.16.1 | SSE stream idle timeout fix for external annotations API |
| v0.16.0 | GitHub Copilot CLI, external annotations API, bot callback URLs, interactive checkboxes, print support, diff display options |
| v0.15.5 | Custom display names, GitHub viewed file sync, expand/collapse all in file tree, search performance, WSL fix |
| v0.15.2 | Compound Planning skill, folder annotation, /plannotator-archive slash command, skill installation via platform installers
|
What's New in v0.17.2
v0.17.2 is a substantial release covering ten PRs — supply-chain hardening with SLSA build attestations, a major plan header overhaul with sticky toolstrip and badges, overlay scrollbars across the entire app, inline highlighting for external annotations, Conventional Comments in code review, and several smaller fixes from the community. Two contributors from outside the core team shipped changes this cycle.
Sticky Toolstrip and Badges
The stickyActionsEnabled setting previously only pinned the right-side action buttons. The annotation toolstrip (selection mode + editor mode toggles) and the left-side badges (repo, branch, plan diff) scrolled away with the document, forcing you back to the top to switch modes or jump into a diff.
A new ghost sticky lane fades in once you scroll past the original toolstrip, pinning the toolstrip and badges on the same horizontal plane as the action buttons. The compact bar uses a row layout for badges and hides label text on inactive toolstrip modes to leave room. Top-of-document rendering is unchanged. The lane stays hidden in plan-diff mode, archive mode, linked-doc mode, and when sticky actions is off. Honors prefers-reduced-motion.
Conventional Comments in Code Review
The code review annotation toolbar now has an optional Conventional Comments label picker — suggestion, issue, nitpick, question, and others, with an inline blocking/non-blocking toggle per label. Annotations export in conventional format (**label** (decoration): text) as plain markdown, compatible with GitHub PRs and any text-based review system.
A dedicated Comments settings tab houses the master toggle (off by default), a label editor for adding/editing/deleting/reordering custom labels, per-label blocking decorator toggle, an educational "how it works" section linking to the spec, and live example output. Drafts persist label and decoration state across file switches.
Unified Plan Header Dropdown and Agent Instructions
Plan mode's header has been consolidated. The sprawled desktop toolbar (mode toggle, standalone Settings button, custom export sub-dropdown) and the separate mobile menu are now a single PlanHeaderMenu rendered at all breakpoints, modeled on the existing review header menu. The version number and release notes link moved into the dropdown footer.
A new "Agent Instructions" item copies a clipboard payload teaching external agents (Claude Code, Codex, custom scripts) how to POST annotations into the live session via /api/external-annotations. The instruction body lives in packages/ui/utils/planAgentInstructions.ts so it can be edited independently of UI code.
The PR also fixes a long-standing bug where the Send Annotations / Approve cluster was hidden whenever a linked doc was active, blocking submission for users running plannotator annotate ./ once they opened a file.
Header Polish: Coordinated Shrinking, Share/Copy Cleanup
Sticky header label shrinking is now driven by measured geometry instead of fixed pixel reserves. A ResizeObserver on the wrapper plus another on the action button cluster computes exactly how much room is available; both sides of the header shrink in lockstep so they stay horizontally aligned as long as possible. Below ~340px of plan area the ghost bar stacks below the action buttons.
"Quick Share" and "Quick Copy" are now plain "Share" and "Copy". Share opens the existing export modal so it benefits from the short-link path for large payloads instead of dumping a 50KB hash URL straight to the clipboard.
The sidebar rail no longer pushes the background grid pattern 30px to the right — it floats over the document area, and the grid paints edge-to-edge under the sidebar flags.
Overlay Scrollbars
Wide, translucent, full-length overlay scrollbars across plan mode and code review, replacing the 6px WebKit rail that was hard to grab. Click the track to page-animate toward the click; drag the thumb smoothly; no layout shift; Firefox parity; respects prefers-reduced-motion; disappears in print.
Backed by overlayscrollbars-react wrapped in a new OverlayScrollArea component. Native scroll semantics stay on the viewport element so existing scrollIntoView and scrollTo calls still work. Wrapped containers include the main plan viewer, annotation panel, sidebar tabs, settings and export modals, file tree, review sidebar, AI chat tab, PR comments timeline, and PR summary/checks dock panels.
Inline Highlighting for External Annotations
External annotations posted via POST /api/external-annotations can now optionally highlight the matching originalText span inline in the rendered plan — COMMENT renders yellow, DELETION renders strikethrough. Annotations without originalText or of type GLOBAL_COMMENT continue to render sidebar-only.
No protocol or schema change. Tools choose inline vs global purely by what they supply. If originalText doesn't match anywhere in the rendered DOM, the annotation degrades gracefully to sidebar-only with a console warning. PATCH and DELETE through the API correctly remove and reapply highlights as state changes.
Supply-Chain Hardening
The release pipeline now generates SLSA build provenance attestations for every released binary. Each of the twelve cross-compiled binaries (six Plannotator targets, six paste-service targets) is signed via Sigstore and recorded in Rekor through actions/attest-build-provenance. Top-level workflow permissions have been tightened to contents: read with per-job overrides.
Installers now accept a --version v0.X.Y flag (and positional form), so you can pin to a specific version instead of always pulling latest. The default behavior is unchanged.
Attestation verification is opt-in via three mechanisms with documented precedence: a --verify-attestation CLI flag, a PLANNOTATOR_VERIFY_ATTESTATION=1 environment variable, or { "verifyAttestation": true } in ~/.plannotator/config.json. Off by default to match how rustup, brew, bun, deno, and helm handle attestation — turning it on hard-fails the install if gh isn't available, so opt-in is never silently skipped. Anyone can still verify any release manually with gh attestation verify.
The same PR fixes a Windows installer crash where cmd.exe's enabledelayedexpansion was eating the ! characters in an embedded node -e script during Gemini settings merge.
#512, closing #506 and parts of #507
Additional Changes
- Numbered list rendering. Ordered lists like
1.,2.,10.were rendered as bullet points because the parser collapsed all list types into a single block kind. The parser now captures the numeric marker and tags the block as ordered; a newcomputeListIndiceshelper assigns CommonMark-correct display numbers including streak break/restart on mixed siblings and independent numbering for nested ordered sublists. The renderer usestabular-numsso9to10doesn't jitter (#520) - Underscore italics. The custom markdown renderer supported
*italic*but not_italic_. Now both work, while intraword underscores likesnake_casecontinue to render as plain text (#504 by @foxytanuki, closing #502) - Perforce added files on Windows. P4-added files were missing from the review UI on Windows because
p4 wherestdout uses\r\nline endings; splitting on\nleft a stray\rin every file path except the last, causingBun.file()to silently fail. The fix normalizes line endings on all P4 command output and replaces fragile index-based parsing withp4 -ztag wherefield-based parsing, which is also more robust for stream depots and overlay mappings (#494 by @l10veu602)
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexPin a specific version:
curl -fsSL https://plannotator.ai/install.sh | bash -s -- --version v0.17.2Claude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
Copilot CLI:
/plugin marketplace add backnotprop/plannotator
/plugin install plannotator-copilot@plannotator
Gemini CLI: The install script auto-detects ~/.gemini and configures hooks, policy, and slash commands. See apps/gemini/README.md for manual setup.
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-extensionVS Code Extension: Install from the VS Code Marketplace. Tested with Claude Code running in VS Code's integrated terminal. Not currently compatible with Anthropic's official VS Code extension due to upstream hook bugs.
What's Changed
- fix(ui): render numerals for ordered list items by @backnotprop in #520
- feat(plan): simplify share/copy + sticky header polish by @backnotprop in #519
- chore: supply-chain hardening — version pinning, SLSA attestations, install fix by @backnotprop in #512
- feat(plan): unified header dropdown + Agent Instructions by @backnotprop in #515
- feat: Zed-style overlay scrollbars by @backnotprop in #509
- feat(plan): complete sticky actions — pin toolstrip + badges on scroll by @backnotprop in #510
- feat(ui): highlight external SSE annotations inline on plan text by @backnotprop in #511
- fix: support underscore italics in markdown renderer by @foxytanuki in #504
- feat: add Conventional Comments support to code review by @backnotprop in #501
- fix(review): show P4 added files in code review by @l10veu602 in #494
Contributors
@foxytanuki returned with the underscore italics fix (#504, closing #502). The custom markdown renderer now treats _italic_ and *italic* as equivalent emphasis while leaving snake_case alone. Their fourth contribution to the project.
@l10veu602 fixed the Perforce added-files regression on Windows (#494). The bug was a classic \r\n line-ending issue in p4 where stdout that left stray carriage returns in file paths, causing Bun.file() to silently miss them. The fix also swaps fragile index-based parsing for p4 -ztag structured output, which holds up better on stream depots and overlay mappings. Verified on a real P4 workspace going from 13 files visible to all 17.
Community members who reported issues addressed in this release:
- @djamatgit: #506 (install.cmd Gemini settings merge crash on Windows)
- @rooterkyberian: #507 (supply-chain hardening — items 1 & 2)
- @Thraka: #502 (underscore italics not rendering)
- @dillonoconnor: #354 (couldn't grab the scrollbar)
Full Changelog: v0.17.1...v0.17.2