Source control for every repository you work on, side by side.
Commit, stage hunks, switch branches and keep everything in sync, across all your projects, from one window.
Download · Features · Install · Development
If you keep several editor windows open just to watch the Source Control panel of each project, RepoDeck puts all of them in one place. Point it at a folder of projects and every repository shows up as a panel with its changes, commit box, branches and history graph, plus a dashboard of what's happening across all of them. It watches the filesystem, so there is nothing to refresh.
- Folders of projects become sections that open and close; new projects (
git init,git clone) appear by themselves and deleted ones disappear. - Commit exactly what you check. Ctrl+Enter commits the checked files and leaves everything else, including other staged work, untouched. Ctrl+Shift+Enter commits and pushes.
- Stage, unstage or discard hunk by hunk, discard files (new files go to the Trash), and ignore a file, its extension or its folder from the right-click menu.
- Branch pill: switch branches, check out remote ones or create a new one by typing its name.
- History graph of all branches, remotes and tags. Click a commit to list its files with status letters, then click a file for its diff. Search by message, author, hash or file name.
- Stash and apply, abort a merge or rebase, open on GitHub or create a pull request, pin favourites to the top.
Side by side or unified, with syntax highlighting, aligned lines, changed words highlighted and Alt+↑/↓ to jump between changes.
Commits and lines over 30 days, streaks, when commits happen (weekday × hour), languages, the most changed files, contributors (with one person's different names and emails merged), branches, open pull requests and recent workflow runs.
- Background fetch every 5 minutes (configurable). It never prompts; anything that needs a password or a host-key check fails quietly and shows ⚠.
- Auto-pull touches only the branch you're on, and only fast-forwards. Uncommitted work is kept; if incoming commits change a file you're editing, it waits (pull pending) and retries once that file is committed or reverted. With unpushed commits and new remote ones it does nothing in the background (syncs on push).
- Push fetches first, then fast-forwards or replays your commits on top (
rebase --autostash). On a conflict it puts everything back and tells you, so nothing half-done is left behind. - Auto-pull can be switched off globally or per folder (for example, for work repositories).
- Home: what's uncommitted, what needs pushing or pulling (with a Push button), commits over the last two weeks, pull requests waiting on you, failing CI and dev servers running from your projects, under a pixel-art coast that follows the time of day.
- Activity logs what RepoDeck did on its own (pulls, fetch problems, new projects, CI failures) and every action you ran.
- Notifications when the window is in the background; Start on Login; a quiet, near-zero CPU footprint when idle.
Download the latest release for your platform from Releases:
| Platform | File | Updates |
|---|---|---|
| Linux | RepoDeck-x.y.z.AppImage (make it executable and run it) |
Automatic |
| Linux (Debian, Ubuntu) | repodeck_x.y.z_amd64.deb |
In-app prompt to download |
| macOS (Apple Silicon / Intel) | RepoDeck-x.y.z-arm64.dmg / RepoDeck-x.y.z.dmg |
In-app prompt to download |
| Windows 10/11 | RepoDeck-Setup-x.y.z.exe |
Automatic |
RepoDeck needs git on your PATH. Optional: the GitHub CLI (gh auth login) for pull requests and CI on Home, and VS Code's code command for opening files.
Note
The macOS app isn't signed with an Apple Developer ID. The first time, right-click RepoDeck in Applications and choose Open (or run xattr -dr com.apple.quarantine /Applications/RepoDeck.app). Windows may show a SmartScreen prompt for the same reason.
Then click Add Folder (Ctrl+O), or drag folders onto the window: a repository, or a folder that contains several.
Every change that lands on main is released automatically, and RepoDeck tells you about it:
- Within 15 minutes of a release (or right away with Check for Updates in ☰ or Preferences), a card appears: RepoDeck x.y.z is available, with what changed.
- Update downloads it in the background, with progress. The sidebar shows an Update badge until it's installed.
- It installs the next time you quit RepoDeck, or right away with Restart Now (you're asked first if a commit message is still unsent).
Prefer not to be asked? Turn on Preferences → Updates → Install Updates Automatically: new versions download in the background and install when you quit. Check for Updates Automatically can be switched off too; Check Now always works.
Windows and the AppImage install updates themselves. The unsigned macOS app and the .deb show Download, which opens the new release.
| Action | Shortcut |
|---|---|
| Add a repository or folder | Ctrl+O |
| Refresh everything (including GitHub) | F5 or Ctrl+R |
| Commit the checked files / commit and push | Ctrl+Enter / Ctrl+Shift+Enter |
| Next / previous change in a comparison | Alt+↓ / Alt+↑ |
| Context menu on a changed file | right-click, Shift+F10 or the Menu key |
| Preferences | Ctrl+, |
On macOS, use ⌘ instead of Ctrl.
Settings and the folder list, a cache of git and GitHub results, and the activity log are stored locally:
| Linux | macOS | Windows | |
|---|---|---|---|
| Settings | ~/.config/repodeck |
~/Library/Application Support/RepoDeck |
%APPDATA%\RepoDeck |
| Cache | ~/.cache/repodeck |
…/RepoDeck/Cache |
…\RepoDeck\Cache |
| Activity log | ~/.local/state/repodeck |
…/RepoDeck/State |
…\RepoDeck\State |
RepoDeck has no telemetry. It talks to the network only through your own git fetch/pull/push, the gh CLI (when installed) and the update check against GitHub Releases. It only ever touches repositories you've added.
Requires git, Node.js 22+ and pnpm.
pnpm install
pnpm dev # the app with hot reload
pnpm test # unit tests against real temporary git repositories
pnpm e2e # Playwright drives the built app (Linux: under Xvfb)
pnpm typecheck
pnpm dist # installers for the current platform, in release/scripts/project-action.sh <setup|start|check|test|lint|build> runs the common development tasks from one place; --help lists them and --dry-run prints the commands without running them.
On Linux you can also run it straight from a checkout: ./install.sh adds a repodeck command and an app-menu entry that start bin/repodeck. That launcher installs dependencies and rebuilds when the checkout changes (keeping the last good build if a build fails). A checkout gets the same update flow, driven by new commits on its upstream branch: Update fast-forwards it and the next start rebuilds.
| Part | What it does |
|---|---|
src/main |
Electron main process: the window, Trash, notifications, dialogs, links, login items and updates (electron-updater) |
src/core |
A utility process (plain Node): git through its CLI, file watching, background fetch and auto-pull, stats, GitHub through gh, the cache, the activity log and settings |
src/renderer |
React, Tailwind, Zustand, Base UI, CodeMirror's merge view and TanStack Virtual; talks to the core over a MessagePort through a small typed bridge (src/preload) |
src/shared |
Types, the commit-graph lane layout and the RPC protocol |
Git runs with GIT_OPTIONAL_LOCKS=0 (no fighting your editor for index.lock), GIT_TERMINAL_PROMPT=0 and literal pathspecs. Results derived from history are cached until the repository's refs move. The page runs with context isolation and no Node access, and loads nothing remote.
Releases are automatic: push to main. When CI passes and the push changed the app (not just docs or workflows), the Release workflow:
- picks the version: the next patch after the latest release, or
package.json's version if you raised it (do that for bigger changes, together with a## x.y.z — datesection in CHANGELOG.md); - writes the notes: that CHANGELOG section if there is one, otherwise the
feat/fix/perfcommit subjects since the last release; - builds Linux, macOS and Windows installers, attaches them to a GitHub release and publishes it. Installed copies offer it within 15 minutes.
CI, the release bookkeeping and the Linux installers run on Foundry's self-hosted runner (labels self-hosted, foundry); the macOS and Windows installers build on GitHub's runners. Pull requests from forks run on GitHub's runners, and every outside contributor's workflow run waits for approval, because a fork can edit the workflow files.
Run it by hand from the Actions tab (Release → Run workflow, optionally force) to release without a new change.
README screenshots come from a made-up deck: pnpm build && xvfb-run -a node scripts/screenshots.mjs.
MIT © 2026 Uncle LYHME. Use, change and share RepoDeck however you like, including commercially, as long as copies keep the copyright and license notice, which credits the original.



