Keep long ChatGPT conversations responsive without replacing the native UI.
中文说明 | Architecture Notes | 架构说明 | Controlled Chrome Cookbook | 受控 Chrome Cookbook
ChatGPT TurboRender is a Chromium-first browser extension that reduces UI jank in very long ChatGPT threads by trimming cold history before first render, preserving a hot interaction window, and restoring old turns on demand.
If this project saves your browser from melting down, star the repo and share a trace or screenshot. Real-world long-thread cases are the fastest way to make the extension better.
If it also saves you time, see the Support section below.
Long ChatGPT sessions eventually push the browser into a bad state:
- too many DOM nodes stay live
- streamed responses keep touching an already huge tree
- scrolling gets sticky
- input latency rises
- memory and CPU keep climbing
TurboRender focuses on the rendering bottleneck instead of changing your workflow. It keeps the latest turns interactive, trims or folds older finalized turns into lightweight history blocks, and restores them only when you actually need them.
- Preserves the native ChatGPT UI instead of forcing a custom reader mode
- Runs on supported ChatGPT conversation routes (
/c/<id>and/share/<id>) onchatgpt.comandchat.openai.com - Keeps the latest 5 interaction pairs live and folds older history inline in the original transcript order
- Auto-activates only when thresholds are reached (finalized turns, live DOM descendants, or frame-spike count)
- Trims the initial
/backend-api/conversation/:idpayload in page context and also reads share-page loader data - Parks cold message groups and replaces them with compact inline batch cards
- Popup acts as a status/control panel only on supported ChatGPT conversation pages; when a supported page temporarily loses its runtime, it can show a recovery state for that same page
- Keeps a sticky
Expand / Collapsecontrol on the right side of long opened batches - Supports English and Simplified Chinese, with auto-follow plus manual override
- Falls back to a safer soft-fold mode if the host page re-renders aggressively
- Stores settings locally only and does not send conversation data to any external service
- Browser target: Chrome and Edge first
- Runtime model: Manifest V3
- Storage model: local only
- Network model: page-layer interception of the initial conversation payload in the main world, no backend, no cloud sync
- Current E2E note: Playwright extension tests are included, but launching a persistent Chromium extension context can still be environment-sensitive in headless sandboxes
TurboRender keeps the newest 5 interaction pairs visible in the native ChatGPT transcript.
- Older history stays inline, above the hot window, as collapsible batch cards
- Each batch holds 5 interaction pairs in the original order
- Expanding a parked batch restores the original host DOM when available
- Expanding an initial-trim batch shows a read-only near-native renderer in the same position
- Long expanded batches keep a sticky
Expand / Collapseaction rail on the right so you can fold them back quickly
pnpm install
pnpm buildUse pnpm build for Chrome, pnpm build:edge for Edge, and pnpm build:firefox for Firefox if you want unpacked local builds. Load .output/chrome-mv3, .output/edge-mv3, or .output/firefox-mv2 to sideload those local builds. Use pnpm package:chrome, pnpm package:edge, and pnpm package:firefox if you want GitHub Release archives (.zip for Chrome/Edge, signed .xpi for Firefox).
Useful commands:
pnpm dev
pnpm test
pnpm test:all
pnpm package:chrome
pnpm package:edge
pnpm package:firefoxGitHub Actions builds Chrome and Edge .zip archives plus a signed Firefox .xpi from tagged releases in .github/workflows/browser-packages.yml and publishes them to GitHub Releases.
See docs/browser-packages.md for the tag trigger, release asset names, required signing secrets, and manual install steps.
Store publishing automation is documented separately in docs/store-publishing.md.
To debug the unpacked extension with chrome-devtools MCP, use the repo-managed browser instead of loading the extension manually inside the MCP browser:
pnpm debug:mcp-chrome -- https://chatgpt.com/share/69c62773-7b4c-83e8-b441-48520275c284This launches a dedicated Chromium-based browser on http://127.0.0.1:9222 with .output/chrome-mv3 preloaded. The launcher prefers the repo-managed Playwright browser (Google Chrome for Testing) or a local Chromium build, because stable Google Chrome no longer honors --load-extension for unpacked extensions. After launching it, restart Codex in this repo so the project-level [.codex/config.toml](./.codex/config.toml) can point chrome-devtools MCP at that browser.
entrypoints/: WXT entrypoints for background, content script, popup, options, and harness pageslib/content/: ChatGPT page adapter, parking engine, visibility logic, and in-page status UIlib/background/: background-side runtime message handling and state orchestrationlib/shared/: settings, types, message contracts, and chat-id helperslib/testing/: local transcript fixture used by harness and teststests/: unit, integration, and extension-level Playwright coveragedocs/: design rationale and deeper implementation notes
- Solve rendering pressure first
- Preserve the native interaction model
- Keep the extension transparent and reversible
- Prefer local-only state and minimal permissions
- Fail safe when the host DOM changes
TurboRender does not send conversation data to any external service.
- no cloud sync
- no analytics pipeline
- no off-device transcript upload
- no persisted full transcript snapshots in v1
- More resilient ChatGPT DOM adapters
- Better per-chat diagnostics in the popup
- Firefox support with a background-runtime swap
- Store-ready assets, screenshots, and publishing metadata
- Larger real-world performance benchmark corpus
Issues and PRs are welcome, especially if you can provide:
- a reproducible long-thread slowdown case
- a DOM snapshot or screen recording after a ChatGPT UI change
- a performance profile comparing extension on vs. off
The popup is a status/control panel for supported ChatGPT conversation pages only.
- Supported routes:
https://chatgpt.com/c/<id>,https://chatgpt.com/share/<id>,https://chat.openai.com/c/<id>,https://chat.openai.com/share/<id> - Unsupported ChatGPT pages show an explicit unsupported state and a link to the supported URL rules
- When the active tab is a supported ChatGPT conversation page but its runtime is temporarily unavailable, the popup can show a recovery state for that page
- The demo button opens a stable share page: https://chatgpt.com/share/69cb7947-c818-83e8-9851-1361e4480e08
- The help button opens this section
If TurboRender saves you time, you can support ongoing maintenance and compatibility updates.
| WeChat sponsor code | Alipay sponsor code |
|---|---|
![]() |
![]() |
Support helps cover maintenance, long-thread testing, and ChatGPT compatibility updates.

