Minato
Minato
A harbour for your repositories.
Repositories accumulate across hosting providers while local clones drift away from them. Some remotes are never cloned, some clones are abandoned, and forks fall behind what they were forked from. Minato shows that whole picture at once, then offers safe, scriptable ways to close the gap.
What it tells you
Local clones are a backup of what a provider hosts, so a repository with no clone is not backed up, and a clone with nothing behind it is the only copy left. Every repository lands in exactly one state, and the reason travels with it.
in sync behind 12 ahead 2 diverged +4/-1 not backed up
Terminal
minato status --state driftedOutput
PATH REPOSITORY GROUP STATE NOTES
/Users/you/Projects/perso/game-night github:mcanouil/game-night perso local only, gone from GitHub
/Users/you/Projects/perso/imdb-ratings github:mcanouil/imdb-ratings perso behind 2
/Users/you/Projects/quarto-dev/quarto-cli github:mcanouil/quarto-cli quarto-dev in sync fork, 135 behind upstreamWhat it does about it
Compares
Reads what the provider reports and what is on disk, then matches the two by remote URL rather than by path, so any directory arrangement works.
Clones what is missing
Bulk clone by owner, group, or state, into a directory you choose. Anything already there is skipped rather than written over.
Updates only what is safe
Fast-forward only, and only when a repository is strictly behind with no modified tracked files. Everything else is reported with the reason it was left alone.
Groups by your own tree
A group is a directory beneath a root, so the folders you already keep become the grouping, with nothing to configure. Groups nest as the tree does, and naming perso takes perso/apps with it.
Follows forks
Reports how far a fork trails the repository it was forked from, so a stale fork is visible before it matters.
Answers to scripts
Every command takes --json, so anything the interface offers can be done by a script or an agent.
Nothing surprising happens
Minato never force-pushes, never rebases, and never discards a change. An update is only ever a fast-forward, so if the situation has been misjudged, git refuses rather than improvising.
Anything that changes your filesystem is explicit, offers a rehearsal with --dry-run first, and reports what it deliberately did not touch.