Commit Graph

22 Commits

Author SHA1 Message Date
Maciek "mab122" Bator 4ab6fc2499 docs: document rad lfs backfill and the unseed refcounting fix 2026-07-17 15:22:31 +02:00
Maciek "mab122" Bator a84aeb23f7 lfs: configure a branch push refspec too, single `git push rad` now works
`rad lfs init` previously only configured a push refspec for the
notes ref (`+refs/notes/rad-lfs/local:refs/notes/rad-lfs`) -- once
any explicit push refspec exists on a remote, git stops falling back
to push.default-driven behavior for a bare `git push rad`, so it only
ever pushed the notes mapping, never the branch. That's the exact
footgun that just caused a real "blog did not update" report: `git
push rad` (bare) after a commit only sent the notes ref, silently
leaving the commit itself unpushed.

Add a second push refspec, `+refs/heads/*:refs/heads/*`, mirroring
the existing `+refs/heads/*:refs/remotes/rad/*` fetch refspec already
configured. A bare `git push rad` now pushes every local branch and
the notes mapping together in one command.

Only takes effect once `rad lfs init` has been (re-)run with this
build -- it's an additive, idempotent config change via the existing
`ensure_refspec` helper, no migration/cleanup needed since there's no
stale conflicting entry to remove this time. Updated `rad lfs init`'s
own success/info messages plus README.md/LFS-IPFS.md/
radicle-lfs-transfer's README to match -- the "push gotcha" workaround
they documented is now the *old*-repository fallback path, not the
primary instructions.
2026-07-16 15:23:00 +02:00
Maciek "mab122" Bator ae7aed5db5 docs: add quickstart cheatsheet to README, clarify push gotcha
Adds a copy-pasteable day-to-day cheatsheet (init, track/commit/push,
clone-elsewhere, private-repo rekey) right after the existing "Zero to
usable" build section. Also corrects/expands the existing
git-push-rad troubleshooting row in LFS-IPFS.md based on today's live
round-trip test: `rad lfs init` only configures a push refspec for the
notes ref, not the branch, so pushing a commit needs both
`git push rad <branch>` and a separate bare `git push rad` -- missing
the second step is what produces "no CID recorded for oid" on a
collaborator's clone.
2026-07-16 12:54:42 +02:00
Maciek "mab122" Bator e060442017 Add client-side encryption for private-repo LFS objects
Radicle's Visibility::Private is enforced entirely by access control at
the replication layer -- git objects for a private repo are plain,
unencrypted objects, protected only by "unauthorized peers are never
given them" (identity/doc.rs). That protection has no jurisdiction over
IPFS's own block-exchange layer: once a legitimate collaborator's IPFS
daemon pins content and joins the network, anyone who obtains the CID by
any means can fetch the plaintext directly.

Adds envelope encryption for private repos: a random per-object content
key encrypts the file (XChaCha20-Poly1305), wrapped once per authorized
recipient (delegates + private allow-list) via ECDH between Radicle
identity keys (already Ed25519, no separate keypair needed) plus HKDF.
The wrapped keys travel in the same refs/notes/rad-lfs note as the CID.

New:
- crates/radicle-cli/src/lfs_crypto.rs -- encryption core (envelope
  schema, encrypt/decrypt, key wrapping, recipient resolution, signer
  loading).
- `rad lfs store`/`rad lfs fetch` -- plumbing commands that now own the
  entire IPFS add/cat + git-notes read/write step (encrypting/decrypting
  as needed), replacing what the pre-commit hook and rad-lfs-transfer
  used to do directly. This collapses what would've become a third copy
  of the note-format logic down to one canonical implementation.
