Every git repo on your machine, on your phone.
A self-hosted git dashboard: one small daemon on your computer, a live status grid, commit graph and real Monaco diffs on any screen you own.
A remote git client for an Android phone, an iPhone or any browser, and a self-hosted stand-in for GitHub Desktop when you are not at the machine. It drives your real local repos against any git remote: GitHub, GitLab, Bitbucket, Gitea, Forgejo, Cloudflare Artifacts or your own server.
โฌ Download ยท repoyeti.com ยท Features ยท Install ยท FAQ ยท Changelog
TL;DR
- ๐ก ย Every repo on the machine, live. Branch, dirty, ahead/behind for all of them, updating the moment something changes on disk. Fetch all in one tap.
- ๐ฟ ย A real commit graph, with lanes and merges, lazily paged, each commit carrying its files-and-lines delta. Drag it taller to read more at once.
- ๐ ย Real Monaco diffs, the actual VS Code editor: syntax highlighting, HEAD-โ-tree comparison, edit and save from the phone.
- ๐ ย Look before you pull. The incoming commits, the files they touch and the conflicts they would cause, without fetching or merging anything.
- ๐ค ย Smart Commit (AI) turns a messy working tree into clean, scoped commits. Bring your own key; a free Groq one takes three clicks.
- ๐ก๏ธ ย No force-push, no
reset --hard, no rebase. A phone is a bad place to rewrite history, so RepoYeti simply cannot. - ๐ ย Self-hosted, one file. No cloud account, no runtime to install, nothing written into your repos. Delete the binary and it is gone.
Download for your platform โ One file. Point it at a folder, open the QR code on your phone.
Features
One daemon, a whole workaround gone
Managing git on a machine you are not sitting at usually means assembling something: a VPN, an SSH client, a tmux session, a second git host. RepoYeti is one binary that makes the working tree you already have reachable from the device already in your hand.
Nothing is mirrored, uploaded, or re-hosted. RepoYeti shells out to the same git you already use, in the same working tree, as the identity you configured for that repository.
โญ Like it? Help it grow
Built in the open, free for personal use, no ads, and a once-a-day version check you can switch off. If RepoYeti earns a place on your machine, a few seconds goes a long way:
- โญ Star the repo - the clearest signal that this is worth maintaining.
- ๐ฌ Join the Discord - feature arguments, early builds, and somewhere to shout when something breaks.
- ๐ Open an issue - a good bug report is worth more than a star. #24 traced a broken release to the exact commit and got two fixes shipped.
Install
- Download your platform -
repoyeti-windows-x64.exe,repoyeti-linux-x64.tar.gzorrepoyeti-macos-arm64.tar.gz. - Run it. The dashboard is compiled into the binary, so there is no
webornode_modulesfolder to keep beside it.
repoyeti add-root ~/code # point it at where your repos live
repoyeti start # daemon on 127.0.0.1:7171
To reach it from your phone, which opens a Cloudflare tunnel and prints a QR code:
repoyeti start --tunnel
The tray icon comes with both downloads. The icon is drawn by a small separate launcher (
misc\RepoYeti-Tray.exe); the zip ships it beside the exe, and since 1.0.2 the single-filerepoyeti.execarries it inside the binary and writes it out beside its own state on first run, so either download gets you the icon, Quit and the auto-restart supervisor. (Before 1.0.2 the bare exe had none, and this line said so as though it were a decision.)misc\Create-Shortcut.ps1still makes a shortcut that launches through the tray host directly.
Signed. Starting with 1.0.1 the Windows executable, the tray launcher and the tray scripts are Authenticode-signed as LUNARWERX LLC through Azure Trusted Signing, and timestamped, so Windows names the publisher instead of warning about an unknown one. SmartScreen still rates new signing identities on reputation, so a very early download may show a prompt that now says who published it. Every release also publishes a
SHA256SUMS.txt.
--tunnelneedscloudflaredonPATH; it is not bundled, in a release or a clone. Check withcloudflared --version. If it is missing, RepoYeti says so and keeps serving locally. Sign-in over a tunnel returns through RepoYeti's registered callback atapp.repoyeti.com; your dashboard and git traffic never pass through it. See Remote access.
Release binary vs. running from a clone
git clone https://github.com/LunarWerxs/RepoYeti.git
cd RepoYeti
bun run install:all # daemon deps + dashboard deps (web/ is a separate package)
bun run --cwd web build:fast # compile the dashboard into web/dist
bun run src/index.ts add-root ~/code
bun run src/index.ts start
The repo has two dependency sets and the dashboard is compiled into the release rather than committed, so a fresh clone has to build it once. Without that step the daemon starts and serves web app not built.
Update cooldown. Set autoUpdateCooldownDays (0 to 30, through PUT /api/settings or ~/.repoyeti/config.json) and the auto-update timer only announces or installs an update at least that many days old: a release's GitHub publication date, or a clone's newest remote commit date. A bad or compromised release then has that long to be caught before your machine takes it. A manual check or install ignores it. A clone waits for the branch tip itself to age, so a branch that moves every day never clears a long cooldown.
AI setup: a free Groq key in 3 clicks
Smart Commit and AI commit messages are bring-your-own-key. There is no bundled key, because Groq revokes any key committed to a public repo. Groq is the suggested provider: free, fast, about thirty seconds.
- Open console.groq.com/keys and sign in.
- Click Create API Key, then Copy.
- In the app, open Settings โ AI, expand Groq, and paste it in.
"Generate" lights up right away. Prefer OpenAI, Claude, Gemini, OpenRouter or DeepSeek? Add that key in the same place instead. Your key never leaves the daemon; it is kept in your OS keychain and sent only to the provider it belongs to.
How it works
your phone โโHTTPSโโโบ Cloudflare tunnel โโโบ โ
โ
your browser โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโบ โโโโบ repoyeti daemon
โ 127.0.0.1:7171
an AI agent โโMCP (approval-gated)โโโโโโโโโโโโบ โ (one compiled binary,
dashboard embedded)
โ
bun:sqlite โโโโโโโโโโโผโโโโโโโโโโบ simple-git
(~/.repoyeti/) โ (your real git)
โผ
your working tree,
exactly where it already is
Bun, bun:sqlite, Hono and simple-git on the daemon; a Vue 3 + Tailwind PWA on the front end, compiled into the binary. Sign-in is "Sign in with Connections" (OIDC / PKCE, zero setup) and is entirely optional. A pluggable VCS backend also supports Lore behind REPOYETI_LORE=1.
The rules
No force-push, no reset --hard, no rebase - those live at your desk. Pulls are fast-forward-only. Everything runs as the git identity you set for that repository. Local state stays in ~/.repoyeti/; nothing is written into your repos.
Privacy
Nothing is mirrored or uploaded. Git traffic goes to your own remotes with your own credentials, and cloud sign-in and settings sync are off by default - core git management works fully self-hosted and offline, with no LunarWerx account.
The daemon pings Connections Studio for update checks, at most once a day. That ping carries a random install id, the running version, and a coarse OS tag (e.g. win11-26100). From that request the server also derives and stores a coarse location (country, region, city, timezone), your network's ASN, locale, and a truncated user agent - but never an IP address. It never sends a hostname, username, file path, account, or anything about your repos.
Set REPOYETI_NO_PING=1 to opt out entirely.
If you use AI Smart Commit, AI commit messages or AI conflict resolution, the changed file list and diff (or the conflicted text) goes to the AI provider you configured, under your key, and only when you press the button. Optional settings sync sends dashboard preferences - never code, credentials or paths - to Connections.
More
- AI agents (MCP):
repoyeti mcpexposes local repos, a blame-based "which unpushed commit does this change fix?" lookup (fixup_base), accepted collaboration status/diffs and guarded remote commit+sync; the full HTTP surface is atGET /api/openapi.json. - Buzz (experimental, Advanced): opt-in Git Smart HTTP compatibility, saved communities, and daemon-safe preflight diagnostics. Setup and security boundaries.
- Open a local dev server from your phone (opt-in): turn on
portProxyand/proxy/<port>/opens whatever is listening on that port through the dashboard's own sign-in, owner only. How it is fenced. - Architecture, remote access, config: docs/ARCHITECTURE.md
- Contributing & tests: docs/CONTRIBUTING.md
- Working here with an AI agent: AGENTS.md - repo map, the enforced guardrails, and the traps that have cost a release.
FAQ
Free to download, self-host and run for any purpose the PolyForm Noncommercial License 1.0.0 permits - personal projects, research, education, and non-profit use.
Commercial use needs a licence: US$79 per installation, meaning per machine running the daemon (the phones and browsers you read it on are not counted). It is perpetual and includes 12 months of updates; after that your copy keeps working and new builds need a renewal. Checkout is handled by Connections, so that is the name on the receipt. Volume pricing for a team is available - ask on Discord. Full terms: repoyeti.com/pricing.md.
Nothing is ever time-limited or feature-gated, in either case. Your chosen AI provider may charge for Smart Commit usage.
Yes, for local repo work. Browsing repos, reading commit history and diffing need no internet connection and no account. Fetching or pushing still needs whatever network access that remote requires, and reaching the dashboard from your phone needs a Cloudflare tunnel.
Prebuilt binaries cover Windows, Linux, and macOS on Apple Silicon. On Windows the release is a single .exe with no runtime to install, plus an optional system-tray build. Running from a clone instead needs Bun 1.1 or newer and git on PATH. Remote phone access additionally needs cloudflared installed separately; RepoYeti detects and reports if it is missing.
GitHub Desktop is a desktop app, not something you open on a phone. The GitHub mobile app browses and reviews repos hosted on github.com, but never drives git in a local working tree. RepoYeti runs on your machine, shells out to your real local git via simple-git, and puts that same working tree on your phone.
Not to us. Git traffic goes to your own remotes with your own credentials. AI features send the diff to the provider you configured, under your key, only when you trigger them. Beyond that there is a once-a-day anonymous version check - see Privacy for the exact contents and the opt-out.
Some key is required, since RepoYeti ships none (Groq revokes any key committed to a public repo). Groq is free and takes about three clicks from Settings โ AI. OpenAI, Claude, Gemini, OpenRouter and DeepSeek work too. Keys live in your OS keychain, are never shown to the dashboard, and are sent only to the provider they belong to.
By design. Force-push, reset --hard and rebase are not implemented at all - a phone is a bad place to rewrite history, and an accidental tap there is unrecoverable. Pulls are fast-forward-only and stop rather than merge when a branch has diverged. None of this limits your desktop git client; RepoYeti just will not run those commands remotely.
What it does offer for a wrong tap is Undo last git action (the repo card's โฎ menu, or repoyeti undo|redo <repo> [--dry-run]). It reads the repository's reflog, so it also covers a commit or pull made outside the app: a branch switch is switched back, a commit is stepped back with its changes left staged, and a pull is stepped back only when no uncommitted edit would be touched. A commit that is already on a remote, or a rebase or cherry-pick, is refused rather than undone.
Yes, from 1.0.1 onward. repoyeti.exe, the tray launcher RepoYeti-Tray.exe and the tray PowerShell scripts are Authenticode-signed as CN=LUNARWERX LLC through Azure Trusted Signing and RFC-3161 timestamped, so the signature stays valid after the (deliberately short-lived) certificate expires. Right-click the exe, Properties, Digital Signatures to see it.
Signing is about who published the file. Integrity is handled separately and was already in place: every release publishes SHA256SUMS.txt, and the automatic updater fetches that manifest first, refuses a release that has no verifiable checksum, stream-hashes the download and deletes it on mismatch, and makes the new binary report the expected version before swapping it in.
More from LunarWerx
RepoYeti is one of the developer tools LunarWerx Studios builds. These are on GitHub too, most of them free for personal use and running on your own machine:
Everything else is at lunarwerx.com and github.com/LunarWerxs.
Credits
Monaco for the diffs ยท Bun and Hono for the daemon ยท simple-git for every git call ยท Vue 3 and Tailwind for the dashboard ยท cloudflared for the tunnel ยท file-type icons from vscode-icons (artwork under CC BY-SA).
License
PolyForm Noncommercial 1.0.0 ยฉ LunarWerx Studios, starting with RepoYeti 1.0.0. The source is available and free for noncommercial use; commercial use is US$79 per installation (buy ยท terms). Earlier MIT grants remain in effect for earlier copies - see licensing details.