Skip to content

Repository files navigation

Refined GitHub Projects

Refined GitHub Projects — Bulk superpowers for GitHub Projects V2

GitHub Projects, bulk-edited the way it should work.
Bulk edit, close, delete, duplicate, transfer, and sprint-manage your project items — all from the table view, no backend required.

Latest Release v1.0.0MIT LicenseChrome Web StoreFirefox Add-onsCoverage

TypeScriptReact 19WXTManifest V3GraphQLPrimer CSSpnpmVitest

Now live on Chrome Web Store and Firefox Add-ons. Manual install remains available for Edge and local builds.

Inspired by refined-github — the gold standard for browser extensions that fix what GitHub won't.
⚡ 90% built with multiple AI agents. By fathiraz.


📥 Downloads

Available in the Chrome Web StoreGet the Add-on for Firefox


📋 Table of Contents


🧐 Why This Exists

GitHub Projects V2 is a solid board — but editing items in bulk is painful. You update one field at a time. You close one issue at a time. You drag items to the next sprint one by one. That's not how teams move.

Refined GitHub Projects adds the bulk operations and sprint tooling that should have shipped with GitHub Projects V2 — running entirely in your browser, with your token never leaving your machine.

ProblemWhat RGP adds
Can't edit N items at onceBulk Edit Wizard — select fields, set values, apply to all
GitHub's duplicate only copies the titleDeep Duplicate — clones all fields, assignees, labels, body
Closing a sprint takes many clicksEnd Sprint — moves incomplete items to next iteration in one action
No visibility into background API callsLive Queue Tracker — real-time progress, rate-limit safe
Dangerous operations have no guardrailEvery destructive action requires a confirmation modal

✨ Features

FeatureWhat it does
Bulk update fieldsChange Status, Assignee, Iteration, Priority, Labels, and any custom field across N items at once
Bulk close issuesMark issues as Completed or Not Planned in a single click
Bulk reopen issuesRestore closed items back to active work
Bulk lock / unlockLock conversations with a reason (off-topic, too heated, resolved, spam)
Bulk pin / unpinPromote or demote important issues at the repository level
Bulk transferMove issues to another repository, history intact
Bulk deletePermanently remove items from your project
Bulk rename titlesUpdate issue or PR titles across multiple items
Export to CSVDownload selected items with all fields, assignees, labels, and custom properties
Sprint managementEnd a sprint with one click; incomplete items auto-assign to the next iteration
Task completion trackerLive task counters in sprint group headers, updated in real time
Deep duplicateClone any item with all custom fields, assignees, labels, and sub-issue relationships

Bulk Actions Bar

Select items with ⌘A / Ctrl+A — the floating bar appears. Hit Actions (⌘⇧B) to open the full menu.

Bulk Actions Bar

Available bulk operations:

CategoryActionShortcut
FieldsEdit Fields⌘⇧E
ContentRename Titles⌘⇧R
ContentReorder Items⌘⇧J
StatusClose Issues⌘⇧X
StatusReopen Issues⌘⇧O
StatusLock Conversations⌘⇧L
StatusUnlock Conversations
VisibilityPin Issues⌘⇧F
VisibilityUnpin Issues
MoveTransfer Issues⌘⇧M
ExportExport to CSV⌘⇧V
DangerDelete Items⌘⇧⌫ (admin only)

Bulk Edit Wizard (3-Step Flow)

Bulk Edit Wizard

  1. Select Fields — choose which standard and custom fields to update
  2. Set Values — pick new values: Status, Priority, Sprint, Size, Estimate, Assignees, Labels, dates…
  3. Review & Apply — see a clean diff of every change before a single API call fires

Deep Duplicate

Deep Duplicate

GitHub's native duplicate copies only the title. Deep Duplicate clones the full issue — all project fields, assignees, labels, body, and sub-issue links — and lets you edit everything before confirming.


Sprint Management

Sprint Management

