rgodha24 / walgithub
git clone https://github.com/rgodha24/walgithub.git
walgit with a GitHub Enterprise Server facade — git over smart HTTP from an object-store bucket
—
stars, 24h
—
stars, 7 days
+135
stars, 30 days · #1,744
135
★ total
4
forks · 0 open issues
Star history starts 2026-10-20; the chart appears after the second daily snapshot.
LanguageRust
LicenseMIT
Created2026-09-25 (25d ago)
Last push25d ago
Watchers0
OwnerUser
Links
README excerpt
# walgit — a git server that is one binary in front of an object store walgit hosts git repositories with **no database, no leader and no local state that matters**. You run a single binary, point it at an S3 or GCS bucket, and you have: smart HTTP (v0/v2) fetch and push, `bundle-uri` clones served as static files, Git LFS, a browsing web UI, a JSON API with an SDK, per-repository push policy, webhooks — and a server that scales to repositories **larger than the machine it runs on**. Every machine that runs walgit is a disposable cache; the bucket is the repository. [code] sh # build (needs rust per rust-toolchain.toml, protoc, node 24 + pnpm for the web UI) just web-build && cargo build --release -p walgit-cli # or: nix build .#walgit or: podman build -t walgit -f Containerfile . # one box, TLS by walgit itself, a local S3 store (rustfs in a container) just dev-store ./target/release/walgit-server --config walgit.standalone.toml open https://walgit.localhost:8080/ [code] sh just test # fast hermetic tier (< 1 min): unit + quick integration, in-memory store, real git just e2e # real git against the server (~20 s) just warnings # zero rustc warnings across all targets just ci # all of the above cargo test -p walgit-server --test sim # fault-injection simulation (crashes, partitions, stale reads) just test-s3 # store contract against local rustfs [code] crates/ walgit-proto protobuf schema (wal.proto), log framing, store keys walgit-store ObjectStore trait (CAS versions, conditional GET, range, compose); backends s3, gcs, memory; leases walgit-git bare repos on disk, receive-pack, pack ingest, refs ↔ packed-refs, advertisements, upload-pack drivers walgit-wal RepoHandle: sync levels, publish (group commit + CAS), checkpoints, log reader, remote reader, tasks walgit-bundle bundle-uri: slots and chains, building, header ∘ pack composition, lists, retention walgit-server axum: smart HTTP, LFS, bundles, auth (none/token/oidc), the maintainer loop, upstream follow, web/ (API, UI, SDK routes, SSE), setup.rs (installer + recipes), events bridge walgit-config walgit.toml (+ WALGIT__ env overrides), per-repo settings merge, fail-closed validation walgit-cli `walgit serve|import|compact|bundle|wal|mirror|synth|config|repo`; `walgit-server` = `walgit serve` web/ React SPA (Vite) + sdk/repos.ts, built into the binary; the wire contract is web/API.md docs/ BUNDLE_URI_DESIGN, ROUNDTRIPS (the cost model), POLICY, LFS, INTEGRITY, EVENTS, CONTRACT, patches/ ``` ## Invariants worth memorising * The manifest CAS is the only commit point; everything before it is invisible, everything after it is idempotent and replayable. * Immutable objects are content-addressed; nothing is overwritten except the manifest, the bundle list and leases. * Every read revalidates against the bucket first; there is no "eventually". * Local disk is a cache. Memory is a cache. The bucket is the repository. * Placement is configured, never inferred; refs-level reads work everywh