Repositories

Ordinary bare repositories, on your disk

Nothing about your history is locked inside this application. Stop the server and your repositories are still repositories.

The git binary does the git work

Repositories live at a predictable path and are driven by spawned git plumbing commands. There is no reimplementation of git in TypeScript and no library standing between your objects and the tool that understands them.

That means a repository can be cloned, inspected, backed up, or migrated with the same commands you already use, and a bug in this application cannot corrupt an object store it never writes to directly.

Smart HTTP, streamed

Clone, fetch, and push work over the standard protocol. Packfiles are streamed rather than buffered, which is the difference between working on a real repository and working on a demo.

  • Reference discovery and both pack services
  • HTTP basic authentication with a personal access token
  • Passwords are not accepted over git, since they end up in shell history and config files

Path safety is not an afterthought

Owner and repository names are validated before they reach the filesystem, and every resolved path is checked to be inside the storage root. A repository name is user input that becomes a path, which is the shape of most directory traversal bugs.

Backups are a file copy

Because the storage layout is ordinary, so is the backup story. Copy the directory, dump the database, done.

Keep your history portable

An open format on your own disk, with no export step to plan for.

Self-host ReviewOS All features