Traverse directories for git repositories and report their status against upstream.
A skiff is a small boat—often one you built yourself. Your code are your skiffs and we have more than ever to keep track of. From small, hand-built vessels to monorepos they are all scattered across the filesystem. This tool helps you check if any are taking on water.
The name started as "scdiffs" for "source control diffs," then lost some letters. The boat thing came later, but it stuck.
go install github.com/indexzero/skiffs@latest# scan current directory
skiffs
# scan specific roots
skiffs -r ~/Code -r ~/work
# show all repos (not just dirty)
skiffs -f all
# output as JSON
skiffs -o json-r, --root Root directories to scan (repeatable, default: .)
-f, --filter Filter: all|dirty|uncommitted|unpushed|unpulled (default: dirty)
-o, --output Output format: table|json (default: table)
-w, --workers Concurrent git operations (default: 8)
-i, --ignore Glob patterns to ignore (repeatable)
Table output shows repo name, branch, and status indicators:
- Uncommitted files count
- Commits ahead of upstream (unpushed)
- Commits behind upstream (unpulled)
JSON output includes full file lists for each status category:
- Modified files
- Untracked files
- Staged files
Save scans as JSON and compare them later:
# save today's scan
skiffs -r ~/Code -o json > ~/.cache/skiffs/$(date +%Y-%m-%d).json
# compare to yesterday
skiffs diff ~/.cache/skiffs/yesterday.json ~/.cache/skiffs/today.jsonThe diff command shows:
- Added and removed repositories
- Repos that became dirty or were cleaned
- Changes in uncommitted/ahead/behind counts
Example output:
Diff Report
old: yesterday.json
new: today.json
cleaned: 2 dirtied: 1 added: 0 removed: 0
Changed:
myproject
→ cleaned
another-repo
→ dirtied
uncommitted: +3
MIT