Skip to content

AngKorGit · Git client for macOS, Windows, Linux A native Git client for everyday work.

I got tired of Git clients that were secretly browsers. This one is native, Rust and libgit2 underneath, and it does the things you do every day without asking for an account or a subscription first.

Free. MIT. No telemetry. Updates itself.

init

Why I made this

I use Git all day, on a Mac that I like, and every client I tried felt like a website wearing a coat. Slow to open, heavy on disk, a login screen before the first commit. The command line was faster, but a good graph and a proper conflict view are worth having.

So in August 2026 I started writing one. The engine is libgit2 through Rust, the window is the system webview, and the rule for what gets in is simple: if GitKraken has a hundred features, I want the twenty-five that matter, done properly.

The rest of this page is laid out like a history. Newest commit on top in the graph, oldest first as you scroll. The line on the left fills as you read.

Conflicts

Conflicts you can read.

Both sides in one view, with line numbers on each so you can talk about line 43 with a colleague. One checkbox takes a whole side. Hover a line and a plus takes just that one.

The result pane is an editor. Click a line and type. Nothing touches the file until you press Mark resolved, and the markers are guarded so you can't save half a conflict by accident.

Resolve conflicts drawGraph.ts src/features/graph 1 of 1 resolved Mark resolved
A main Current
1import { render } from './renderer';
2
3export function drawGraph(rows: Row[]) {
Conflict 1
4 const palette = useThemePalette();
5 return render(rows, { palette, animate: true });
6}
7
B feature/lane-colors Incoming
1import { render } from './renderer';
2
3export function drawGraph(rows: Row[]) {
Conflict 1
4 const colors = legacyColors();
5 return render(rows, { colors });
6}
7
Result Conflict 1 of 1 Ready to mark resolved — click any result to edit it Reset
1 import { render } from './renderer';
2
3 export function drawGraph(rows: Row[]) {
4 const palette = useThemePalette();
5 return render(rows, { palette, animate: true });
6 }
7

New in 0.10

Two branches, two folders, one window.

A worktree is a second checkout of the same repository in a sibling folder. Run a hotfix or an AI agent there while your real work sits untouched. No stash, no "let me just commit this WIP".

The sidebar lists every worktree with its branch and whether it has changes. Each opens as its own tab. Try to check out a branch that's already open in another folder and it takes you there instead, the same way git refuses on the command line.

angkorgit
angkorgit (demo) main Fetch Pull Push 2
Search commits…
Filter author…
200+ commits
Branch / tagGraphMessageAuthorHashDate
// WIP 6 uncommitted changes 1 conflicted 2 staged 4 modified View changes
main feat(graph): virtualize commit rows Sokha Chan 000190a 1y ago
fix(diff): handle renamed files in word diff Dara Kim 00018fa 1y ago
v0.4.0 refactor(core): extract lane allocator Maly Sok 00018ea 1y ago
perf(history): lazy-load decorations Sokha Chan 00018da 1y ago
Merge branch 'feature/lane-4' Dara Kim 00018ca 1y ago
fix(remote): retry ssh agent auth once Maly Sok 00018ba 1y ago
docs: update architecture overview Sokha Chan 00018aa 1y ago
feature/diff-viewer test(conflicts): cover diff3 markers Dara Kim 000189a 1y ago
style(inspector): tighten spacing rhythm Maly Sok 000188a 1y ago
feat(ai): provider registry + adapters Sokha Chan 000187a 1y ago
feat(graph): virtualize commit rows Dara Kim 000186a 1y ago
fix(diff): handle renamed files in word diff Maly Sok 000185a 1y ago
refactor(core): extract lane allocator Sokha Chan 000184a 1y ago
Merge branch 'feature/lane-3' Dara Kim 000183a 1y ago
feat(stash): quick apply from sidebar Maly Sok 000182a 1y ago
fix(remote): retry ssh agent auth once Sokha Chan 000181a 1y ago
main ↑2 6 changes 100% v0.17.0

New worktree

A second folder for this repository with its own checked-out branch. Work on two things at once without stashing, and keep every commit in the same history.

New branch Existing branch
feature/parallel-task

Starts from main.

/Users/demo/projects/angkorgit-new

Created next to the repository by default. The folder must not exist yet.

Open it in a new tab
Cancel Create worktree

Graph

Drag a branch onto another. That's the merge.

The graph is virtualized, so a hundred thousand commits scroll like fifty. Ref chips show the whole name or fold behind a count, never half a word. Paste a hash into the search and it jumps there.

Merges from the app are always real merge commits. Right-click does what you'd expect, and ⌘Z undoes the merge if you picked the wrong branch.

angkorgit
angkorgit (demo) main Fetch Pull Push 2
Search commits…
Filter author…
200+ commits
Branch / tagGraphMessageAuthorHashDate
// WIP 6 uncommitted changes 1 conflicted 2 staged 4 modified View changes
main feat(graph): virtualize commit rows Sokha Chan 000190a 1y ago
fix(diff): handle renamed files in word diff Dara Kim 00018fa 1y ago
v0.4.0 refactor(core): extract lane allocator Maly Sok 00018ea 1y ago
perf(history): lazy-load decorations Sokha Chan 00018da 1y ago
Merge branch 'feature/lane-4' Dara Kim 00018ca 1y ago
fix(remote): retry ssh agent auth once Maly Sok 00018ba 1y ago
docs: update architecture overview Sokha Chan 00018aa 1y ago
feature/diff-viewer test(conflicts): cover diff3 markers Dara Kim 000189a 1y ago
style(inspector): tighten spacing rhythm Maly Sok 000188a 1y ago
feat(ai): provider registry + adapters Sokha Chan 000187a 1y ago
feat(graph): virtualize commit rows Dara Kim 000186a 1y ago
fix(diff): handle renamed files in word diff Maly Sok 000185a 1y ago
refactor(core): extract lane allocator Sokha Chan 000184a 1y ago
Merge branch 'feature/lane-3' Dara Kim 000183a 1y ago
feat(stash): quick apply from sidebar Maly Sok 000182a 1y ago
fix(remote): retry ssh agent auth once Sokha Chan 000181a 1y ago
main ↑2 6 changes 100% v0.17.0
feature/diff-viewer

Keyboard

⌘K, then type.

Every command in the app is in the palette, including the ones buried in a right-click menu. Shortcuts are printed next to the menu items so you learn them by using the mouse.

⌘Z undoes, ⌘⇧Z redoes, ⌘B hides the sidebar, [ and ] move between files in a diff. The Escape key closes exactly one thing at a time.

angkorgit
angkorgit (demo) main Fetch Pull Push 2
Search commits…
Filter author…
200+ commits
Branch / tagGraphMessageAuthorHashDate
// WIP 6 uncommitted changes 1 conflicted 2 staged 4 modified View changes
main feat(graph): virtualize commit rows Sokha Chan 000190a 1y ago
fix(diff): handle renamed files in word diff Dara Kim 00018fa 1y ago
v0.4.0 refactor(core): extract lane allocator Maly Sok 00018ea 1y ago
perf(history): lazy-load decorations Sokha Chan 00018da 1y ago
Merge branch 'feature/lane-4' Dara Kim 00018ca 1y ago
fix(remote): retry ssh agent auth once Maly Sok 00018ba 1y ago
docs: update architecture overview Sokha Chan 00018aa 1y ago
feature/diff-viewer test(conflicts): cover diff3 markers Dara Kim 000189a 1y ago
style(inspector): tighten spacing rhythm Maly Sok 000188a 1y ago
feat(ai): provider registry + adapters Sokha Chan 000187a 1y ago
feat(graph): virtualize commit rows Dara Kim 000186a 1y ago
fix(diff): handle renamed files in word diff Maly Sok 000185a 1y ago
refactor(core): extract lane allocator Sokha Chan 000184a 1y ago
Merge branch 'feature/lane-3' Dara Kim 000183a 1y ago
feat(stash): quick apply from sidebar Maly Sok 000182a 1y ago
fix(remote): retry ssh agent auth once Sokha Chan 000181a 1y ago
main ↑2 6 changes 100% v0.17.0
Type a command or branch name…
Actions
File history…
Pull
Push
Fetch (with tags)
Create branch…
New worktree…
Create tag…
Stash changes…

Native

Native, not a browser.

Most Git clients are a website wrapped in its own copy of a browser, which is why they take a moment to open and sit heavy on the disk. AngKorGit draws its window with the webview your OS already ships, and talks to the repository through libgit2 in the same process. It opens quickly, updates itself, and stays out of the way.

Engine
Rust and libgit2, no shelling out for the things you do all day.
100k commits
The graph and diffs are virtualized. Long histories scroll like short ones.
Cold start
Open, splash, repo. The repository is read in process, no daemon to wait for.

Spec sheet

Everything in the box

The whole list, in plain words. If it isn't here, it isn't in the app.

Every day

  • Stage files, hunks, or single lines
  • Commit with summary and description, drafts saved per repository
  • Amend, revert, reset (soft, mixed, hard)
  • Undo and redo for commits, checkouts, merges, rebases
  • Working copy watcher, so the WIP row is always right
  • Auto fetch in the background

Branches

  • Branch folders in the sidebar
  • Drag one branch onto another to merge or rebase
  • Interactive rebase: reorder, squash, reword, drop
  • Cherry-pick one or many, with the origin reference
  • Worktrees: list, create, remove, prune
  • Stashes, tags, submodules

Reading changes

  • Inline or side by side, word level highlighting
  • Whole file view, image diffs, a minimap you can click
  • Previous and next change, previous and next file
  • Commit search by text, author, branch, or hash
  • File history
  • Commit details with parents, refs, and per-file counts

Remotes and accounts

  • Fetch, pull, push, with the credential chain git itself uses
  • SSH keys and access tokens. Several accounts on one host
  • Identity profiles stored per repository, never in the global gitconfig
  • Pull requests: list, check out, create, pick reviewers (GitHub, GitLab, Bitbucket)
  • Commit signing through your existing git config (SSH or GPG)

