Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| 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 |
| v0.7.0 | TOC sidebar, sticky actions, save to notes without approving, import teammate reviews, viewed file tracking |
| v0.6.8 | Mermaid diagram rendering, repo/branch info display |
| v0.6.7 | Quick Comment mode, type-to-comment shortcut, smart agent detection |
What's New in v0.10.0
Sharing plans got a ground-up rethink. The hash-based URLs that Slack and email clients kept truncating are now replaced by short links backed by a dedicated paste service — with end-to-end encryption so plan content never touches the server in readable form. The code review UI gained GitHub-style code suggestions with inline editing and syntax-highlighted diffs. And a batch of community-driven fixes landed: CJK input method support, empty file display in reviews, XDG-compliant install paths, customizable Obsidian export filenames, and proper error handling when shared links fail to load.
Short URL Sharing with End-to-End Encryption
Share URLs used to embed the entire plan as a compressed hash fragment. That worked for small plans, but anything substantial produced 10-40KB URLs that Slack, WhatsApp, and email clients would silently truncate — and the recipient would see the demo plan instead of the shared content with no indication anything went wrong (#142, #187).
Short URLs solve both problems. Click "Create short link" and the plan is encrypted in your browser using AES-256-GCM, uploaded to the paste service as an opaque blob, and you get back a ~50-character URL like share.plannotator.ai/p/a1T8a4Ey#key=.... The decryption key lives only in the URL fragment — it's never sent in HTTP requests, never stored on the server, and the paste service has zero ability to read your plan content.
The paste service runs as a Cloudflare Worker with KV storage (7-day TTL). Self-hosters can deploy their own instance and point to it with PLANNOTATOR_PASTE_URL. The existing hash-based URLs continue to work as a fallback for offline use or environments without network access.
If a short URL fails to load — expired paste, missing encryption key, network error — the portal now shows an explicit warning dialog explaining the failure instead of silently falling back to the demo plan. An amber "Demo" badge remains visible in the header so it's always clear when you're looking at demo content rather than shared data.
- Thanks to @GunitBindal for building the paste service and short URL integration (#188), and for filing the feature request (#187)
- Thanks to @uqarni for reporting the silent truncation fallback (#142)
Code Suggestions in Code Review
The code review UI now supports GitHub-style code suggestion blocks. When annotating a diff, you can write a fenced suggestion that renders as a syntax-highlighted before/after comparison — the reviewer sees exactly what you're proposing, not a prose description of it. Suggestions include copy buttons for quick application.
Annotation editing is also inline now. Click an existing annotation to modify its text directly in place rather than deleting and recreating. The DiffViewer component was decomposed from 615 lines down to 200 in the process, with logic extracted into focused subcomponents for the code modal, suggestion renderer, and inline editor.
- Thanks to @flex-yj-kim for the contribution (#198)
Customizable Obsidian Export Filenames
The Obsidian integration now supports a configurable filename template with 12 variables: {title}, {YYYY}, {MM}, {DD}, {HH}, {mm}, {ss}, {date}, {time}, {datetime}, {project}, and {agent}. Set your preferred format in Settings and see a live preview of the generated filename. The default is {title} (same behavior as before). Filesystem-unsafe characters are automatically sanitized.
CJK Input Method Support
Pressing Enter during CJK character composition (Chinese, Japanese, Korean input methods) no longer triggers form submission. The fix adds isComposing guards to all five Enter-key handlers in the plan review UI so the Enter key confirms the IME candidate as expected, and a second Enter submits the form.
- Thanks to @eromoe for reporting the issue (#191)
- Thanks to @flex-yj-kim for the review-editor side fix in #198
Review UI: Empty Files and Diff Error Handling
The code review UI could show an empty file list when the user's git config had diff.mnemonicPrefix enabled, because the diff parser expected standard a//b/ prefixes. The fix forces standard prefixes via --no-prefix fallback logic. Git diff errors (e.g., from detached HEAD or corrupted index) are now surfaced in the UI instead of silently showing "No changes."
- Thanks to @flex-yj-kim for the fix (#200)
- Thanks to @zhuscat for reporting the empty file list issue (#189)
XDG Base Directory Fix
The install script now correctly places the binary in ~/.local/bin rather than deriving the path from XDG_DATA_HOME. Per the XDG Base Directory Specification, XDG_DATA_HOME is for data files — not executables.
OpenCode: Remote URL Notification and Decision Timeout
OpenCode users in remote/SSH sessions now see the Plannotator URL logged directly in the TUI, since there's no local browser to open. A 10-minute decision timeout was also added — if no approve/deny action is taken, the session auto-denies and releases the port to prevent permanent port occupation.
- Thanks to @codeg-dev for the contribution (#197)
- Thanks to @GunitBindal for reporting the remote session UX gap (#192)
Additional Fixes
- Diff view clears on sidebar tab switch — switching from the Version Browser tab back to Table of Contents now properly clears the diff overlay (#199 by @flex-yj-kim)
- Import merge fix — importing a teammate's share URL now correctly merges annotations with your existing ones instead of replacing them (#205)
- Paste service CORS — the paste service now accepts requests from any localhost port, since the hook server uses random ports
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
- Add short URL sharing via paste service to fix URL truncation by @GunitBindal in #188
- fix: respect XDG Base Directory Specification of ~/.local/bin by @idletea in #195
- fix(opencode): notify URL in remote mode and add 10-min decision timeout by @codeg-dev in #197
- feat: Add code suggestions, inline editing, and refactor DiffViewer by @flex-yj-kim in #198
- fix: Fix diff view not clearing on sidebar tab switch by @flex-yj-kim in #199
- fix: Fix review showing empty files + propagate diff errors to UI by @flex-yj-kim in #200
- fix: guard Enter key handlers with isComposing for CJK IME support by @backnotprop in #201
- Add customizable filename format for Obsidian exports by @backnotprop in #202
- Deploy paste service with E2E encryption by @backnotprop in #203
- test: E2E encryption tests for paste service by @backnotprop in #204
- v0.10.0 pre-release fixes by @backnotprop in #205
Contributors
@flex-yj-kim (@wicksome) has become the project's most active external contributor. Across v0.9.3 and v0.10.0, Yeongjin shipped five PRs spanning both the plan review and code review UIs — from the toolbar dismiss fix that landed in v0.9.3 (#182) to the code suggestions feature, DiffViewer refactor, empty file fix, diff view clearing fix, and the review-editor isComposing guard in this release. Consistent, high-quality work across the whole surface area.
- @GunitBindal made their first contribution in #188
- @idletea made their first contribution in #195
- @codeg-dev made their first contribution in #197
Community members who reported issues and requested features that shaped this release:
- @uqarni — #142 (URL truncation silent fallback)
- @eromoe — #191 (CJK IME enter key)
- @azyu — #167 (Obsidian filename format)
- @zhuscat — #189 (review UI empty files)
Full Changelog: v0.9.3...v0.10.0