OXYGENHUB
# 1d9702887eee oxygenhub / README.md
3.7 KiB · Markdown · last changed oxygen and oxygenflow as pinned subrepos in deps/ (make pins moves them), and an OxygenFlow pipeline: fmt of this workspace, then clippy, tests and a release build against the pins 1 month ago renderedsource blame history raw

Oxygenhub

A forge for Oxygen repositories: hosting, browsing, review, issues and releases, in one Rust binary with one data directory. It works like GitHub where GitHub is right and differs where Oxygen's commutative model makes something better possible. The specification is docs/spec.md; deployment notes are in docs/deploy.md.

Status

Milestones 0.1 (browse), 0.2 (accounts and access), 0.3 (proposals and review), 0.4 (issues and notifications), 0.5 (API, webhooks, checks) and 0.6 (web edits, releases, mirror, code search) are done: pages show trees, files, blame, history with the dependency graph, changes with diffs, comparisons, bookmarks, tags, conflicts, the trust policy and the push log; accounts sign in with a password and optional TOTP, create repositories and organisations, hold roles, mint scoped tokens for oxy, and link their Oxygen keys so signed changes are attributed to them; proposals offer a bookmark's changes for another with the resulting state, diff and conflicts computed before landing, comments anchored to atoms, approvals backed by seals, and landing from the hub or from oxy proposal land; issues with labels, assignees, milestones, cross references and closing keywords; an inbox with watching, subscriptions, mentions and optional email; search over issues, proposals, repositories and accounts; a JSON API for all of it with scoped tokens, webhooks with signed deliveries and retries, and checks on state hashes that gate landing; editing and conflict resolution in the browser, signed by the hub as your delegate; releases with assets and source archives; a read-only Git mirror for Git-only tools; and code search. The runner follows in 0.7.

Running

cargo build --release
target/release/oxygenhub --data /srv/oxygenhub init --base-url https://hub.example:7343 --self-signed
target/release/oxygenhub --data /srv/oxygenhub admin user create andy --admin
target/release/oxygenhub --data /srv/oxygenhub serve

Sign in, create a repository under + NEW and a token under Settings › Tokens, then from any checkout: oxy remote add hub https://hub.example:7343/andy/oxygen, oxy config remote.hub.token <token> and oxy push hub. With a self-signed certificate, hand clients the CA with OXY_CA=<path> or oxy config remote.hub.ca <path>.

Configuration lives in <data>/hub.toml (spec §17.1) and every key can be overridden with OXYHUB_<SECTION>_<KEY>.

Layout

crates/hub        the binary: config, db (sqlx + migrations), repos (registry, locks, views),
                  protocol (embedded oxy-server), web (pages), api (JSON), render (markdown,
                  highlighting, diffs, graph)
crates/hub-api    the JSON API's types, shared with clients
templates/        askama templates and the stylesheet
assets/           vendored fonts, icons, the small progressive-enhancement script
migrations/       under crates/hub; applied at start

Developing

make check runs formatting, clippy with warnings as errors, and the tests. The tests use a real oxy-core client against a hub on a loopback port and never touch your own Oxygen configuration.

oxygen and oxygenflow as pinned subrepos

The hub builds against deps/oxygen and deps/oxygenflow, subrepos (oxy submodule) pinned to exact states, so every build says which oxygen it used and OxygenFlow can build it without network. make pins moves both to their main on Earth (push those repositories first); the next commit records the new pins. Format only this workspace, cargo fmt -p oxygenhub -p hub-api: --all also reaches the path dependencies in deps/, which have their own formatting. After a fresh clone, oxy submodule update --init fetches them.