Radish alpha
r
rad:z371PVmDHdjJucejRoRYJcDEvD5pp
Radicle website including documentation and guides
Radicle
Git
radicle.xyz _posts 2025-08-12-radicle-1.3.0.md

The Radicle team is delighted to announce the release of Radicle 1.3.0 (29043134a). This release contains 48 commits by 7 contributors. We would like to thank everyone for their continued effort in helping us improve the Radicle protocol and tooling via their contributions and usage reports 👾

Installation

curl -sSLf {{ site.url }}/install | sh -s -- --no-modify-path --version=1.3.0

Canonical References

This feature has been under way for quite some time, and we are proud to announce that it’s ready for you to use!

Canonical reference rules have been introduced via an identity payload entry under the identifier xyz.radicle.crefs. Here’s an example of the payload that includes a single rule for tags that live under refs/tags/releases/*:

"xyz.radicle.crefs": {
  "rules": {
    "refs/tags/releases/*": {
      "allow": [
        "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
        "did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
        "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM"
      ],
      "threshold": 2
    }
  }
}

The canonical reference rules are now used to check for canonical updates. The rule for the defaultBranch of an xyz.radicle.project is synthesized from the identity document fields: threshold and delegates. This means that a rule for that reference is not allowed within the rule set. This is checked when performing a rad id update.

For a more detailed history and usage of canonical references, check out the accompanying post.

Introducing radicle-protocol

This set of changes is mostly cosmetic for the time being. A new crate, radicle-protocol, was introduced to provide a home for a sans I/O implementation of the Radicle protocol. The crate currently defines the inner workings of the protocol, and radicle-node depends on this.

Note here that we switched to use the bytes crate, and we witnessed a panic from this crate while using a pre-release. It has not showed up again, but we introduced the use of backtraces to help identify the issue further. So, please report a backtrace if the radicle-node stops due to this issue.

Path to Windows

We made an effort to start paving some of the way to being able to use Radicle on Windows. The first step was taken for this, and you can now use the rad CLI on a Windows machine – without WSL.

Currently, git-remote-rad and radicle-node are blockers for full Windows support. However, the sans I/O approach mentioned above will provide a way forward for implementing a radicle-node that works on Windows, and we will continue to look into other fixes required for getting full Windows support.

Improved Log Rotation

The rotation of logs under .radicle/node now works using a numbered system, i.e. node.log.1, node.log.2, etc. The current running node will log to node.log, which is a symlink to most recent number.

This means that logs will be persisted between runs, which will require occasional cleanup.

Display Full Node ID

We have improved the formatting for Node IDs and node addresses. The CLI will output shortened forms of NIDs and addresses when the output is transient, and the full form where it is presented to the user. This will allow you to be able to copy and paste these identifiers.

Stable Order for Pinned Repositories

The pinned repositories now maintain their insertion order, meaning that they should not be reordered by any other factors other than the user’s decision on which repositories should appear first.

Relax Pushes for git-remote-rad

The git-remote-rad would always expect a working copy and a reference when performing pushes. These constraints are relaxed to allow a bare Git repository and any kind of Git revision. This should improve the experience for users of jj.

Connect Attempts will Error

If a connection attempt would not happen due to an error, the result of the error was never returned. This would often lead to timeouts when using rad node connect. We now return the error and can report it instead of waiting for a timeout.

Default Branch Picker

When running rad init the default value for the defaultBranch of the repository is now by provided the branch you are on or the Git configuration option init.defaultBranch.

Changelog

For a full list of changes, see below:

Checksums

f09b4203a47611e1e6a78ea9087b5cae2f94cacc649ed195840a0869d821c861  radicle-1.3.0-x86_64-apple-darwin.tar.xz
a25c67276a86c9fbadadbacbd2ea9763202e99701aa85cf7fe5815662696988d  radicle-1.3.0-x86_64-unknown-linux-musl.tar.xz
3a615bb99bc998b3fca5ad8582599c8dfb3cffb0beec291f5939d4b559270227  radicle-1.3.0-aarch64-unknown-linux-musl.tar.xz
7939e1d1bce232730843d8975f205558b0885479c6666b630abb1500b67756db  radicle-1.3.0-aarch64-apple-darwin.tar.xz
---
title: "Radicle 1.3.0"
image: radicle-1.png
---

The Radicle team is delighted to announce the release of Radicle 1.3.0
(29043134a). This release contains 48 commits by 7 contributors. We would like
to thank everyone for their continued effort in helping us improve the Radicle
protocol and tooling via their contributions and usage reports 👾

## Installation

```
curl -sSLf {{ site.url }}/install | sh -s -- --no-modify-path --version=1.3.0
```

## Canonical References

This feature has been under way for quite some time, and we are proud to
announce that it's ready for you to use!

Canonical reference rules have been introduced via an identity payload entry
under the identifier `xyz.radicle.crefs`. Here's an example of the payload that
includes a single rule for tags that live under `refs/tags/releases/*`:

```
"xyz.radicle.crefs": {
  "rules": {
    "refs/tags/releases/*": {
      "allow": [
        "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
        "did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
        "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM"
      ],
      "threshold": 2
    }
  }
}
```

The canonical reference rules are now used to check for canonical updates. The
rule for the `defaultBranch` of an `xyz.radicle.project` is synthesized from the
identity document fields: `threshold` and `delegates`. This means that a rule
for that reference is not allowed within the rule set. This is checked when
performing a `rad id update`.

For a more detailed history and usage of canonical references, check out the
accompanying [post](/2025/08/12/canonical-references.html).

## Introducing `radicle-protocol`

This set of changes is mostly cosmetic for the time being. A new crate,
`radicle-protocol`, was introduced to provide a home for a [sans I/O][sans-io]
implementation of the Radicle protocol. The crate currently defines the inner
workings of the protocol, and `radicle-node` depends on this.

Note here that we switched to use the `bytes` crate, and we witnessed a panic
from this crate while using a pre-release. It has not showed up again, but we
introduced the use of backtraces to help identify the issue further. So, please
report a backtrace if the `radicle-node` stops due to this issue.

## Path to Windows

We made an effort to start paving some of the way to being able to use Radicle
on Windows. The first step was taken for this, and you can now use the `rad` CLI
on a Windows machine – without WSL.

Currently, `git-remote-rad` and `radicle-node` are blockers for full Windows
support. However, the sans I/O approach mentioned above will provide a way
forward for implementing a `radicle-node` that works on Windows, and we will
continue to look into other fixes required for getting full Windows support.

## Improved Log Rotation

The rotation of logs under `.radicle/node` now works using a numbered system,
i.e. `node.log.1`, `node.log.2`, etc. The current running node will log to
`node.log`, which is a symlink to most recent number.

This means that logs will be persisted between runs, which will require
occasional cleanup.

## Display Full Node ID

We have improved the formatting for Node IDs and node addresses. The CLI
will output shortened forms of NIDs and addresses when the output is transient,
and the full form where it is presented to the user. This will allow you to be
able to copy and paste these identifiers.

## Stable Order for Pinned Repositories

The pinned repositories now maintain their insertion order, meaning that they
should not be reordered by any other factors other than the user's decision on
which repositories should appear first.

## Relax Pushes for `git-remote-rad`

The `git-remote-rad` would always expect a working copy and a reference when
performing pushes. These constraints are relaxed to allow a bare Git repository
and any kind of Git revision. This should improve the experience for users of
`jj`.

## Connect Attempts will Error

If a connection attempt would not happen due to an error, the result of the
error was never returned. This would often lead to timeouts when using `rad node
connect`. We now return the error and can report it instead of waiting for a
timeout.

## Default Branch Picker

When running `rad init` the default value for the `defaultBranch` of the
repository is now by provided the branch you are on or the Git configuration
option `init.defaultBranch`.

## Changelog

For a full list of changes, see below:

* `7a9d4512f` **radicle: fix Canonical::quorum doc link** *<fintan.halpenny@gmail.com>*
* `5d467418b` **term: Revert using inquire to spawn editor** *<lorenz.leutgeb@radicle.xyz>*
* `4934473b8` **cli/node: Improve log rotation** *<lorenz.leutgeb@radicle.xyz>*
* `3d352f23e` **canonical: Support Annotated Tags** *<lorenz.leutgeb@radicle.xyz>*
* `54fd8c40a` **node: clean up logging** *<erik@zirkular.io>*
* `174792813` **node: register backtrace** *<fintan.halpenny@gmail.com>*
* `0aaa81f82` **cli: mention binary names as part of unknown** *<fintan.halpenny@gmail.com>*
* `fdb1ac4e3` **radicle: Fix clippy::result_large_err** *<lorenz.leutgeb@radicle.xyz>*
* `5bab3f9cc` **clippy: Allow doc_overindented_list_items** *<lorenz.leutgeb@radicle.xyz>*
* `906803378` **chore: Automated fixes generated by clippy** *<lorenz.leutgeb@radicle.xyz>*
* `586eefc3e` **rust-toolchain: 1.85 → 1.88** *<lorenz.leutgeb@radicle.xyz>*
* `efeefd0da` **chore(debian/changelog): update package version to match upstream** *<me@sebastinez.dev>*
* `2a47bc0c7` **term: provide default HELP message** *<fintan.halpenny@gmail.com>*
* `a998ce691` **ssh: provide path on connect error** *<fintan.halpenny@gmail.com>*
* `8224819fe` **radicle/profile: Enable home detection on Windows** *<lorenz.leutgeb@radicle.xyz>*
* `1e0a14ddc` **ssh: Remove dependency on log** *<lorenz.leutgeb@radicle.xyz>*
* `8e6279a38` **ssh: Remove dependency on byteorder** *<lorenz.leutgeb@radicle.xyz>*
* `95b3303eb` **term: Remove unused dependency shlex** *<lorenz.leutgeb@radicle.xyz>*
* `009436efa` **ssh: Use winpipe for SSH agent on Windows** *<lorenz.leutgeb@radicle.xyz>*
* `070550153` **radicle: Depend on winpipe for Windows support** *<lorenz.leutgeb@radicle.xyz>*
* `08b535d56` **radicle: Only set file limits on Unix** *<lorenz.leutgeb@radicle.xyz>*
* `e7fb5647a` **term: Remove dependency on libc** *<lorenz.leutgeb@radicle.xyz>*
* `70fb0d3fe` **term: Use inquire for spawning the editor** *<lorenz.leutgeb@radicle.xyz>*
* `a28fd65e8` **term/ansi: Remove unused Windows module** *<lorenz.leutgeb@radicle.xyz>*
* `d46d36ece` **term/spinner: Only handle signals on Unix** *<lorenz.leutgeb@radicle.xyz>*
* `92d77f9ec` **crypto/ssh/keystore: Reduce scope of DirBuilderExt** *<lorenz.leutgeb@radicle.xyz>*
* `37ea81766` **cli: improve default branch pick** *<sekhat@temporus.me>*
* `85ddcace0` **docs: fix installation instructions in README.md** *<istankovic@posteo.net>*
* `7c4b71ab8` **radicle: Keep pinned repos ordered in config** *<tobias.hunger@gmail.com>*
* `1fa30e2e8` **cli: test missing commits for canonical quorum** *<fintan.halpenny@gmail.com>*
* `afe64d517` **remote-helper: improve canonical handling** *<fintan.halpenny@gmail.com>*
* `14444a43e` **remote-helper: refactor pushing action** *<fintan.halpenny@gmail.com>*
* `a9f75d47e` **remote-helper: allow any revision in push src** *<tobias.hunger@gmail.com>*
* `da72557cf` **git-remote-rad: Allow pushing from bare repositories** *<tobias.hunger@gmail.com>*
* `271ef497d` **crypto: Fix scope of `ssh-key` dependency** *<lorenz.leutgeb@radicle.xyz>*
* `0e3f3f03d` **cli: Improve formatting of Node IDs and addresses** *<lorenz.leutgeb@radicle.xyz>*
* `010d5134e` **protocol: fix `Frame` docstring** *<fintan.halpenny@gmail.com>*
* `3c5668edd` **protocol: Reimplement encoding on top of `bytes`** *<lorenz.leutgeb@radicle.xyz>*
* `1c20f64a2` **node, protocol: Refactor** *<lorenz.leutgeb@radicle.xyz>*
* `61c468778` **protocol: Create skeleton by moving from radicle-node** *<lorenz.leutgeb@radicle.xyz>*
* `b9759c586` **radicle: Make `node::Link` copy and add `is_*`** *<lorenz.leutgeb@radicle.xyz>*
* `408d4f27e` **chore: add canonical references to CHANGELOG** *<fintan.halpenny@gmail.com>*
* `820122516` **cli: test canonical tags** *<fintan.halpenny@gmail.com>*
* `ff365e2d8` **radicle: disallow default branch** *<fintan.halpenny@gmail.com>*
* `a69397386` **cli: extract document update logic** *<fintan.halpenny@gmail.com>*
* `7f646666b` **radicle: canonical references payload** *<fintan.halpenny@gmail.com>*
* `af6cf03ac` **radicle: canonical reference rules** *<fintan.halpenny@gmail.com>*
* `fb8681f5b` **radicle: `connect` returns `ConnectError`** *<fintan.halpenny@gmail.com>*

## Checksums

```
f09b4203a47611e1e6a78ea9087b5cae2f94cacc649ed195840a0869d821c861  radicle-1.3.0-x86_64-apple-darwin.tar.xz
a25c67276a86c9fbadadbacbd2ea9763202e99701aa85cf7fe5815662696988d  radicle-1.3.0-x86_64-unknown-linux-musl.tar.xz
3a615bb99bc998b3fca5ad8582599c8dfb3cffb0beec291f5939d4b559270227  radicle-1.3.0-aarch64-unknown-linux-musl.tar.xz
7939e1d1bce232730843d8975f205558b0885479c6666b630abb1500b67756db  radicle-1.3.0-aarch64-apple-darwin.tar.xz
```

[sans-io]: https://sans-io.readthedocs.io