- Graph view: See branches, tags, and uncommitted changes in one graph
- History recovery: Keep detached HEAD visible and optionally discover unreachable commits
- Commit details: Click a commit to see message, files, and diffs
- Branch actions: Create, checkout, rename, delete, and merge
- Tag actions: Create, push, view details, and delete locally or on selected
remotes; signed tags are marked with a verified badge in the graph
- Tag types: lightweight tags are a plain ref with no tag object, so they are
unsigned by definition and carry no message; annotated tags follow your git
signing configuration (
tag.gpgSign,user.signingkey,gpg.format) and may have an optional message
- Tag types: lightweight tags are a plain ref with no tag object, so they are
unsigned by definition and carry no message; annotated tags follow your git
signing configuration (
- Commit actions: Checkout, cherry-pick, revert, and reset
- Avatar support: Optional avatars from GitHub, GitLab, or Gravatar
- Multi-repo: Work with multiple repositories and declared Git submodules in
one workspace; reload the extension after changing
.gitmodules - Devcontainer ready: Works in remote and container environments
- Internationalization: English, Dutch, Polish, zh-CN, and zh-TW
The original Git Graph by mhutchie left the MIT license in May 2019 — everything after commit 4af8583 is under more restrictive terms. This fork descends from that last MIT commit via asispts/neo-git-graph and adds devcontainer support, internationalization, and a modernized codebase and toolchain.
From version 1.0.0 the project is licensed under the GNU AGPL-3.0-or-later. Copyleft guarantees this fork stays open: anyone may redistribute or build on it, but every distributed or network-hosted derivative must keep its complete source available under the same terms. See docs/LICENSING.md for the full licensing strategy and provenance.
Marketplace listings are coming soon — this fork has not been published yet. Once it is, it will be available from:
- VS Code Marketplace: link to follow after publication
Until then, you can build and install it locally: pnpm install, package the
bundled extension with pnpm exec vsce package --no-dependencies, then in VS
Code run Extensions: Install from VSIX....
All settings use the git-graph-libre prefix.
| Setting | Default | Description |
|---|---|---|
autoCenterCommitDetailsView |
true |
Center commit details when opened |
dateFormat |
"Date & Time" |
"Date & Time", "Date Only", or "Relative" |
dateType |
"Author Date" |
"Author Date" or "Commit Date" |
dialog.merge.noFastForward |
true |
Pre-check "no fast-forward" in merge dialogs |
dialog.pullBranch.noFastForward |
false |
Pre-check "no fast-forward" in the pull dialog |
fetchAvatars |
false |
Fetch avatars (sends email to external services) |
graphColors |
12 defaults | Colors for graph lines |
graphStyle |
"rounded" |
"rounded" or "angular" |
initialLoadCommits |
300 |
Commits to load on open |
loadMoreCommits |
100 |
Commits to load on demand |
maxDepthOfRepoSearch |
0 |
Folder depth for repo search |
repository.boldCheckedOutCommit |
false |
Bold the checked-out commit's message |
repository.fetchTagsByDefault |
true |
Pre-check "Fetch all tags" in the Fetch dialog |
repository.includeReflog |
false |
Include commits referenced only by reflogs |
repository.includeUnreachableCommits |
false |
Scan for unreachable commits in Show All |
repository.muteMergeCommits |
false |
Mute merge commit messages (opt-in) |
showCurrentBranchByDefault |
false |
Show only current branch on open |
showStatusBarItem |
true |
Show status bar button |
showUncommittedChanges |
true |
Show uncommitted changes node |
telemetry.enabled |
"unset" |
unset / enabled / disabled — see below |
tabIconColorTheme |
"color" |
"color" or "grey" |
This extension can send anonymous usage data so development can be aimed at
the features people actually use. It asks first and sends nothing until you
answer. It is a hobby project with no company behind it, and the data goes to a
small self-hosted service at t.plohnensoftware.download — never to a
third-party analytics provider.
What is sent
- Which command or action ran (for example
pushTag), and whether it succeeded. - Once per session: whether a feature that works by showing something was actually in effect — recovered history (reflog-only or unreachable commits) appearing in the graph, a signed tag being there to badge, a discovered Git submodule appearing in the repository dropdown, or the graph actually being opened on one. These are recorded once, not once per refresh, and each is a yes/no about the feature: the repository paths behind the submodule answers are compared inside the extension and never leave it, so nothing is sent about which repositories or submodules you have.
- Once per session: the language Visual Studio Code is running in and which of this extension's translations served you — so missing translations can be spotted, since a mismatch between the two is a request nobody has answered.
- Once per session: which settings you have changed from their defaults — only that they were changed, never what you changed them to.
- The properties Visual Studio Code attaches to every extension telemetry event: extension and VS Code version, product (Code, Insiders, VSCodium, Cursor), whether this is a new installation, and anonymized machine, session, and device identifiers generated by VS Code itself.
- Your operating system, processor architecture, and the numeric part of your
OS version (
linux/x64/7.2.2, with any build or distribution suffix stripped). Visual Studio Code does not attach these itself, so the extension adds them.
What is never sent
File names, file paths, workspace or folder names, repository names, git remote URLs, branch names, tag names, commit hashes, commit messages, author names, email addresses, environment variables, credentials, or your list of installed extensions.
What the receiving service stores
The list above is also the complete list of what is kept. The service at
t.plohnensoftware.download is a small self-hosted ingest — two containers, one
table, no dashboard, no third party — and it writes that payload plus a
timestamp of its own. It adds nothing else about you:
- No IP address. It is never read, never logged, and never hashed, and there is no column it could be stored in. Avoiding the automatic IP geolocation that hosted analytics products apply was the main reason to self-host at all, so no country, region, city, or network operator is attached to anything you send.
- No request headers, user agent, cookies, or referrer. Nothing outside the JSON body is read. The endpoint has no login and no session, so there is not even a token that could tie two of your requests together.
- No access log. The server logs startup, shutdown, and database failures. It never logs a request body, an address, or a property value.
- No names, email addresses, or accounts. Nothing in the system has a user account for one to belong to.
- Nothing joinable to another dataset. No install token, no license key, no cross-service identifier. A copy of the database, on its own, joins to nothing.
The closest thing to an identifier is the anonymized machine id Visual Studio Code generates. It is what makes how many installations use a feature answerable rather than just how many clicks happened, and actions are grouped by it when reading the data. It is not derived from your hardware, your hostname, or your user name; it is shared across all your extensions rather than specific to this one; and it resets if you reinstall your operating system. With no IP address and no log stored beside it, there is no second field to work back through to a person.
The server is open source, and its schema is the full list of what it is even able to store: git-graph-libre-telemetry-server.
Important
Even though I believe this data could help me to allocate my time better and I find it useful,I prioritize users so please only accept telemetry if you feel comfortable with it. This is also a reason why extention requests your action to take a educated decision about it.
Nothing is sent until you say so
git-graph-libre.telemetry.enabled has three states and starts at unset:
| State | What happens |
|---|---|
unset |
Nothing is sent. The default — no answer is not a yes. |
enabled |
Feature-usage data is sent, subject to the switch below |
disabled |
Nothing is sent. |
The extension asks once when it activates, and again whenever you open the
graph, until you answer. Closing the notification without choosing is not an
answer: the state stays unset and nothing is sent.
While the question is open the graph is not shown — you get a screen saying
what is being waited for, with a Set now button that brings the
notification back if you dismissed it. Answer it either way and the graph
opens; disabled is a complete answer and costs you nothing.
Visual Studio Code's own telemetry.telemetryLevel setting always wins on top
of that: while it is off, nothing is sent no matter which state the setting
above is in. If you accept while that switch is off, the extension says so and
offers to open the setting rather than storing a preference that cannot take
effect.
Run code --telemetry to see the full declaration of what this extension
collects, alongside every other extension you have installed.
GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later) — see
LICENSE. This fork incorporates MIT-licensed material from the
original Git Graph lineage; the required MIT notices and per-era contributor
rosters are preserved in LICENSE.mit and credited in
NOTICE.md.
This project is not affiliated with or endorsed by the original Git Graph project or its maintainer.