A pack log is Keeper's sole object storage: a numbered append-only file holding git packs back-to-back, never mutated in place. The goal is a store trivially git-exchangeable that still never rewrites packs, so bytes copy verbatim and a dropped branch is just a refs tombstone. The method: keep git's pack encoding but strip the per-pack header and checksum, append object records to the project's tail log, and index every object and pack boundary in the Indices so a valid packfile reframes on the fly.
A log is named NNNNN.keeper with a 10-char RON64 store-wide sequential seqno, so a file_id names a log uniquely; the file sits in the project shard that wrote it.
.be/<project>/ flat pool holds all the project's NNNNN.keeper logs, .idx runs, and one refs.file_id names a log; it lives in the single project shard, no per-branch dirs.(file_id, offset).One log holds many packs back-to-back; a new log starts only past a size threshold, so a lone local commit appends to the tail rather than opening a file.
Within a pack, objects MUST follow git's type order — commits, trees, blobs, tags; keeper makes the implicit git repack grouping an explicit invariant writers enforce and readers trust.
type4-keyed index, not a pack-prefix scan — a pack may be blob-only.strict_order in KEEPPackFeed enforces only non-decreasing type; import copies git's stream, no Feed.Two git delta encodings get two base rules; together they keep every project shard self-contained, so a shard copies or recompacts in isolation.
Every appended pack also gets a bookmark index entry recording its extent, so per-pack reconstruction for the wire is O(1) — no varint scan, no inflation.
key=file_id20|offset40|type4(PACK), val=obj_count32|byte_len32; the reserved PACK type avoids object collisions.obj_count sums into the fresh PACK header; byte_len is the record length to sendfile from offset in file_id.
Keeper never rewrites or GCs packs live; dropping a branch is a refs tombstone and its objects linger until an out-of-band epoch.
refs tombstone; objects stay in the shard, no log is deleted or repacked, no live deletion.beagle→beagle2), leaving dead objects.