gh-collab-manager
Source: RogerSquare/gh-collab-manager (local project) Category: Project tour
gh-collab-manager — a web dashboard for managing collaborators, invitations, and co-authors across all your GitHub repositories at once, driven by the gh CLI under the hood.
What it is
Section titled “What it is”An Express server that shells out to the gh CLI for every GitHub operation (no REST token juggling on your end — gh auth login handles that), a plain HTML/CSS/JS frontend, and an audit log of every mutating action. Solves the “I have N repos and want to see who has access to all of them, without clicking through N settings pages” problem.
| Layer | Technology |
|---|---|
| Backend | Express 5 |
| GitHub auth | gh CLI (inherits your authenticated session) |
| Storage | audit.json rolling log (max 500 entries) |
| Frontend | Plain HTML / CSS / vanilla JS, GitHub-ish dark theme |
| Port | 3005 by default (env: PORT) |
Features
Section titled “Features”- Repo list — shows every repo you own or collaborate on
- Collaborators view — per-repo list of who has what access
- Add / remove collaborators — bulk across selected repos
- Pending invitations — see and cancel invites
- Contributor list — history of who has ever pushed
- Co-author removal — strip a co-author from commit trailers
- Repo metadata — description, topics, visibility, default branch
- Repo reset — destructive; nuke and re-create from a known state
- Audit log — every mutation is logged with action + details + timestamp
gh-collab-manager/├── server.js # Express + gh CLI calls├── audit.json # append-only log (rotated at 500)├── public/│ ├── index.html # main UI│ └── claude-projects.html # separate "Claude-touched projects" view└── package.jsonAPI surface (high level)
Section titled “API surface (high level)”GET /api/user·GET /api/reposGET /api/repos/:owner/:repo/collaborators·POSTto add ·DELETE /:usernameto removeGET /api/repos/:owner/:repo/invitations·DELETE /:idto cancelGET /api/repos/:owner/:repo/contributorsPOST /api/repos/:owner/:repo/remove-coauthorGET /api/repos/:owner/:repo/metadataPOST /api/repos/:owner/:repo/reset— destructiveGET /api/claude-projects— scan for claude-code-managed projectsGET /api/audit— read the audit log
Non-obvious design choices
Section titled “Non-obvious design choices”ghCLI, not Octokit. The CLI already owns your session, pagination defaults, rate-limit handling. Using it keeps the server stateless from an auth standpoint — no tokens in env vars.execFile, notexec. Arguments pass as array elements, not a shell string. Eliminates an entire category of injection bug when usernames or repo names contain unusual characters.- Audit log as append-only JSON. Up to 500 entries, then rolled. Cheap, readable, versionable.
- No frontend framework. Single-user admin tool — HTML/CSS/JS is enough.
Gotchas
Section titled “Gotchas”ghmust be installed and authenticated on the server. If the backend runs somewhere you haven’tgh auth login’d, everything silently returns 401s.- Destructive actions lack confirmation by default.
resetand bulk collaborator removal do exactly what they say — route them through a confirmation UI before production use. - Rate limiting inherits from
gh. Burst requests can trip GitHub’s secondary rate limits; the tool doesn’t add its own backoff. - Audit log is not cryptographic. It’s a JSON file the same process writes to — trivial to tamper. Good enough for “did I do that?” recall, not for anything legal.
See also
Section titled “See also”- projects/atrium — similar “one pane of glass for many things” philosophy