Git backed by object storage because you can't stop me
git object-storage kefka
10

Configure Feed

Select the types of activity you want to include in your feed.

docs(README): update with usage directions

Signed-off-by: Xe Iaso <me@xeiaso.net>

Xe Iaso (May 29, 2026, 11:47 AM EDT) 63ab369b 3d889908

+87
+87
README.md
··· 18 18 ## Design tradeoffs 19 19 20 20 - All repos are stored in object storage, making the local filesystem irrelevant at the cost of making storage operations a bit more latent compared to the local filesystem. 21 + - Repos are stored in git bare repo format. This theoretically could hamper performance, but also means that in a pinch you can just download the repo from the object storage bucket should you need to get a copy of it RIGHT NOW. 21 22 - Post-receive hooks are stored in the repository, meaning that hooks are checked out from the repository on push. 22 23 - Right now all s3fs reads are completely buffered in memory before billy can use them, theoretically this means that the size limit for files is 2Gi. 23 24 - This is like very new and not tested in the slightest. ··· 29 30 - Any kind of blogpost. 30 31 - Deployment to Kubernetes. 31 32 - HTTPS support with TLS termination. 33 + 34 + ## Setup instructions 35 + 36 + objgit depends on the following things: 37 + 38 + - A system capable of running the Go runtime. 39 + - TLS certificate authorities on the disk. 40 + - A functional IPv4/IPv6 network stack. 41 + - A Tigris account, bucket, and access keypair (part of the core flow of this tool relies on Tigris' [RenameObject](https://www.tigrisdata.com/docs/objects/object-rename/) call which is not part of the standard S3 API). 42 + 43 + ### Prepare your `.env` file 44 + 45 + objgit takes its configuration via flags, environment variables, and `.env` files in this order of precedence: 46 + 47 + - envvars 48 + - `.env` file 49 + - flags 50 + 51 + Here is a sample `.env` file: 52 + 53 + ```sh 54 + # Use the AWS credential chain to load Tigris credentials 55 + AWS_PROFILE=tigris 56 + 57 + # If true, allow the execution of post-receive hooks 58 + ALLOW_HOOKS=true 59 + # Hook timeout in go time.Duration format 60 + HOOK_TIMEOUT=60s 61 + 62 + # If true, allow anonymous pushes 63 + ALLOW_PUSH=true 64 + 65 + # The Tigris bucket that all repos are stored in, 66 + # as well as the SSH host key 67 + BUCKET=xe-git-repos 68 + 69 + # Per-protocol bindhosts 70 + GIT_BIND=:9418 71 + HTTP_BIND=:8080 72 + SSH_BIND=:2222 73 + 74 + # Prometheus metrics 75 + METRICS_BIND=:9090 76 + 77 + # Logging detail level 78 + SLOG_LEVEL=INFO 79 + ``` 80 + 81 + ### Run the program 82 + 83 + ```text 84 + go run ./cmd/objgitd 85 + ``` 86 + 87 + ### Push a repo 88 + 89 + ```text 90 + $ git push ssh://localhost:2222/xeiaso.net/objgit.git 91 + Enumerating objects: 9, done. 92 + Counting objects: 100% (9/9), done. 93 + Delta compression using up to 32 threads 94 + Compressing objects: 100% (9/9), done. 95 + Writing objects: 100% (9/9), 2.80 KiB | 2.80 MiB/s, done. 96 + Total 9 (delta 5), reused 0 (delta 0), pack-reused 0 (from 0) 97 + remote: push to xeiaso.net/objgit.git refs/heads/main: a300ea49df20ad5dc82fc4dabb85fbd3261faed7 -> 3d889908eefd60d9a11605f077b7b4560aef8e74 98 + remote: top-level contents: 99 + remote: CLAUDE.md 100 + remote: LICENSE 101 + remote: README.md 102 + remote: cmd 103 + remote: docs 104 + remote: go.mod 105 + remote: go.sum 106 + remote: internal 107 + remote: go module: tangled.org/xeiaso.net/objgit 108 + remote: manifest (/tmp/manifest.txt): 109 + remote: ref refs/heads/main 110 + remote: sha 3d889908eefd60d9a11605f077b7b4560aef8e74 111 + remote: hook done 112 + To ssh://localhost:2222/xeiaso.net/objgit.git 113 + a300ea4..3d88990 main -> main 114 + ``` 115 + 116 + ### Deployment to production 117 + 118 + TODO(Xe): re-evaluate performance-based life choices and write.