gitcask
An open-source git server that keeps every repository in your S3 bucket, so servers are disposable and cost follows pushes rather than repository count.
The shape
Any number of identical instances serve any repository. Each repository is a write-ahead log in the bucket: immutable packs, a log entry per push, and a small manifest that changes only by compare-and-swap. There is no database and no leader.
Roles are configuration, not separate programs: serve answers git, LFS and the API, maintain folds the log into checkpoints and compacts packs, and events delivers webhooks. An empty role list runs all three.
What a request does
A read revalidates the manifest first, so every instance answers with the latest push.
A push is acknowledged only after the bucket accepted it.
Who owns what
gitcask owns the bytes. Everything that differs from one organisation to the next belongs to the platform built on it.
| gitcask | Your platform | |
|---|---|---|
| Git | Smart HTTP v0 and v2, LFS, the JSON API | The UI people use |
| Identity | Verifies a signed token and its repository scopes | Users, sign-in, teams, revocation |
| Repositories | Create, delete, read, commit, merge | The list of repositories and their metadata |
| Automation | One webhook per ref change, replayable | CI, reviews, issues, branch policy |
Where to go next
- QuickstartPush to a local gitcask in five minutes.
- ArchitectureThe bucket layout, the write and read paths, and maintenance.
- Cost modelRound trips per operation and the bars gitcask is held to.
- AuthenticationJWT, introspection and trusted proxies, and the exact errors.
- APIGit over HTTP, LFS and the JSON API for reads and commits.
- EventsRef events delivered to your webhook from a durable cursor.
- Initialize and importStart a repository from a pinned tree or a full history.
- OperationsRoles, configuration, metrics and recovery.
- Migrating from GiteaMove repositories from Gitea and cut over.