One gate, nine platforms.

savesyncsnapshotmirrorprrunnertui+37 more

A torii is a gate. This one stands between you and every place your code lives: GitHub, GitLab, Gitea, Codeberg, Forgejo, Bitbucket, Sourcehut, Radicle and Azure DevOps. You cross it with one command, not with seven tools.

 cargo install gitorii --locked   # 0.13.0

Named for the job, not for the plumbing

Every line on the right does what the line on the left does, against the same repository and the same objects. What changes is that the name says what you wanted.

files 14 pairs
git add . && git commit -m "msg" torii save -am "msg"
git pull && git push torii sync
git switch -c branch torii branch <name> -c
git fetch torii sync --fetch
git reset --soft HEAD~1 torii save --reset HEAD~1 --reset-mode soft
git rebase -i HEAD~3 torii history rebase HEAD~3 -i
git stash push -u torii snapshot stash -u
git log --oneline --author X torii log --oneline --author X
git show HEAD torii show
git blame src/main.rs torii show src/main.rs --blame
Push to three platforms torii mirror sync
Hunt for exposed secrets torii scan --history
Run status across five repos torii workspace status <name>
Commit every dirty repo at once torii workspace save <name> -am "wip"
↑↓ movetab switch columnenter copy same objects underneath

Forty-four commands, and none of them is a second tool

The platform work, the CI control plane, the multi-repo operations and the safety net live in the same binary as the commit and the push. That is the argument: not fewer commands than git, but everything a repository needs under one name. Pick a group on the left.

commands 44 commands
torii init initialise a repository
torii clone clone by URL or by platform shorthand
torii save stage and commit; amend, revert and reset live here as flags
torii sync pull and push; integrate a branch, choosing merge or rebase
torii status what changed, staged and unstaged
torii diff unstaged, staged, or the last commit
torii log history, with graph, author, date and message filters
torii show a commit, a tag, or a file line by line with --blame
↑↓ moveenter open/ filter 158 subcommands under them

Rewrite history without holding your breath

The whole filter-repo surface, as first-class subcommands. Every one takes a safety snapshot before it touches a commit, preserves author and committer dates by default, and refuses to run on a dirty tree.

log torii history

torii history reword <hash> -m "msg"

snapshot taken · dates preserved · restore with torii snapshot restore

↑↓ moveenter previewu undo

It stops you before the mistake, not after

The secret scanner runs before every save, not as a hook you remember to install on each machine.

scan 1 finding

torii save -am "wip"

⚠  Secret detected in src/config.rs:12
   GITHUB_TOKEN = "ghp_xxxxxxxxxxxxxxxxxxxx"

commit aborted (1 finding)
secret scanner AWS, GitHub, GitLab, Stripe, SendGrid and Twilio keys, PEM blocks, JWTs, and connection strings carrying a password. Sweeps the whole history with --history.
snapshots Local saves that are not commits, taken before every risky operation and restorable by id.
history orphans Walks unreachable objects, so work the reflog already expired is still recoverable.
.toriignore.local Machine-private rules, gitignored automatically, for patterns whose existence would help an attacker.
y commit anywayN aborte edit

Seven clients, nine hosts, one command

Pull requests, issues, pipelines, jobs, packages and releases, against whichever platform the repository lives on. Mirror across several at once and each keeps its own credentials.

remote 9 hosts

torii mirror sync

→ github   paskidev/gitorii   pushed 3 commits

serves GitHub

↑↓ mover switch remotes sync
working tree one .git, one history torii mirror sync gitlab primary · CI runs here github replica · own token codeberg replica · own token one push · one set of refs · a replica that rejects does not roll back the others

The same tool, with a screen

Seventeen views over the same operations, sharing one configuration with the CLI. No separate app, no daemon.

tui ? help
↑ ↓ / j k move through the sidebar
tab / enter enter the selected view
esc back to the sidebar
e toggle the event log
? help
q / ctrl+c quit
  • files
  • save
  • sync
  • snapshot
  • log
  • branch
  • tags
  • worktrees
  • submodules
  • remote
  • workspace
  • pr/mr
  • issues
  • bisect
  • auth
  • platform
  • config
q quite event logtab enter view

The numbers, as measured

Commands and subcommands counted in the CLI's own dispatch table; tests counted in the suite; version and downloads read from crates.io as this page renders.

status v0.13.0
44
top-level commands
158
subcommands
328
tests in the suite
0
runtime dependencies
0.13.0
on crates.io
1,215
downloads
ctrl+r reload counted 08-08-2026

Four ways in

Prebuilt binaries need no compiler. Building from source needs a C compiler and nothing else — no perl, no openssl-dev, no libssh2-dev, no pkg-config.

install v0.13.0

cargo install gitorii --locked # 0.13.0

--locked matters: without it the resolver ignores the published lockfile and can pull a broken release-candidate crypto chain.

enter copyesc back no runtime dependencies

If cargo install dies with a rustc SIGSEGV, the crypto chain overflowed rustc's 8 MB stack. RUST_MIN_STACK=67108864 cargo install gitorii --locked -j 1 fixes it; -j 1 is the bulletproof setting.