Queue follow-up messages while your AI chat is generating, then send them automatically in order when it’s ready.
⭐ Find this useful? Star the repo to help more ChatGPT users discover the queue :)
ChatGPT normally accepts one message while a response is generating. This extension adds a Queue button and keyboard shortcuts: ⌘ + Shift + Enter on macOS, or Ctrl + Shift + Enter in general, so you can stage any follow-up draft, even while a turn is still active (for example during a tool approval). It displays the pending messages beside the composer and sends them one at a time as each response finishes.
The store listing will be linked here after the first public release.
You need Node.js and pnpm. Use the Node.js version in .nvmrc and pnpm 10.
git clone https://github.com/technway/ai-chat-queue.git
cd ai-chat-queue
pnpm install
pnpm buildOpen chrome://extensions, enable Developer mode, choose Load unpacked, and select .output/chrome-mv3.
- Open ChatGPT and start a conversation.
- Type a message, then use the Queue button or press ⌘ + Shift + Enter on macOS, or Ctrl + Shift + Enter on Windows and Linux. Normal Enter keeps ChatGPT's native behavior untouched.
- Your message waits in the queue, then sends automatically when ChatGPT is ready.
Note
The queue currently supports text messages. Images and files are not queued yet.
- Queueing is always explicit: use the Queue button, ⌘ + Shift + Enter on macOS, or Ctrl + Shift + Enter on Windows and Linux. It never depends on the send-button or generation state, so it works while ChatGPT is idle, generating, unavailable, or waiting for a tool approval.
- Normal Enter is left completely native: ChatGPT decides what to do with it, including its own "Follow up" behavior.
- The queue drainer watches generation state. When a turn truly finishes, the next message is placed in the composer and submitted automatically. Messages are never sent merely because the send button happens to be enabled mid-turn.
- Pending messages can be moved up or down before they are sent.
- Queued messages can be edited in place; automatic sending pauses at the edited message while earlier messages continue.
- Queue state and UI preferences are stored locally per conversation. After a reload, pending work is restored paused so it can be explicitly resumed.
The extension does not send messages to its own service: it operates on the ChatGPT page already open in the browser.
The diagram below uses ChatGPT as the current provider example, while the shared runtime is designed to support additional AI chat providers.
flowchart TD
DOM["AI chat DOM"] --> Content["Shared content runtime<br/>src/entrypoints/content.ts"]
Content --> Registry["Provider registry"]
Registry --> ChatGPT["ChatGPT provider<br/>adapters + selectors"]
Content --> QueueAction["Explicit queue action<br/>Queue button + keyboard shortcuts"]
QueueAction --> QueueService["QueueService"]
QueueService --> QueueDrainer["QueueDrainer"]
QueueDrainer --> GenerationState["Generation-state observer"]
QueueService --> QueuePanel["QueuePanel<br/>(isolated shadow UI)"]
QueueService --> QueueStorage["QueueStorage<br/>chrome.storage.local"]
QueueDrainer --> ChatGPT
Provider-specific DOM knowledge stays inside the active provider. See the provider checklist for adding another AI chat site. Queue behavior is covered independently by unit tests and end-to-end tests against a local fake page.
Start a development build with:
pnpm devThe development extension is generated in .output/chrome-mv3-dev. Edit source files under src/; WXT rebuilds the extension during development.
For browser tests, install Playwright Chromium once:
pnpm exec playwright install chromium
pnpm test:e2eThe E2E suite loads the built extension into Chromium and serves e2e/fake-chatgpt.html at a ChatGPT URL. It never connects to production ChatGPT.
- Messages are used only for local queue management and are not sent to an AI Chat Queue backend.
- No backend, analytics, telemetry, account service, or remote database is required.
- No user data is collected by this extension.
- Queued messages and queue preferences are stored in the browser's local extension storage, scoped to the conversation where they were queued.
- The
storagepermission is used to persist queued messages and preferences across page reloads. - Content-script access is limited to
chatgpt.comandchat.openai.comso the extension can read the composer state, render the queue button, and submit queued text. - The extension requests no tabs, scripting, identity, downloads, or network permissions, and the background service worker does not process user data.
See the full statement in PRIVACY.md.
Please read CONTRIBUTING.md before opening a pull request. The short version is: open or find an issue, keep ChatGPT DOM knowledge inside the adapter, add tests for behavior changes, and run the local quality checks before submitting.
This project is licensed under the GNU General Public License v3.0.
The release checklist and Chrome Web Store upload flow are documented in docs/RELEASING.md. The local release artifact is produced with:
pnpm zipGitHub Actions runs quality checks, unit tests, browser E2E tests, and the extension build for pushes to main and pull requests targeting main.

