{"id":50037446,"url":"https://github.com/hugoh/hrd","last_synced_at":"2026-06-07T05:00:32.871Z","repository":{"id":357017143,"uuid":"1230842942","full_name":"hugoh/hrd","owner":"hugoh","description":"Multi-repo manager (TUI \u0026 CLI) for git and jj with parallel dispatch and live status","archived":false,"fork":false,"pushed_at":"2026-05-30T01:39:46.000Z","size":347,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T02:11:58.273Z","etag":null,"topics":["cli","developer-tools","devtools","git","go","golang","jj","jujutsu","multi-repo","productivity","repo-management","terminal","tui","vcs"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hugoh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-06T11:27:06.000Z","updated_at":"2026-05-30T01:39:02.000Z","dependencies_parsed_at":"2026-06-07T05:00:28.205Z","dependency_job_id":null,"html_url":"https://github.com/hugoh/hrd","commit_stats":null,"previous_names":["hugoh/hrd"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/hugoh/hrd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugoh%2Fhrd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugoh%2Fhrd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugoh%2Fhrd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugoh%2Fhrd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hugoh","download_url":"https://codeload.github.com/hugoh/hrd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hugoh%2Fhrd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34009201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-07T02:00:07.652Z","response_time":124,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","developer-tools","devtools","git","go","golang","jj","jujutsu","multi-repo","productivity","repo-management","terminal","tui","vcs"],"created_at":"2026-05-21T01:09:24.143Z","updated_at":"2026-06-07T05:00:32.378Z","avatar_url":"https://github.com/hugoh.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# hrd\n\nHerd your repos. Run commands across them in parallel. Watch results stream in live.\n\n`hrd` is a multi-repo manager for developers who work across many repositories and use both **git** and **jj** (Jujutsu). It keeps your repos organized into groups, runs VCS commands across all of them at once, and shows a live unified status dashboard — with full awareness of branches, bookmarks, remote tracking, ahead/behind counts, and conflicts.\n\n[![CI](https://github.com/hugoh/hrd/actions/workflows/ci.yml/badge.svg)](https://github.com/hugoh/hrd/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/github/hugoh/hrd/graph/badge.svg?token=91HAIC8SER)](https://codecov.io/github/hugoh/hrd)\n[![Go Report Card](https://goreportcard.com/badge/github.com/hugoh/hrd)](https://goreportcard.com/report/github.com/hugoh/hrd)\n\n## Features\n\n- **git and jj as first-class citizens** — both backends are fully supported with native status parsing. Colocated repos (jj on top of git) are handled correctly.\n- **Parallel execution** — commands run concurrently across all matched repos, with results streaming in as each one completes.\n- **Live status dashboard** — `hrd ls` shows a color-coded table of every repo's ref, remote sync state, dirty flag, and per-bookmark/branch badges, updating in real time.\n- **Interactive TUI** — `hrd` (or `hrd tui`) opens a full-screen terminal UI for browsing repos, filtering by group or name, and dispatching commands across multiple repos with live streaming output.\n- **Repo groups** — group repos for easier filtering.\n- **Three dispatch commands** — `git`, `jj`, and `shell`.\n- **Shell completion** — bash, zsh, and fish, with dynamic completion of repo and group names from your live config.\n- **Extensible backend system** — new VCS backends implement a single interface and self-register.\n\n## Install\n\n### Homebrew (macOS/Linux)\n\n```sh\nbrew install hugoh/tap/hrd\n```\n\n### Linux (deb/rpm)\n\nDownload the `.deb` or `.rpm` from the [releases page](https://github.com/hugoh/hrd/releases) and install with your package manager:\n\n```sh\n# Debian/Ubuntu\nsudo apt install ./hrd_*.deb\n\n# RHEL/Fedora\nsudo dnf install ./hrd_*.rpm\n```\n\n### mise\n\n```sh\nmise use -g github:hugoh/hrd\n```\n\n### Go install\n\n```sh\ngo install github.com/hugoh/hrd@latest\n```\n\n### From source\n\n```sh\ngit clone https://github.com/hugoh/hrd\ncd hrd\ngo build -o hrd .\n```\n\n## Quick start\n\n```sh\n# Track some repos\nhrd repo add ~/dev/myproject ~/dev/infra\nhrd repo add -n dotfiles ~/.local/share/chezmoi\n\n# Start the TUI\nhrd\n\n# Add repos to groups\nhrd repo group myproject work\nhrd repo group infra work\n\n# Live status across all repos in context\nhrd ls\n\n# Run a command across all repos\nhrd fetch\n\n# Or just the ones you care about right now\nhrd jj dotfiles log\n\n# Arbitrary shell commands\nhrd shell -- 'echo $(basename $PWD): $(git rev-parse --short HEAD)'\n```\n\n**Tip**: Group names are displayed with an `@` prefix (e.g., `@work`, `@oss`) to distinguish them from repo names. The `@` is optional on input — `hrd ls @work` and `hrd ls work` both work.\n\n## Status dashboard\n\n```text\nNAME        VCS STATUS                                                   \nmyproject   git main ↑2*  feat: add new feature (2 hours ago)            \ndotfiles    jj  main ✓∅⇡5  config: update zshrc (1 day ago)              \ninfra       git feat/rework ↑1↓3  refactor: networking layer (3 days ago)\nold-service jj  legacy ✗✓!‼  fix: critical bug (1 week ago)\n```\n\nStatus symbols at a glance:\n\n| Symbol | Meaning                                |\n| ------ | -------------------------------------- |\n| `✓`    | Synced with remote                     |\n| `↑N`   | N commits ahead of remote              |\n| `↓N`   | N commits behind remote                |\n| `⇡N`   | Working copy ahead of bookmark (local) |\n| `↑N↓N` | Diverged (ahead and behind)            |\n| `∅`    | Local only, no remote                  |\n| `‼`    | Unresolved conflict                    |\n| `!`    | Bookmark conflict (jj)                 |\n| `✗`    | Remote was deleted                     |\n| `*`    | Dirty working copy                     |\n| `?`    | Unknown remote state                   |\n\n## Interactive TUI\n\nRun `hrd` (or `hrd tui`) to open the full-screen terminal UI:\n\n- Browse all tracked repos in a sortable table.\n- Filter by group with `@` — type `@work` to show only work repos, or select individual repos with `Space`.\n- Run VCS commands (`status`, `diff`, `log`, `fetch`, `pull`, `push`) from a single key press — results stream in live as each repo completes.\n- The command palette (`:`) gives access to every subcommand without leaving the TUI.\n- Shortcuts: `s` (status), `l` (log), `d` (diff), `f` (fetch), `p` (pull), `P` (push), `@` (group picker), `q` or `Esc` (quit).\n\nThe TUI mirrors the CLI: the same backends, the same parallel execution, the same status parsing — just in an interactive, always-on view.\n\n## Command reference\n\n```text\nNAME:\n   hrd - manage multiple git and jj repositories\n\nUSAGE:\n   hrd [global options] [command [command options]]\n\nVERSION:\n   dev\n\nCOMMANDS:\n   repo        manage tracked repositories\n   group       list repo groups\n   ls, ll      show status of repos\n   status, st  show detailed status for repos (git status or jj status)\n   diff        show diff for repos (git diff or jj diff)\n   log         show log for repos (git log or jj log)\n   fetch       fetch from remotes (git fetch or jj git fetch)\n   pull        pull from remotes (git pull or jj git pull)\n   push        push to remotes (git push or jj git push)\n   git         run a git command across repos\n   jj          run a jj command across repos\n   shell       run an arbitrary shell command across repos\n   tui, i      interactive terminal UI for browsing and running commands across repos\n   help, h     Shows a list of commands or help for one command\n   completion  Output shell completion script for bash, zsh, fish, or Powershell\n\nGLOBAL OPTIONS:\n   --config string, -c string  path to config file (default: \"~/.config/hrd/config.toml\")\n   --help, -h                  show help\n   --version, -v               print the version\n```\n\n## Configuration\n\nConfig lives at `~/.config/hrd/config.toml` (respects `$XDG_CONFIG_HOME`).\n\n```toml\n[repos.dotfiles]\npath = \"/home/alice/.local/share/chezmoi\"\n\n[repos.myproject]\npath = \"/home/alice/dev/myproject\"\ngroups = [\"work\"]\n\n[repos.infra]\npath = \"/home/alice/dev/infra\"\ngroups = [\"work\"]\n\n[settings]\nconcurrency = 8\n```\n\n**Note**: Groups are derived from the `groups` field on each repo. Group names are displayed with an `@` prefix (e.g., `@work`) to distinguish them from repo names. The `@` is optional on input — `work` and `@work` are treated identically.\n\n---\n\n## Contributing\n\nContributions are very welcome! Please open an issue or submit a pull request. See [development instructions](AGENTS.md).\n\n### Adding a backend\n\nImplement the `Backend` interface in a new package, add a `Register()` function that calls `backend.Register()`, and call it from `main.go`'s `Run()` function. The interface is four methods: `Name`, `Detect`, `Status`, and `Run`.\n\n---\n\n## Related tools\n\n[gita](https://github.com/nosarthur/gita) is the direct inspiration for `hrd`.\n\n[Jujutsu (jj) VCS](https://github.com/jj-vcs/jj) motivated creating `hrd` with first-class non-git support.\n\n## Disclaimer\n\nLLMs were used to put together the initial version.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhugoh%2Fhrd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhugoh%2Fhrd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhugoh%2Fhrd/lists"}