GitHub, as if it never got acquired.
Unmerged is a browser extension that re-skins github.com in place. Same URLs, same session, same links in your notifications, with a calmer interface that loads faster than the one it replaces.
For Chrome and Firefox
102 ms
From a profile to one of its repos, click to content
305 ms
To show a pull request on a warm reload
~1 MB
Of GitHub's HTML a repo page never downloads
Measured in Chromium on public pages, medians of 3 to 5 runs. GitHub's API latency moves the numbers around.
Same URLs
It takes over the pages you live in.
Links, bookmarks and the URLs in your email all keep working, because nothing moves. Every page not listed here is GitHub as usual.
Home
github.com
What needs your review, your open pull requests, assigned issues and what merged recently. No feed.
Pull requests
/owner/repo/pull/123 · /pulls
Conversation, commits, checks and diffs. Batch line comments into one review, suggest changes, edit in place and merge.
Issues
/owner/repo/issues/123 · /issues
Timeline, comments and linked pull requests. Close as completed or not planned. Lists take any ?q= search.
Repositories
/owner/repo
Code, files, commits, issues and pull requests, with go-to-file on t. Admins can edit the About sidebar.
Notifications
/notifications
Inbox, unread and participating, filtered by repository. Mark as read or done from the row.
Profiles
/username
Repositories, achievements, followers and following, and the contribution graph.
GitHub is one click away. Classic, in the sidebar or ⌘K, shows the stock page for the current URL with a pill to come back. Any page can be switched off for good from the toolbar popup.
Fast by doing less
Faster, mostly by loading less.
Data comes straight from GitHub's GraphQL API. Slow queries are split into parallel requests, and each section shows the moment its data lands.
GitHub's page stops loading
Once GitHub's head arrives with who's signed in, the rest of its page is cancelled. Its HTML body and scripts never load underneath.
Requests start before the click
Hovering, focusing or pressing a link starts that page's requests, so most navigations find their data already there.
The last visit paints first
Results are cached per account in extension storage. They show at once while the same request refreshes them.
Code highlighting on demand
Diffs and files are drawn by @pierre/diffs with Shiki. Pages without code never load it, and each grammar loads on first use.
Keyboard first
Everything is a few keys away.
⌘K finds repos, people and your pull requests and issues by title, jumps to owner/repo#123 (or just #123 inside a repo), and carries the actions for the page you're on.
- ⌘KCommands, search, and jumps to owner/repo#123
- jkMove between rows
- ghHome
- gpYour profile
- tGo to file
- ⌘↵Send comment
- ?Every shortcut on the current page
Privacy
Your token never leaves your browser.
Unmerged has no server and no analytics. It talks to GitHub, and to another site only when you play a video linked from it.
Stored in the extension
Your personal access token lives in extension storage, out of reach of github.com and other extensions.
Sent only to api.github.com
The only requests that carry it go to GitHub's API. It is never in the page, a URL or github.com's storage.
Cache stays local
Cached results sit in extension storage per account, expire after 7 days, and are never written where GitHub's scripts can read them.
Install
Two minutes, from source.
Unmerged isn't in the extension stores yet. Build it once and load it unpacked.
- 1
Build it
git clone https://github.com/D3OXY/unmerged cd unmerged pnpm install pnpm build
For Firefox, run
pnpm build:firefox. - 2
Load it
Open
chrome://extensions, turn on Developer mode, click Load unpacked and pick.output/chrome-mv3. - 3
Add a token
Open github.com and paste a personal access token when asked. This link fills in the scopes Unmerged needs.
Create a token