A Chrome extension that automatically groups your GitHub Pull Requests into a dedicated tab group — in sync with the API, in the background, without interrupting you.
Built to stay out of your way while keeping your review queue visible.
Polls the GitHub API every 2 minutes using chrome.alarms — the only MV3-compliant way to run background tasks reliably without a persistent service worker.
New PRs get a tab. Merged or closed PRs have their tab removed. PRs you're actively reading are never force-closed — just ungrouped if the PR disappears.
Close a tab from the group manually and that PR is gone for good — it will never be re-opened by a future sync. Reset anytime from the Options page.
One checkbox to hide all PRs opened by dependabot[bot]. Your review queue, not a bot queue.
Block entire repositories from appearing in the group. Add them as owner/repo, one per line. Useful for noisy monorepos or low-priority projects.
Reads X-RateLimit-Remaining on every response. On 403 or 429, backs off automatically until the reset timestamp, then resumes.
Shows only the 10 most recent PRs opened in the last 2 weeks. Keeps the group focused on what's actually pending, not a backlog from months ago.
Pick from Chrome's 8 tab group colors to make your PR group stand out — or blend in — with the rest of your workspace.
No magic — just a clean polling loop and a deterministic reconciliation algorithm.
chrome.alarms wakes up the service worker. Since MV3 service workers are ephemeral, setInterval doesn't survive — alarms do.
One request: is:open is:pr review-requested:{you} created:>={2 weeks ago}, sorted by most recent, capped at 10 results.
Dependabot PRs, excluded repos, and permanently dismissed URLs are stripped from the result set before reconciliation.
URLs in the API but not in the group → new tab opened. URLs in the group but not in the API → tab closed (unless it's the active tab, in which case it's just ungrouped).
An in-memory map of tabId → URL is rebuilt after every sync. This lets chrome.tabs.onRemoved detect manual closes and persist them as dismissals.
The extension isn't on the Chrome Web Store. Load it directly from the source — it takes less than a minute.
chrome://extensions in Chromeextension/ folder