Radish alpha
r
rad:z371PVmDHdjJucejRoRYJcDEvD5pp
Radicle website including documentation and guides
Radicle
Git
radicle.xyz _posts 2025-09-30-radicle-1.5.0.md

The Radicle team is delighted to announce the release of Radicle 1.5.0 (5fea9ac0), code name Hibiscus. The Hibiscus flower tends to bloom from late spring through autumn, and can be made into a nice warming tea. So grab your cup and take a seat, while we walk through this 1.5.0 release.

This release consists of 74 commits from 7 contributors. Thanks to the following contributors for their effort in making Radicle better:

  • yorgos
  • defelo
  • Sebastian
  • Matthias

Installation

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

Better Support for Bare Repositories

Some improvements to supporting bare repositories have been made for rad and git-remote-rad. For rad, the rad clone command has learned a new flag --bare, which clones the repository into a bare repository, as opposed to having a working tree (see gitrepository-layout).

git-remote-rad (our Git remote helper), also learned to better handle bare repositories, when using git push and git fetch with a rad:// remote.

For jj users, this begins to unlock being able to use jj without co-location of the Git repository. Further improvements to interoperability with jj are in progress and will be released in future versions.

Introducing the patch.branch Option

Continuing on the theme of making jj users happy, git-remote-rad can now handle the option -o patch.branch[=<name>]. When the option is passed without a name, i.e. -o patch.branch, an upstream branch will be created which is named after the patch being created – patches/<PATCH ID>. Alternatively, the <name> value is used if supplied.

This allows you to specify if you want a tracking branch (or bookmark in jj) for the patch. This means that you can avoid using rad patch checkout.

Improved rad patch show

The rad patch show command has received some love by improving its output. The Base of the patch is now always output, where before it was behind the --verbose flag.

The previous output would differentiate “updates”, where the original author creates a new revision, and “revisions”, where another author creates a revision. This could be confusing since updates are also revisions. Instead, the output shows a timeline of the root of the patch and each new revision, without any differentiation. The revision identifiers, head commit of the revision, and author are still printed as per usual.

Structured Logging

The radicle-node has learned to output structure logging using the new --log-logger structured and --log-format json option pairs. If they are not specified, then the logging will remain the same as per usual.

Deprecations in rad

It is important to note that we are now emitting deprecation and obsoletion warnings for several rad commands and options.

For rad diff, the whole command is deprecated, and git diff should be used instead. It is better to use the tools that already exist in this case.

The option rad self --nid was deprecated in favor of rad node status --only nid. The reason for this is that we will be making efforts to separate the cryptographic identity of user and node. For this case, the node will – in a future version – read the location of the secret key to use from configuration or arguments at runtime. This means that a running node is required to report the correct Node ID – and the command cannot rely on the default location, which is shared with the user.

The options rad patch review [--patch | --delete] are marked as obsolete, since their functionality never worked as intended. Reviews are something that requires more research and time to implement. These commands will likely be removed before a next major release, since their lack of functionality is confusing.

Changelog

This release contains 74 commit(s) by 7 contributor(s).

Checksums

d94e3b65d2585c7f7b5e31a5d55af8a7ff156cd4c45a7b728501e6f54353600e  radicle-1.5.0-aarch64-apple-darwin.tar.xz
4c27f2428873d99532337991f977255aa4023beedd6d53178ce3abdc529df8dc  radicle-1.5.0-aarch64-unknown-linux-musl.tar.xz
57523bc4ff575f2cdf94df3f4e3bf814cc46f2fd497fcfdd885e9bcdd7d4fb26  radicle-1.5.0-x86_64-apple-darwin.tar.xz
9c9277df40c0f144e0b5bcde9cfe2e81c0f8a1ee4f2cb9313ef942ab0c811022  radicle-1.5.0-x86_64-unknown-linux-musl.tar.xz
---
title: "Radicle 1.5.0 – Hibiscus 🌺"
image: radicle-1.png
---

The Radicle team is delighted to announce the release of Radicle 1.5.0 (5fea9ac0), code name *Hibiscus*.
The Hibiscus flower tends to bloom from late spring through autumn, and can be made into a nice warming tea.
So grab your cup and take a seat, while we walk through this 1.5.0 release.

