soko is a fast, lightweight command-line tool designed to simplify the management of multiple Git repositories. It allows users to register their repos once and then view the status of all registered repositories with a single command, eliminating the need for manual directory switching.
Key Features:
Fast Registration: Quickly register multiple repositories using soko scan or individually with soko init.
Status Overview: Get a comprehensive view of all registered repos' statuses in real-time.
Shell Integration: Navigate between repos seamlessly with shell integration, enhancing workflow efficiency.
Activity Reports: Generate detailed reports on commit activity across repos over specified periods.
Command Execution: Run commands across multiple repos simultaneously or sequentially.
Tag-Based Filtering: Organize and manage repos using tags for targeted operations.
Git Platform Support: Integrates seamlessly with GitHub, GitLab, and Bitbucket.
Audience & Benefit:
Ideal for developers, DevOps engineers, and teams managing multiple projects. soko streamlines repository management by providing a centralized overview, enabling users to save time and increase productivity. It offers a comprehensive yet efficient solution for handling multiple Git repositories in one place.
soko can be installed via winget, making it accessible with minimal setup effort.
README
All your repos, one command.
soko (倉庫 — "storehouse") is a fast, lightweight CLI for managing multiple git repositories. Register your repos once, then see the status of all of them from anywhere with a single command. No more cd-ing between directories and running git status one at a time.
Prerequisites
Git — soko shells out to git for all repository operations
Go 1.22+ — only needed if installing from source or via go install
Install
# Quick install (macOS / Linux)
curl -fsSL https://raw.githubusercontent.com/CelikE/soko/master/install.sh | sh
# Homebrew (macOS / Linux)
brew install CelikE/tap/soko
# Windows (winget)
winget install CelikE.soko
# Windows (Scoop)
scoop bucket add soko https://github.com/CelikE/homebrew-tap
scoop install soko
# From source (requires Go 1.22+)
go install github.com/CelikE/soko/cmd/soko@latest
# Enable shell integration (add to .bashrc or .zshrc)
eval "$(soko shell-init)"
# Register all repos at once
soko scan ~/projects --tag work
# Or register individually
cd ~/projects/auth-service && soko init --tag backend
# See everything at a glance
soko status
REPO BRANCH STATUS ↑↓ LAST COMMIT
──────────────────────────────────────────────────────────────────────────────
auth-service feat/sso ✎ 3M ↑2 2h ago feat: add OAuth
backend-api main ✓ clean ↓3 1d ago fix: rate limiter
frontend dev ✎ 1M 2U ↑1 4h ago refactor: nav bar
3 repos · 2 dirty · 1 behind · 6 changes
Commands
Command
Description
soko init
Register the current git repo (detects worktrees)
soko scan
Discover and register all git repos in a directory
Register as a linked worktree instead of resolving to main repo
--worktrees
scan
Also discover and register linked git worktrees
--no-worktrees
fetch, exec
Skip worktree entries, only operate on parent repos
--dry-run
scan, clean
Preview what would happen without making changes
--depth
scan
Maximum directory depth to scan (default: 5)
--group
status, list
Group repos by tag in a tree view
--all
status
Show all repos without truncation
--prune
fetch, clean
Prune stale remote tracking refs
--force
remove, clean
Skip confirmation prompt
--seq
exec
Run sequentially instead of in parallel
--prs
open
Open pull/merge requests page
--issues
open
Open issues page
--actions
open
Open CI/CD page
--branches
open
Open branches page
--settings
open
Open settings page
--days
report
Number of days to look back (default: 7)
--author
report
Filter commits by author name (substring match)
--all-authors
report
Show commits from all authors
--max
report
Max commits per repo (default: 5, 0 for all)
--fix
doc
Auto-fix issues (remove stale paths)
--fish
shell-init
Output fish shell syntax
--pwsh
shell-init
Output PowerShell syntax
Usage examples
Status with filters
soko status # all repos
soko status auth # single repo (prefix match)
soko status auth frontend # multiple specific repos
soko status --fetch # fetch first, then show status
soko status --dirty # only repos with uncommitted changes
soko status --tag backend --behind # only backend repos behind remote
soko status --json # machine-readable output
Tags
soko init --tag backend --tag go # tag during registration
soko tag backend go # tag current repo (shorthand)
soko tag add critical # add tag to current repo
soko tag add -r my-repo critical # add tag to a specific repo
soko tag remove backend # remove tag from current repo
soko tag list # show all tags with repo counts
soko status --tag backend # filter any command by tag
soko fetch --tag frontend # fetch only frontend repos
soko exec --tag go -- go mod tidy # run in tagged repos only
Aliases
soko alias set morning "sync --tag work" # create an alias
soko alias set deploy "exec --tag prod -- make deploy"
soko alias list # show all aliases
soko alias remove morning # remove an alias
soko morning # runs soko sync --tag work
soko deploy # runs soko exec --tag prod -- make deploy
Built-in commands always take priority over aliases.
Activity report
soko report # your commits, last 7 days
soko report --days 1 # standup: yesterday
soko report --days 30 # monthly summary
soko report --tag backend # only backend repos
soko report auth # specific repo
soko report --all-authors # everyone's commits
soko report --author "John" # specific author
Run commands across repos
soko exec -- git pull --rebase # pull all repos
soko exec -- git stash # stash everything
soko exec -- make test # run tests everywhere
soko exec --seq -- git log -1 # sequential, one at a time
soko exec --tag backend -- go vet # only in backend repos
soko cd auth # jump by name (prefix match)
soko go # interactive picker
soko go --tag backend # picker filtered by tag
Open in browser
soko open # current repo homepage
soko open auth-service # by name
soko open --prs # pull/merge requests
soko open --issues # issues
soko open --actions # CI/CD
soko open --tag backend # open all backend repos
soko open --tag backend --prs # PRs for all backend repos
Supports GitHub, GitLab, and Bitbucket — auto-detects the platform from the remote URL.
Manage repos
soko list # show all registered repos
soko list --group # tree view grouped by tag
soko list --tag infra # filter by tag
soko remove old-project # unregister by name
soko remove --path /old/path # unregister by path
soko remove --all --force # clear everything
Clean up stale branches
soko clean --dry-run # preview merged branches
soko clean # delete with confirmation
soko clean --force # skip confirmation
soko clean --prune # also prune stale remote refs
soko clean --tag backend # only backend repos
soko clean auth # specific repo
Health check and config
soko doc # check paths, git, remotes, shell-init
soko doc --fix # auto-remove stale entries
soko config path # print config file location
soko config edit # open config in $EDITOR
soko config set git_path /usr/local/bin/git # use a custom git binary
soko config get git_path # check current git binary
Git worktrees
soko supports git worktrees natively. If you use worktrees as your primary branching workflow, use --worktrees to discover and register them:
# Scan and discover repos + worktrees
soko scan ~/projects --worktrees
# Register a single worktree
cd ~/projects/api/feat-oauth
soko init --worktree
# See everything — worktrees show alongside their parent
soko list
# api ~/projects/api/main
# api/feat-oauth ~/projects/api/feat-oauth → api
# api/hotfix-123 ~/projects/api/hotfix-123 → api
# Jump to a worktree
soko cd api/feat # prefix match on parent/branch
soko go # pick interactively
# Status works per-worktree
soko status --dirty
# Remove a parent — linked worktrees are removed too
soko remove api
# Skip worktrees for bulk operations
soko fetch --no-worktrees
soko exec --no-worktrees -- git pull
Without --worktrees, soko detects when you're in a worktree and registers the main repo instead — no duplicates.
tmux-sessionizer integration
Use soko as the directory source for your tmux-sessionizer:
# Pick a repo/worktree and create a tmux session for it
TARGET=$(soko list --json | jq -r '.[].path' | fzf)
SESSION=$(basename "$TARGET")
tmux new-session -d -s "$SESSION" -c "$TARGET" 2>/dev/null
tmux switch-client -t "$SESSION"
Or use soko's built-in interactive picker, which supports fuzzy search:
soko go # pick a repo or worktree, cd into it
Configuration
soko stores registered repos in a single YAML file:
~/.config/soko/config.yaml
Respects $XDG_CONFIG_HOME if set. The format is minimal: