Source control, reimagined

Commit your .env.

Version control where the host cannot read your code. loot makes visibility and permissions properties of content and changes, not of the repository. Keep files private inside a shared repo. Embargo a security fix, cut the release, and reveal the source later.

curl -sSf https://loot.millerbyte.com/install.sh | sh

macOS · Linux · Windows — see all install options. Installs to ~/.loot/bin; verify with loot --version.

what the host stores4841 bytes, addressed by hash
what a key opensREADME.md
# loot

A from-scratch source-control system.

**Thesis:** visibility and permissions belong to *content and changes*, not to
the *repository*. Commit your `.env`. Keep files private inside a shared repo.
Embargo a security fix: merge it, cut the release, reveal the source later.

This is the unsolved problem in modern version control. Ergonomics (jj already
nails them) are a layer for later.

## Security

loot's cryptography is written from scratch and has never been independently
…
7d b5 14 da 94 31 d9 10 e8 87 9d eb 01 95 af ce
56 65 8d 0b 20 2c af 93 88 54 30 2e 2e e0 cd 72
0d 14 b0 5d 4c 97 7a 24 1c 70 0a f7 5e 0a c8 f1
c9 51 82 af 23 df 5a c0 95 0a 29 4d fa de bf 8c
83 a7 39 90 34 32 5c f6 cb 90 69 a3 d4 c4 a7 67
f4 f0 b4 c7 b6 ce 78 dc af ff 3d 06 e5 dd b7 0e
85 72 61 21 50 7c 64 bc 39 5e 8c 04 59 72 98 1b
a3 b6 ba 50 ff fc bd 86 02 5b b4 a2 83 b9 eb a8
c1 bf bd 47 5b 4f f3 32 14 e8 67 2d 64 29 e4 c3
ef 90 f6 4c 93 4a 08 2f 5b 7a 55 70 88 9c 4d e5
68 4c 65 34 69 e5 5b 40 68 c6 82 b2 ff 9f 1c 30
57 24 3f e9 60 4b bf dd 74 53 dc 69 43 0e 4f 5e
…

One file on this host, shown twice. Both panes are this server's live answer for the same address — 20d8a9c631c77ae9…

Ciphertext. It is printable here because it discloses nothing — the same property that makes it safe to hand a host.

Published — which is why you can read it. The published tier is the only thing this forge holds a key for.

  • live
  • 4841 bytes sealed
  • generation 14
  • README.md
  • address 20d8a9c631c77ae9…

Three things git can't do

Each is one command. Full walkthroughs live in the docs.

01sealed

Commit a private .env

Declare per-file privacy in .lootattributes. The secret is sealed in a shared repo; non-keyholders carry the ciphertext and can never read it.

Walkthrough →
.lootattributes
.env restricted=alice
non-keyholderkey unseal: wrong recipient or corrupt envelope

What works today

loot is a from-scratch, encrypted-DAG source-control system that hosts its own development. The full loop, from first init to relay-based collaboration, runs now.

local
initstatusdescribenewlogsurface
docks
dockdocksdock merge
file
bundleapply
relay
servepushpull
grants
grantgrant --relaygrantspull-grants
identity
keygenwhoamipeer addid export/import
02embargoed

Embargo a security fix

Merge the patch and cut the release now; the source stays encrypted to everyone until the reveal timestamp, then unlocks for anyone who pulls.

.lootattributes
security-fix.txt embargoed=1800000000
Walkthrough →
03

Grant a key to a teammate

Hand one content key to one identity over the relay — sealed to their public key, signed by you, recorded in the audit manifest. Permissioning is key management.

shell
loot grant --relay origin .env bob
Walkthrough →

Check it yourself

Browse this repo with no account. Every path is listed, and everything but the published files is locked: the forge that hosts it holds no key to open them.

Open the tree →

Built with loot

loot leads its own development; git main is a downstream projection. The forge that hosts it holds no key to the private code it stores, only to what is published, and the proof log shows the sealing that makes that true.