End a sprint with one click. The Sprint widget (top-right on any Projects page) shows the active iteration and task completion. Hit End Sprint, pick the target iteration for incomplete items, and the background queue moves them automatically — no manual re-assignment.


Live Queue Tracker

Every bulk operation runs through a sequential background queue with 1-second delays between mutations. The live tracker shows real-time percentage progress and automatically backs off on 403 / 429 errors — keeping your PAT safe on large projects.


Privacy by Design

  • No backend — all calls go directly from your browser to api.github.com
  • Token stays local — the PAT is stored in browser extension storage, never sent to any external server
  • Shadow DOM isolated — injected UI never clashes with GitHub's own styles

🚀 Installation

Browser Compatibility

BrowserEngineInstall path
ChromeChromium✅ Chrome Web Store
ArcChromium✅ Chrome Web Store
Microsoft EdgeChromium✅ Manual install
FirefoxGecko✅ Firefox Add-ons
ZenFirefox (Gecko)✅ Firefox Add-ons

For Humans

  1. Chrome: install directly from the Chrome Web Store.
  2. Firefox: install directly from Firefox Add-ons.
  3. Edge / local testing: download the latest browser build package from Releases and extract it on your machine.
  4. For manual installs, open your browser's extension page:
    • Chrome: chrome://extensions
    • Edge: edge://extensions
    • Firefox / Zen: about:debugging#/runtime/this-firefox
  5. Load the extension manually when needed:
    • Chrome / Edge: enable Developer modeLoad unpacked → select the extracted folder
    • Firefox / Zen: Load Temporary Add-on → select the manifest file in the extracted folder
  6. Click the extension icon, paste your GitHub PAT, and click Validate and save.

Done. Chrome and Firefox install in one click from their respective stores; Edge remains available via manual install.

For AI Agents

Paste this into Cursor, Claude Code, or any coding agent:

Install Refined GitHub Projects:
Chrome: https://chromewebstore.google.com/detail/refined-github-projects/ljkfilkmedkcpckabpeeiacjefhnlplg
Firefox: https://addons.mozilla.org/en-US/firefox/addon/refined-github-projects/
If you need Edge or a local build, use the latest GitHub release:
https://github.com/fathiraz/refined-github-projects/releases
Steps:
1. Chrome: install from the Chrome Web Store
2. Firefox: install from Firefox Add-ons
3. Edge/manual installs: download the latest browser build package (not the source archive) and extract it
4. Load as unpacked extension when needed:
- Chrome: chrome://extensions → Developer mode → Load unpacked → select extracted folder
- Edge: edge://extensions → Developer mode → Load unpacked → select extracted folder
5. Click the extension icon → paste your GitHub PAT (scopes: repo, read:org, project) → Validate and save

Or fetch these instructions directly:

curl -sL https://raw.githubusercontent.com/fathiraz/refined-github-projects/main/README.md

Development Setup

# Prerequisites: Node.js 18+, pnpm
git clone https://github.com/fathiraz/refined-github-projects.git
cd refined-github-projects
pnpm install
# Dev server with hot reload
pnpm dev
# Production build
pnpm build

Load dist/chrome-mv3 in chrome://extensions or edge://extensions, or load the Firefox output in about:debugging.

If you want to use Safari manually, follow the WXT Safari publishing guide.


📖 Usage Guide

Setting Up Your PAT

  1. GitHub → SettingsDeveloper settingsPersonal access tokensTokens (classic)
  2. Generate new token (classic)
  3. Name it Refined GitHub Projects and select the required scopes:
ScopeReason
repoRead/write issues, labels, assignees
read:orgRead organization membership for assignee search
projectRead/write GitHub Projects V2 fields
  1. Copy the token and paste it into the extension popup → Validate and save.

Running a Bulk Operation

  1. Open any GitHub Projects table view
  2. Check item checkboxes — or press ⌘A / Ctrl+A to select all
  3. The Bulk Actions Bar appears at the bottom
  4. Click Actions (⌘⇧B) and choose your operation
  5. Follow the wizard; review changes before confirming

