
Radicle is a peer-to-peer, local-first code collaboration stack built on Git.
Radicle 1.5.0 – Hibiscus 🌺
30.09.2025The 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 -sSf https://radicle.xyz/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).
5fea9ac05
node: Add--log-logger structured
and--log-format json
me@sebastinez.deve56311739
node: Refactor logging initialization lorenz.leutgeb@radicle.xyz9793b4e7b
systemd: Require Linux for journal module yorgos.work@proton.mee70850cb3
remote-helper: Add patch.branch option mail@defelo.de6a43e83dd
Release 1.3.1 fintan.halpenny@gmail.com7b00bf2e3
cli/patch/review: Obsoletion Warning lorenz.leutgeb@radicle.xyz8dd17e2a6
cli/warning: Addfn obsolete
lorenz.leutgeb@radicle.xyz7d1db6a01
cli/diff: Deprecation Warning lorenz.leutgeb@radicle.xyz8558cc223
cli/self:--nid
deprecation warning to stderr lorenz.leutgeb@radicle.xyz3fb04623a
cli/warning: Addfn deprecate
lorenz.leutgeb@radicle.xyz2635562c9
cli/node/status: Add--only nid
lorenz.leutgeb@radicle.xyz8afd55ff6
build: update release files location fintan.halpenny@gmail.comd2e10fdef
cli/tests/commands: Clean up testrad_patch
erik@zirkular.io19210faab
protocol/service: ChangeRouting table updated..
from info to debug me@sebastinez.dev86472fdcc
remote-helper/fetch: Improve error handling lorenz.leutgeb@radicle.xyzf542df183
radicle: Usegit fetch-pack
for “local fetch” lorenz.leutgeb@radicle.xyz20663a4e3
remote-helper: Usegit send-pack
for “internal push” lorenz.leutgeb@radicle.xyzf9ff484c9
cli: Makerad patch show
prettier lorenz.leutgeb@radicle.xyz43246fe6c
remote-helper: Parse base revision early lorenz.leutgeb@radicle.xyzef2796186
remote-helper: ListHEAD
lorenz.leutgeb@radicle.xyz101fbff80
ci: Denycargo doc
warnings erik@zirkular.io14fcf5067
docs: fix doc string linking fintan.halpenny@gmail.comee9e6de5f
remote-helper: Do not assume remote name lorenz.leutgeb@radicle.xyz6b9ff4f99
cli/init: Allow--setup-signing
with bare repos lorenz.leutgeb@radicle.xyzfd93240b9
cli/git: Remove dead codefn view_diff
lorenz.leutgeb@radicle.xyz86ea33b0c
cli/clone: Add flag--bare
lorenz.leutgeb@radicle.xyz766e281d3
radicle: Allow creating bare clones lorenz.leutgeb@radicle.xyze528c40a0
radicle-cli: Test initializing from bare repos lorenz.leutgeb@radicle.xyz606882f01
remote-helper: Simplify handling ofGIT_DIR
lorenz.leutgeb@radicle.xyz354565c57
radicle: HandleGIT_DIR
more uniformly lorenz.leutgeb@radicle.xyz4e6746796
remote-helper: Refactor option handling lorenz.leutgeb@radicle.xyz876d22b07
remote-helper: Remove unused push error variant lorenz.leutgeb@radicle.xyz550fcccc2
remote-helper: Do not hard-code binary name lorenz.leutgeb@radicle.xyz897404164
remote-helper: Make crate binary-only lorenz.leutgeb@radicle.xyz66adbffd6
term: Use static template in spinner initialization fintan.halpenny@gmail.com8fc37e331
term: Move to indicatif spinner erik@zirkular.ioee9ecfda7
remote-helper: RemoveSyncWriter
in favor ofPaintTarget
erik@zirkular.io153a8f9fb
node: RemoveSyncWriter
in favor ofPaintTarget
erik@zirkular.io11a109ef4
term: IntroducePaintTarget
erik@zirkular.io379037956
remote-helper: Prevent doubly verifying each push lorenz.leutgeb@radicle.xyza0f6cbf5f
radicle: Move interpretation of output to binary lorenz.leutgeb@radicle.xyz0a8317c35
remote-helper: Interpret verbosity option lorenz.leutgeb@radicle.xyz11e8b89b2
radicle/src/git: additionally specify pruneTags for remote fintan.halpenny@gmail.com646d4360e
cli/node: Replace manual pushing with Table::extend() mail@beyermatthias.de2f2823267
cli/issue: Replace manual pushing with Table::extend() mail@beyermatthias.de8554e996b
cli/diff: Replace manual pushing with Table::extend() mail@beyermatthias.defbef60eed
cli/sync: Replace manual pushing with Table::extend() mail@beyermatthias.de370ae3643
cli/patch: Replace manual iterator partitioning with Itertools::partition_result() mail@beyermatthias.de3f489354b
cli: Add itertools dependency mail@beyermatthias.de9c2f97abe
cli/remote: Replace manual building table from iterator mail@beyermatthias.de4bd45cdab
cli/inbox: Replace manual building table from iterator mail@beyermatthias.de016cab1db
term/table: Add Table::with_opts() to set options after Table obj was constructed mail@beyermatthias.defb458537b
cli/patch: Replace manual building table from iterator mail@beyermatthias.de41a742ed9
term/table: Add impl FromIterator for Table mail@beyermatthias.deff021d588
cli: Rewrite#[path="…"]
module declarations mail@beyermatthias.de11fc98c9c
term: Replace manual Extend impl for Table mail@beyermatthias.def00d1d674
cli/self: Stop printing information about the node lorenz.leutgeb@radicle.xyze1af550a0
cli/node: Print Node ID lorenz.leutgeb@radicle.xyz9b7529baa
hooks: Filter for “radicle.{xyz,zulipchat.com}” lorenz.leutgeb@radicle.xyzb301fa6a0
doc: Mention handling of “radicle.xyz” lorenz.leutgeb@radicle.xyz79505fa90
radicle/test/fixtures: Use “radicle.xyz” asconst
lorenz.leutgeb@radicle.xyz1a3fda547
radicle/explorer: Allow overriding default URL lorenz.leutgeb@radicle.xyze2c476a38
radicle/test: Don’t hard-code “radicle.xyz” lorenz.leutgeb@radicle.xyz2127782b7
term: Remove dependency onanyhow
lorenz.leutgeb@radicle.xyzedd88a59b
term: Removemod command
lorenz.leutgeb@radicle.xyz79d928551
node: Remove dependency onanyhow
lorenz.leutgeb@radicle.xyz4bf3ab6fb
github/actions: Add a workflow to build lorenz.leutgeb@radicle.xyz55cdd880b
radicle-term: Pass inmut self
rather than rebinding mail@beyermatthias.de19c484e95
radicle-term: Optimize impl of VStack::children() mail@beyermatthias.de93388e366
radicle-term: Preallocate in Line::spaced() mail@beyermatthias.de3036509e4
radicle-term: Add testcase for Line::spaced() mail@beyermatthias.de23b9d3063
radicle: Remove unnecessary clone() mail@beyermatthias.de29a95fb1a
radicle-fetch: Replace manual std::matches!() impl mail@beyermatthias.deded0d19d5
protocol/wire/test: Definefn 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