OXYGENHUB
# 170bb436e1d5 oxygen / README.md
5.5 KiB · Markdown · last changed Revsets: oxy log -r selects changes by set algebra over history 1 month ago renderedsource blame history raw
648724d8 unknown ↶ 1
# Oxygen
2
ee06a6c5 Andy McCall ↶ 3
Oxygen (`oxy`) is a distributed, commutative version control system written in Rust for large repositories. See [docs/spec.md]docs/spec.md for the specification, [docs/guide.md]docs/guide.md for a user guide by task, and [docs/protocol.md]docs/protocol.md if you are implementing a client or server.
d02e545d Andy McCall ↶ 4
5
It is self-hosting: this directory is an Oxygen repository, and the project's own history is kept with `oxy`, not with Git.
6
7
## What is different
8
9
- **History is a set of changes, not a chain of snapshots.** A change records what it did to identified lines and tree nodes and which earlier changes it depends on. Changes that do not depend on each other commute, so there are no merge commits and rebasing independent work rewrites nothing.
10
- **Conflicts are data.** A conflicted state can be committed, pushed and pulled. Resolving one is an ordinary edit followed by a commit.
11
- **Every change has a stable ID and a content hash.** The ID survives rewrites; the hash makes history tamper-evident.
12
- **Everything is signed.** Composite Ed25519 + ML-DSA-65 signatures on changes and on every bookmark update, verified against a trust policy that lives in the repository.
13
- **Every operation is undoable** through an operation log.
14
- **Large files are chunked** with content-defined chunking into a BLAKE3-addressed store.
15
16
## Status
17
18
Early, but usable for its own development. Implemented: the object model, the change graph with conflict detection and resolution, the working copy (`status`, `commit`, `checkout`, `diff`, `undo`), identities and signatures, remotes over local paths and HTTP(S) with `clone`, `fetch`, `pull`, `push`, the reference server `oxy serve`, the trust policy, and packed storage.
19
20
Not yet: checkpoints for very long histories, history editing (`rebase`, `split`, `edit`), multiple workspaces, garbage collection with retention, and the Thin client profile for constrained machines.
21
22
## Building
23
24
```
25
cargo build --release
26
cargo test --workspace
27
```
28
29
The binary is `target/release/oxy`.
f4324e40 unknown ↶ 30
d02e545d Andy McCall ↶ 31
## Quick start
32
33
```
34
oxy identity create --name "Your Name" --email [email protected]
35
oxy config --user core.sign change      # sign every commit
36
oxy init                                 # in a project directory
37
oxy status
38
oxy commit -m "First change"
94084087 Andy McCall ↶ 39
oxy log                                  # -n 10 for the latest ten, -v for full messages
47ce8b8e Andy McCall ↶ 40
oxy log -r 'v0.3.1..main & author(me)'   # a revset: set algebra over history
d02e545d Andy McCall ↶ 41
```
42
94084087 Andy McCall ↶ 43
Output uses colour, glyphs, and relative times on a UTF-8 terminal, and
44
falls back to plain ASCII when piped, with `--plain`, or with `NO_COLOR` set.
45
ff1f62fe Andy McCall ↶ 46
Collaborating through a hub such as OxygenHub: sign in once, in the
47
browser, and every repository on that hub clones, fetches and pushes with it.
d02e545d Andy McCall ↶ 48
49
```
ff1f62fe Andy McCall ↶ 50
oxy auth login https://oxygenhub.io
51
oxy clone https://oxygenhub.io/owner/project
52
oxy push
53
oxy pull
54
```
55
56
Or with your own server:
57
58
```
d02e545d Andy McCall ↶ 59
oxy serve --root /srv/oxy --bind 0.0.0.0:8890 --tls-cert cert.pem --tls-key key.pem --token SECRET
ff1f62fe Andy McCall ↶ 60
echo SECRET | oxy auth login https://host:8890 --with-token
d02e545d Andy McCall ↶ 61
oxy clone https://host:8890/project
62
```
63
8e119486 Andy McCall ↶ 64
A repository kept on your own storage, with no server in between (Oxygen
65
Strata, see `docs/strata.md`): a bucket in your cloud account, in your
66
region, under your keys, or a directory on a shared drive.
67
68
```
69
oxy remote add cloud s3://my-bucket/repos/project --profile work   # or gs://, az://, dir://
70
oxy remote check cloud                   # reachable, what it holds, and that it behaves
71
oxy push cloud
72
oxy clone s3://my-bucket/repos/project?profile=work
73
```
74
d02e545d Andy McCall ↶ 75
Trust policy, so a server accepts only changes from keys you have granted:
76
77
```
78
oxy policy init                          # your key becomes the root
79
oxy identity export                      # a contributor sends you this file
80
oxy policy grant alice.identity
81
oxy push                                 # publishes the policy
82
```
83
728da0f9 Andy McCall ↶ 84
Bookmarks (`oxy bookmark create|switch`, `oxy merge`), submodules (`oxy submodule add|update`),
85
partial commits (`oxy commit PATH..`, `oxy commit -i`), `oxy blame`, `oxy bisect`, `oxy squash` and
86
`oxy rebase` cover the everyday Git toolbox; see the guide.
87
30ea9c1e Andy McCall ↶ 88
Working alongside Git: `oxy git import <repo> <dest>` converts a Git history, `oxy git fetch <url>`
89
brings new commits of a Git remote into the bookmark, `oxy git push <url>` publishes the bookmark as
90
commits on top of them, and `oxy git export <dir>` writes a plain Git mirror.
91
28fc23d7 Andy McCall ↶ 92
Keys have a lifecycle: `oxy identity rotate` moves to a fresh key pair (the policy follows),
7ba155f2 Andy McCall ↶ 93
`oxy identity renew --expires 365` sets an expiry, `oxy identity delegate add agent.identity --scope changes --expires 8h`
94
lets another key sign changes for you (an AI agent, say) for a while without ever being able
95
to move a bookmark, and `oxy identity revoke` retires a key. With several root
28fc23d7 Andy McCall ↶ 96
keys, `oxy policy root add|remove|threshold` and `oxy policy sign` gather the required signatures
97
through proposal files.
98
d02e545d Andy McCall ↶ 99
## Layout
100
101
| Path | Contents |
102
|---|---|
103
| `crates/oxy-core` | Library: encoding, hashing, objects, the change graph, storage, identities, policy, protocol, repository operations |
104
| `crates/oxy-server` | Reference HTTP(S) server for the wire protocol |
8e119486 Andy McCall ↶ 105
| `crates/oxy-strata` | The S3, Google Cloud Storage and Azure stores a repository can be kept on |
d02e545d Andy McCall ↶ 106
| `src/cli` | The `oxy` command-line interface |
107
| `docs/spec.md` | The specification |
ee06a6c5 Andy McCall ↶ 108
| `docs/guide.md` | User guide, organised by task |
8e119486 Andy McCall ↶ 109
| `docs/strata.md` | Keeping a repository on your own storage: S3, GCS, Azure, a directory |
ee06a6c5 Andy McCall ↶ 110
| `docs/protocol.md` | Wire protocol for other implementers |
111
| `docs/prompt.md` | Shell prompt integration |
d02e545d Andy McCall ↶ 112
113
## Licence
114
115
MIT or Apache-2.0, at your option.