Ending a Sprint

  1. The Sprint widget appears top-right on your Projects page
  2. Click End Sprint
  3. Choose the target iteration for incomplete items
  4. Click End Sprint — incomplete items move automatically

Keyboard Shortcuts

ShortcutAction
⌘A / Ctrl+ASelect all visible items
⌘⇧BOpen Actions menu
EscClear selection

🏗️ Architecture

┌─────────────────┐ sendMessage ┌──────────────────────────┐ ┌──────────────────────┐
│ Content Script │ ──────────────────→ │ Background Service │ ──→ │ GitHub GraphQL API │
│ (DOM / UI) │ │ Worker │ │ api.github.com │
│ │ ←────────────────── │ - PAT storage │ │ │
│ - Shadow DOM │ response / │ - Sequential queue │ │ │
│ - Row observer │ queueStateUpdate │ - 403/429 backoff │ │ │
└─────────────────┘ └──────────────────────────┘ └──────────────────────┘
↑
│ WXT Storage API
↓
┌─────────────────┐
│ Extension │
│ Popup │
│ - PAT config │
└─────────────────┘

Data flow:

  1. The Content Script observes the GitHub Projects DOM via MutationObserver and injects UI into a Shadow DOM container — invisible to GitHub's own styles.
  2. On a bulk operation, the content script sends a typed message to the Background Service Worker.
  3. The Background Worker retrieves the stored PAT, builds a sequential task queue, and fires GraphQL mutations with 1 s delays between each write. Promise.all() is never used for mutations — it will 403-ban your token.
  4. Progress is broadcast back as queueStateUpdate messages, driving the live tracker widget.

🛠️ Tech Stack

LayerTechnology
Extension frameworkWXT with Manifest V3
UIReact 18, TypeScript, Primer CSS
Messaging@webext-core/messaging
StorageWXT browser storage APIs
APIGitHub Projects V2 GraphQL via fetch
DOM isolationWXT CSUI with Shadow DOM
BackgroundWXT Background Service Workers

🗺️ Roadmap

  • Bulk update fields (Status, Assignee, Sprint, Priority, Labels, custom fields)
  • Bulk close / reopen issues
  • Bulk lock / pin / unpin issues
  • Bulk transfer issues to another repository
  • Bulk delete project items
  • Bulk rename titles
  • Reorder items
  • Export selected items to CSV
  • Deep duplicate with all fields, assignees, labels, body, sub-issues
  • Sprint management — end sprint with auto-assignment of incomplete items
  • Task completion tracker in sprint group headers
  • Live queue tracker with real-time progress
  • Chrome Web Store release
  • Firefox Add-ons release

📊 Test Coverage

Code Coverage

PackageLine RateBranch RateHealth
main81%77%
Summary81% (738 / 916)77% (412 / 538)

🤝 Contributing

Contributions are welcome. Please follow these rules — they exist to keep the extension safe for everyone.

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/my-feature
  3. Make your changes and run pnpm typecheck
  4. Commit with a conventional message: git commit -m 'feat: my feature'
  5. Push and open a pull request

Critical rules (strictly enforced):

  • Never use Promise.all() for GraphQL mutations — GitHub will 403-ban your PAT
  • All mutations must run sequentially through the background queue with sleep(1000) between each
  • Never call GitHub's API directly from a Content Script — always use sendMessage to the Background Worker
  • Anchor injected UI to data-testid attributes or ARIA labels, not volatile CSS class names

📄 License

MIT © fathiraz


🙏 Acknowledgments

  • refined-github — the gold standard for browser extensions that meaningfully improve GitHub's UX
  • WXT — made cross-browser Manifest V3 development actually enjoyable
  • Primer CSS / @primer/react — GitHub's own design system, so the injected UI feels native
  • GitHub GraphQL API — the Projects V2 API that makes all of this possible

fathiraz · github.com/fathiraz · Project repository

About

GitHub Projects, but the way it should work. Bulk edit, close, delete, and deep duplicate items — all from the table.

Topics

Resources

Contributing

Stars

59 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages