ghinbox
A better UI for GitHub notifications. Forged from the fires of PyTorch.
The three main design philosophies of ghinbox are as follows:
-
Pull more data, but less often. GitHub notifications allows only a very impoverished set of search queries and forces a strict limit of 25 items per page; in return, you can freely refresh your notifications without being rate limited. ghinbox makes the opposite tradeoff: we want all of the notifications and all of the data; to avoid being rate-limited, you must explicitly request a sync and we expect you to only do syncs rarely, opting to show you our offline view of the state of notifications.
-
Issue and pull request notifications are fundamentally different. GitHub notifications jumble issues and pull requests together. We argue the workflow for handling issues and pull requests is quite different: issues you can just read, perhaps dash off a quick response; a pull request, you have to actually sit down and fully understand what is changed. Issues you can doomscroll on your phone; pull requests require focused attention. You should have separate flows for handling each of them.
-
Core contributor PRs privileged over external contributor PRs. GitHub notifications doesn't distinguish between PRs that come from core contributors versus external contributors; anyone can CC you and dump a PR in your inbox. This design makes it easy for the masses to hijack maintainer attention. Instead, external contributions should be relegated to their own section, where a maintainer can engage with them on their own terms, subject to whatever attention they want to allocate.
These philosophies transfer into the following feature set:
-
GitHub source of truth (unlike Octobox); you can blow away ghinbox's local state without care, any actions you take translate directly into concepts GitHub knows, like marking a notification as Done.
-
Fetch all unread comments for each notification and display them inline on one page.
-
Ability to filter out uninteresting comments (e.g., bot interactions, automated messages, etc.)
-
Ability to take out notifications which were only induced by uninteresting actions.
-
A Phabricator-style PR review dashboard, which emphasizes clarity on whether or not a PR in your inbox needs action taken on it or not.
Technical details
GitHub's official API does not expose enough information / interaction points to implement even a feature-parity notifications page. In particular:
- There is no way to distinguish between "Read" and "Done" notification states via the REST API.
- The HTML notifications page provides more information than the notifications JSON API provides.
- There is no way to move a notification back to inbox after it's marked done.
To work around these issues, ghinbox isn't just an HTML+JS application that hits the GitHub API; it comes with a full API server which provides a few extra APIs that stock GitHub API doesn't have, which are implemented by directly interacting with the GitHub website with Playwright.
Importantly, this means that I will not host ghinbox publicly; you have to run it yourself. When you launch the server, it will launch a flow to log you into GitHub on Playwright's Chrome instance, and then will use that to issue itself a token (we also proxy plain GitHub API calls through this server so you don't have to provide a token in the web UI) and preserve the browser credentials so that it can do direct interactions.
This repository also contains support for "prod flows", which are scripted interactions against the real GitHub website (using test accounts), which we can use to get fixtures for our E2E tests and also verify that GitHub hasn't changed its UI in a way that is incompatible with our Playwright scripts.
Quick Start
# Install dependencies
uv sync
uv run playwright install chromium
uv run ghinbox
Contributing
See CONTRIBUTING.md
Metadata
Release files for ghinbox 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ghinbox-0.2.1.tar.gz | 382.8 kB | Without provenance | Details for ghinbox-0.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ghinbox-0.2.1-py3-none-any.whl | Python 3 | none | any | Details for ghinbox-0.2.1-py3-none-any.whl |
Total release size: 505.6 kB
Release files / ghinbox-0.2.1.tar.gz
| Download URL | ghinbox-0.2.1.tar.gz |
|---|---|
| Size | 382.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1c38b14e629a8c6b03977db8fdda07aab55143edcb6b60784d01207dc359626b
|
|
BLAKE2b-256 checksum How to use checksums |
f9464acd44cee69b204a54f3f8d6f1fe816c628942e352103f14181ede0337c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.6
|
Release files / ghinbox-0.2.1-py3-none-any.whl
| Download URL | ghinbox-0.2.1-py3-none-any.whl |
|---|---|
| Size | 122.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ba059acf3751a449a4d3982d7d961ab5112029cbfacff54c63d67956d09b4928
|
|
BLAKE2b-256 checksum How to use checksums |
6260d92266f5949b8b0737746d0b3ed13766f1687afaef48d55116ba5e0618b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.6
|
Security for ghinbox 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.