Skip to content

Repository files navigation

GitAtlas Ember

A desktop app for developers who work across many Git repositories. GitAtlas Ember scans your filesystem, discovers every repo, and shows their status on a single dashboard — branch names, ahead/behind counts, uncommitted changes, and health at a glance. Drill into any repo for a full-featured Git UI with commit history, staging, branching, stashing, and more.

This repository is a fork of the original GitAtlas, customized into my personal Ember edition with adjustments that I consider improvements or that better fit my workflow and style. It is styled with the Emberveil design system and installs alongside upstream GitAtlas under its own identifier (com.gitatlas.ember).

Built with Tauri v2 (Rust) and React.

Features

  • Menu Bar Applet — A macOS status item with a popover panel: repos that need attention first, per-repo fetch/pull/push, and a badge counting what needs your attention (see Menu Bar Applet)
  • Emberveil Theme — Complete light and dark modes, switchable in the header (light / dark / system)
  • Repo Discovery — Automatically finds Git repositories under configurable root directories
  • Status Dashboard — See branch, ahead/behind, dirty files, and stash count for every repo in one view
  • Health Indicators — Color-coded badges: clean, local changes, diverged, or error
  • Filter & Search — Filter by health status, search by name/branch/path
  • Bulk Operations — Fetch or pull all repositories with one click
  • Repo Detail View — Full-screen view with tabbed interface:
    • Changes — Stage/unstage files, view diffs, create commits
    • History — Visual commit graph with branch topology, commit details and file diffs
    • Branches — Create, checkout, delete, and merge branches (with drag-and-drop merge)
    • Stashes — Save, pop, and drop stashes
    • Readme — View repository README
  • Remote Operations — Fetch, pull (rebase), and push per-repo with remote management
  • Git Profile — View and edit per-repo git user.name/email
  • GitHub Integration — Direct links to GitHub repos from dashboard cards, open PR creation
  • Fast Startup — Repo list cached to disk for instant display on launch
  • Configurable Scan Root — Click to edit the scan directory, persisted across sessions

Getting Started

Prerequisites

Install & Run

npm install
npm run tauri dev

This starts the Vite dev server and compiles the Rust backend, then opens a native desktop window. The scan root defaults to ~/dev — click the path below the header to change it. Click "Scan for Repos" to discover Git repositories.

Build for Production

npm run tauri build

Produces a native app bundle in src-tauri/target/release/bundle/.

Menu Bar Applet

GitAtlas Ember lives in the macOS menu bar alongside its dashboard window. The status item shows a flame glyph (a template image, so it follows light and dark menu bars) with a badge counting the repositories that need attention — anything not clean, or behind its remote.

Left-click opens a popover panel anchored under the status item:

  • Repos needing attention are listed first, most urgent on top; clean ones collapse behind a Clean group
  • Each row shows branch and signals (↓behind, ↑ahead, ~changed, ≡stashed); hovering swaps them for Fetch, Pull, Push, Open in code editor, Reveal in Finder, and Open on the web
  • Clicking a row opens that repo in the dashboard's detail view
  • Fetch All and Dashboard live in the footer, next to the time of the last status refresh
  • Keyboard: type to filter, / to move, Enter to open, ⌘R to refresh, Esc to clear the filter or dismiss

Right-click opens the native menu: Open Dashboard, Refresh Status, Fetch All Repositories, an Auto-refresh submenu (Off / 5 / 15 / 30 minutes, persisted in ~/.gitatlas/config.json), and Quit.

Auto-refresh only re-reads local state — the working tree and refs — so it never hits the network and never triggers credential prompts. Ahead/behind counts change only when you fetch, which is always an explicit action.

Closing the dashboard window leaves the app running in the menu bar; quit from the tray menu (or ⌘Q) to exit fully. The status item's icon is generated from the brand mark by scripts/generate-tray-icon.py.

Tech Stack