- `rad lfs rekey` -- since Radicle's access control is retroactive (a
  newly-authorized DID can replicate full history) but encrypted objects
  aren't automatically re-wrapped for new recipients, this command lets
  an already-authorized collaborator grant a newly-authorized one access
  to previously-committed objects, without re-encrypting or re-uploading
  content. Revocation remains unsolved, matching Radicle's own model
  (already-replicated/decrypted content can't be un-known).

Operational requirement: private-repo LFS operations need a signer
capable of ECDH, which only an unencrypted keystore or RAD_PASSPHRASE
provides (an ssh-agent-only signer can sign but not do key agreement).
Fails fast with an actionable error rather than hanging on a passphrase
prompt inside a non-interactive git hook.

Breaking change: the refs/notes/rad-lfs note format moves from bare
`cid=<cid>` text to JSON (`{"v":1,"cid":"...","enc":...}`). No migration
path -- prototype, no external users yet.

Verified end-to-end with real Radicle profiles/identities (not just the
transfer-agent protocol): a private repo's IPFS-stored content is
confirmed ciphertext (byte-different from plaintext, +16 bytes AEAD tag);
an authorized peer decrypts correctly; an unauthorized peer is denied
with a clear error and no leaked content; RAD_PASSPHRASE is required and
enforced with a fast, clear failure; and rekey correctly grants a
newly-authorized peer access to a pre-existing object while leaving other
recipients' entries untouched.
2026-07-14 16:01:49 +02:00
Maciek "mab122" Bator 5d53fab673 docs: zero-to-install quick start, Arch dependency lists, fix cross-repo links
Cross-repo markdown links (radicle-lfs-transfer) now use full https URLs
instead of relative paths, since Forgejo can't resolve ../other-repo across
repositories the way a plain filesystem or the git submodule mechanism can.
2026-07-14 12:51:30 +02:00
Maciek "mab122" Bator 005d708059 readme: note this is a fork adding LFS-over-IPFS support 2026-07-14 12:34:49 +02:00
Lorenz Leutgeb aa177b0400
treewide: radicle.{xyz → dev,network}
We have moved to radicle.dev, so adjust the domain name in various
places.

Not changed:
 - COB type names
 - systemd secret identifiers
2026-04-27 18:34:30 +02:00
Ivan Stanković 85ddcace0a docs: fix installation instructions in README.md
Crates have been moved, so make sure the paths are correct.
2025-07-20 15:33:12 +00:00
Lars Wirzenius a9fa31e5e6 docs: add links to to README.md to home page and Zulip
This makes it more obvious how to find more information about the
project and how to talk to the project.

Signed-off-by: Lars Wirzenius <liw@liw.fi>
2025-04-23 11:22:48 +02:00
Lorenz Leutgeb a9a4aac322
docs, cli: Mention feedback, also via e-mail 2025-04-10 15:04:52 +02:00
cloudhead a4989b7ce7
Remove `radicle-httpd` crate
The HTTP daemon is moved to the `radicle-explorer` repository. Hence,
all traces of it are removed from this repository.
2024-06-06 11:14:00 +02:00
cloudhead 2f3d1284ca
docs: Fix download link in README.md 2024-05-04 22:58:39 +02:00
cloudhead 104a1b96d0
docs: Specify `--root` for source installation
This places the binaries in the common location for Radicle.
2024-05-03 12:07:45 +02:00
cloudhead 55c4de0239
Remove outdated Dockerfiles 2024-04-29 18:02:07 +02:00
cloudhead 0b816d5c86
docs: Typo fixes
Nb. This was submitted by user `@omahs` via GitHub, but since an email
address was not included in the commits, I've used my own.
2024-04-29 13:28:31 +02:00
Lars Wirzenius a71289f720
docs: link to protocol guide
Signed-off-by: Lars Wirzenius <liw@liw.fi>
2024-04-03 15:32:26 +02:00
cloudhead 15efae2a74
docs: Use POSIX-compliant install command 2024-03-15 10:36:22 +01:00
Alexis Sellier e33661738c
Move unit files to `systemd` directory 2023-06-22 12:13:30 +02:00
Alexis Sellier 33870572d4
Improve unit files, add binary install to README
After going through the process of getting this working using the unit
files, I found a few issues that are fixed here.
2023-06-22 12:13:30 +02:00
Alexis Sellier 49a6dacd75
Flesh out `README` 2023-03-13 12:19:20 +01:00
Slack Coder eedf08031d
README: Add install instructions
Advise on how to install the project as `cargo install` requires the
`--locked` option to succeed.

Signed-off-by: Slack Coder <slackcoder@server.ky>
2023-01-12 13:15:37 +01:00
Alexis Sellier ba95725028
Add placeholder README 2022-10-14 13:19:28 +02:00