A Chrome extension (Manifest V3) that scans your Gmail and shows exactly which sent emails are still waiting on a reply. No AI, no backend, no analytics — everything runs and stays in your browser.
If you sent the last message in a thread and the recipient hasn't replied since, it shows up — sorted by how long you've been waiting, so the oldest, most overdue conversations rise to the top.
This repo doubles as a worked example of building with Claude from a real spec: docs/PRD.md is the product requirements document written and iteratively reviewed before any code existed, and docs/EDD.md is the engineering design document written from the finished implementation, describing how it actually works.
- Google Sign-In via OAuth (
gmail.readonlyscope only — read access, nothing else) - Scans the last 30 days of sent mail
- Shows recipient, subject, and days waiting per thread
- Correctly handles multi-recipient threads (a thread stays "waiting" until everyone has replied)
- Filters out newsletters, no-reply senders, and self-sent mail automatically
- Per-thread manual override: exclude a specific recipient from a thread's "waiting on" requirement (e.g. you only actually need the CEO's answer, not their assistant's or a cc'd lawyer's)
- ⓘ Why? panel on every row — expands inline to show the exact facts behind the classification, generated from the same logic that produced it
- Cache-then-background-refresh: instant warm launches, a 5-minute background refresh via
chrome.alarms, never blocks the popup UI
See docs/PRD.md for the full feature spec, edge-case definitions, performance targets, error states, and acceptance tests. See docs/EDD.md for the technical implementation: architecture, Gmail API usage, detection algorithm, storage schema, and caching design.
There's no build step — it's plain HTML/CSS/JS. But because this uses Google OAuth, you need to create your own OAuth client before sign-in will work for you; the client_id in extension/manifest.json is tied to the specific extension ID it was created for, and Chrome mints a different extension ID for every unpacked folder path, so this repo's existing client_id will not work once you load it from your own machine.
- Clone this repo and open
chrome://extensionsin Chrome. - Enable Developer mode (top right), then Load unpacked → select the
extension/folder. - Note the extension ID Chrome assigns it (shown on the extension's card).
- In Google Cloud Console → APIs & Services → Credentials, create an OAuth client of type Chrome Extension, using the ID from step 3 as the Application ID.
- Enable the Gmail API on that same Cloud project, and add the
.../auth/gmail.readonlyscope on the OAuth consent screen. - Copy the new client's Client ID into
extension/manifest.jsonunderoauth2.client_id. - Reload the extension in
chrome://extensions, click the InboxPilot icon, and sign in.
A freshly created OAuth client can take anywhere from a few minutes to a few hours to propagate on Google's side — if sign-in fails immediately with a "bad client id" error right after setup, that's usually why; it typically resolves on its own.
extension/ The actual Chrome extension (Manifest V3)
docs/PRD.md Product requirements document
docs/EDD.md Engineering design document
Personal pilot project, v0.1. Working and in daily use against a real Gmail account; not published to the Chrome Web Store.
MIT — see LICENSE.