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. 1

    Build it

    git clone https://github.com/D3OXY/unmerged
    cd unmerged
    pnpm install
    pnpm build

    For Firefox, run pnpm build:firefox.

  2. 2

    Load it

    Open chrome://extensions, turn on Developer mode, click Load unpacked and pick .output/chrome-mv3.

  3. 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