The `bookmarks` permission explained: what browser extensions can really do with your saved links
Chrome's bookmarks permission hands extensions every saved URL, when you last opened each one, and a live feed of new saves. Here's how to check yours.

Your bookmarks are the only dataset in your browser you built on purpose. History is a byproduct — everything you touched, wrong turns included. Bookmarks are curated: the bank, the medical portal, the recipe blog you actually cook from, the job board you'd rather your employer didn't know about. One line at install time — "Read and change your bookmarks" — hands the whole map to an extension.
That line reads like one of the friendlier warnings. It isn't. This single permission covers reading every saved URL, knowing when you last clicked each one, watching you save new ones in real time, and quietly rewriting where your existing links point.
I've been working through Chrome's permission list one entry at a time — tabs, history, cookies, sessions, the rest. Bookmarks earns its own post because the gap between the warning string and the actual payload is one of the widest on the list.
It's not a fringe permission, either. In the Extenshi catalog's August 2026 snapshot of 362,889 live listings across Chrome, Firefox and Edge, 6,010 extensions (1.7%) declared bookmarks. A small share — but every one of them can read the most intentional record of your online life.
What the API actually hands an extension
The chrome.bookmarks reference splits into a read side, a write side, and a live event feed.
getTree() returns the entire hierarchy — every folder, every bookmark, every URL and title — in one call. getRecent(n) gives the most recently added entries. search(query) matches words against titles and URLs, so an extension can simply ask for "bank", "clinic" or "jobs" and get the answers.
Each node carries metadata, too. dateAdded says when you saved it. Since Chrome 114, dateLastUsed says when you last opened it — which turns a static list into a usage timeline. Which saved links you actually revisit, and when, is a habits profile most people never think about.
The write side is full CRUD: create(), update(), move(), remove(), and removeTree() — that last one deletes an entire folder recursively. Chrome protects the skeleton (the Bookmarks Bar and Other Bookmarks folders can't be renamed or removed, and the root node itself is off limits), but everything inside them is fair game.
update() is the one worth pausing on. Per the reference, it changes title and url — independently. Which means an extension can keep the title you recognize and swap the destination:
// manifest: "permissions": ["bookmarks"]
// the bookmark still reads "Bank — login"
await chrome.bookmarks.update("42", { url: "https://evil.example.com/login" });One call, no prompt, and the title you recognize stays exactly as it was. You click a bookmark you created three years ago and land somewhere else. Nothing in the warning string hints that "change" includes "redirect."
And the live feed — this is the part that surprises people. onCreated fires the instant you save a page, with the full node attached:
chrome.bookmarks.onCreated.addListener((id, bookmark) => {
if (bookmark.url) console.log(bookmark.title, bookmark.url);
});Four lines, and an extension watches everything you decide to keep, in real time, for as long as it's installed. onChanged, onMoved and onRemoved fill in the rest — a complete audit log of your curation.
Scale used to be a brake here; it isn't anymore. Chrome's old bookmark write-rate limits are deprecated, and the docs state flatly that "Bookmark write operations are no longer limited by Chrome." An extension that wants to spam a thousand affiliate shortcuts into your bar can.
The bookmarks permission warning undersells the payload
Chrome shows one line at install: "Read and change your bookmarks" — the string appears in Chrome's own permissions list and in the full permissions table Matt Frisbie documents in Building Browser Extensions, 2nd Edition (Apress, 2025), which also records Firefox's variant, "Read and modify bookmarks." Credit where due: unlike sessions, a permission Chrome never announces by name, this one at least gets a sentence.
But the sentence compresses a lot. It doesn't mention dateLastUsed, the live event feed, or that "change" covers rewriting a saved link's destination while keeping its title. It also doesn't mention reach. With Chrome sync on, your tree isn't local: bookmarks saved on your phone appear in the desktop tree — the API has a dedicated folderType value ("mobile") for them — and since the 2025 sync changes, each node carries a syncing flag telling an extension which of your bookmarks live in your Google account and which exist only on this machine.
One more thing the string never surfaces: admin-managed bookmarks. On a work machine, IT-pinned links arrive in a "managed" folder marked unmodifiable — writes to them fail, but reads don't. An extension holding this permission can enumerate your company's internal tool URLs. MDN's browser.bookmarks page describes the same tree model on the Firefox side, so none of this is a Chrome-only story.
Why bookmarks leak more than history
You'd think history is the sensitive one — it's bigger, after all. But bookmarks are different in three ways.
They're intentional. You saved them because they matter: the mortgage calculator, the fertility clinic, the divorce lawyer, the competitor's pricing page, the internal dashboard you open every morning. A curated list of your concerns is worth more than a month of noise.
They're durable. A bookmark from 2021 still sits in the tree. One getTree() call yields years of accumulated intent — including links with personal data baked into the URL: query strings with account IDs, pre-authenticated links, docs shared "to anyone with the link."
And they're boring enough to ignore. Nobody audits their bookmark utilities the way they'd audit an ad blocker. That's exactly the camouflage a malicious listing wants.
When Varonis Threat Labs dissected the Stanley malware-as-a-service toolkit in January 2026, the demo extension — "Notely" — posed as a note-taking and bookmarking app. According to Varonis, its working features gave cover for its permissions and a way to collect positive reviews before the phishing payload switched on. Google removed it within a week of Varonis reporting it; I covered the toolkit in the Stanley write-up.
The telling detail: the manifest Varonis published doesn't request bookmarks at all. It asks for tabs, scripting and every site, and the server endpoint that sent URL-hijacking instructions was named bookmarks-access. The bookmark theme was pure camouflage.
Who actually uses this — and what healthy looks like
The legitimate home for bookmarks is tools that work on the browser's own tree: sync services, de-duplicators, folder and tag organizers, bookmark search. In the same August 2026 snapshot, the stores' Bookmarks category held 5,596 extensions with roughly 1.1 million combined installs — mostly small utilities.
Three reference points. Apple's iCloud Bookmarks, with about 7 million Chrome users, declares bookmarks because keeping your Chrome tree in step with Safari is its whole job — your saved links end up in iCloud by design. Raindrop.io, a popular bookmark manager I compared in the web-clipper review, doesn't request bookmarks at all: it saves the page you're on into its own cloud and never touches the browser's tree. So even "bookmark manager" doesn't automatically justify the permission.
On the local-only end, the Bookmark Janitor I built in October's tutorial flattens, searches and de-dupes your tree entirely in popup memory — the finished sample is in the public Extenshi samples repo if you'd rather read the code first.
Which leads to the test I apply to every permission in this series: the mismatch question. Does this extension's actual job require your saved links?
- A tool that syncs, cleans or reorganizes the bookmarks stored in your browser — yes, obviously.
- A coupon finder, screenshot tool, or session manager that keeps its own lists — no. Your bookmark tree has nothing to do with its stated purpose.
- Anything pairing
bookmarkswith broad<all_urls>host access — now it can watch what you save and read the page contents. That combination deserves a real reason.
Plus the flag from earlier in this series: an abandoned extension holding this permission is a future liability — no updates means no response when the developer account gets sold or compromised.
How to check your extensions
- Find who has it. Open
chrome://extensionsand click Details on each extension. Unlikesessions, this one does surface as a warning line — "Read and change your bookmarks" — so holders are visible without leaving the page. In the catalog,bookmarksappears in each listing's permission breakdown. - Ask the mismatch question for every holder: is managing saved links part of what this thing does? If the answer is no and the developer can't explain why, remove it.
- Audit the whole set at once. For the extensions you installed from a store,
npx @extenshi/guard scanchecks them against the catalog and flags the ones worth a second look — free account needed, Guard docs here. - Vetting a new one before installing? Paste its store link into the checker and read the permission breakdown first: Check an extension →. Shopping for a bookmark manager? Browse what's in the catalog and compare permissions side by side.
The bookmarks permission isn't evil — it's the reason your favorite save-for-later tool works. But it's also the most curated picture of your online life that your browser holds, wrapped in a warning string that makes it sound like a filing cabinet. Now you know it's more than that.
Sources
- chrome.bookmarks API reference — Chrome for Developers (Google)
- Permissions list — Chrome for Developers (Google), for the per-permission warning text
- Bookmarks sync changes — Chrome for Developers (Google), for the
folderType/syncingsplit - browser.bookmarks — MDN Web Docs (Mozilla)
- Stanley — A $6,000 Russian Malware Toolkit with Chrome Web Store Guarantee — Varonis Threat Labs
- Raindrop.io extension docs — Raindrop
- Bookmark Janitor sample — Extenshi public samples repo (MIT)
Further reading
📚 Building Browser Extensions, 2nd Edition by Matt Frisbie — Amazon | Apress. Chapter 10 contains the full permissions list with the per-permission warning messages quoted above.
This article is based on publicly available security research and news reporting. Extenshi does not independently verify all claims made by third-party researchers. References to specific companies or products reflect the findings of cited sources and do not constitute accusations of intentional wrongdoing. If you believe any information is inaccurate, please contact us at [email protected].
Related Articles

The `history` permission explained: what an extension can dig out of your past
The history permission lets a browser extension read every site you visited — even before you installed it. Here's what it exposes and how to check yours.

The `sessions` permission explained: what browser extensions can see after you close a tab
Chrome shows no warning for the sessions permission alone. Here's what extensions can really see in your recently closed tabs — and how to check yours.

chrome.bookmarks in browser extensions: search and de-duplicate the user's bookmark tree
Build an MV3 popup with the Chrome bookmarks API: flatten the whole bookmark tree, search it live as you type, and de-duplicate URLs behind a safe preview step.

Web clipper extensions reviewed: Evernote, Notion, Raindrop & Obsidian permissions compared
I compared four web clipper extensions on permissions and data flow. Which read every page you visit, which stay local, and which one I'd actually trust.