A Chrome extension that injects small, focused UI enhancements into github.com, aimed at making GitHub itself more pleasant to use.
It’s a collection of independent features, not a single-purpose tool: each one lives in its own folder under features/ and can be added, removed, or shipped on its own. GitHub covers the fundamentals well; this is for the gaps that are easier to fill from the outside than to wait on.
This isn’t on the Chrome Web Store yet.
chrome://extensions, enable Developer mode (top-right toggle).chrome://extensions → the extension’s card → Details → Extension options.Go to github.com/settings/personal-access-tokens/new (a fine-grained token, not classic) and set:
If the repo belongs to an organization with SSO enforced (or with a policy restricting personal access tokens), one more step: go to github.com/settings/tokens, find the new token, and click Configure SSO / Authorize next to the org’s name. Without this, requests to that org’s data can silently come back empty or 404, since GitHub doesn’t otherwise reveal that the resource exists.
Back in the extension’s Settings page: paste the token, Save, then Test connection — it should report the GitHub username the token authenticates as.
Screenshots below are mockups illustrating each feature’s layout and colors (matched to the extension’s actual dark-theme CSS) — not literal captures of a live GitHub page.
On a GitHub issue page (or a Projects board’s issue-preview side panel) that has sub-issues, injects a left-to-right dependency graph below the sub-issues list.
A small floating button (or stack of buttons) on a GitHub Projects board view, each linking straight to “new issue” for a repo you configure in Settings — handy when the repo you actually file work into isn’t the one the board itself lives in. Fully user-defined (label, URL, color, and an optional “only on this board” project match); nothing is preset.
On a GitHub Projects Board (kanban) view, draws an arrow directly between any two currently-visible cards where one blocks the other — red if the blocker is behind the card it blocks, gray otherwise — no need to open either issue to see the dependency. Off by default; a switch next to the view tabs (shown only while a Board view is selected) turns it on, and the choice is remembered (also switchable from Settings).
On a GitHub Projects Board (kanban) view, stretches the board to the full window width instead of the page’s normal centered column — more room for columns before they need to scroll horizontally. On by default; switchable from Settings.
More features will land as their own entries here, each in its own folder under features/ (and background/ for anything they need server-side). See Contributing for the shape a new one takes.
manifest.json MV3 manifest — wires content scripts and the background service worker
background.js Service worker entry point: opens Settings, routes messages to feature modules
lib/github-api.js Shared GitHub REST/GraphQL client (auth, caching) used by every feature
background/<feature>.js One feature's server-side logic (GitHub calls, computation) + its MESSAGE_TYPE
features/<feature>/ One feature's content-script side: DOM injection, rendering, styling
options/ Settings page (GitHub token, quick-create shortcuts, feature toggles)
icons/ Toolbar/extensions-page icons
A push to main that bumps manifest.json’s "version" field is packaged and released automatically by .github/workflows/release-chrome-extension.yml:
manifest.json, background.js, background/, features/, icons/, lib/, and options/ into gh-reloaded-<version>.zip.v<version>, either way.A push that doesn’t change the version is a no-op for this workflow — the Chrome Web Store refuses to re-accept a version it already has, so re-submitting unchanged would just fail every time.
.github/workflows/require-version-bump.yml runs on every pull request into main and fails if manifest.json’s "version" isn’t strictly higher than what’s currently on main — so a feature branch needs its version bump before opening (or before merging) a PR.
By itself this only shows as a pass/fail check on the PR; to actually block the merge button, mark it required:
main.Require Version Bump / check-version to the required list (it only appears in the picker after the workflow has run at least once on a PR).This repo’s own settings aren’t something this workflow file can change — it needs to be turned on by a repo admin from the GitHub UI (or via the API) the same way any other required check would be.
The API can only update an existing Chrome Web Store listing — the first submission has to happen by hand:
zip -r extension.zip manifest.json background.js background features icons lib options), upload it as a new item, fill in the store listing (description, screenshots, privacy practices, single purpose, permission justifications), and submit it for review.https://www.googleapis.com/auth/chromewebstore scope against your Web Store account — e.g. via chrome-webstore-upload-cli’s docs, or any OAuth 2.0 installed-app flow.Add these as Actions secrets (repo Settings → Secrets and variables → Actions):
| Secret | Value |
|---|---|
CHROME_EXTENSION_ID |
Extension ID from step 3 |
CHROME_PUBLISHER_ID |
Publisher ID from step 3 |
CHROME_CLIENT_ID |
OAuth client ID from step 4 |
CHROME_CLIENT_SECRET |
OAuth client secret from step 4 |
CHROME_REFRESH_TOKEN |
Refresh token from step 5 |
Until all five secrets are set, the workflow still cuts a GitHub Release on every version bump; it just skips the store upload step (with a warning in the run log) rather than failing the run.
Google’s own review queue still sits on top of this either way — a workflow run “publishing” a release means it was submitted, not that it’s instantly live on the store.
See CONTRIBUTING.md for how a feature module is structured and how to add a new one. Issues and PRs welcome.
See PRIVACY.md — short version: nothing is collected, sold, or sent anywhere except directly to api.github.com with your own token.