A wxPython GUI for viewing and managing GitHub issues, pull requests, and git metadata.
Built with wxPython and the GitHub CLI (gh).
The full user guide is at https://theideaplace.github.io/GHManage/, and Help ▸
User Guide (F1) opens it from the app. This README is a summary.
- Repo chooser — list shows your GitHub repositories; arrow through and press Enter to load. Above them sit ★ Favorites, Activity, Starred Repositories, Watched Repositories, Notifications, My Work and your saved searches, the counted ones with how many they hold, e.g. "Notifications (12 unread)"
- Notifications — your GitHub inbox: why you were told, what it is, mark read, mark done, unsubscribe; Enter opens an issue or PR right here, and Backspace comes back
- Search GitHub — Ctrl+Shift+F searches issues and PRs, or repositories, across all of GitHub
with GitHub's own qualifiers (
is:open label:bug author:@me …); save a search and it sits in the repo list, one Enter away - My Work — open issues and PRs that need you, everywhere: review requests, assigned, your own, mentions
- Open any GitHub address — paste a link to an issue, PR, commit, release, workflow run or branch into Ctrl+Shift+O and it opens in its own view with that item selected
- New issue — Ctrl+N, a title and a Markdown description
- Pull requests — checks (K), review (V), draft/ready (D), merge, request reviewers, update branch
- Copy — the link, a Markdown link, the title, the number/SHA/tag, or the details, for anything
- Watch settings and account switching — Participating, All Activity or Ignore for a repository; switch between the github.com accounts gh is signed in to
- Activity — your GitHub feed: what happens in the repositories you star or watch and what the people you follow do, newest first, across every repository
- Issues & PRs view — issues and PRs in one list, like an email inbox
- Git views — browse branches, commits, tags, releases, workflows (run them on a branch), and workflow runs (drill into a run's artifacts and download them)
- GitHub Pages — if a repo publishes a site, see every publish and whether it worked, then browse the pages it serves and open any of them in your browser
- Release download counts — the Releases view shows how many times each release was downloaded, with a repo total in the status bar; press Enter on a release for a per-file breakdown
- Labels view — browse the repo's labels, press Enter on one to list the issues and PRs carrying it, and create or delete labels with Ctrl+I / Ctrl+D (or Insert / Delete)
- Branch-specific commits — press Enter on a branch to see its commits, or press Ctrl+B in Commits view to pick a branch
- Details panel — full body, metadata, comments, file changes, and release notes shown below the list
- Comment navigation — press Alt+N/Alt+P in the details box to jump between comments
- View More — press Ctrl++ to load more items (100 at a time)
- View menu with:
- View Mode — switch between Issues & PRs, Branches, Commits, Tags, Releases, Workflows, Workflow Runs, Labels, GitHub Pages, Notifications, Activity, Starred Repositories and Watched Repositories
- Quick / Full list mode — Quick shows compact rows; Full includes field names (e.g. "number: 208, type: PR, state: OPEN, title: …") for screen readers
- Sort order — by number, title, created date, updated date, or comments
- Column selection — toggle columns on/off (columns change per view mode)
- State filter — open, closed, or all (issues/PRs view)
- Show filter — issues only, PRs only, or both (issues/PRs view)
- Actions menu — one home for everything that acts on what the list is showing: close, reopen, comment, new issue, copy, watch settings, create and delete labels, delete a workflow run, run a workflow, download an artifact, mark notifications read or done, open in browser. Each item names what it would act on in the current view and is greyed out where it does not apply, so the menu answers "what can I do here?" without trial and error
- Python 3.9+
- The
ghCLI installed and authenticated (gh auth login) - wxPython
Download GHManage-win-Setup.exe from the latest release and run it. It installs per-user, with no administrator prompt, and keeps itself up to date: new versions download in the background and install the next time you start GHManage. Help ▸ Check for Updates checks on demand.
GHManage-win-Portable.zip is also published for anyone who would rather not install. It does not update itself.
Releases are code-signed. See docs/INSTALLER.md for how.
Apple Silicon (M1 or later), macOS 11 Big Sur or newer.
Download GHManage-osx.dmg from the latest release, open it, and drag GHManage to Applications. GHManage-osx-Portable.zip contains the same app if you prefer to unzip it yourself.
Both update themselves — a macOS app bundle carries its own updater, so it keeps working wherever you put it. New versions download in the background and install the next time you start GHManage; Help ▸ Check for Updates checks on demand.
Install and sign in to the GitHub CLI first:
brew install ghthen gh auth login. GHManage looks for gh in the usual Homebrew and MacPorts
locations, because an app launched from Finder does not inherit the PATH from
your shell profile. If you keep it somewhere else, set GHMANAGE_GH_PATH to its
full path.
There is no Intel build. wxPython and Velopack both publish per-architecture wheels with no universal2 build, so an Intel release would be a separate build rather than a fat binary.
pip install -r requirements.txtOr install as a package:
pip install .python ghviewer.pyOr for a specific repository (skips the repo chooser):
python ghviewer.py --repo owner/repo-name| Key | Action |
|---|---|
R or Ctrl+R |
Refresh the list (resets to first page) |
Ctrl++ |
View More — load the next page of items |
Ctrl+O |
Open the selected item on GitHub in your browser |
Ctrl+Shift+O |
Open a repository, or an issue, PR, commit, release, run or branch, by its address |
Ctrl+Shift+C / Ctrl+Shift+L |
Copy the selected item's link / a Markdown link to it |
Ctrl+Shift+T / Ctrl+Shift+I / Ctrl+Shift+D |
Copy its title / number, SHA or name / details |
Ctrl+N |
New issue — in the open repository, or the one selected in the repo list or the current list |
Ctrl+Shift+S |
Search the repository in front of you |
Ctrl+Shift+F |
Search GitHub; Ctrl+S in the results saves the search |
Ctrl+Shift+U |
Watch settings for the repository |
Ctrl+Shift+K |
Switch GitHub account |
Ctrl+G |
Go to a specific issue/PR by number (issues view only) |
Ctrl+B |
Select a branch for the Commits view (commits view only) |
Ctrl+I |
Create — a new label (Labels view) |
Ctrl+D |
Delete — the selected label or workflow run; mark a notification done |
Ctrl+1 … Ctrl+0 |
Switch view — see below |
Alt+N |
Jump to the next comment in the details box |
Alt+P |
Jump to the previous comment in the details box |
Tab |
Move focus between the repo list, item list, and details panel |
F6 / Shift+F6 |
Move focus to the next / previous pane: repo list, item list, details panel, status bar |
F1 |
Open the user guide in your browser |
Ctrl+Q |
Quit |
F6 stops on the status bar as well as the three panes. The bar is split into
items — the latest message, the keys that work in the current view, the filter
when one is set, the list mode, and a found update — and Left / Right move
from one to the next, wrapping at either end. Items with nothing to say are not
on the bar. Press Enter or Space on the update item to install the update
and restart.
Once a repository is loaded, Ctrl+<number> jumps straight to a view — the
numbers follow the order of the View ▸ View Mode menu, so you can read them off
the menu. They work from anywhere in the window (repo list, item list, or
details panel).
| Key | View |
|---|---|
Ctrl+1 |
Issues & PRs |
Ctrl+2 |
Branches |
Ctrl+3 |
Commits |
Ctrl+4 |
Tags |
Ctrl+5 |
Releases |
Ctrl+6 |
Workflows |
Ctrl+7 |
Workflow Runs |
Ctrl+8 |
Labels |
Ctrl+9 |
★ Favorites |
Ctrl+0 |
GitHub Pages |
Ctrl+Shift+N |
Notifications |
Ctrl+Shift+M |
My Work |
Ctrl+Shift+A |
Activity |
Every view except Favorites, Activity, Starred and Watched Repositories, Shared With Me,
an organization's repositories, Notifications, My Work and search results needs a
repository, so with none selected
the status bar says "Select a repository first" and the view is left alone. Those don't change
the repository you are in, so Ctrl+1 takes you back to it.
The repository list starts with seven entries that aren't single repositories: ★ Favorites, Activity, Starred Repositories, Watched Repositories, Notifications, My Work and My Organizations (Enter on an organization lists its repositories). After them come Shared With Me (other people's repositories you collaborate on, when there are any), your saved searches, any repositories you opened by address, then your own repositories. Starred and Watched are also on View ▸ View Mode.
- Starred Repositories — the repositories you have starred, most recently starred first.
- Watched Repositories — the repositories you are watching. GitHub watches your own repositories for you, so they are in this list as well.
Each row reads repository, description, language, stars and when it was last pushed; an archived repository or a fork says so at the start of its description. The details panel adds forks and open issues.
| Key | Action |
|---|---|
Enter |
Open the repository here in GHManage; Backspace from its issues comes back to the same row |
Ctrl+O |
Open the repository on GitHub |
F |
Favorite the repository |
Ctrl++ |
Load 100 more |
| Key | Action |
|---|---|
Enter (or double-click) |
Open an issue or PR here in GHManage (Backspace comes back); anything else on GitHub. Marks it read |
M |
Mark read |
Delete or Ctrl+D |
Mark done |
U |
Unsubscribe from the thread |
I |
Include read notifications, or not |
G or Ctrl+Shift+G |
Open its repository here |
Ctrl++ |
Load more |
Choose Notifications in the repository list, press
Ctrl+Shift+N, or use View ▸ View Mode ▸ Notifications. Each row reads why
GitHub told you, what it is, its title, the repository, when it changed, and
whether it is read. Actions ▸ Mark All as Read asks first.
| Key | Action |
|---|---|
Enter (or double-click) |
Open what the event is about here in GHManage (an issue, pull request, release or commit), with Backspace back to the event; anything else on GitHub |
G or Ctrl+Shift+G |
Open the event's repository here in GHManage; Backspace there brings you back to the same event |
F |
Favorite what the event is about: its issue, pull request, release or discussion |
Ctrl++ |
Load older events |
Choose Activity at the top of the repository list, press Ctrl+Shift+A, or
use View ▸ View Mode ▸ Activity. The repository you were in stays selected, so
Ctrl+1 takes you straight back to it. It is the feed github.com shows on your
dashboard: pushes, pull requests, issues, comments, reviews, releases, stars
and forks in the repositories you star or watch, and by the people you follow.
Each row reads who, what, which repository, what it was about, and when (in
your local time), for example "alice, merged pull request #42,
nvaccess/nvda, Fix the braille cursor, 2026-10-05 14:32". The details panel
gives the whole event as one sentence, then the comment, review or description
text when there is one.
GitHub keeps only the latest 300 events from the last 90 days. The first 100 are
loaded, Ctrl++ loads the next 100 and puts you on the first of them, and the
status bar says when there are no more. The quick filter (Ctrl+F) works here
like in every other view.
F favorites the issue, pull request, release or discussion an event is about,
the same favorite you would make from that item's own view. Events about a
push, a branch or the repository as a whole have nothing of their own to keep,
and the status bar says so. G and Actions ▸ Go to Event's Repository work
from the details panel as well as the list.
| Key | Action |
|---|---|
Enter (or double-click) |
Open the selected item on GitHub in your browser |
C |
Close the selected issue/PR |
O |
Reopen the selected issue/PR |
M or Ctrl+M |
Add a comment to the selected item |
N or Ctrl+N |
New issue |
K |
Checks on the selected pull request |
V |
Review it: approve, request changes, comment |
D |
Draft ⇄ ready for review |
Backspace |
Return to the labels list (only when the list is restricted to a label) |
| Key | Action |
|---|---|
Enter |
Switch to Commits view for the selected branch |
| Key | Action |
|---|---|
Backspace |
Return to the branches list |
| Key | Action |
|---|---|
Enter |
Drill into the selected release's assets and their download counts |
The downloads column totals every file attached to a release, and the status
bar totals every release currently loaded — press Ctrl++ to load more and the
total grows with them. The details panel breaks a release down file by file,
most-downloaded first.
From a release's Assets list, Enter downloads the selected file in your
browser and Backspace returns to the releases.
A download count is a lifetime running total kept by GitHub. It is not broken down by date, and no API offers that — to see downloads over time you have to record the numbers and compare them later. Counts include automated traffic, so a sharp spike on one release is worth reading with suspicion.
| Key | Action |
|---|---|
Enter (or right-click → Run on branch…) |
Run the selected workflow on a branch you pick |
Manual runs only work when the workflow declares an on: workflow_dispatch
trigger; if it doesn't, the app tells you so instead of triggering anything.
After a run starts, switch to Workflow Runs and refresh to watch it.
| Key | Action |
|---|---|
Enter |
Drill into the selected run's artifacts (shown in the same list) |
Ctrl+D or Delete |
Delete the selected run (asks first) |
J |
List the run's jobs and steps; Enter on a job reads its log, opening at the first error |
L |
Show what failed: GitHub's errors and the end of each failed step's log |
E |
Rerun: all jobs, or only the failed ones |
X |
Cancel a queued or running run |
From a run's Artifacts list, press Enter (or right-click → Download…) on an
artifact to download it into a folder you choose, and Backspace to return to the
runs list. Expired artifacts can't be downloaded and are marked as such.
| Key | Action |
|---|---|
Enter |
List the issues and PRs carrying the selected label |
Ctrl+I or Insert |
Create a label |
Ctrl+D or Delete |
Delete the selected label (asks first) |
These keys work from the labels list and from the details panel below it, so you can read what a label is and act on it without moving focus back. Right-click offers the same three actions, and so does the Actions menu — where the Delete entry names the label it would delete.
Enter reloads the Issues & PRs view restricted to that label, so the state
filter, columns, sorting, and every issue action still work there — the window
title and status bar name the label, and Backspace returns to the labels list.
The restriction is applied by gh, not by the quick filter, so it finds items
that were never on the current page. Ctrl+1 clears it and shows everything again.
A new label needs a name; the description and colour are optional, and GitHub picks a colour when the field is left blank. Deleting a label strips it from every issue and pull request that carries it, and GitHub offers no undo, so the app confirms first.
On a fork, labels come from the same upstream repo the issues do.
| Key | Action |
|---|---|
Enter |
Browse the pages the site serves |
S |
Open the site itself in your browser |
Ctrl+0 shows the publish history of a repository's Pages site — one row per
publish, with whether it succeeded, the commit it came from, who pushed it, and
how long it took. The status bar carries the site's address, its state, and the
branch and folder it publishes from; the details panel adds the rest of the
configuration, including any custom domain.
If the repository has no site, the app says so plainly rather than showing you an empty list.
From there, Enter opens the site's Published Pages — every file the site
serves, each with the address it is served at. Enter on one opens it in your
default browser, S opens the site's home page, and Backspace returns to the
publish history. The Actions menu carries Open Published Site too, enabled
once a site is found. F favorites a page like anything else, so a page you
check often is one keystroke away from any repository.
Two things are worth knowing about that list, and the details panel says so on the pages it applies to:
- Jekyll sites serve Markdown as HTML. A file stored as
guide/setup.mdis served atguide/setup.html. The listed address is the one that works. A site with a.nojekyllfile skips this and is served exactly as committed. - A site built by Actions is listed from its source, not its output. GitHub publishes those through a workflow, and the workflow decides what actually ships — possibly a subset of these files, possibly something it generated that is not in the repository at all. For sites GitHub builds itself, the list is what is served.
The publish history has the same split. Sites GitHub builds report a full build log with durations and error messages; sites built by Actions have no build log at all, so their history is read from their deployments instead, which record a state but not a duration.
Everything that acts on what the list is showing lives in one menu, whichever view it belongs to: open in browser, close/reopen/comment on an issue, create and delete labels, delete a workflow run, run a workflow, download an artifact, open a published Pages site, pick or compare branches.
Items are re-labelled and enabled for the current view, so Delete reads
"Delete Label…" in the Labels view and "Delete Workflow Run…" in Workflow Runs,
and is greyed out where nothing can be deleted. Ctrl+D follows the same rule;
so does the bare Delete key, which additionally works from the details panel.
Switch between Issues & PRs, Branches, Commits, Tags, Releases (with download counts), Workflows (the workflow definitions, which you can run on a branch), Workflow Runs (recent run history), Labels, GitHub Pages (a published site and the pages it serves), Notifications (your GitHub inbox) and Activity (your GitHub feed, across all repositories). Each view has its own set of columns and detail formatting.
build.batBuilds the app folder into dist\ghmanage\. Add clean to wipe artifacts first.
build.bat installerAlso packs the Velopack installer and update feed into installer\Releases\.
That step needs vpk, a .NET global tool: dotnet tool install -g vpk.
The build is --onedir, not --onefile, and that is not optional — see
docs/INSTALLER.md for why, along with the update flow, how to
test an upgrade locally, and the code-signing setup.
Tests run with python -m pytest (install it with pip install pytest). They
fake the gh CLI, so they need no network and no sign-in.
assets\ holds the icon stamped into the app, the Start menu shortcut, and
Setup.exe, plus the two scripts that generate it and the exe's version resource.
make_icon.py only needs re-running if the artwork changes.