You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(annotate): add URL/HTML docs, blog post, and env var references (#553)
- Rewrote the annotate command docs page to cover all four input types
(URLs, HTML files, folders, markdown) with Jina Reader pipeline details,
--no-jina flag, JINA_API_KEY, and source badge
- Added PLANNOTATOR_JINA and JINA_API_KEY to the environment variables
reference page
- New blog post: "Annotate Any Web Page or HTML File" with embedded video
For provenance purposes, this commit was AI assisted.
description: "Plannotator's /plannotator-annotate command now accepts URLs and HTML files, not just markdown. Fetch any web page, convert it to markdown, and annotate it with structured feedback for your coding agent."
4
+
date: 2026-04-12
5
+
author: "backnotprop"
6
+
tags: ["annotate", "url", "html", "jina-reader"]
7
+
---
8
+
9
+
**Plannotator is an open-source review UI for AI coding agents.** The `/plannotator-annotate` command now accepts URLs and HTML files alongside markdown, so you can pull in any external documentation, convert it on the fly, and send structured annotations back to your agent session.
You're working with an agent that needs to implement against an external API or follow a specific guide. You could copy-paste the documentation into chat, but you lose structure. You could describe what you need freeform, but that's imprecise. What you actually want is to open the page, highlight the relevant sections, and send that annotated content directly to the agent.
16
+
17
+
This was a [community-requested feature](https://github.com/backnotprop/plannotator/issues) that ships in [PR #545](https://github.com/backnotprop/plannotator/pull/545).
plannotator annotate docs/guide.html # local HTML file
24
+
plannotator annotate ./docs/ # folder (now includes .html files)
25
+
plannotator annotate https://... --no-jina # direct fetch, no Jina
26
+
```
27
+
28
+
All inputs are converted to markdown before reaching the annotation editor. You annotate, highlight, comment, and when you click Send Annotations, structured feedback goes back to the agent session.
29
+
30
+
Local HTML files are read from disk and converted via Turndown. Folders now show `.html` and `.htm` files alongside markdown in the file browser, with conversion happening on demand. A source attribution badge appears under the document title so you know what you're looking at.
31
+
32
+
## How URL fetching works
33
+
34
+
By default, URLs are fetched through [Jina Reader](https://jina.ai/reader/) (`r.jina.ai`). Jina handles JavaScript-rendered pages, strips navigation and boilerplate, and returns clean markdown. Most documentation sites work well with it.
35
+
36
+
If the URL ends in `.md` or `.mdx`, Plannotator fetches it raw and skips conversion entirely.
37
+
38
+
For cases where you want to skip Jina, use `--no-jina`. Plannotator will fetch the page directly and run Turndown locally.
Then run the annotate command with any URL or HTML file. Annotate the relevant sections and send the feedback to your agent. Full docs at [plannotator.ai/docs](/docs/getting-started/installation/).
| HTML file |`plannotator annotate docs/guide.html`| Converts to markdown via Turndown, then opens |
17
+
| URL |`plannotator annotate https://docs.stripe.com/api`| Fetches the page, converts to markdown, then opens |
18
+
| Folder |`plannotator annotate ./docs/`| Opens a file browser showing all `.md`, `.mdx`, `.html`, and `.htm` files |
12
19
13
20
### Slash command (inside an agent session)
14
21
15
22
```
16
23
/plannotator-annotate path/to/file.md
24
+
/plannotator-annotate https://docs.stripe.com/api
25
+
/plannotator-annotate ./specs/
17
26
```
18
27
19
-
The agent runs `plannotator annotate <file>` under the hood. The annotation UI opens in the browser. When you submit, feedback is returned to the agent as structured output.
28
+
The agent runs `plannotator annotate <arg>` under the hood. The annotation UI opens in the browser. When you submit, feedback is returned to the agent as structured output.
20
29
21
30
### Standalone CLI (outside an agent session)
22
31
23
32
```bash
24
33
plannotator annotate path/to/file.md
34
+
plannotator annotate index.html
35
+
plannotator annotate https://example.com/docs
36
+
plannotator annotate ./docs/
25
37
```
26
38
27
-
This starts a local server, opens the browser, and blocks until you submit. The formatted feedback is printed to stdout.
39
+
Starts a local server, opens the browser, and blocks until you submit. Formatted feedback is printed to stdout.
28
40
29
-
## How it works
41
+
## Folders
30
42
43
+
When you pass a folder, Plannotator opens a file browser showing all markdown and HTML files in the directory tree. Click any file to open it in the annotation UI. This is useful for annotating a set of specs, documentation, or your Obsidian vault.
44
+
45
+
Build output directories like `_site/`, `public/`, `.docusaurus/`, and `node_modules/` are automatically excluded from the file browser.
46
+
47
+
## URLs
48
+
49
+
Fetching a URL converts the page to markdown before opening it in the annotation editor.
50
+
51
+
### Jina Reader (default)
52
+
53
+
By default, URLs are fetched through [Jina Reader](https://jina.ai/reader/) (`r.jina.ai`). Jina handles JavaScript-rendered pages and returns clean, reader-mode markdown. This works well for documentation sites, blog posts, and API references.
54
+
55
+
Set `JINA_API_KEY` in your environment for higher rate limits (500 req/min vs 20 req/min unauthenticated). Free API keys are available from Jina.
56
+
57
+
### Direct fetch (`--no-jina`)
58
+
59
+
If you don't want to use Jina, pass `--no-jina`. Plannotator will fetch the HTML directly and convert it with Turndown. This is useful for pages behind authentication, internal docs, or when you just prefer not to route through a third-party service.
URLs ending in `.md` or `.mdx` are fetched as raw text with no conversion. If the server returns HTML instead (like GitHub's rendered markdown viewer), Plannotator falls through to Jina or Turndown automatically.
68
+
69
+
### Local and private URLs
70
+
71
+
URLs pointing to `localhost`, `127.x.x.x`, `10.x.x.x`, `192.168.x.x`, and other private or link-local addresses always use direct fetch. Jina is skipped automatically since it can't reach private networks.
72
+
73
+
### Configuring Jina
74
+
75
+
Three ways to disable Jina Reader, in priority order:
76
+
77
+
1.**CLI flag:**`--no-jina`
78
+
2.**Environment variable:**`PLANNOTATOR_JINA=0` or `PLANNOTATOR_JINA=false`
79
+
3.**Config file:**`~/.plannotator/config.json` with `{ "jina": false }`
80
+
81
+
If none of these are set, Jina is enabled by default.
82
+
83
+
## HTML files
84
+
85
+
Local `.html` and `.htm` files are read from disk and converted to markdown using [Turndown](https://github.com/mixmark-io/turndown) with GFM table support. `<script>`, `<style>`, and `<noscript>` tags are stripped before conversion.
86
+
87
+
HTML files must be within your current working directory. Files outside the project root return a 403 error.
88
+
89
+
## Source badge
90
+
91
+
When annotating an HTML file or URL (not plain markdown), a small badge appears under the document title showing where the content came from. For URLs it shows the hostname (e.g. "stripe.com"). For HTML files it shows the filename (e.g. "guide.html").
48
92
49
93
## Annotate mode differences
50
94
@@ -55,7 +99,7 @@ The annotation UI in annotate mode works the same as plan review, with a few cha
55
99
-`Cmd/Ctrl+Enter` sends annotations instead of approving
56
100
- The completion screen says "Annotations Sent" instead of "Plan Approved"
57
101
58
-
All annotation types work identically — deletions, replacements, comments, insertions, global comments, and image attachments.
102
+
All annotation types work identically: deletions, replacements, comments, insertions, global comments, and image attachments.
59
103
60
104
## Feedback format
61
105
@@ -84,11 +128,20 @@ The agent receives this and can act on each annotation.
84
128
85
129
| Endpoint | Method | Purpose |
86
130
|----------|--------|---------|
87
-
|`/api/plan`| GET | Returns `{ plan, mode: "annotate", filePath }`|
The annotate server respects the same environment variables as plan review. See the [environment variables reference](/docs/reference/environment-variables/).
140
+
The annotate server respects the same environment variables as plan review, plus two specific to URL annotation:
141
+
142
+
| Variable | Default | Description |
143
+
|----------|---------|-------------|
144
+
|`PLANNOTATOR_JINA`| enabled | Set to `0` or `false` to disable Jina Reader for URL annotation. |
145
+
|`JINA_API_KEY`| (none) | Optional Jina Reader API key for higher rate limits (500 RPM vs 20 RPM). |
146
+
147
+
See the [environment variables reference](/docs/reference/environment-variables/) for all options.
Copy file name to clipboardExpand all lines: apps/marketing/src/content/docs/reference/environment-variables.md
+7Lines changed: 7 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,6 +20,13 @@ All Plannotator environment variables and their defaults.
20
20
|`PLANNOTATOR_SHARE_URL`|`https://share.plannotator.ai`| Base URL for share links. Set this when self-hosting the share portal. |
21
21
|`PLANNOTATOR_PLAN_TIMEOUT_SECONDS`|`345600`| OpenCode only. `submit_plan` wait timeout in seconds. Set `0` to disable timeout. |
22
22
23
+
## Annotation variables
24
+
25
+
| Variable | Default | Description |
26
+
|----------|---------|-------------|
27
+
|`PLANNOTATOR_JINA`| enabled | Set to `0` or `false` to disable Jina Reader for URL annotation. Set to `1` or `true` to enable (this is the default). Can also be set via `~/.plannotator/config.json` (`{ "jina": false }`) or per-invocation via `--no-jina`. |
28
+
|`JINA_API_KEY`| (none) | Optional Jina Reader API key for higher rate limits. Without it: 20 req/min. With it: 500 req/min. Free keys available from [Jina](https://jina.ai/reader/) and include 10M tokens. |
0 commit comments