Capture prompts and file attachments from one AI platform and replay them on any other - in one click.
Chrome extension link: Prompt Porter
When you're comparing AI models, you constantly retype the same prompt and re-attach the same files. Prompt Porter eliminates that. It intercepts your prompt text and file attachments, stores them as a bundle, and lets you inject that bundle into any supported platform with one click - or open multiple platforms simultaneously for side-by-side comparison.
- Capture - snapshot your prompt text and attached files from any supported LLM page
- Inject - replay a bundle into a different platform, populating the text field and re-attaching files automatically
- Compare mode - open 2-4 platforms in parallel tabs and inject the same bundle into all of them at once, with optional auto-send
- Keyboard shortcuts -
Ctrl+Shift+S/⌘+Shift+Sto capture,Ctrl+Shift+V/⌘+Shift+Vto inject the latest bundle - Local storage only - bundles are stored in your browser (IndexedDB +
chrome.storage.local); nothing is sent to any server - Auto-expiry - bundles older than 7 days are pruned automatically; max 20 bundles kept at a time
| Platform | Capture | Inject text | Inject files |
|---|---|---|---|
ChatGPT (chatgpt.com) |
✅ | ✅ | ✅ |
Claude (claude.ai) |
✅ | ✅ | ✅ |
Gemini (gemini.google.com) |
✅ | ✅ | ✅ ¹ |
Grok (grok.com) |
✅ | ✅ | ✅ |
¹ Gemini requires an extra click due to browser security restrictions on file pickers without direct user interaction. After clicking Inject in the popup, a green Inject Bundle button appears on the Gemini page - click it to complete the injection.
Search for Prompt Porter on the Chrome Web Store and click Add to Chrome.
- Clone or download this repository.
- Open Chrome and go to
chrome://extensions. - Enable Developer mode (toggle in the top-right corner).
- Click Load unpacked and select the repository folder.
- The Prompt Porter icon will appear in your toolbar.
- Open any supported AI platform and type your prompt. Attach files if needed.
- Click the Prompt Porter toolbar icon.
- Optionally enter a label for the bundle.
- Click Capture (or press
Ctrl+Shift+S/⌘+Shift+S). The bundle is saved locally. A badge briefly confirms the capture.
- Navigate to your target AI platform.
- Open the Prompt Porter popup and select a bundle from the list.
- Click Inject Here. The prompt text and files are automatically inserted into the platform's input area.
- Select a bundle from the list.
- In the Compare section, check the platforms you want to open.
- Optionally enable Auto-send to submit the prompt automatically after injection.
- Click Compare. Prompt Porter opens a new tab for each selected platform and injects the bundle into all of them.
prompt-porter/
├── manifest.json # Extension manifest (MV3)
├── background.js # Service worker: storage, routing, keyboard shortcuts
├── content.js # Content script (isolated world): capture, relay
├── injector.js # Main-world script: React/Angular-aware text & file injection
├── adapters.js # Per-platform DOM selectors (used during inject)
├── popup.html # Extension popup UI
├── popup.js # Popup logic: bundle list, capture, inject, compare
└── icons/
├── icon16.png
├── icon48.png
└── icon128.png
Prompt Porter requests only the permissions it needs:
| Permission | Why |
|---|---|
storage |
Saves bundle metadata to chrome.storage.local |
tabs |
Opens new tabs for compare mode; queries the active tab |
activeTab |
Sends messages to the current tab's content script |
| Host permissions for the 4 supported sites | Runs the content script and injects bundles |
No network requests are made. No data leaves your browser.
All captured data - prompt text and file contents - is stored locally in your browser only. See PRIVACY.md for the full privacy policy.
Pull requests are welcome. For significant changes, please open an issue first to discuss what you'd like to change.
When adding a new platform:
- Add its hostname to
manifest.json(content_scriptsmatches andhost_permissions). - Add an adapter entry in
adapters.jswithgetTextarea,getFileInput,getFileDropZone,injectText, andinjectFiles. - Add a matching entry in the
ADAPTERSobject incontent.jswithgetTextarea. - Add platform-specific injection logic in
injector.jsif needed (React fiber walking, shadow DOM, etc.).
MIT.
Built by Akash Tamate

