Folders, bookmarks and full-text search for ChatGPT and Claude conversations. No account, no server, no sync. Everything stays in the browser.
Version 1.0.0 · Manifest V3 · no build step, no dependencies
Both ChatGPT and Claude let you search conversation titles. Neither lets you search what was actually said. Once you have a few hundred conversations, the thing you remember discussing is effectively gone.
The existing extensions in this category mostly require a vendor account before anything works, which means handing a third party a copy of your conversation history. Shelf reads your history in your own browser and writes the index to your own machine. There is nowhere for it to send anything, because there is no server.
chrome://extensionshttps://chatgpt.com or https://claude.aiFirst run reads your conversation list, then fetches message bodies in the background at 3 at a time with a 140ms gap, so it never floods the host app.
Keyboard
Ctrl+Shift+F — focus searchCtrl+Shift+K — show or hide the panelmanifest.json
src/
lib/
util.js shared helpers, the global Shelf namespace, concurrency pool
store.js folders, assignments, bookmarks, settings, licence
(chrome.storage.local)
idb.js the searchable copy of conversations (IndexedDB)
search.js tokenizer, scoring, snippet extraction with highlight ranges
content/
adapters/
base.js the interface every platform implements
chatgpt.js ChatGPT
claude.js Claude
panel.js the injected UI
panel.css scoped styles, light and dark
boot.js picks the adapter, mounts once, survives SPA navigation
background/
service-worker.js licence verification, opening pages
popup/ toolbar popup
options/ settings, licence, backup and restore
icons/
Content scripts load in order and share one global (window.Shelf), so there is
no bundler and no build step. That keeps the Chrome Web Store review simple and
means the source you ship is the source you wrote.
The panel is its own element, not a graft onto the host sidebar. Most extensions in this category inject into ChatGPT’s or Claude’s own navigation, which is why they break on every redesign and why two of them installed together fight each other. Shelf renders into a container the host app does not own.
Storage is split, and the index lives in the extension’s own origin. Folder
structure is small and goes in chrome.storage.local. Conversation text is large
and goes in IndexedDB, owned by the service worker.
That second part matters more than it looks. IndexedDB is scoped per origin, so an index opened from the content script would be one database on chatgpt.com and a different one on claude.ai, with neither able to see the other. Cross-platform folders and cross-platform search would silently not work. The worker owns one database for the whole extension instead, and search runs there too so thousands of conversation bodies never cross the message channel.
Each adapter calls the same endpoints the web app itself calls, from the page’s own origin, using the session the user is already signed into. No credentials are read, stored or transmitted, and nothing is proxied through a server.
These are internal endpoints, not a documented public API. They will change. Each adapter is written to return “unavailable” rather than throw, so a change breaks one platform’s indexing rather than the whole extension. This is the main maintenance burden of this product. Budget for it.
| Free | Pro | |
|---|---|---|
| Products | 1 of 3 | ChatGPT, Claude and Gemini together |
| Folders and subfolders | 2 | unlimited |
| Pinned conversations | 3 | unlimited |
| Search results | top 3 | all |
| Full-text search | yes | yes |
| Accent colour, sort order | no | yes |
| Backup and restore | no | yes |
Pro is 7 USD per month or 49.99 USD once.
The product cap is the lever that matters. Someone who uses only ChatGPT gets a complete, unlimited-search tool for nothing and has little reason to pay, which is fine: they were never going to. Someone who uses two or three hits the wall at exactly the moment the extra value is obvious, and the wall offers a way through rather than just stopping them.
Full-text search is deliberately never limited: it is the reason anyone installs this, and the loudest complaint about the incumbent in this category is that nothing works before you pay. Nobody meets a wall on install either, since the first product opened claims the free slot silently.
Shelf: Folders & Search for ChatGPT and Claude because that is where the
search traffic is.src/background/service-worker.js:
GUMROAD_PRODUCT_IDCHECKOUT_URL
Until you do, activation returns a clear message instead of failing silently.PRIVACY.md) and put the URL in the store
listing. It is required for the permissions this extension asks for.storage, unlimitedStorage — the folder structure and the local indextabs — to reach an open ChatGPT or Claude tab from the popup and shortcutnode tests/test-search.js # search: 17 cases
node tests/test-store.js # folders, tree, limits, backup: 32 cases
node tests/test-xss.js # escaping: 10 cases
node tests/test-index-client.js # worker messaging: 14 cases
The escaping tests matter most. Conversation titles are untrusted input rendered
into HTML strings, so esc() and markup() are the security boundary.
nottingostore@gmail.com