Conflicts

  • Both sides aligned, line numbers on each
  • Take a side, a block, or one line
  • Edit the result in place, or the whole file
  • AI explanation of a conflict on request

The rest

  • ⌘K palette with every command, shortcuts shown next to menu items
  • 16 themes, dark and light, five accents
  • Built-in terminal per repository
  • Real confirmation dialogs before anything destructive
  • Signature-verified updates from GitHub releases

And not

What I left out, on purpose

In-app pull request review
The forge does this better, with CI logs and suggestions. There is an Open in browser button.
Telemetry, accounts, a cloud
Nothing phones home. There is nothing to sign up for.
A blame view
File history is there. Line-level blame is on the list.
A plugin marketplace
Not yet. The palette and sidebar are list driven, so it is possible later.

AI, optional

Uses the AI you already have.

AngKorGit doesn't ship a model or a token wallet. If you've got Claude Code, GitHub Copilot CLI, Codex, Gemini CLI, OpenCode or Antigravity installed, it finds the binary and uses your own login and quota. No key to paste.

Or point it at an API key, or at Ollama on your own machine. Whatever you pick, requests go straight from your computer to that provider. There is no server of mine in between.

What it's used for: a commit message from the staged diff, a plain-language explanation of a commit or a conflict, a review of what you're about to commit, and a pull request description. Every one of those has a Stop button.

Settings · AI Reachable

Detected on this machine

  • >_ Claude Code CLI you already log into In use
  • >_ GitHub Copilot CLI CLI you already log into
  • >_ Codex CLI you already log into
  • >_ Gemini CLI CLI you already log into
  • >_ OpenCode CLI you already log into

Or a provider

  • OpenCode · CLI you already log into
  • Anthropic · API key
  • OpenAI · API key
  • Gemini · API key
  • Ollama · local, no key
  • LM Studio · local, no key

Commit message style

Conventional feature/* → feat(scope):

Install · v0.17.0

Pick your platform.

Every build is compiled in public by GitHub Actions from the source you can read, and the app checks for the next version itself.

Mac with Homebrew

terminal
brew install --cask cheat2001/tap/angkorgit
  • macOS

    Intel and Apple Silicon, one file

    AngKorGit_0.17.0_universal.dmg

    Not signed with an Apple certificate, so macOS asks once. Right-click, Open, or use Homebrew below and it never asks.

    Download
  • Windows

    x64 installer

    AngKorGit_0.17.0_x64-setup.exe

    SmartScreen will say the publisher is unknown. More info, then Run anyway. An .msi is on the releases page too.

    Download
  • Linux

    AppImage, .deb and .rpm

    AngKorGit_0.17.0_amd64.AppImage

    chmod +x and run. Needs WebKitGTK 4.1 and libssl, which most desktops already have.

    Download
Install from the terminal without Homebrew
macOS
curl -L https://github.com/cheat2001/angkorgit/releases/download/v0.17.0/AngKorGit_0.17.0_universal.dmg -o ~/Downloads/AngKorGit.dmg
xattr -cr ~/Downloads/AngKorGit.dmg
open ~/Downloads/AngKorGit.dmg
Windows (PowerShell)
curl -L https://github.com/cheat2001/angkorgit/releases/download/v0.17.0/AngKorGit_0.17.0_x64-setup.exe -o "$env:TEMP\AngKorGit-setup.exe"
Start-Process "$env:TEMP\AngKorGit-setup.exe"
Linux
curl -L https://github.com/cheat2001/angkorgit/releases/download/v0.17.0/AngKorGit_0.17.0_amd64.AppImage -o ~/Downloads/AngKorGit.AppImage
chmod +x ~/Downloads/AngKorGit.AppImage
~/Downloads/AngKorGit.AppImage

Something odd on first launch? The getting started page walks through each prompt. All versions are on the releases page.

Questions

Things people ask me

Anything else, open an issue. I read them all.

AngKorGit or Angkor Git?
One word, AngKorGit. People also write Angkor Git, angkorgit or GitAngkor, and they all mean this app. angkorgit.app is the only official site, and the code lives on GitHub under cheat2001/angkorgit.
Is it really free?
Yes. MIT licensed, the whole source is on GitHub, and there is no paid tier hiding behind a feature. If it saves you time and you feel like it, there is a coffee link in the footer.
Why does macOS warn me on first launch?
The build isn't signed with an Apple developer certificate yet, so Gatekeeper asks once. Right-click and Open, or install through Homebrew, which clears the flag for you. After that the updater handles new versions and verifies each one with a signature.
Does it send anything anywhere?
No telemetry, no crash reporting, no account. The only network traffic is git itself, the update check against GitHub releases, and whatever AI provider you choose to enable.
How does it compare to GitKraken or Fork?
Faster to open, lighter, and narrower on purpose. GitKraken took the workflow ideas further than anyone and I learned from it, but I wanted the twenty-five features that matter rather than the hundred. Fork is closer in spirit, though it is not open source and not on Linux.