web-summary-privacy

Privacy Policy

“WholeTake” Chrome Extension

Last updated: 2026-10-22


Overview

“WholeTake” (formerly “AI Web Summary & Translate”; the “Extension”) is maintained by an independent developer. It helps you summarize and translate web pages using a large language model (LLM) endpoint that you configure yourself.

We take your privacy seriously. This policy explains what data the Extension processes, how, and what your rights are.

In one precise line: This version ships exactly two AI paths — your own key (BYOK) straight to the endpoint you choose, or Chrome built-in AI running on your device; neither goes through a developer server, and there is no telemetry. On the BYOK path your content goes only to the AI endpoint you configure; with built-in AI, inference runs on your device; results are kept locally by default. Exactly what each feature sends, whether it is automatic, and how many model calls it makes are laid out in the data-flow matrix (DATA_FLOW.md).


No developer collection, no telemetry

This version ships exactly two AI paths: your own key (BYOK) straight to the endpoint you choose, or Chrome built-in AI running on your device. On both of them the developer collects no user data on any server (note, however, that your page content is sent to the AI endpoint YOU choose — that is the nature of BYOK, which is different from “sends no data anywhere”). The Extension:


Data processed locally on your device

1. Settings

Everything you enter on the Settings page is stored only in your Chrome browser’s storage:

The Extension’s own pages also use window.localStorage (not chrome.storage) for 11 display and ask-panel preferences only — numbers, booleans, layout coordinates and your interface language (kgAskDeep decides whether a question reads all candidates in batches, i.e. how many model calls it makes — not layout; the candidate cap, batch size and batch limit are ordinary adjustable settings from v1.51 (defaults 48 / 8 / 6; 0 = unlimited, still hard-capped at 60 batches) — larger values mean more calls, billed by your own endpoint as always). They contain no page content, no credentials and no personal data, are never synced and never leave your device: wt-theme (light/dark/auto theme, used to avoid a first-paint flash), kgAskPanelW / kgAskFontPx (knowledge-graph ask panel width and font size), kgAskBox (where the answer window was dragged to and how big it is — four numbers), kgAskDeep (the ask panel’s “deep search” toggle, one boolean), kgLegendOpen / kgLegendBox (legend collapsed state, window position and size), spFontPx (side panel font size), wt-options-advanced (whether the settings page shows its advanced settings — one boolean), wt-uilang (the interface language you chose and its text direction, again to avoid a first-paint flash), and wt-uilang-pack (an offline copy of the Extension’s own interface text file for that language — literally the _locales/<lang>/messages.json that ships inside the Extension, cached so the first frame can already be in the right language; it contains none of your data). To clear them: use your browser’s “Clear browsing data -> Cookies and other site data”, or remove the Extension.

