This is a Plasmo extension project bootstrapped with plasmo init.
First, run the development server:
pnpm dev
# or
npm run dev- Components are now named in kebab-case for file paths (example:
components/bookmark-list.tsx). - Shared platform types live in
types/platform.tsto avoid duplication acrossplatform/andutils/.
- Non-trivial functions now include short doc comments that describe the intent and the why, not just the how.
- Event-suppression code in content UIs is documented to avoid accidental regressions with host app shortcuts.
The repo now includes a minimal Vitest + jsdom scaffold so you can add unit/UI tests without changing runtime behavior.
Scripts:
npm run test
npm run test:watchNotes:
- Tests live under
tests/and target utilities and DOM-driven navigation behavior. - This scaffold is intentionally light to keep extension bundling untouched.
- If you haven’t installed dependencies yet, run
npm installfirst (orpnpm install).
Open your browser and load the appropriate development build. For example, if you are developing for the chrome browser, using manifest v3, use: `build/chrome-mv3-dev`.
You can start editing the popup by modifying `popup.tsx`. It should auto-update as you make changes. To add an options page, simply add a `options.tsx` file to the root of the project, with a react component default exported. Likewise to add a content page, add a `content.ts` file to the root of the project, importing some module and do some logic, then reload the extension on your browser.
For further guidance, [visit our Documentation](https://docs.plasmo.com/)
## Making production build
Run the following:
```bash
pnpm build
# or
npm run build
This should create a production bundle for your extension, ready to be zipped and published to the stores.
The easiest way to deploy your Plasmo extension is to use the built-in bpp GitHub action. Prior to using this action however, make sure to build your extension and upload the first version to the store to establish the basic credentials. Then, simply follow this setup instruction and you should be on your way for automated submission!
A lightweight browser extension that lets you bookmark individual responses inside modern LLM chat apps and quickly navigate back to them later.
Built with Plasmo, this extension injects UI elements directly into supported LLM interfaces so bookmarks feel native and unobtrusive.
This repository contains the source code for a Plasmo-based browser extension that:
- Adds bookmark buttons directly into LLM chat UIs
- Stores references to specific responses
- Provides a sidebar for searching and managing bookmarks
- Enables fast navigation back to bookmarked responses
The goal is to make long-running LLM conversations easier to manage without changing existing workflows.
Fully supported:
- ChatGPT (chatgpt.com, chat.openai.com)
Partially supported or planned:
- Claude
Bookmarks from different platforms are stored together and can be filterable by source. Navigation back to a specific response is currently implemented for ChatGPT only. Support for other platforms will be added once stable DOM anchors are available.
At a high level:
- The extension injects small UI controls into LLM interfaces using content scripts.
- When a response is bookmarked, only lightweight references are stored:
- Platform
- Conversation ID
- Message or turn ID
- Short title preview
- No response content or conversation text is stored.
- A sidebar overlay allows users to:
- View all bookmarks
- Filter by platform
- Search by title
- Navigate back to the original response
All storage is local to the browser.
This extension is designed to be:
-
Fast
No background polling, no heavy observers, and no network requests. -
Native-feeling
UI elements are injected directly into existing toolbars and panels so they visually match the host application. -
Non-intrusive
The extension does not interfere with existing LLM functionality. -
Lightweight
Storage operations are minimal and scale well even with many bookmarks.
- The extension does not store message content.
- Only identifiers and minimal metadata are saved.
- No data is sent to external servers.
- All data remains local to the browser profile.
This makes the extension safe to use even for sensitive conversations.
High-level overview of the codebase:
-
contents/
Content scripts that inject UI into supported LLM platforms. -
components/
Shared React components such as the bookmark list and sidebar. -
utils/
Navigation helpers and platform-specific logic. -
types/
Shared TypeScript types for bookmarks and metadata.
Start the development server:
pnpm dev
# or
npm run dev