Log

What torii actually is

Git has won. Every serious codebase runs on it, and the data model underneath is not the problem — it is the reason the thing survived twenty years. The…

Git has won. Every serious codebase runs on it, and the data model underneath is not the problem — it is the reason the thing survived twenty years. The problem is the surface. Onboarding to a codebase in 2026 still starts with half a page of incantations, and half of them exist because a command was designed around what the plumbing does rather than around what a person wants.

torii is a thin, opinionated CLI over the same object store, the same refs and the same protocol. Your repository is still a Git repository, your collaborators install nothing, and you can stop using torii at any point without a migration.

torii <command> 44 commands torii tui 17 views torii-core vcs · platforms · workspace · config · auth one library, both surfaces 7 platform clients github gitlab gitea bitbucket sourcehut radicle azure libgit2 (vendored) GIT_HTTPS=0 GIT_SSH=0 objects, refs, index pure-Rust transports rustls (https) · russh (ssh) since 0.6.0 build needs a C compiler no perl · no openssl-dev no libssh2-dev · no pkg-config one binary · MIT OR Apache-2.0

One layer, two surfaces

The binary presents a CLI and a TUI, and both call the same library. That is not an implementation detail you can ignore: it is why the TUI has no features the CLI lacks, why there is no second configuration file, and why a fix to sync lands in both at once. A TUI bolted onto a CLI as a separate program drifts within a release; one built on the same domain layer cannot.

Why libgit2 has holes in it

libgit2 is vendored, but built with GIT_HTTPS=0 GIT_SSH=0 — its own network transports compiled out. HTTPS goes through rustls and SSH through russh, both pure Rust.

The reason is not purity. It is that libgit2's transports drag in libcurl, libssh2 and OpenSSL, and those drag in perl, pkg-config and a build day you did not plan for. With them gone, building torii from source needs a C compiler and nothing else, and a prebuilt binary links no runtime library at all. On the musl target with the static feature it runs on Alpine, on scratch, on busybox.

The cost is real and worth naming: two transport implementations that the wider world has not hammered on for fifteen years. Push validation against Bitbucket, Gitea, Forgejo and Sourcehut is still on the list of things verified by reasoning rather than by a test against a live server.

What "human-first" means here

It means the verb matches the intention. torii save -am "msg" is add and commit because they are one act. torii sync is pull and push because that is what "get in step with everyone else" means. torii snapshot exists because "let me try something and be able to undo it" is a thing people do constantly and Git answers with three unrelated mechanisms.

It also means the tool refuses to be quietly dangerous. The secret scanner runs before every save. Every history rewrite takes a snapshot first. save --reset --reset-mode hard is reversible. None of that is possible to add on top of a client; it has to be in the path the command already takes.

Where it is going

The long-term goal is not a nicer Git. It is a version control system designed around how people actually work, with torii as the migration path off Git when there is somewhere to migrate to. That is a long horizon and it is being built in the open. Until then, this is a Git client that tries not to make you memorise plumbing.