Refined GitHub Projects
Chrome Web Store & Firefox Add-ons live · Manifest V3 · No backend

The bulk operations
GitHub Projects forgot.

The bulk operations and sprint tooling GitHub Projects V2 should have shipped with — running entirely in your browser, your token never leaves your machine.

12
bulk actions
5
browsers supported
100%
local & private
MV3
manifest version
github.com/acme/sprint-12 · Projects
Sprint board
Roadmap
Backlog
#4821 Migrate auth to OAuth 2.1 In progress
#4822 Decommission legacy webhook router Todo
#4823 Audit npm dependencies for CVE-2025-04 In review
#4824 Backfill events table partitioned by month Todo
#4820 Add Slack alerts for queue backpressure Done
#4819 Document on-call rotation handoff Done
4 selected Actions Edit fields Close Duplicate Export B
Why it exists

GitHub Projects is powerful. Managing it at scale isn't.

Refined GitHub Projects fixes the gaps that slow down every sprint planning session.

📋
One field at a time, forever
Native GitHub lets you update exactly one item's field per interaction. With a backlog of 60 items, that's 60 clicks just to flip a Status.
🔁
GitHub's duplicate strips everything
The built-in duplicate copies only the title. Every assignee, label, status, and project field has to be re-applied manually — every single time.
🏃
Ending a sprint is a chore
Moving incomplete items to the next iteration requires opening each issue individually, changing the sprint field, and hoping you didn't miss any.
🔒
No visibility into background ops
When you do find a workaround — via API or script — there's no progress indicator, no rate-limit safety, and a 403 ban if you fire too fast.

And what we ship instead.

The problem
What RGP adds
✕ Can't edit N items at once
✓ Bulk Edit Wizard — pick fields, set values, apply to all
✕ GitHub's duplicate copies only the title
✓ Deep Duplicate — clones every field, assignee, label, body
✕ Closing a sprint takes many clicks
✓ End Sprint — moves incomplete items to next iteration in one action
✕ No visibility into background API calls
✓ Live Queue Tracker — real-time progress, rate-limit safe
✕ Destructive actions have no guardrail
✓ Every bulk write requires explicit confirmation
Features

Twelve bulk operations, one queue, zero backend.

01 / BULK ACTIONS02 / EDIT WIZARD03 / DEEP DUPLICATE04 / SPRINT MGMT
Bulk Edit Wizard
Three-step flow: pick fields, set values, review the diff. One queue, sequential mutations, full audit before a single API call fires.
E
Deep Duplicate
GitHub's duplicate copies the title. Ours clones the issue: every project field, assignee, label, body, sub-issue link.
D
📅
End Sprint
Pick the target iteration. Incomplete items auto-assign. The queue handles re-parenting in the background.
N
Bulk Transfer
Move issues to another repository — history, comments, sub-issue links intact.
M
🔒
Bulk Lock
Lock conversations with a reason. Off-topic, too heated, resolved, spam — apply to N issues at once.
📌
Bulk Pin / Unpin
Promote (or demote) important issues at the repository level without clicking through every one.
CSV Export
Selected items, every custom field, assignees, labels — exported in a shape that pastes cleanly into a spreadsheet.
V
🗑
Bulk Delete
Hidden behind admin permissions and a hard confirm. The kind of thing GitHub should require — and didn't.
How it works

Your token. Your browser. No middleman.

Refined GitHub Projects is a browser extension. There is no SaaS. There is no proxy. Your PAT lives in browser extension storage and goes one place — api.github.com. Audit the source if you don't believe us.

Content Script
In the page
  • Observes DOM via MutationObserver
  • Injects UI inside Shadow DOM
  • Sends typed messages — never calls the API
sendMessage
Background Worker
Service worker
  • Stores PAT in extension storage
  • Sequential queue, sleep(1000) between writes
  • 403 / 429 backoff is automatic
GraphQL
🐙
GitHub
api.github.com
  • Projects V2 GraphQL
  • Your scopes: repo, read:org, project
  • Rate limit lives here, we respect it
🛡 Never use Promise.all() for mutations — GitHub will 403-ban your PAT.
🛡 Never call the API from a content script. Always proxy through the worker.
🛡 Anchor injected UI to data-testid — not volatile class names.
12
bulk operations
1s
between mutations
0
backend services
5
browsers tested
99.3%
TypeScript
Installation

Up and running in under two minutes.

1
Install on Chrome
One-click install from the Chrome Web Store — fastest path.
chromewebstore.google.com
2
Install on Firefox
Live on Firefox Add-ons. Automatic updates included.
addons.mozilla.org
3
Edge / local testing
Edge is supported via manual install. Download the latest release, extract, then load unpacked.
github.com/fathiraz/refined-github-projects/releases
4
Open extension page
Chrome: chrome://extensions · Edge: edge://extensions · Firefox: about:debugging.
5
Load unpacked
Enable Developer mode → Load unpacked → select the folder. Firefox: Load Temporary Add-on.
6
Add your PAT
Click the icon, paste your token, hit Validate and save. All features unlock automatically.
Chrome tested
Firefox tested
Arc tested
Edge tested
Zen tested
Safari roadmap
🔑
Required PAT scopes
Your token is stored locally and goes only to api.github.com — never to any server we control.
Generate token →
repoRead/write issues, labels, assignees
read:orgRead org membership for assignee search
projectRead/write GitHub Projects V2 fields
Roadmap

What's shipped, what's next.

Bulk update fields — Status, Assignee, Sprint, Priority, Labels, custom fields
Bulk close / reopen issues
Bulk lock / pin / unpin / transfer / delete
Bulk rename titles & reorder items
Export selected items to CSV
Deep duplicate with all fields and sub-issues
Sprint management — end sprint with auto-assignment
Task completion tracker in sprint group headers
Live queue tracker with real-time progress and rate-limit backoff
Chrome Web Store release
Firefox Add-ons release
Safari support — manual install via WXT publishing guide

Stop clicking. Start moving.

Refined GitHub Projects is MIT-licensed, runs in your browser, and never asks you to log into anything that isn't GitHub.