How it works
Everything Geld changes on GitHub, and nothing it doesn't.
02
Header counts exclude them
+93 −53, Files changed 12, the compare-page summary and the commit header are rewritten in place so they exclude hidden files, and prefixed with a gray 6 tests label. The label is always shown, even 0 tests, so you know the numbers were checked. Hovering it shows three rows: excluding tests, including tests and tests only. The originals are remembered and restored the moment Geld is switched off.
- Files changed6
Hover, tap or focus the label to see the breakdown.
04
Pull request lists get real numbers
On /pulls, the global pull request dashboard and search results, every row gets N tests +A −D excluding hidden files, with the same hover breakdown. Because list pages contain no diffs, the counts come from the same .diff file GitHub serves when you append .diff to a pull request URL. Rows are fetched a few at a time, only when scrolled near the viewport, and cached by the pull request's head commit. It can be switched off in the options.
Lists can also hide pull requests by author: add logins under Hidden authors (*[bot] covers every GitHub App such as dependabot[bot] or renovate[bot]) and those rows fold into a line that says how many by whom, with a Show to bring them back for the visit. And when GitHub's own file filter is active on a diff (by extension, viewed state or only files you own from CODEOWNERS), Geld leaves those files out of its counts too, which GitHub's header does not.
Add a controlled mode to Button
#128 opened 2 days ago by octocat
Fix focus ring on disabled toggles
#127 opened 3 days ago by hubot
05
Categories
Files are grouped into categories, each with its own switch. Tests is on by default; the rest are opt-in from the popup or the options page. A path is attributed to the first matching category, in this order:
- 01
Testson by default
Unit, integration and end-to-end tests, snapshots and test tooling.
- 02
Generatedopt-in
Lockfiles, build output and code produced by generators.
- 03
Vendoredopt-in
Third-party code copied into the repository.
- 04
Agent configopt-in
Instructions and configuration for AI coding agents.
- 05
Docsopt-in
Markdown, documentation folders and changelogs.
- 06
Tooling & CIopt-in
CI workflows, linters, formatters and build configuration.
- 07
Fixturesopt-in
Storybook stories, test fixtures, mock data and translation catalogues.
- 08
Trivial changesopt-in
Renames, mode changes, binary/deleted files, space/comment-only edits.
- 09
Large diffsopt-in
⚠️ Are you sure? Large diffs (1000+ lines) are often the real work.
With one category on, labels read 6 tests; with several, 9 hidden with the per-category split in the tooltip, chips in the bottom row (6 tests · 2 generated · 1 doc) and one panel per category in the file tree. Every pattern is listed on the patterns page, rendered from the same source the extension uses.
Two categories are different: Trivial changes and Large diffs are decided from the diff rather than from paths. Trivial changes are kinds of change: renames and permission changes with no edited lines, binary and deleted files, whitespace-only and comment-only edits. Large diffs (a thousand or more changed lines in one file) are kept apart on purpose: they are often where the real work is, so hiding them is a deliberate opt-in; by default Geld does the opposite and expands the ones GitHub collapses (Expand large diffs, in General). A file that a path category claims stays there; the rest is checked against the kinds you left on. Separately, the Hide comment-only lines setting works inside files that stay visible: changed lines that only add, remove or edit code comments (in a language Geld recognises) collapse into a row that says how many and shows them on click, and the header counts leave them out.
06
Repository rules
Repository rules decide where Geld runs, and read like a .gitignore for repositories. The last matching line wins, and matching is case-insensitive because GitHub treats owner and repository names that way. The popup's turn off for this repo / org actions append these rules for you.
acme/widgets # off in one repository
acme # off in the whole org (same as acme/*)
!acme/widgets # …but back on here; last match wins
* # off everywhere
!acme/* # …except this org: an allowlist07
Your patterns & categories
Every category can be opened to its advanced settings: untick any of its built-in pattern groups, or add extra patterns of your own. They use the same gitignore-style syntax as the built-in ones: a pattern without a slash matches a filename at any depth, a trailing slash matches a directory at any depth, ** spans directories, {a,b} expands alternatives, and !pattern rescues a path from that category. [owner/repo] headers scope the lines below them to matching repositories; [*] returns to global. The options page includes a path tester that shows which pattern decided.
You can also create categories of your own — a name, an icon and a list of patterns. Each gets a switch, its own panel in the file tree and its own count in the header, and is matched before the built-in categories.
*.golden # everywhere
!src/legacy/** # …but never inside src/legacy
[acme/*] # only in the acme organisation
fixtures/**/*.json
sandbox/
[*] # back to global
*.story.tsx08
Repository configs
A repository can carry its own Geld config for everyone who reviews it: commit .github/geld.yml to the default branch. It is versioned and reviewed like any other file, and whoever may merge there decides what it says; Geld stores nothing. An organisation puts its defaults in geld.yml at the root of its .github repository (acme/.github), and a repository's own file is layered on top.
The file uses the same keys as the settings document: categories switches categories on or off, groups built-in pattern groups, categoryPatterns adds patterns to a built-in category and customCategories defines new ones. Personal settings (enabled, repoRules, layout) are rejected. Repositories that mark files linguist-generated in .gitattributes feed the Generated category the same way, for free.
# .github/geld.yml
categories:
docs: true # hide docs here even for people who keep them
groups:
tests/snapshots: false # …but always show snapshot changes
categoryPatterns:
generated:
- src/api/__generated__/**
customCategories:
- id: custom:fixtures
title: Fixtures
icon: package
patterns:
- fixtures/**Because hiding is the whole point, a repository config is treated with care. Files it hides are counted and listed exactly like the ones your own patterns hide, the popup names whose config is in use, and a Repository configs setting decides whether they apply at all: always, ask once per repository (the default; the popup asks the first time and remembers your answer on that device) or never. Files are fetched through your own GitHub session, so private repositories work without any extra permission, and they are cached for half an hour.
09
Hide whitespace
Hide whitespace changes uses GitHub's own diff setting rather than a re-implementation. Geld first reads GitHub's persisted preference and does nothing if it is already on. If it is off, it flips GitHub's setting the way you would, through the diff-settings menu on the React view or the Apply and reload form on the classic view. GitHub remembers this for signed-in users, so it happens once. Signed-out users get the ?w=1 URL instead.
10
Keyboard shortcut
AltShiftT shows or hides the hidden files on the current page for the rest of the visit, without touching your settings. Rebind it in your browser's extension-shortcut settings, or turn it off in the options. The toolbar icon carries the hidden-file count as a badge, and the popup lists the hidden paths for the current tab.
Settings live in your browser's sync storage and can be exported as JSON. To share them between browsers, sign in with GitHub (device flow, gist scope only) and Geld keeps them in a secret gist on your own account; see the FAQ.
11
GitHub Enterprise Server
Add your server's hostname in the options. The browser asks you to allow Geld on that host, and the content script is registered there (Chrome, Edge and Safari via scripting, Firefox via contentScripts). Geld makes no requests to any host other than the GitHub hosts you have configured. GHES runs GitHub's UI a few versions behind, so if something looks off, please open an issue with a screenshot.