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 unwraps 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).
bbd1e2cffcrates: 1.4.0 release fintan.halpenny@gmail.comde38d9741build: move to usereleases/prefix fintan.halpenny@gmail.com819ae5fdfnode/main: Refactor initialization of logging lorenz.leutgeb@radicle.xyzbc4a13902systemd: Clean up default service configurations lorenz.leutgeb@radicle.xyz25decf161systemd: Add example service hardening lcdt@disroot.orgd7aa2d9daflake/hooks: Reconfigure Git Hooks lorenz.leutgeb@radicle.xyz7d2f0e387node: e2e test for canonical ref update fintan.halpenny@gmail.com0d96af5d0node: update default branch for canonical refs fintan.halpenny@gmail.comc38b9d9e1node: simplify canonical reference calculation fintan.halpenny@gmail.coma8255a2e0Introduce a node event for canonical reference updates fintan.halpenny@gmail.com690f6b02cremote-helper: remove check for fast-forward fintan.halpenny@gmail.com119a12489radicle: the great Canonical rewrite lorenz.leutgeb@radicle.xyz8a66e4d04node/systemd: Check that received sockets are AF_UNIX lorenz.leutgeb@radicle.xyz192cc993aradicle: Fix panic when reading from SQLite database fails lorenz.leutgeb@radicle.xyza568e7f48protocol: Refactor decoding lorenz.leutgeb@radicle.xyzcbd2a7070protocol: Refactor encoding lorenz.leutgeb@radicle.xyza8426dfdaprotocol: Fix panic when serializing large frames lorenz.leutgeb@radicle.xyzc5b99db10doc: Oversight when integrating winpipe lorenz.leutgeb@radicle.xyza4d83ec8dnode/control: Please the borrow checker lorenz.leutgeb@radicle.xyzfca96e697node: Fix test on Windows lorenz.leutgeb@radicle.xyz19a262d3dnode: Use winpipe for control socket on Windows lorenz.leutgeb@radicle.xyzce11f03feradicle/profile: Control socket path for Windows lorenz.leutgeb@radicle.xyzfd34b680bsignals: Guard most of the crate for Unix lorenz.leutgeb@radicle.xyz5229fb8a5fix: Normalize filesystem paths withduncelorenz.leutgeb@radicle.xyz31039bbceradicle-fetch: More fine-grained errors lorenz.leutgeb@radicle.xyzd2517c500radicle-fetch: Fallback to known version lorenz.leutgeb@radicle.xyza670b6e66radicle: fix stream tests fintan.halpenny@gmail.com0c6ff06c6radicle: use repository fixture in cob stream tests fintan.halpenny@gmail.com1d7478cd9radicle: introducecob::common::Titleme@sebastinez.dev2a0f6fd3ccli: extendrad cob logbehaviour fintan.halpenny@gmail.com044ff8addradicle: introduce specialised Stream types fintan.halpenny@gmail.comc0ac228c3radicle: introduce COB stream fintan.halpenny@gmail.com9b59c0e2cradicle: add Op::load method fintan.halpenny@gmail.comdbfcf424dradicle: add Op::manifest_of fintan.halpenny@gmail.combfe8c5234cob: add method for loading entry manifest fintan.halpenny@gmail.com86119473btest: add alphanumeric generator fintan.halpenny@gmail.com8953ec4c8cli/inbox: Clearify “clear” behaviour mail@beyermatthias.de9a7c22536radicle/config/node: Use newtypes lorenz.leutgeb@radicle.xyzc4ff0d8earadicle/config/node: Granular Default Values lorenz.leutgeb@radicle.xyz77f63c76dReplace unit-returning-closure with drop() mail@beyermatthias.decb7c748c6Move destructuring to fn signature mail@beyermatthias.de9486e751fSimplify impl of Display for some types mail@beyermatthias.de787cb3a87Collapse nested if mail@beyermatthias.deb0af48aa0To not allocate in good case mail@beyermatthias.de0200e84aebootstrap: Add IPv6, IPv4, Onion addresses lorenz.leutgeb@radicle.xyz6a1b13bb6cli: Use human-panic mail@beyermatthias.def6f3be437cli/issue: Optimize how the issues are collected mail@beyermatthias.deb49ff9e5aradicle: Implement Iterator::size_hint() for optimizations mail@beyermatthias.de1e66c5764refactor: Replace return Err(anyhow!()) with anyhow::bail!() mail@beyermatthias.de01bed73a6cli: fix error formatting fintan.halpenny@gmail.comed5b2659ccli: Gracefully handle failure to link log file lorenz.leutgeb@radicle.xyzde78cf787cli: Add verbose printing of authors lorenz.leutgeb@radicle.xyzc8b6a13d6cli/sync/status: Refactor output table lorenz.leutgeb@radicle.xyzc089727e9term, cli, remote-helper: Status Symbols lorenz.leutgeb@radicle.xyz1cd3ad078node: Remove useless caching of node announcement lorenz.leutgeb@radicle.xyzefa7efaccradicle: Announcer test set constructions fintan.halpenny@gmail.comc15288a69radicle: note about Announcer::can_continue fintan.halpenny@gmail.com1b33229ddradicle: test Announcer::timed_out on success fintan.halpenny@gmail.com11156619bradicle: Announcer test repeated sync fintan.halpenny@gmail.comce2d3eb07radicle: Announcer test synced with unknown node fintan.halpenny@gmail.comca7231e65radicle: Announcer test adapting the replication target fintan.halpenny@gmail.com685c84e59radicle: Announcer with replication factor of 0 fintan.halpenny@gmail.com4307eb35bradicle: Announcer test AlreadySynced for preferred seeds fintan.halpenny@gmail.com376a5566cradicle: Announcer test preferred seeds only fintan.halpenny@gmail.com84f11f5e3radicle: Announcer ensures local node is ignored fintan.halpenny@gmail.com8a6e55502radicle: Announcer can exit on preferred seeds or replication factor fintan.halpenny@gmail.comd14709481fix: 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