Sebastian Tirelli
2025-10-20 5 min read Reliability ← All writing

The Chrome extension 60,000 people use to keep ChatGPT fast

I built ChatGPT LightSession to fix a slowdown in my own long threads. Sixty thousand people have installed it since, and the number keeps climbing. The extension trims the conversation JSON on the way in, keeping long sessions responsive without touching a server.

A thirty-message ChatGPT thread opens instantly. A three-thousand-message thread, with months of edits, regenerations, and exploratory branches, takes several seconds to become interactive and stutters when you try to scroll. I hit that wall in my own threads and wrote a small Chrome extension to make it stop. Sixty thousand people have installed it since.

What is actually happening on the page

When you open a conversation, the client sends a GET to /backend-api/conversation/<id> and receives a JSON object with a mapping field. The mapping contains every node the conversation has ever had: every message, every branch, every deleted reply that is still reachable. For a short thread with no branching, that is a compact payload. For a thread accumulated over months, the mapping can be several megabytes.

The client then hands the whole object to the renderer. React and TanStack Query do not virtualize the transcript; nodes along the active path are rendered as soon as they are resolved. Memory allocation spikes. The input box, which listens on the same event loop as the render pipeline, waits.

The fastest way to see this is to open DevTools on your own longest thread and look at the Network response for the conversation fetch. If it is several megabytes, no amount of tab hygiene is going to make it fast.

What the extension does

ChatGPT LightSession is a Manifest V3 extension. It does one thing: it wraps the page’s fetch, and when the response is a JSON object that looks like a conversation ({ mapping, current_node }), it rebuilds the mapping to contain only the last N nodes along the active path from the current node back toward root. Everything outside that window is dropped before the renderer sees it.

The rebuilt structure is still a valid mapping. Each kept node has at most one child, which is the next kept node. The first kept node’s parent is null. current_node stays pointing at the original leaf. The response metadata (url, type, headers, status) is preserved so nothing downstream notices a reshaped body. If the JSON does not have the shape of a conversation, or if the mapping rebuild would produce anything inconsistent, the extension passes the response through untouched.

A small toast in the corner reports what happened on each load, for example LightSession: kept 10/142 node(s) (limit 10). removed 132 (~93%). A popup lets you set N, toggle inclusion of tool and system messages, and turn the extension off per-session.

OpenAI ships the full history because the client’s editor needs to walk the branch tree. LightSession is a bet that most users, most of the time, only want the active branch. For that common case, the mapping the page actually needs is a single chain; trimming to it is lossless for the rendered conversation and removes the thing that made the page slow. The extension never talks to any server, never reads message content for anything except re-chaining node ids, and never persists any conversation data. The only storage it uses is a chrome.storage blob holding your preferences.

What I learned shipping it

Three things, in order of how much they surprised me.

Fixing a slow product you do not own is underrated leverage. Users do not care whose code path is slow. They care that their screen is slow. When you can produce the fix as a small, drop-in patch, they will install it with very little friction. The extension crossed sixty thousand active users without paid promotion.

The surface area you do not control is a permanent tax. ChatGPT has rewritten its front-end twice in the extension’s lifetime. Each rewrite was a potential regression, and twice it was one. The fix shape has always been small, but the vigilance is ongoing. Shipping a reliability patch on someone else’s product is a contract of humility: you are useful exactly as long as you keep watching.

MV3 constraints force clarity. Service workers, chrome.scripting, and strict CSP mean you cannot be clever. The extension lives in three files: a background worker that coordinates injection, a content-loader that asks for the injection, and a page agent that wraps fetch. Each one does one thing. That compression was not by choice; MV3 does not let you spread logic around. It turned out to be a discipline worth keeping.

Install

The extension is free and stays free: ChatGPT LightSession on the Chrome Web Store.

It is actively maintained. Compatibility rewrites have been published within days of every front-end change OpenAI has shipped so far; the install count is still climbing.