Keyboard shortcuts are not in that list: since v1.39 the Extension has no in-page shortcut handling of its own, and the browser-level shortcuts are managed by Chrome’s own Keyboard shortcuts page (chrome://extensions/shortcuts) and stored by Chrome, not by the Extension.

Where your API keys live is your choice:

Keys have three storage modes, chosen under Settings → Key Storage:

In every one of this version’s key-storage modes, none of this is ever sent to a developer-operated server or any intermediary (only to the AI endpoint YOU configured, when the Extension calls it). We still recommend:

2. Page content

When you actively trigger “Summarize” or “Translate”, the Extension sends the following to the AI endpoint you configured yourself (when you right-click a web link and choose “Summarize / Translate link in new tab” or “Summarize / Translate link in background tab”, or point at a link and press the “hovered link” keyboard shortcut, the Extension first opens that link in a new tab — in the background, without switching to it, for the background items and the shortcut — waits for the page to load, and then does the same thing on that page — what is sent is that new tab’s content, exactly as if you had opened it yourself and pressed Summarize):

On both of this version’s paths — your own key (BYOK) and Chrome built-in AI — the developer has no access to this data and operates no intermediary server.

What happens with unencrypted (http://) endpoints (as of v1.44): your content only ever goes to the endpoint you configured yourself, but sending it in the clear is a risk in its own right, so the Extension checks twice — once when you save the setting, and again immediately before every request it sends:

The technical criteria and where they are implemented are in the “endpoint transport policy” table in SECURITY.md.

Automatic calls beyond the summary itself (on by default, all to your same model endpoint, each can be turned off in Settings):

Topic pages, mind maps, and knowledge-base Q&A are manually triggered (see Section 3 below and DATA_FLOW.md). Exactly what each feature sends, whether it is automatic, and the estimated number of model calls are laid out in the data-flow matrix (DATA_FLOW.md).

Export diagnostics (CORE-1510-F4): Settings → About (next to “Feedback”) can export a diagnostics file to help us debug — the file is only downloaded to your device, never sent anywhere by itself; whether to hand it to the developer is your call. By default the file contains: end-of-task snapshots for the last ≤50 tasks (timestamps, cache decision, call count, error code, provider and model name, the endpoint’s masked label, whether the result was saved; field by field in the “Diagnostics ring” item below — including YouTube caption-source codes, PDF reader layout counts, the summary processing trace, link-task codes, per-round translation counters and knowledge-base citation-check counters, all fixed codes and numbers), the most recent translation outcomes (URL and host name reduced to hashes — for tabs in an Incognito window not even the hashes — plus the names of the translation and proofreading models used), queue and index state (counts and fixed codes only; for the index we only record whether an error occurred, not its text), the health of the “Recent results” store (whether the index format is valid and how many records it lists, number of index chunks, how many are missing and how many carry a time range, number of record shards and staging keys, whether an import is unfinished and in which mode, how many deletions are pending, whether a leftover copy of the old single-key index or a migration backup still exists, the running total and time of automatic removals, and the reason and time of the last rebuild of the index from the stored records — numbers, yes/no flags and fixed codes only, never a record id, title or URL), the running-task snapshot, the wipe generation, the extension version and Chrome major version, the built-in AI device status, your browser’s primary language code (for example “zh”; no region), the storage-protection status (ok / unsupported / failed / pending — whether extension scripts on web pages can read local storage; once the check has finished, anything other than ok means the Extension has stopped running on web pages; see SECURITY.md), how many Incognito items were left out of the file, and a non-sensitive subset of your settings — no URL, no page text and no key (allow-listed writer; any URL-like string is dropped whole, credential-shaped strings become ***; endpoints appear only as a masked label — cloud providers from the built-in preset list (OpenAI, OpenRouter, Gemini…) as their domain plus a short hash; custom, local and LAN endpoints only as a category (custom / local / lan), the port and a short hash. The host name or IP itself is never written; the short hash is mixed with a salt that is generated at random for each browser session and stays on your device (it is not in the file), so it can neither be reversed nor checked against a guessed address. So level 1 carries no URL, no path and no query string). Before the file is written, the whole file is scanned once more; any string that looks like a URL, an email address, an IP address or a key is replaced with [redacted], and the file records how many were replaced (normally zero). Only if you tick “include content” (the checkbox is shown after turning on “Show advanced settings”) will tasks started afterwards in a regular window also record the model’s raw output, the error text of tasks that failed, your most recent conversation contexts (including page text), the per-paragraph source and translation of the last 3 full-page translations (including the proofreading replies, the model, the batch and the attached instructions as fixed codes, and the AI-refinement terminology sheet), the full URLs of translation outcomes, and — for the last 5 summaries — the instruction shell that was sent (page text replaced by a hash code), the text of any automatic correction instructions (which may quote table rows and cited paragraphs from the page), the text description produced for each image, the excerpts of the paragraphs the summary cites, the carousel items that were marked as currently shown, and the full final summary. In an “include content” file, the keys you have configured (8 characters or longer) and strings that start like a well-known key (sk-, rk-, AKIA, ASIA, Bearer …) are replaced with ***; the model settings stored with those conversation contexts carry only the endpoint’s masked label (the same label as in the settings subset) — never the endpoint address, so a token in its query string (for example ?code= or ?sig=) or a user name and password written into it is not in the file; other text in the file — page text, model output and error messages — is kept as is, so a key in some other format that appears there would not be caught. Tasks in an Incognito window never record any of this content, even with the box ticked, and their conversation context and translation-outcome URLs are left out of the file. That file lives only in your Downloads folder; share it only with someone you trust; after the export the box unticks itself and the retained content is removed at once.

YouTube summaries: when you summarize on a YouTube video page, or use another feature that needs to read the video’s content there (such as mind maps; follow-up questions reuse what was already read and do not read from YouTube again), the Extension reads the video’s caption data from YouTube within that page (the primary path does not use your signed-in credentials; only if it fails, a fallback retries using your existing YouTube session within that page — all reads stay inside the YouTube page and nothing is ever sent to the developer); the caption text is then sent to the AI endpoint you configured (or processed fully on-device by the built-in AI). Summary material for a YouTube video is always obtained from YouTube within that page and never goes through the developer. When no usable captions can be obtained (the video has none, or they fail to load or are too short), the material becomes the video description (the information written by the uploader, together with the channel name and video length) plus top comments. A video without captions also counts as a failure of the primary path, so the fallback above first retries reading the captions using your YouTube session; the top comments are fetched from that page from YouTube (www.youtube.com) only when no usable captions can be obtained, with at most two additional requests per read, and the comment requests themselves do not use your signed-in credentials; at most 20 comments are taken (each up to 500 characters, at most 6,000 characters of comment text in total; the commenter’s display name and like count are added alongside) and sent together with the description to the AI endpoint you configured (or processed fully on-device by the built-in AI).

PDF summaries / translations (v1.49+): when you press Summarize or Translate on a PDF open in Chrome’s built-in viewer, the Extension opens its own reader page and downloads that PDF again from its source URL: the Extension’s background makes this one download, replaces the original tab with the reader page only once the first bytes confirm the URL still returns a PDF, and hands the downloaded file to the reader page (the reader does not ask the site a second time); if it clearly does not return a PDF, the original viewer is kept and a new tab asks you to drop the file in; if the server does not answer within 8 seconds, the original viewer is kept and the reader page opens in a new tab, which receives the same download when it arrives; if the server declares a file larger than 50 MB, no reader page is opened and the original tab shows a short notice — this step only prevents your copy of the PDF from disappearing, it is not an access control. The reader page downloads the file itself only if the browser shut down the Extension’s background before the reader received the file, or when you reload the reader page. Every download uses your existing browser login state (so PDFs behind a login wall work too) and goes to the PDF you are viewing — or, only when you press “Open in reader and summarize” (or “… and translate”) on the toolbar popup’s card about a link that did not open as a page, to that link’s address (the link you right-clicked or pointed at; it can be on another site, and nothing is fetched before you press the button); it never goes to the developer, and the downloaded file is held only in memory on your device, never written to the Extension’s storage. If the server redirects the request to a different site this time, the Extension does not read the redirected content for your safety and asks you to save the file from the viewer’s download button and drop it into the reader instead. The file is parsed on your device by a bundled copy of pdf.js; the extracted text layer (and, when “Include page images and charts when summarizing” is on: for documents with a text layer, the detected figures cropped as images — at most 4 per page and, by default, 20 per document (adjustable in settings to 10, 30 or 40), cropped on your device — are sent one at a time to the model you configured to get a short text description, exactly like web-page images, and each description is placed next to that figure’s caption before the summary is written; tables that can be reliably rebuilt from the text layer are read as text and are not sent as images; whole-page images inside such documents are described the same way; for scanned PDFs with no text layer, rendered images of whole pages are attached to the summary request — with Chrome built-in AI at most 4 of them, and the result says how many were read) is then treated exactly like web-page content: sent only to the AI endpoint you configured (or processed locally by Chrome built-in AI). Scanned PDFs with no text layer can only be summarized from page images — no OCR. Local file:// PDFs require that you enable “Allow access to file URLs” for this extension in chrome://extensions; otherwise you can drop the file onto the reader page manually. History and translation cache are keyed by the original PDF’s URL and title (same rules as section 3).

A PDF summary also carries a short “how much the model actually saw” statistic (text pages / scanned pages / figures detected and actually read / whole-page images / why figures were left out / how many reading segments there were and how many were left unread; numbers and reason codes only, no page text or images), stored locally with that history record. Very long PDFs (more than about 60,000 characters of text, counting an estimate of the figure descriptions) are read in segments by default: each segment (≤28,000 characters, including the descriptions of its figures; no images are attached) is one model call — up to two segments are read at the same time — and one final call merges them — at most 12 segments + 1; the “Read long PDFs in parts” setting turns it off, and Chrome built-in AI always makes a single call. What is sent is the same document’s text layer and figure descriptions, only split across several calls to your same endpoint — no new endpoint is involved. Detected tables are rebuilt as plain-text tables and sent with the text (no longer flattened into one line per cell). Before you press Summarize, the PDF reader shows an estimate — figures to be read one by one, tables read as text, how many figures will not be read when a document has more than the per-document limit, and the expected number of model calls — computed inside the Extension from counts only (no page text leaves your device for this). A “Text only this time” checkbox skips figure reading for that one summary without changing your settings.

Chrome built-in AI mode: if you choose “Chrome built-in AI” (Gemini Nano) in Settings, the model inference for the content above runs entirely on your computer and page content is not sent to any external AI endpoint. Note, however, that fetching source images, reading video content within the YouTube page (captions, plus top comments when no usable captions can be obtained), and the one-time download of the built-in model itself can still generate network requests (to image CDNs, to YouTube, and to the browser’s model-download service, respectively).

Where results are shown, and what the web page can see: the summary result, streaming output, and your follow-up input are carried, in side-panel mode, by an extension-owned page (extension origin); the on-page popup by default carries its content in an extension-owned iframe, so scripts on the page you’re browsing cannot read or alter the results or your input inside it — and the iframe handshake requires a one-time nonce obtained through the extension’s internal channel, which the host page cannot obtain or hijack. If the iframe is removed by the host page or fails to load for any reason, the default behavior is fail closed: the Extension closes the window and cancels the task — content is never handed back to the page automatically. In-page rendering happens only if you have explicitly opted in beforehand via the “Compatibility mode” consent setting; with that consent, a benign load failure (e.g. iframe load timeout) falls back to in-page rendering clearly labeled “Compatibility mode” — in that mode the content lives in the host page’s DOM and is readable by page scripts, so use side-panel mode for sensitive content. In compatibility mode only the current result is placed in the page: related summaries are neither looked up nor shown (no other page’s title, address or even a count is written into the host page) — although a result reused from the cache can be one saved for another page of the same site whose address this page declares as its own (see “What a web page may infer” in section 4); and if you have also allowed the Extension in Incognito, compatibility mode (in regular windows too) does not show the auto-tag row or the auto-tag call in the page — Incognito results have no tags, so leaving the row in would let the page tell that you are in an Incognito window (tags are still generated and saved; view and edit them in Recent results). Error messages written into the web page — the error card, the error area of the compatibility-mode window and the in-page mind map’s failure message — contain only a localized explanation and an error code, never the provider’s raw error text (which can include account IDs or internal host names). In side-panel mode, summary errors are shown in the side panel (the Extension’s own page) with the full text; translation errors are always shown on the web page. The full text of a failed task is also included in an “include content” diagnostics file (for tasks started after you tick it; not for tasks in Incognito windows). See SECURITY.md for the full trust-boundary description.

3. Local history & cache of summaries / translations

For review convenience and token savings, results are kept in your browser’s local chrome.storage.local:

Non-persistent session context (chrome.storage.session): so that you can keep asking follow-ups after the Service Worker is recycled, the side panel can restore its view when reopened, and a few bookkeeping records survive a Service Worker restart, the Extension keeps eighteen keys in chrome.storage.session (a prefixed family such as conv_* counts as one). For every key we state what it holds, whether it contains a URL, when it disappears on its own, and whether “clear everything” removes it:

Every key in chrome.storage.session is never synced, never written to disk, and never sent to the developer, and all of them are gone at the latest when the browser session ends. “A real navigation or closing the tab clears it” is true only for conv_*, panel_*, trrun_* and rdrTab_* — and, for tabs in an Incognito window, also for bgLastRunOutcome (a real navigation means you move to a different page; reloading the same URL does not count — the document is replaced, but these keys are deliberately kept so that a reload does not kill the tab’s running tasks, and reloading the PDF reader page keeps rdrTab_*; a same-document History API change — infinite scroll, a single-page app switching routes — does not count either, and these keys stay until a real navigation); bgLastRunOutcome of a regular tab and topicDraft_* stay by design until the next overwrite, a save/discard, or “clear everything”; imgDescV1 stays until “clear everything”, the viewer’s “Clear all”, or the end of the browser session; a linkDropV1 entry is removed when you use or dismiss it, when its source tab closes, or after 10 minutes; the three diagnostics keys bgTaskLedgerV1 / diagVerboseV1 / bgDiagVerbose_* stay until “clear everything” or a diagnostics export (the latter two are cleared right after export); sessionCreds, bgActiveTasks, the two learned tables, and wipeGenV1 follow their own lifecycles as described above; popupIntent:* exists for about 17 seconds at most (the hand-off note is removed when the background decides; the decision record removes itself on time, or the next time it is read).

Your controls:

On both of this version’s AI paths, all of this stays on your device only — never sent to a developer-operated server or intermediary. Exactly three things send any of it to the AI endpoint you chose (or to on-device Chrome built-in AI): auto-tags, which run automatically after each summary (the summary excerpt, up to ~4,000 characters; can be turned off in Settings); the standalone suggested-questions call, which also runs automatically and sends the same summary excerpt (up to ~4,000 characters) on selection summaries, when the question section of a full-page summary fails to parse, on Chrome built-in AI’s two-stage flow, and when a cache hit finds a record that has no questions yet (can be turned off in Settings; when a full-page summary goes to your own AI endpoint, the questions are produced inside the same single summary call and nothing extra is sent); and the content sent when you actively use topic pages / mind maps / knowledge Q&A (knowledge Q&A also includes today’s local date — no time of day or time zone — so that ranges such as “last month” can be resolved). There is one further optional path that does not go to an AI endpoint and is off by default (next section): once you turn on “Allow public knowledge-base lookup (Wikidata)”, only one concept name goes to Wikidata when you click “Find public mapping”, and only the new tag names of each summary included in the knowledge graph (at most 6) go to Wikidata when its tags are generated (untick “Automatically look up public mappings for new tags” to stop the latter).

Proofread once more after translating (v1.51; a sub-option of “AI refined translation”, on by default): with it on, some paragraphs (long paragraphs whose numbers cannot all be found in the draft translation — and, when the source is written in a less common script such as Sinhala, every long paragraph) have their source text and draft translation sent once more to the same model (or your primary model) to check for omissions — the proofreading pass may only add what was left out, translate words left in the source language, or restore a number from the source; a reply that rewrites wording the draft already has is discarded. Apart from the date described next, nothing new is sent, the same paragraph simply goes out a second time; paragraphs whose translation still carries source-language words, whose dates are ambiguous, or that replaced a currency named in the source with a different one, are likewise re-sent at most once each. The call caps and billing are in the translation row of DATA_FLOW.md.

Today’s date when a paragraph mentions a year (TRC-1520-11): when a paragraph mentions a year (a Gregorian year in any numeral system, or a Buddhist, Japanese-era or Minguo year), the translation and proofreading instructions also include today’s date from your device (the date only — no time or time zone; this sentence covers translation only — for the date sent when summarizing, and the time zone sent only when a custom prompt references it, see “2. Page content” above) so the model can tell past events from forecasts; paragraphs that mention no year get nothing extra. The exception is a custom translation prompt of your own: if it references or, every translation request carries today’s date or your device’s time zone name, whether or not the paragraph mentions a year (the default translation prompt references neither).

4. Incognito windows (v1.53)

The Extension does not run in Incognito windows unless you turn on “Allow in Incognito” for it on chrome://extensions. If you do, a summary or translation of a page in an Incognito window is shown but not saved:


Optional public knowledge-base lookup (Wikidata)

The concept editor on a topic page lets you attach a public knowledge-base mapping (a Wikidata Q-number) to a tag concept. You can paste a Q-number yourself (zero network traffic), or turn on an option that is off by default to look up candidates (the setup wizard’s last step, “Allow public knowledge-base lookups (Wikidata) to match concepts across languages”, and Settings → “Knowledge” are the same switch; both start unticked):


Third-party services

The Extension sends the page content described above to the AI endpoint you specify. You are responsible for understanding and agreeing to that endpoint’s privacy policy. Common endpoints:

Some providers offer a free tier whose terms differ from their paid service — for example, content sent under the Gemini API’s unpaid tier may be used by Google to improve its products and may be read by human reviewers, and Google’s terms require you to be 18 or older. The Extension shows this notice when you pick Gemini in the setup wizard or in Settings; check your provider’s terms before sending sensitive or personal content.

The developer is not responsible for any third-party service’s data handling.


Model-list fetch from the Settings page (not a summary/translation request): when you open Settings, or leave a key / region / endpoint field after editing it, the Settings page sends one GET with that credential set to AWS Bedrock (https://bedrock.<region>.amazonaws.com/foundation-models) or to the OpenAI-compatible endpoint you entered (/models) to list the selectable models. The request carries only the credential and the request itself — never any page content; the main settings plus the three independent-model slots make at most four credential sets, each requested on its own, and only for the provider/endpoint that would actually be used at run time (e.g. zero requests when Chrome built-in AI is selected). “Test connection” likewise sends only a fixed string (see DATA_FLOW).

Permissions

The Extension requests the following Chrome permissions, each used only for its core features:

Permission Purpose
storage Stores the settings above, plus “Recent results” and the translation cache (local chrome.storage.local, never synced; “Recent results” has no size setting and is limited only by your free disk space — beyond 50,000 records older ones are removed automatically (starting with long-unopened records that aren’t in the knowledge graph and have no tags) and the viewer tells you so; delete entries or clear everything in the viewer, or delete old records manually in Settings — see section 3 above)
scripting Injects the content script into the page to show results and translations; and two small self-contained functions — reading the address of the link under the pointer when you press the hovered-link shortcut, and a short navigation watcher in a tab the Extension opened for a link
contextMenus Adds the right-click “Summarize / Translate selection” items (shown when text is selected) and, on http/https links, “Summarize / Translate link in new tab” and “… in background tab” (opens a new tab for that link — in the foreground or in the background, as the item says — and runs on that page once it has loaded); runs only when you click a menu item
sidePanel Display mode (default since v1.28): summary results are shown in the browser side panel, only on tabs where you triggered a summary (per-tab content; the panel does not follow you to other tabs); you can switch back to the in-page dialog in Settings. The panel only renders results you explicitly requested; it reads nothing by itself
unlimitedStorage Keeps the local “Recent results” history and knowledge base from being capped by the browser’s default local-storage quota (the Extension itself has no size setting — only a 50,000-record safety limit). The data still lives only on your device — never synced or uploaded
host_permissions: <all_urls> Lets the Extension work on any site you’re reading, and lets the service worker fetch your configured AI endpoint and page-image CDNs (CORS bypass); since v1.49 it also lets the Extension download again the PDF you are viewing — or the PDF link you chose to open in the reader from the toolbar popup — from its source (the Extension’s background downloads it once and hands it to the reader — see “PDF summaries / translations” above); and it lets the Extension inject its content script into the new tab opened for a link you right-clicked or pointed at (that page is not the tab you were on when you clicked the menu or pressed the shortcut)
declarativeNetRequestWithHostAccess Used ONLY to strip the Origin header from requests the Extension itself sends to your own configured local AI endpoint (loopback such as Ollama / LM Studio). Local servers reject the browser-added Origin: chrome-extension://<id> with a CORS 403; removing it lets your own local model accept the request. The rule is scoped by initiatorDomains to THIS extension’s initiator only (never any web page), covers loopback automatically and LAN only after you explicitly opt in, and NEVER public endpoints — one modifyHeaders(remove Origin) rule per configured local endpoint origin (typically one, at most four - deduplicated across the main/summarize/translate/knowledge endpoints), and nothing else: it does not block, redirect, read ordinary web-page traffic, or read/modify cookies

The content script is injected on demand (since v1.37; zero resident scripts since v1.39): no code from this extension is resident on any web page — the manifest declares no content_scripts. The full script loads into the current tab only when you trigger a summary/translation (keyboard shortcut, context menu, or popup) — or, for a link you right-clicked or pointed at, into the new tab it opens; if the page swaps documents while that action is still running (for example you reload it), the same script is injected into the same tab once more so the action can finish or the side panel can re-attach to the page (no new task is started); and the first time compatibility mode shows a result inside the page, the Extension’s own bundled formatting library is injected into that same page. Content is extracted only when you explicitly trigger it, never read or uploaded without your explicit action. Two smaller injections exist. When you press the “hovered link” shortcut, a few lines of code run in every frame of the current tab only to read the address of the link under your mouse pointer (or the link that has keyboard focus) — no page content is read and nothing is stored. In a tab the Extension opened for a link, a small watcher runs from the moment the new page loads until 5 seconds after the action starts and reports only whether a navigation in that tab was started by the page itself or followed one of your clicks or key presses (a time difference — never which key or where you clicked), so that the action is re-run only when the page redirected itself.


Your rights & controls


Children’s privacy

The Extension is not designed for children under 13 and does not knowingly collect children’s data.


Policy changes

Material changes will be reflected on this page with an updated “Last updated” date. Please check back periodically.


Contact

For any privacy questions:


Source code

The Extension’s source code is not currently public. If it is open-sourced later, a link will be added here for review. If you have questions about how privacy is implemented, email us — we’re happy to explain the technical details.