Chrome Extension + Inbox: Capture Prompts Where You Work
Your best prompts happen inside ChatGPT, Claude, Gemini and the other tools you already use - not in a separate app you have to remember to open. The Prompt2Love Chrome extension captures the prompts you type and the outputs you get right on the page, sends them to a server-side Inbox, and lets you review and file them into your library when it suits you. It signs in with a per-workspace API key, not your browser session, and a bright badge on the toolbar icon tells you how many captures are waiting.
Save Your Own Prompt from Any AI Tool
A content script injects a heart-icon save button right next to each tool's submit button on ChatGPT, Claude, Gemini, Perplexity, Copilot and Mistral. It reads your input text directly from the field, whether that is a plain textarea or a rich contenteditable editor. By default a click opens an edit modal that shows 'Quelle: [ToolName]' so you can adjust the prompt before saving; turn on 'quickSave' and it saves instantly without the modal. The prompt lands in your Inbox tagged with the auto-detected tool name as its source, and optionally the page URL.
- Works on ChatGPT (chatgpt.com, chat.openai.com), Claude (claude.ai), Gemini (gemini.google.com), Perplexity, Copilot (copilot.microsoft.com) and Mistral (chat.mistral.ai)
- Reads both plain textarea and contenteditable input
- Edit modal by default; 'quickSave' setting saves instantly without it
- Source captured as sourceTool (detected tool name) plus sourceUrl when 'sendSourceUrl' is enabled
- Auto-titles from the first 60 characters if you give no title; body up to 50,000 characters
- Lands in your Inbox with status 'inbox'
Selection-Based Capture
The content script watches your selections everywhere on the page. When you highlight between 50 and 50,000 characters and the selection settles (a 200ms debounce keeps it calm), a floating action button appears at the midpoint of your selection. It gives you two choices: 'Als Prompt speichern' opens the save-prompt modal to capture the text as a new Inbox prompt, and 'Als Output speichern' opens a picker to attach the highlighted text to an existing prompt as a result. The button stays inside the viewport and disappears as soon as you clear the selection.
- Selection must be between 50 and 50,000 characters
- 200ms debounce; button appears at the selection midpoint, clamped to the viewport, auto-hides when the selection clears
- 'Als Prompt speichern' creates a new Inbox prompt
- 'Als Output speichern' attaches the text to an existing prompt
Output Capture via Paste Detection
When you copy a prompt from your library, the background worker quietly records a SHA256 fingerprint of it together with the prompt's id - it never stores the full text. Later, when you paste text of at least 16 characters into an AI tool, the script fingerprints what you pasted and, on a match, starts watching for the AI's reply via that site's adapter. The moment the response finishes, an 'output detected' toast with a save button appears (it auto-dismisses after 12 seconds); one click saves the reply back to that same prompt as a text output with a model hint. This closes the prompt-to-output testing loop. Pastes that don't match fail silently, and because output capture relies on a per-site adapter, it may not work on every tool or mode.
- Triggers on pastes of 16 or more characters; matches via SHA256 fingerprint, never full-text storage
- Recent copies kept in session storage: up to 10 entries with a time-to-live expiry
- The paste path always saves as outputType 'text'; the toast auto-dismisses after 12 seconds
- Relies on a per-site adapter's onResponseComplete - may not work on all tools or modes
Save as Output with File Upload
Choosing 'Als Output speichern' opens a modal that loads up to 20 of your recent prompts, which you can search through. You pick the output type - Text (the default), Image, or Video - and for images and videos the file is uploaded straight to storage through a presigned S3 PUT URL. You can also add an optional model name like 'GPT-4o' or 'Claude 3.5' to record exactly what produced the result. Clicking a prompt in the list saves the output to it.
- Output types in the modal: text, image, video
- Images: JPEG, PNG, WebP or GIF (no SVG), up to 6MB; videos: MP4, WebM or QuickTime, up to 50MB
- Uploads go via a presigned S3 PUT URL (valid 600 seconds) and are confirmed on a successful upload
- Optional model name field; the prompt list is searchable and shows your 20 most recent prompts
The Inbox: Review and File
The Inbox lives in your web dashboard, not inside the extension itself, and lists your captured prompts newest first, refreshing every 30 seconds. Each card shows the title (or the first 60 characters), a body preview, any detected variables as {{name}} badges, a source-tool emoji, a clickable source URL, and a timestamp. Per card you choose 'Einordnen' to file it or 'Verwerfen' to discard it; checkboxes let you bulk-discard several at once. When you file, you can optionally pick a category from the full category tree (with an 'Ohne Kategorie (All)' option); the system checks your tier limit, creates a new prompt in your library, marks the Inbox item as filed, and remembers which prompt it became.
- Lives in the web dashboard, not the extension; refetches every 30 seconds
- Two statuses: 'inbox' (default) and 'filed'
- Card shows title, a 3-line body preview, variable badges, a source-tool emoji (ChatGPT/Claude/Gemini/Perplexity/Midjourney/unknown), source URL and a DD.MM HH:MM timestamp
- Actions: 'Einordnen' (file, optional category) or 'Verwerfen' (discard); bulk select and delete
- Filing creates a library prompt after a tier-limit check, sets status to 'filed' and stores which prompt it became
Inbox Badge on the Extension Icon
The background worker keeps the toolbar icon's badge in sync with your Inbox count, so you always know at a glance how many items need attention without opening anything. It refreshes the count immediately after every action that changes the Inbox - saving, filing, or discarding a prompt - and also periodically on a timer. When the Inbox is empty, the badge clears.
- Badge color #CCFF00 (lime); empty when the count is 0
- Count comes from the inbox count endpoint
- Refreshes after every save, file or discard, and on a periodic alarm (about every 15 minutes)
Secure API-Key Authentication
You generate a key in the web app, scoped to a specific workspace. The server shows you the raw key exactly once - it has the format p2l_ followed by 32 bytes of hex (64 characters total) - and stores only a SHA256 hash of it plus the last four characters, so the full key never sits in the database. The extension keeps the key in chrome.storage.local and sends it as an Authorization: Bearer header on every call; the server hashes and looks it up to resolve your account and workspace. Every extension route accepts either this key or a normal session cookie, so the same endpoints work from the browser too. You can revoke a key at any time, its last-used time is tracked, and every call is logged for analytics.
- Key format: p2l_ plus 32 bytes of hex (64 characters); only the SHA256 hash and last four characters are stored
- Stored extension-side in chrome.storage.local, sent as an Authorization: Bearer header
- Dual auth: every extension route accepts either the Bearer key or a session cookie
- Keys are workspace-scoped and revocable; last-used time is tracked and every call is logged for analytics
- Your tier limits are enforced per user