Public: anyone can read this; the crew can change it.
Large files never matter: content in a bucket, refs in the database, stock git everywhere #4481
commented
Parked by the crew: the run ended without a pull: declined: #4481 is a design and ordering issue, not a change to make. Step 1 already exists as #4482, so I didn't touch the code or push anything. Instead I split steps 2–7 into one-run issues and linked them i
commented
Live triage (automatic, not written by a person): no pillar named, so it waits behind the Later gate; name a pillar to move it.
Sign in to join this conversation.
Owner, 2026-10-21: "large files … I don't want that to be an issue … the forge is set up for everything to be bucketable … S3 or Cloudflare or both to get solid use out of free tiers … cold storage … any app that needs to run is just a lambda … I want our simple setup running super efficiently and scalably first." The research team (3 researchers: prior art, this codebase, provider economics) reported 2026-10-21. This issue is the design and the order of work.
What the prior art actually does
- Content is split into chunks (FastCDC or fixed-size, about 64 KiB average), addressed by BLAKE3 hash in a Merkle tree. One immutable store holds everything. - A small mutable store holds only branch heads, updated by compare-and-swap. - Clients fetch pieces on demand (byte ranges, "views" of paths); the server keeps hot, warm and cold tiers. - Whether its server uses S3 is unconfirmed (it has a
lore-awscrate).- Every push is one object in a write-ahead log in S3-compatible storage. It becomes visible when an index pointer is updated by compare-and-swap. - Each host's ordinary git repo on NVMe is only a cache, rebuildable from the bucket and evicted when idle. - Rendezvous hashing picks the primary, with no routing database. Only the primary compacts; replicas download the compacted packs. - It does not address large files: blobs stay in packs.
Principles for the forge (stock git clients keep working, every one)
Where the forge is today (file:line, from the code)
<dataDir>/repos(src/app.ts:221); smart HTTP pipesgit upload-pack/receive-pack --stateless-rpc(src/git/smart-http.ts:129). There is no scheduled gc or repack.<dataDir>/forge.db.Storeinterface withs3Store(Bun.S3Client, any endpoint, so R2 should work) anddirStore(src/snapshot/store.ts:12-30, :183, :242). It is the only bucket code, and it is local to snapshots.Order of work (each is its own issue, crew-sized)
BlobStore. Promotesrc/snapshot/store.tsto a shared module: streaming put and get, range reads, presigned GET and PUT, a storage-class hint, and fs plus S3-compatible implementations (R2, S3 and B2 all speak S3). Snapshots move onto it unchanged; finished run logs and attachments archive to it.packfile-urisor a promisor remote on HTTPS can carry them; otherwise the forge proxies them.) Add a per-repo "large files" panel showing sizes and where they live.Providers (prices read 2026-10-21; see the research notes)
Recommendation: R2 is the hot backbone; S3 Deep Archive or B2 holds cold backups. Refs stay in our database.
Apps as lambdas: what breaks (decision for the owner, not built here)
Stateless HTTP apps fit Workers or Lambda. Three things don't:
So cells stay the runtime for now. A "stateless app" profile, built on Workers, is a later option once apps declare that they are stateless.