What we found inside five AI chat sites while building a Chrome extension
We built a Chrome extension that reads five AI chat sites, and a redesign at any of them can break it. Bubbles, the main thing we build, don't read pages at all.
Updated Nov 3, 2026
The extension is LLM Context Bridge. It's free, and it moves a conversation from one AI chat site to another. There's no shared way to do that, so it does what you'd do by hand: it reads the messages off the page, opens a new tab, pastes them in, and presses send.
That only works if the code knows how each site builds its page, so the extension has turned into a small record of how these sites mark up a conversation. This is what's in the code today, and any of it could change tomorrow.
ChatGPT is the easy one
Every message carries an attribute, data-message-author-role, and its value tells you who's talking. One query and you're done. The whole function is about ten lines.
Claude takes more guessing
The extension looks for [data-testid="user-message"] and [data-testid="assistant-message"], then .font-claude-message, then broader patterns like [class*="HumanTurn"]. If none of those match, it takes all the text in main and calls it a conversation.
The input box is a ProseMirror editor, so setting a value doesn't do anything. The extension focuses it and uses document.execCommand('insertText'), which is deprecated and still the thing that works.
Gemini has its own HTML tags
Gemini is the nicest to read: <user-query> and <model-response> say exactly what they are. The send button list includes mattooltip="Send message", an attribute that comes from Angular Material.
It's also the only site where the extension always pastes from your clipboard, which replaces whatever you had copied. On the others it uses the clipboard only if pasting fails. The extension's privacy page says so too.
Perplexity doesn't say who said what
The first thing the code tries is broad: [class*="col-span"], [class*="MessageBlock"] and section, keeping any block with more than 20 characters. When that works, the transcript has no “User:” or “Assistant:” labels, so the next assistant has to work out who said what.
Grok has four strategies
Grok gets the most code. Strategy one looks for data-message-author-role, the same attribute ChatGPT uses, along with class names like UserMessage. Strategy two looks for query and response blocks. Strategy three walks the children of the conversation feed. Strategy four is labeled “Nuclear fallback” in a comment, and it takes all the visible text in the main content area.
How the handoff works
Once the text is out, the extension stores it in chrome.storage.local and opens the new site in a tab. That tab checks for a waiting conversation and ignores anything older than 30 seconds. Then it waits 2 seconds for the page's input box to render and pastes a short note, followed by the chat. The note begins:
This is the full conversation from another AI assistant. Please read and understand the complete context of everything we have been discussing.The chat sits between --- CONVERSATION START --- and --- CONVERSATION END --- markers, and the last line asks the assistant to briefly acknowledge that it's caught up. To send, it tries a list of button selectors, then falls back to pressing Enter. If pasting fails on most sites, it puts the text on your clipboard and shows a note telling you to paste.
How bubbles avoid this
This extension depends on five companies' HTML. That's the cost of reading pages nobody designed to be read by a tool, and it's fine for moving a chat. For context you want to keep, there's bubbles.
Bubbles: save context once, use it in ChatGPT, Claude, Gemini, Grok, Perplexity, Cursor and 20+ more AI tools. They go through MCP, so the AI app asks for your bubble and gets it, with no page reading involved. To try it, paste this line into whichever AI you use:
Connect my Sixteen Bridges account — follow https://sixteenbridges.com/llms.txtAnd if you switch between these sites, install the extension. It's free and there's no account.