LayerTechnology
Desktop frameworkTauri v2
FrontendReact 19, TypeScript 5, Tailwind CSS v4
Build toolVite 6
Git enginegit2 (libgit2)
Filesystem scanignore + walkdir
DatabaseSQLite (rusqlite, in-memory)
Config/cacheJSON files in ~/.gitatlas/

Project Structure

gitatlas-ember/
├── src/ # React frontend
│ ├── components/
│ │ ├── Dashboard.tsx # Main layout, scan root, scan trigger
│ │ ├── RepoList.tsx # Repo card grid
│ │ ├── RepoCard.tsx # Single repo card with status + actions
│ │ ├── FilterBar.tsx # Health filter + search
│ │ ├── BulkActions.tsx # Fetch All / Pull All buttons
│ │ ├── StatusBadge.tsx # Health indicator dot
│ │ ├── GitHubLink.tsx # Shared GitHub icon button (shell.open)
│ │ └── detail/
│ │ ├── RepoDetail.tsx # Full-screen repo view with tabs
│ │ ├── FileChanges.tsx # Staging, unstaging, diffs
│ │ ├── CommitGraph.tsx # Commit history with visual graph
│ │ ├── CommitLog.tsx # Commit list
│ │ ├── CommitForm.tsx # Commit message input
│ │ ├── DiffViewer.tsx # Unified diff display
│ │ ├── BranchPanel.tsx # Branch management
│ │ ├── StashPanel.tsx # Stash management
│ │ ├── ReadmeViewer.tsx# README rendering
│ │ └── graph/
│ │ ├── computeGraph.ts # Lane assignment algorithm
│ │ └── GraphSvg.tsx # SVG rendering of commit graph
│ ├── hooks/
│ │ ├── useRepos.ts # Scan, refresh, bulk ops, cache loading
│ │ ├── useRepoDetail.ts # All detail operations (commits, staging, branches, etc.)
│ │ └── useRepoStatus.ts # Single repo status polling
│ └── types/
│ ├── repo.ts # RepoInfo, RepoHealth
│ ├── detail.ts # CommitInfo, FileChange, BranchInfo, StashEntry, etc.
│ └── index.ts # Re-exports
├── src-tauri/ # Rust backend
│ └── src/
│ ├── lib.rs # AppState, Builder, command registration
│ ├── main.rs # Entry point
│ ├── error.rs # AppError enum with Serialize for IPC
│ ├── cache.rs # Disk cache + config (~/.gitatlas/)
│ ├── commands/
│ │ ├── scan.rs # scan_directories, get/set_scan_roots, load_cached_repos
│ │ ├── status.rs # get_all_repos, get_repo_status
│ │ ├── operations.rs # fetch_all, pull_all, fetch/pull/push per-repo
│ │ ├── panel.rs # 9 commands for the menu bar panel and editor/file-manager actions
│ │ └── detail.rs # 29 commands: commits, staging, branches, stashes, remotes, etc.
│ ├── git/
│ │ ├── discovery.rs # Find .git dirs using ignore crate
│ │ ├── status.rs # Branch, ahead/behind, dirty, stash, remote URL
│ │ ├── operations.rs # Fetch, pull, push via git2
│ │ └── detail.rs # Commit log, diffs, staging, branches, stashes, remotes, profiles
│ ├── db/
│ │ ├── mod.rs # Database struct, schema init
│ │ ├── models.rs # RepoInfo, CommitInfo, FileChange, BranchInfo, etc.
│ │ └── queries.rs # Upsert, get_all, clear
│ └── scanner/
│ └── mod.rs # Multi-root scan orchestration
├── package.json
└── vite.config.ts

Data Storage

GitAtlas Ember stores configuration and cache files in ~/.gitatlas/ (shared with upstream GitAtlas):

  • config.json — User settings (scan_roots, refresh_minutes, and optional editor_command GUI editor executable)
  • cache.json — Last-known repo list for fast startup

The in-memory SQLite database holds repo data during the app session. It is populated from the cache on startup and refreshed on scan.

License

MIT

About

A desktop app for developers who work across many Git repositories. GitAtlas scans your filesystem, discovers every repo, and shows their status on a single dashboard

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages