Radicle is a peer-to-peer, local-first code collaboration stack built on Git.


Radicle 1.7.0 – Daffodil

18.03.2026

Spring has sprung, where we’re writing from, and Daffodils are in season!

The Radicle team are springing into action and announcing the release of Radicle 1.7.0 (748ddad), code name Daffodil. The Daffodil is the national flower of Wales and starts to pop up in February/March – guiding us into the spring time.

This release consists of 226 commits from 11 contributors. Thank you to all the amazing contributors who provided valuable work this release:

Installation

curl -sSLf https://radicle.xyz/install | sh -s -- --no-modify-path --version=1.7.0

⚠️ Security Fix

This release contains a security fix, and so it is highly recommended that you update all of your nodes. The information on the vulnerability will be disclosed on the 2026-03-23, with a full write-up at https://radicle.xyz/2026/03/23/vulnerability-disclosure.

We have taken the time to scan all existing repositories on our public seeds, and have not detected any active exploitation of the vulnerability with malicious intent as of today, 2026-03-18.

New Features

Improved rad/sigrefs

The “Signed References” feature was reimplemented. The commits in refs/rad/sigrefs will now only verify if they carry an appropriate value for refs/rad/root in the associated refs blob. This reference was introduced in commit 989edacd564fa658358f5ccfd08c243c5ebd8cda, which was released via version 1.1.0. A new reference, refs/rad/sigrefs-parent, is now recorded in the refs blob, when writing a new entry. If present, its target must match the parent commit. This is to prevent a replay of a previous refs/rad/sigrefs commit. It is optional to maintain backwards compatibility, and might become mandatory (like refs/rad/root does in this release) in the future. Further, the new implementation detects replay of refs blobs. In order to do so, it walks the history of refs/rad/sigrefs backwards to the root commit, if refs/rad/sigrefs-parent is not set.

Blocking Policies

For those familiar with rad block, you may be aware that you can block a NodeId. Previous to this release, the blocked node’s references would be rejected during a fetch. However, it would not be blocked on the connection management level. With the changes included in this release, blocked nodes are now also blocked at the connection level. Any attempts for inbound or outbound connections will be rejected.

Include a Wider Set of References

The references of a remote were restricted to heads, tags, notes, rad, and cobs. This is too restrictive, and does not allow the extensibility that Git affords us as users. The restriction is now lifted, and the only references that are filtered out are refs/tmp/heads; used by radicle-remote-helper to create temporary patches.

Better Errors for rad id Updates

Using rad id to update the identity document as a non-delegate would result in unclear errors. Now, when a non-delegate user attempts to update the document, they will have a clearer error given to them.

$ rad id update \
    --repo rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji \
    --title "Add myself!" \
    --delegate did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk \
    --no-confirm
✗ Error: did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk is not a delegate, and only delegates are allowed to create a revision
✗ Hint: bob (you) is attempting to modify the identity document but is not a delegate!

Improved I/O Usage

Radicle uses sqlite for local state storage, and it was configured to use journal_mode = WAL, and the default value of synchronous = FULL. It was recently found that this combination would result in a high amount of I/O operations for a long running node. The journal_mode and synchronous pragmas are now configurable from rad config edit. The new default values for both are WAL and NORMAL, respectively. This results in less I/O operations. On power loss, transactions might be rolled back, but SQLite still guarantees consistency in this mode.

Fixed Bugs

Windows

Use winsplit on Windows

When preparing commands to execute, the shlex crate was used on all platforms. The semantics on Windows are different (e.g. ‘\’ is a path separator on Windows but marks an escape sequence on Unix-like systems). This lead to issues when attempting to execute child processes, and was fixed by using winsplit on Windows instead.

Prevent git-upload-pack Zombies

One of our Windows users noticed that git-upload-pack processes would never be reaped, resulting in zombie processes. These zombie processes are now prevented by using the “Job” API of the operating system to group child processes and their children.

Signal Handling Support

Signal handling is now supported, and so the radicle-node executable will now respect signals on Windows.

Responsive CLI Commands

Users of the rad CLI would often encounter the following output:

✗ Error: timed out reading from control socket

The reason for this was that the request/response pattern that was implemented never accounted for errors. When the Service would receive a request that resulted in a failure, it would log it, and move on. The Service has now learned to respond with errors. This will improve the above error scenarios by providing more information about the error that occurred.

IPv6 Address Parsing

Parsing addresses involving an IPv6 host failed if they were enclosed in square brackets, e.g. in rad node connect z6Mk...@[::1]:8776. Also, ambiguous addresses would parse, e.g. ::1:8776 would be indistinguishable from [::1]:8776. Since a port number is always required along with a host when providing an address, IPv6 addresses now always require brackets to avoid confusion. Existing IPv6 addresses that are stored in the sqlite database are migrated automatically on node startup.

Deprecations

rad fork

The rad fork command was confusing, and mislead users as to what its purpose was. Many believed it to create a hard-fork of the repository. Instead, it pushed the default branch to the local user’s namespace. The command is now deprecated, and you should use git push instead.

Breaking Changes

Seeds No Longer Contains Fetching Information

If you are using the radicle-node control socket, and request Seeds information, then expect a breaking change to the output. The Connected state of a peer no longer contains fetching information, which was separated out. This has resulted in the entire fetching value being removed.

Changes to rad node debug Information

The rad node debug information for ongoing fetches contained the number of subscribers awaiting for results, this was removed.

COB Type Names are More DNS Compliant

The TypeName strings defined in radicle-cob are restricted to reflect the size limits on domain names as specified in RFC-1035. These restrictions are:

Human-readable Timeout Durations

Several rad commands take a --timeout option, and each one would vary in units, e.g. seconds, milliseconds. These options now take human-readable durations as values, e.g. “9s” for 9 seconds, “1min” for 1 minute, etc. This is a breaking change since these options now require the unit to be specified.

Changelog

This release contains 226 commit(s) by 11 contributor(s).

Checksums

e6de41ba2b2efd07b9ab008717d720184f8385c3bb93ad5c4a37f257179ecfed  radicle-1.7.0-x86_64-apple-darwin.tar.xz
0dd4d185bd6a1e5588ec879471678c482b0cc27d92cb2cc3b22982e63e920049  radicle-1.7.0-aarch64-unknown-linux-musl.tar.xz
dd9b734dc7b7b7132e7a27e5a53e268276870bbebd195ff6c0e1273ec2984dea  radicle-1.7.0-aarch64-apple-darwin.tar.xz
e23ad2f616d9730db5ae4eb730baad1373172e2dcaec1fef2c6b199dba514378  radicle-1.7.0-x86_64-unknown-linux-musl.tar.xz