Annotate

approvedunreviewed

by junuxyz

Add threaded comments, highlights, and optional ChatGPT, Claude, or OpenCode replies to selected text.

Updated todayMIT

Annotate

Annotate logo

Keep context attached to your notes.

Annotate is a desktop Obsidian plugin that lets you select a passage, leave a comment, and click its highlight to revisit it or add a reply. Currently, only macOS on Apple silicon is supported.

https://github.com/user-attachments/assets/b64ded00-4c37-46e0-a9a0-9e790734fa87

Features

  • 💬 Comment on any passage. Start a thread, reply, edit, resolve, or reopen it from the highlight or comments list. Quote selected text, copy messages or entire threads, and expand longer conversations. Comments support Obsidian Markdown, note links, code blocks, and LaTeX, and follow text edits and Obsidian renames.
  • 🖍️ Highlight and color text. Choose highlight and text colors from the selection menu, combine them, or remove them. Customize the highlight palette, opacity, and Rounded, Flat, or Underline shape. Assign a shortcut to reapply your last highlight color. Bold, italics, and strikethrough stay formatted.
  • 🤖 Ask an assistant. When enabled, messages ask your default assistant. Start with @comment to save a comment without an AI reply, or use @chatgpt / @claude / @opencode to choose an assistant. Requests supply the full current note, highlighted passage, question, and conversation, including earlier local comments. Assistant access is optional. ChatGPT can work on notes inside explicitly permitted vault folders. See the setup guide for context and permission controls.
    • Comments stay in your vault without changing your notes. Assistant requests share note content with the selected provider. See assistant setup and privacy.
  • 🎨 Fit your Obsidian theme. The interface uses your theme's colors, accent color, and typography to blend into Obsidian in light and dark mode. Highlight colors remain customizable.

Local comments and highlighting work offline without an account. Optional ChatGPT and Claude replies require an authenticated Codex account or a Claude subscription through Claude Code. They send the current note and thread context to OpenAI or Anthropic; OpenCode sends context to the selected model provider and uses its account requirements. Provider limits apply, and subscriptions are not included. Web search and selected remote MCP services have separate opt-in controls and can send context or approved arguments to those services.

Assistant integration runs locally installed CLIs outside the vault. Annotate locates those executables, reads Codex's model cache and login file, and keeps isolated Codex state under ~/.annotate/codex/ and temporary working directories outside the vault. The CLIs also use their provider login data. See assistant setup and privacy for details.

Install

Requires macOS on Apple silicon and Obsidian 1.14.4 or later.

  1. Open the latest release and download main.js, manifest.json, and styles.css from Assets.
  2. Create <vault>/.obsidian/plugins/annotate/ and copy all three files into it.
  3. In Obsidian, open Settings → Community plugins, allow community plugins if prompted, then enable Annotate. Reload Obsidian if it is not listed yet.

Node.js and an assistant account are not needed for local comments and highlighting. To update, disable Annotate, replace the same three files with files from one release, and enable it again. Keep data.json and the other plugin data files.

The official build supports ChatGPT, Claude, and OpenCode. See assistant setup to enable optional AI replies. For building from source, see source installation.

Quick start

  1. Select text and choose Annotate from the selection menu.
  2. Write a comment and press Enter to send. Use Shift+Enter for a new line.
  3. Click the highlight to reply, or resolve the thread when you're done.

Documentation

License

MIT · Third-party notices

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.