This release consists of 74 commits from 7 contributors.
Thanks to the following contributors for their effort in making Radicle better:
- yorgos
- defelo
- Sebastian
- Matthias

## Installation

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

## Better Support for Bare Repositories

Some improvements to supporting bare repositories have been made for `rad` and
`git-remote-rad`. For `rad`, the `rad clone` command has learned a new flag
`--bare`, which clones the repository into a bare repository, as opposed to
having a working tree (see [gitrepository-layout](https://git-scm.com/docs/gitrepository-layout/2.49.0)).

`git-remote-rad` (our Git remote helper), also learned to better handle bare
repositories, when using `git push` and `git fetch` with a `rad://` remote.

For `jj` users, this begins to unlock being able to use `jj` without co-location
of the Git repository. Further improvements to interoperability with `jj` are
in progress and will be released in future versions.

## Introducing the `patch.branch` Option

Continuing on the theme of making `jj` users happy, `git-remote-rad` can now
handle the option `-o patch.branch[=<name>]`. When the option is passed without
a name, i.e. `-o patch.branch`, an upstream branch will be created which is
named after the patch being created – `patches/<PATCH ID>`. Alternatively, the
`<name>` value is used if supplied.

This allows you to specify if you want a tracking branch (or bookmark in `jj`)
for the patch. This means that you can avoid using `rad patch checkout`.

## Improved `rad patch show`

The `rad patch show` command has received some love by improving its output. The
`Base` of the patch is now always output, where before it was behind the
`--verbose` flag.

The previous output would differentiate "updates", where the original author
creates a new revision, and "revisions", where another author creates a
revision. This could be confusing since updates are also revisions. Instead, the
output shows a timeline of the root of the patch and each new revision, without
any differentiation. The revision identifiers, head commit of the revision, and
author are still printed as per usual.

## Structured Logging

The `radicle-node` has learned to output structure logging using the new
`--log-logger structured` and `--log-format json` option pairs. If they are not
specified, then the logging will remain the same as per usual.

## Deprecations in `rad`

It is important to note that we are now emitting deprecation and obsoletion
warnings for several `rad` commands and options.

For `rad diff`, the whole command is deprecated, and `git diff` should be used
instead. It is better to use the tools that already exist in this case.

The option `rad self --nid` was deprecated in favor of `rad node status --only nid`.
The reason for this is that we will be making efforts to separate the cryptographic
identity of user and node.
For this case, the node will – in a future version – read the location of the
secret key to use from configuration or arguments at runtime. This means that a
running node is required to report the correct Node ID – and the command cannot
rely on the default location, which is shared with the user.

The options `rad patch review [--patch | --delete]` are marked as obsolete,
since their functionality never worked as intended. Reviews are something that
requires more research and time to implement. These commands will likely be
removed before a next major release, since their lack of functionality is
confusing.

## Changelog

This release contains 74 commit(s) by 7 contributor(s).

* `5fea9ac05` **node: Add `--log-logger structured` and `--log-format json`** *<me@sebastinez.dev>*
* `e56311739` **node: Refactor logging initialization** *<lorenz.leutgeb@radicle.xyz>*
* `9793b4e7b` **systemd: Require Linux for journal module** *<yorgos.work@proton.me>*
* `e70850cb3` **remote-helper: Add patch.branch option** *<mail@defelo.de>*
* `6a43e83dd` **Release 1.3.1** *<fintan.halpenny@gmail.com>*
* `7b00bf2e3` **cli/patch/review: Obsoletion Warning** *<lorenz.leutgeb@radicle.xyz>*
* `8dd17e2a6` **cli/warning: Add `fn obsolete`** *<lorenz.leutgeb@radicle.xyz>*
* `7d1db6a01` **cli/diff: Deprecation Warning** *<lorenz.leutgeb@radicle.xyz>*
* `8558cc223` **cli/self: `--nid` deprecation warning to stderr** *<lorenz.leutgeb@radicle.xyz>*
* `3fb04623a` **cli/warning: Add `fn deprecate`** *<lorenz.leutgeb@radicle.xyz>*
* `2635562c9` **cli/node/status: Add `--only nid`** *<lorenz.leutgeb@radicle.xyz>*
* `8afd55ff6` **build: update release files location** *<fintan.halpenny@gmail.com>*
* `d2e10fdef` **cli/tests/commands: Clean up test `rad_patch`** *<erik@zirkular.io>*
* `19210faab` **protocol/service: Change `Routing table updated..` from info to debug** *<me@sebastinez.dev>*
* `86472fdcc` **remote-helper/fetch: Improve error handling** *<lorenz.leutgeb@radicle.xyz>*
* `f542df183` **radicle: Use `git fetch-pack` for "local fetch"** *<lorenz.leutgeb@radicle.xyz>*
* `20663a4e3` **remote-helper: Use `git send-pack` for "internal push"** *<lorenz.leutgeb@radicle.xyz>*
* `f9ff484c9` **cli: Make `rad patch show` prettier** *<lorenz.leutgeb@radicle.xyz>*
* `43246fe6c` **remote-helper: Parse base revision early** *<lorenz.leutgeb@radicle.xyz>*
* `ef2796186` **remote-helper: List `HEAD`** *<lorenz.leutgeb@radicle.xyz>*
* `101fbff80` **ci: Deny `cargo doc` warnings** *<erik@zirkular.io>*
* `14fcf5067` **docs: fix doc string linking** *<fintan.halpenny@gmail.com>*
* `ee9e6de5f` **remote-helper: Do not assume remote name** *<lorenz.leutgeb@radicle.xyz>*
* `6b9ff4f99` **cli/init: Allow `--setup-signing` with bare repos** *<lorenz.leutgeb@radicle.xyz>*
* `fd93240b9` **cli/git: Remove dead code `fn view_diff`** *<lorenz.leutgeb@radicle.xyz>*
* `86ea33b0c` **cli/clone: Add flag `--bare`** *<lorenz.leutgeb@radicle.xyz>*
* `766e281d3` **radicle: Allow creating bare clones** *<lorenz.leutgeb@radicle.xyz>*
* `e528c40a0` **radicle-cli: Test initializing from bare repos** *<lorenz.leutgeb@radicle.xyz>*
* `606882f01` **remote-helper: Simplify handling of `GIT_DIR`** *<lorenz.leutgeb@radicle.xyz>*
* `354565c57` **radicle: Handle `GIT_DIR` more uniformly** *<lorenz.leutgeb@radicle.xyz>*
* `4e6746796` **remote-helper: Refactor option handling** *<lorenz.leutgeb@radicle.xyz>*
* `876d22b07` **remote-helper: Remove unused push error variant** *<lorenz.leutgeb@radicle.xyz>*
* `550fcccc2` **remote-helper: Do not hard-code binary name** *<lorenz.leutgeb@radicle.xyz>*
* `897404164` **remote-helper: Make crate binary-only** *<lorenz.leutgeb@radicle.xyz>*
* `66adbffd6` **term: Use static template in spinner initialization** *<fintan.halpenny@gmail.com>*
* `8fc37e331` **term: Move to indicatif spinner** *<erik@zirkular.io>*
* `ee9ecfda7` **remote-helper: Remove `SyncWriter` in favor of `PaintTarget`** *<erik@zirkular.io>*
* `153a8f9fb` **node: Remove `SyncWriter` in favor of `PaintTarget`** *<erik@zirkular.io>*
* `11a109ef4` **term: Introduce `PaintTarget`** *<erik@zirkular.io>*
* `379037956` **remote-helper: Prevent doubly verifying each push** *<lorenz.leutgeb@radicle.xyz>*
* `a0f6cbf5f` **radicle: Move interpretation of output to binary** *<lorenz.leutgeb@radicle.xyz>*
* `0a8317c35` **remote-helper: Interpret verbosity option** *<lorenz.leutgeb@radicle.xyz>*
* `11e8b89b2` **radicle/src/git: additionally specify pruneTags for remote** *<fintan.halpenny@gmail.com>*
* `646d4360e` **cli/node: Replace manual pushing with Table::extend()** *<mail@beyermatthias.de>*
* `2f2823267` **cli/issue: Replace manual pushing with Table::extend()** *<mail@beyermatthias.de>*
* `8554e996b` **cli/diff: Replace manual pushing with Table::extend()** *<mail@beyermatthias.de>*
* `fbef60eed` **cli/sync: Replace manual pushing with Table::extend()** *<mail@beyermatthias.de>*
* `370ae3643` **cli/patch: Replace manual iterator partitioning with Itertools::partition_result()** *<mail@beyermatthias.de>*
* `3f489354b` **cli: Add itertools dependency** *<mail@beyermatthias.de>*
* `9c2f97abe` **cli/remote: Replace manual building table from iterator** *<mail@beyermatthias.de>*
* `4bd45cdab` **cli/inbox: Replace manual building table from iterator** *<mail@beyermatthias.de>*
* `016cab1db` **term/table: Add Table::with_opts() to set options after Table obj was constructed** *<mail@beyermatthias.de>*
* `fb458537b` **cli/patch: Replace manual building table from iterator** *<mail@beyermatthias.de>*
* `41a742ed9` **term/table: Add impl FromIterator for Table** *<mail@beyermatthias.de>*
* `ff021d588` **cli: Rewrite `#[path="…"]` module declarations** *<mail@beyermatthias.de>*
* `11fc98c9c` **term: Replace manual Extend impl for Table** *<mail@beyermatthias.de>*
* `f00d1d674` **cli/self: Stop printing information about the node** *<lorenz.leutgeb@radicle.xyz>*
* `e1af550a0` **cli/node: Print Node ID** *<lorenz.leutgeb@radicle.xyz>*
* `9b7529baa` **hooks: Filter for "radicle.{xyz,zulipchat.com}"** *<lorenz.leutgeb@radicle.xyz>*
* `b301fa6a0` **doc: Mention handling of "radicle.xyz"** *<lorenz.leutgeb@radicle.xyz>*
* `79505fa90` **radicle/test/fixtures: Use "radicle.xyz" as `const`** *<lorenz.leutgeb@radicle.xyz>*
* `1a3fda547` **radicle/explorer: Allow overriding default URL** *<lorenz.leutgeb@radicle.xyz>*
* `e2c476a38` **radicle/test: Don't hard-code "radicle.xyz"** *<lorenz.leutgeb@radicle.xyz>*
* `2127782b7` **term: Remove dependency on `anyhow`** *<lorenz.leutgeb@radicle.xyz>*
* `edd88a59b` **term: Remove `mod command`** *<lorenz.leutgeb@radicle.xyz>*
* `79d928551` **node: Remove dependency on `anyhow`** *<lorenz.leutgeb@radicle.xyz>*
* `4bf3ab6fb` **github/actions: Add a workflow to build** *<lorenz.leutgeb@radicle.xyz>*
* `55cdd880b` **radicle-term: Pass in `mut self` rather than rebinding** *<mail@beyermatthias.de>*
* `19c484e95` **radicle-term: Optimize impl of VStack::children()** *<mail@beyermatthias.de>*
* `93388e366` **radicle-term: Preallocate in Line::spaced()** *<mail@beyermatthias.de>*
* `3036509e4` **radicle-term: Add testcase for Line::spaced()** *<mail@beyermatthias.de>*
* `23b9d3063` **radicle: Remove unnecessary clone()** *<mail@beyermatthias.de>*
* `29a95fb1a` **radicle-fetch: Replace manual std::matches!() impl** *<mail@beyermatthias.de>*
* `ded0d19d5` **protocol/wire/test: Define `fn roundtrip` and macro** *<lorenz.leutgeb@radicle.xyz>*

## Checksums

```
d94e3b65d2585c7f7b5e31a5d55af8a7ff156cd4c45a7b728501e6f54353600e  radicle-1.5.0-aarch64-apple-darwin.tar.xz
4c27f2428873d99532337991f977255aa4023beedd6d53178ce3abdc529df8dc  radicle-1.5.0-aarch64-unknown-linux-musl.tar.xz
57523bc4ff575f2cdf94df3f4e3bf814cc46f2fd497fcfdd885e9bcdd7d4fb26  radicle-1.5.0-x86_64-apple-darwin.tar.xz
9c9277df40c0f144e0b5bcde9cfe2e81c0f8a1ee4f2cb9313ef942ab0c811022  radicle-1.5.0-x86_64-unknown-linux-musl.tar.xz
```