
Radicle is a peer-to-peer, local-first code collaboration stack built on Git.
Radicle 1.4.0 – Lily
04.09.2025The Radicle team is delighted to announce the release of Radicle 1.4.0 (bbd1e2c), code name Lily. Going forward, we want to name our releases after the abundant flowers and plants of this earth. We chose Lily as the first in honor of Finland’s national flower, the Lily of the Valley. The team is making this release from Helsinki 🇫🇮
This release contains 67 commits by 5 contributors. It’s exciting to see our Zulip community growing and having patches from fresh contributors! 👾
Thanks to the following contributors for providing their time and effort for this release:
- srestegosaurio
- Matthias Beyer
- Sebastian Martinez
Installation
curl -sSf https://radicle.xyz/install | sh -s -- --no-modify-path --version=1.4.0
Canonical Reference Improvements
The canonical reference calculation was improved internally so that the
developers can better reason about the process. During this, it was noted that
the Radicle storage copy of the repository and the working copy of the
repository were both used during the process. By ensuring that the storage
copy is the only one used, a class of bugs is ruled out. This, however, means
that a git push
will not fail when the pushed commit diverges, but will still
emit a warning that the new commit is diverging away from the other heads. We
weighed this up, and consider it an improvement, since the user is given control
of their own Git history.
Future improvements will provide ways of inspecting and resolving diverging heads.
Fixed Panics
Two instances of panics were fixed in this release.
The first, and most important, was a panic around serializing wire messages.
There is a strict size limit on the protocol messages that we control. However,
this size limit is not intended to be imposed on Git streams, for example during
fetching from other nodes. We incorrectly placed a check for this size limit in
the serialize
function, which meant it would panic for some Git fetches. This
was fixed by moving the check elsewhere, while also improving the code so we do
not make that mistake again.
The second involved using the read
method from the sqlite
crate. This method
calls try_read
and unwrap
s the Result
, which would cause a panic. We have
replaced the calls to read
with try_read
to more gracefully handle the
error.
Improvements Towards Windows Compatibility
We have continued along the path towards compatibility by fixing some areas that required some Windows specific handling. These included canonicalization of paths, and using the correct named pipes location for the control socket.
Improved Bootstrapping
Previously, we would use DNS to resolve to the IP address of bootstrap nodes, which would be used as the bootstrap address. Now, we may also use the IPv4, IPv6, and Tor addresses directly for bootstrapping.
Improvements to rad sync
We now use a more suitable symbol in rad sync status
for the status:
✗ Hint:
? … Status:
✓ … in sync ✗ … out of sync
! … not announced • … unknown
This aligns closer with the rad node status
output. As well as this, the Tip
column was renamed to SigRefs
, since the term Tip
was too ambiguous.
The internal logic of rad sync --announce
was improved by writing more tests
and finding edge cases to fix. Included in these improvements is changing the
target behavior. Before, the announcements would attempt to reach the preferred
seeds target and the replication factor. Now, it tries to reach the preferred
seeds and falls back to the replication factor.
Improvements to rad cob log
The rad cob log
command learned two new options, --from
and --to
. These
take a commit SHA that correspond to a COB operation, and allows you to limit
the log to start from or end the log at those operations, respectively.
Various Improvements
We have made the errors that occur in radicle-fetch
more fine-grained so that
we get better error reporting.
Also, thanks to Matthias Beyer for making improvements within our Rust code. These may not be visible to the user, but they may improve some performance, and improve the developers lives :)
Changelog
This release contains 67 commit(s) by 5 contributor(s).
bbd1e2cff
crates: 1.4.0 release fintan.halpenny@gmail.comde38d9741
build: move to usereleases/
prefix fintan.halpenny@gmail.com819ae5fdf
node/main: Refactor initialization of logging lorenz.leutgeb@radicle.xyzbc4a13902
systemd: Clean up default service configurations lorenz.leutgeb@radicle.xyz25decf161
systemd: Add example service hardening lcdt@disroot.orgd7aa2d9da
flake/hooks: Reconfigure Git Hooks lorenz.leutgeb@radicle.xyz7d2f0e387
node: e2e test for canonical ref update fintan.halpenny@gmail.com0d96af5d0
node: update default branch for canonical refs fintan.halpenny@gmail.comc38b9d9e1
node: simplify canonical reference calculation fintan.halpenny@gmail.coma8255a2e0
Introduce a node event for canonical reference updates fintan.halpenny@gmail.com690f6b02c
remote-helper: remove check for fast-forward fintan.halpenny@gmail.com119a12489
radicle: the great Canonical rewrite lorenz.leutgeb@radicle.xyz8a66e4d04
node/systemd: Check that received sockets are AF_UNIX lorenz.leutgeb@radicle.xyz192cc993a
radicle: Fix panic when reading from SQLite database fails lorenz.leutgeb@radicle.xyza568e7f48
protocol: Refactor decoding lorenz.leutgeb@radicle.xyzcbd2a7070
protocol: Refactor encoding lorenz.leutgeb@radicle.xyza8426dfda
protocol: Fix panic when serializing large frames lorenz.leutgeb@radicle.xyzc5b99db10
doc: Oversight when integrating winpipe lorenz.leutgeb@radicle.xyza4d83ec8d
node/control: Please the borrow checker lorenz.leutgeb@radicle.xyzfca96e697
node: Fix test on Windows lorenz.leutgeb@radicle.xyz19a262d3d
node: Use winpipe for control socket on Windows lorenz.leutgeb@radicle.xyzce11f03fe
radicle/profile: Control socket path for Windows lorenz.leutgeb@radicle.xyzfd34b680b
signals: Guard most of the crate for Unix lorenz.leutgeb@radicle.xyz5229fb8a5
fix: Normalize filesystem paths withdunce
lorenz.leutgeb@radicle.xyz31039bbce
radicle-fetch: More fine-grained errors lorenz.leutgeb@radicle.xyzd2517c500
radicle-fetch: Fallback to known version lorenz.leutgeb@radicle.xyza670b6e66
radicle: fix stream tests fintan.halpenny@gmail.com0c6ff06c6
radicle: use repository fixture in cob stream tests fintan.halpenny@gmail.com1d7478cd9
radicle: introducecob::common::Title
me@sebastinez.dev2a0f6fd3c
cli: extendrad cob log
behaviour fintan.halpenny@gmail.com044ff8add
radicle: introduce specialised Stream types fintan.halpenny@gmail.comc0ac228c3
radicle: introduce COB stream fintan.halpenny@gmail.com9b59c0e2c
radicle: add Op::load method fintan.halpenny@gmail.comdbfcf424d
radicle: add Op::manifest_of fintan.halpenny@gmail.combfe8c5234
cob: add method for loading entry manifest fintan.halpenny@gmail.com86119473b
test: add alphanumeric generator fintan.halpenny@gmail.com8953ec4c8
cli/inbox: Clearify “clear” behaviour mail@beyermatthias.de9a7c22536
radicle/config/node: Use newtypes lorenz.leutgeb@radicle.xyzc4ff0d8ea
radicle/config/node: Granular Default Values lorenz.leutgeb@radicle.xyz77f63c76d
Replace unit-returning-closure with drop() mail@beyermatthias.decb7c748c6
Move destructuring to fn signature mail@beyermatthias.de9486e751f
Simplify impl of Display for some types mail@beyermatthias.de787cb3a87
Collapse nested if mail@beyermatthias.deb0af48aa0
To not allocate in good case mail@beyermatthias.de0200e84ae
bootstrap: Add IPv6, IPv4, Onion addresses lorenz.leutgeb@radicle.xyz6a1b13bb6
cli: Use human-panic mail@beyermatthias.def6f3be437
cli/issue: Optimize how the issues are collected mail@beyermatthias.deb49ff9e5a
radicle: Implement Iterator::size_hint() for optimizations mail@beyermatthias.de1e66c5764
refactor: Replace return Err(anyhow!()) with anyhow::bail!() mail@beyermatthias.de01bed73a6
cli: fix error formatting fintan.halpenny@gmail.comed5b2659c
cli: Gracefully handle failure to link log file lorenz.leutgeb@radicle.xyzde78cf787
cli: Add verbose printing of authors lorenz.leutgeb@radicle.xyzc8b6a13d6
cli/sync/status: Refactor output table lorenz.leutgeb@radicle.xyzc089727e9
term, cli, remote-helper: Status Symbols lorenz.leutgeb@radicle.xyz1cd3ad078
node: Remove useless caching of node announcement lorenz.leutgeb@radicle.xyzefa7efacc
radicle: Announcer test set constructions fintan.halpenny@gmail.comc15288a69
radicle: note about Announcer::can_continue fintan.halpenny@gmail.com1b33229dd
radicle: test Announcer::timed_out on success fintan.halpenny@gmail.com11156619b
radicle: Announcer test repeated sync fintan.halpenny@gmail.comce2d3eb07
radicle: Announcer test synced with unknown node fintan.halpenny@gmail.comca7231e65
radicle: Announcer test adapting the replication target fintan.halpenny@gmail.com685c84e59
radicle: Announcer with replication factor of 0 fintan.halpenny@gmail.com4307eb35b
radicle: Announcer test AlreadySynced for preferred seeds fintan.halpenny@gmail.com376a5566c
radicle: Announcer test preferred seeds only fintan.halpenny@gmail.com84f11f5e3
radicle: Announcer ensures local node is ignored fintan.halpenny@gmail.com8a6e55502
radicle: Announcer can exit on preferred seeds or replication factor fintan.halpenny@gmail.comd14709481
fix: upgrade radicle-crypto fintan.halpenny@gmail.comChecksums
82ad1e7f0afbf59bc95b6f9996bb5db570ba3661ce9644c370e8140a2364cdb3 radicle-1.4.0-x86_64-apple-darwin.tar.xz
937ddc7016fa0cbd9ce2449294939dcab6802880109ae58a5f4b7a03ae63d5b9 radicle-1.4.0-x86_64-unknown-linux-musl.tar.xz
6b673bae8d2531c07b3e1df853dbc0396397569aae29f5675b3bb4606306735e radicle-1.4.0-aarch64-apple-darwin.tar.xz
d51ba8ca3b9277e5d06dcafee2ae04d9a4ad697b6bd57b33e436b559e85820e0 radicle-1.4.0-aarch64-unknown-linux-musl.tar.xz