This page describes how the Highlight browser extension (the “Extension”), the companion website at finnjclancy.github.io/highlighter (the “Gallery”), and the share/AI/agent service at highlighter-share.finnjclancy.workers.dev handle your information. The short version: Highlight stores your highlights locally by default, has no accounts, ads, analytics, or tracking, and sends data off your device only when you deliberately use AI highlights, connect an agent, create a share link, copy/export content, or post a comment on a shared link.
The Extension stores the following data locally in your browser using the standard chrome.storage APIs:
chrome.storage.sync across your signed-in Chrome profile if that feature is enabled in your browser).This local data leaves your browser only when you take a deliberate action: invoking AI highlights, enabling an agent connection, copying/exporting content, generating a share link, or posting a comment on a shared link.
The optional agent connection is off by default. If you enable it, the Extension creates a random private browser token and opens an encrypted WebSocket connection to the Highlight Worker. To pair ChatGPT, the Extension asks the Worker for a 12-character one-time code. The code expires after 10 minutes and is consumed once. The Worker stores a hash-derived bridge identifier—not the private browser token—and uses it to connect the approved ChatGPT session to the correct browser.
The public MCP connection uses OAuth 2.1 with dynamic client registration and PKCE. Highlight stores the ChatGPT client's registered name, callback URL, and generated client ID; a one-time authorization code for up to 5 minutes; and a refresh-session record for up to 30 days. Access tokens are signed, expire after 1 hour, and contain only the hashed bridge identifier and permission scope. Pairing codes, authorization codes, and refresh tokens are stored in isolated Cloudflare Durable Objects and deleted when consumed or expired. Highlight has no user accounts and does not receive your ChatGPT conversation or OpenAI account identity through this flow.
A connected agent can request the active page and selection; read page-numbered extracted text from a PDF you have open in Highlight's PDF Reader; read a set you deliberately staged from the Library; list, create, move, rename, merge, or remove folder labels; add, edit, remove, restore, search, tag, export, summarize, compare, snapshot, or open saved highlights; add page notes; and create or manage live links and their discussion. PDF text, Library searches, staged selection IDs, operation history, page notes, exports, and snapshots remain in your browser unless a tool returns them to the connected agent or you explicitly publish a live link. Tool requests and responses are relayed through the Worker in memory and are not intentionally stored by the agent bridge. Published highlight payloads and discussion are stored by the share service until their selected expiry. Cloudflare may process standard request logs under its own policies. Disconnecting closes the browser connection and discards the local private token; an existing OAuth session can no longer reach that disconnected bridge.
The setup guide also offers a developer-only private MCP URL. It contains the browser token and must be treated like a password; never put it in a plugin, chat message, screenshot, or public document.
In the PDF Reader, Copy for ChatGPT extension prepares and copies a prompt containing the PDF title, source URL, your instruction, and guidance to use the paired MCP connection while leaving the PDF tab active. You then open the ChatGPT browser extension and choose whether to paste and send it. Open ChatGPT web instead opens or focuses chatgpt.com and attempts to append the same prompt to its composer. Neither action puts the PDF text in the prompt or presses Send. Extracted PDF text is returned only if the connected agent calls get_pdf_document; the agent can then request exact highlights, notes, or tags through the other MCP tools.
After you select highlights in the Library, Open in ChatGPT web stores only those highlights' existing local IDs as the current staged selection, opens or focuses chatgpt.com, and inserts a short instruction into the ChatGPT composer. Copy for browser agent stores the same local IDs and copies that instruction to your clipboard instead. The instruction contains the number of selected highlights and asks the connected Highlight MCP tool to retrieve them; it does not place the highlight text itself on the clipboard or in the composer.
Highlight does not read or store your ChatGPT conversation, does not transmit an existing ChatGPT draft, and never presses Send. It only appends the prepared instruction after you click the corresponding Library action. ChatGPT receives the instruction only if you choose to send it, and receives the selected highlight data only if the connected agent then calls get_library_selection.
AI highlights is optional and disabled until you accept an in-product disclosure. When you invoke it—or enable the clearly labelled Auto setting—the Extension extracts selectable text from the open PDF and sends that text, the PDF title, source URL, temporary text-span identifiers, and any optional reader instruction over HTTPS to the Highlight Worker. Explicit literal keyword and phrase instructions can be matched by the Worker itself. For open-ended or semantic instructions, the Worker forwards the request to the Google Gemini API so Gemini can select passages.
The Gemini API key is stored as an encrypted Cloudflare Worker secret and is not included in the Extension. Highlight does not store the extracted source PDF text. To reduce repeated processing, the Worker may store selected span identifiers, categories, and short explanations in Cloudflare Workers KV for up to 30 days. Google states that content submitted through its free Gemini API tier may be used to improve its products. Do not use AI highlights on confidential or sensitive PDFs.
When you click Share live link, the Extension builds a compressed payload containing the current page URL/title and the highlights you chose to create on that page, including highlight text, colours, comments, tags, and location hints used to reopen the highlights on the original page.
The Extension first sends that payload over HTTPS to the Highlight share-link service at highlighter-share.finnjclancy.workers.dev to create a shorter link. The service stores the payload in Cloudflare Workers KV for the selected expiry (between 1 and 365 days) so the share URL can work and show link preview metadata. A random management credential is stored only in your browser; the service stores its cryptographic hash. Optional gallery passwords are also stored only as hashes. If the share service is unavailable, the Extension falls back to a long URL with the compressed payload embedded directly in the URL.
If a recipient opens a share link, their browser fetches the Gallery page and decodes the shared highlights client-side. GitHub Pages hosts the static Gallery files, and Cloudflare serves short share links. As with any web request, GitHub and Cloudflare may process standard server logs such as IP address, user-agent, timestamp, and requested URL under their own policies.
Shared links let viewers add attributed comments and reactions. The share service stores the optional author name, comment or reaction, related highlight ID, and timestamp with that share until it expires. Password-protected galleries require the password before their gallery discussion can be read or changed. Do not put sensitive information in share-link discussion.
<all_urls> — so the Extension can apply highlights and drawings on any web page you choose to use it on. On chatgpt.com, this also lets Highlight append a prepared Library instruction only after you press Open in ChatGPT web. Page details or selected passages are transmitted only when you deliberately invoke AI, sharing, or the optional connected-agent feature described above.All highlight, drawing, and palette data lives in your browser's local storage. To delete it:
chrome://extensions, which clears all of its stored data.Short share links, their highlight payloads, and discussion are stored until the expiry selected when the link is created, between 1 and 365 days. Links created by this Extension can also be listed and revoked before expiry through the connected-agent live-link tools; revocation deletes the stored gallery payload, discussion, and management record. OAuth access tokens expire after 1 hour and refresh-session records after 30 days; one-time pairing and authorization records expire after 10 and 5 minutes respectively. Avoid sharing sensitive content.
Highlight uses data obtained through Chrome extension permissions only to provide or improve its single purpose: highlighting, organising, understanding (including optional AI assistance), exporting, drawing on, and sharing selected web and PDF content at your request. Highlight does not use or transfer this data for personalised advertising, retargeting, sale of data, credit-worthiness, or unrelated purposes. The use of information received from Chrome APIs adheres to the Chrome Web Store User Data Policy, including the Limited Use requirements.
Questions, concerns, or requests? Open an issue at github.com/finnjclancy/highlighter/issues.