Codextend is a Chrome extension that augments the OpenAI Codex cloud UI. It is built with the Plasmo browser extension framework and uses React, TypeScript, and Tailwind CSS for the popup interface.
- Node.js 18 or newer (Plasmo targets the active LTS release).
- npm 9+ (bundled with Node 18).
npm installnpm run devThe command above runs the Plasmo dev server, generates assets, and watches for file changes. When it is ready, load the unpacked extension from build/chrome-mv3-dev in Chrome.
npm run dev– start the Plasmo development server.npm run build– produce a production bundle inbuild/.npm run zip– package the production bundle for store submission.npm run lint– lintsrc/**/*.ts?(x)andtests/**/*.tswith ESLint and the project TypeScript config.npm run test– execute the Vitest suite (matcher logic, DOM helpers, selectors, and archive flows).npm run typecheck– runtsc --noEmitfor an additional type-safety pass.
src/config.tscentralizes runtime constants such as Nerch keyword defaults, retry counts, and scan limits.src/lib/selectors.tsdefines the selectors map (SELECTORS) and helper utilities for navigating task rows and menus.src/lib/dom.tsexposes DOM utilities (query helpers, waiters, click + scroll helpers) that power automation flows.src/lib/archive.tsorchestrates scanning, archiving, retry logic, and confirmation polling.src/ui/Panel.tsxtogether withsrc/ui/panelStore.tsrenders the sidebar UI, tracks panel state, and surfaces the confirmation dialog.tests/contains Vitest specs for archive workflows, selector utilities, DOM helpers, and keyword matching.
npm run devand load the unpacked extension frombuild/chrome-mv3-dev.- Navigate to the Codex task list (ChatGPT) and open the Codextend panel.
- Verify Nerch-related conversations are detected (highlighted/listed) using the default keyword from
src/config.ts. - Trigger the archive action on a Nerch thread:
- Confirm the confirmation dialog appears the first time, that focus moves to the confirm button, and the dialog blocks automation until acknowledged.
- Accept the dialog and ensure the task archives successfully.
- Trigger another archive and confirm the dialog stays hidden once acknowledgment is persisted (stored via
panelStore).
- Toggle between different task rows and ensure selectors (menu buttons, archive action) continue to function.
Run the following commands locally and ensure they succeed:
npm run lintnpm run testnpm run build
These commands are expected to pass in CI as well; running them locally prevents regressions and avoids churn in review.
The extension highlights conversations that match a configurable set of keywords defined in src/config.ts. By default the list contains the single term "nerch", but you can add or remove terms at runtime by updating the stored settings:
import { loadMatchSettings, saveMatchSettings } from "./src/lib/storage"
const settings = await loadMatchSettings()
settings.keywords = [...settings.keywords, "my new keyword"]
await saveMatchSettings(settings)Keywords are normalized (trimmed, deduplicated, and lower-cased) before persisting so tests (npm run test) and runtime behavior remain aligned.
The extension requests the following Chrome permissions:
activeTabscriptingstorage
It also declares host permissions for both https://chatgpt.com/* and https://chat.openai.com/* to interact with ChatGPT experiences across domains.