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 -sSLf 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).
5fea9ac05node: Add--log-logger structuredand--log-format jsonme@sebastinez.deve56311739node: Refactor logging initialization lorenz.leutgeb@radicle.xyz9793b4e7bsystemd: Require Linux for journal module yorgos.work@proton.mee70850cb3remote-helper: Add patch.branch option mail@defelo.de6a43e83ddRelease 1.3.1 fintan.halpenny@gmail.com7b00bf2e3cli/patch/review: Obsoletion Warning lorenz.leutgeb@radicle.xyz8dd17e2a6cli/warning: Addfn obsoletelorenz.leutgeb@radicle.xyz7d1db6a01cli/diff: Deprecation Warning lorenz.leutgeb@radicle.xyz8558cc223cli/self:--niddeprecation warning to stderr lorenz.leutgeb@radicle.xyz3fb04623acli/warning: Addfn deprecatelorenz.leutgeb@radicle.xyz2635562c9cli/node/status: Add--only nidlorenz.leutgeb@radicle.xyz8afd55ff6build: update release files location fintan.halpenny@gmail.comd2e10fdefcli/tests/commands: Clean up testrad_patcherik@zirkular.io19210faabprotocol/service: ChangeRouting table updated..from info to debug me@sebastinez.dev86472fdccremote-helper/fetch: Improve error handling lorenz.leutgeb@radicle.xyzf542df183radicle: Usegit fetch-packfor “local fetch” lorenz.leutgeb@radicle.xyz20663a4e3remote-helper: Usegit send-packfor “internal push” lorenz.leutgeb@radicle.xyzf9ff484c9cli: Makerad patch showprettier lorenz.leutgeb@radicle.xyz43246fe6cremote-helper: Parse base revision early lorenz.leutgeb@radicle.xyzef2796186remote-helper: ListHEADlorenz.leutgeb@radicle.xyz101fbff80ci: Denycargo docwarnings erik@zirkular.io14fcf5067docs: fix doc string linking fintan.halpenny@gmail.comee9e6de5fremote-helper: Do not assume remote name lorenz.leutgeb@radicle.xyz6b9ff4f99cli/init: Allow--setup-signingwith bare repos lorenz.leutgeb@radicle.xyzfd93240b9cli/git: Remove dead codefn view_difflorenz.leutgeb@radicle.xyz86ea33b0ccli/clone: Add flag--barelorenz.leutgeb@radicle.xyz766e281d3radicle: Allow creating bare clones lorenz.leutgeb@radicle.xyze528c40a0radicle-cli: Test initializing from bare repos lorenz.leutgeb@radicle.xyz606882f01remote-helper: Simplify handling ofGIT_DIRlorenz.leutgeb@radicle.xyz354565c57radicle: HandleGIT_DIRmore uniformly lorenz.leutgeb@radicle.xyz4e6746796remote-helper: Refactor option handling lorenz.leutgeb@radicle.xyz876d22b07remote-helper: Remove unused push error variant lorenz.leutgeb@radicle.xyz550fcccc2remote-helper: Do not hard-code binary name lorenz.leutgeb@radicle.xyz897404164remote-helper: Make crate binary-only lorenz.leutgeb@radicle.xyz66adbffd6term: Use static template in spinner initialization fintan.halpenny@gmail.com8fc37e331term: Move to indicatif spinner erik@zirkular.ioee9ecfda7remote-helper: RemoveSyncWriterin favor ofPaintTargeterik@zirkular.io153a8f9fbnode: RemoveSyncWriterin favor ofPaintTargeterik@zirkular.io11a109ef4term: IntroducePaintTargeterik@zirkular.io379037956remote-helper: Prevent doubly verifying each push lorenz.leutgeb@radicle.xyza0f6cbf5fradicle: Move interpretation of output to binary lorenz.leutgeb@radicle.xyz0a8317c35remote-helper: Interpret verbosity option lorenz.leutgeb@radicle.xyz11e8b89b2radicle/src/git: additionally specify pruneTags for remote fintan.halpenny@gmail.com646d4360ecli/node: Replace manual pushing with Table::extend() mail@beyermatthias.de2f2823267cli/issue: Replace manual pushing with Table::extend() mail@beyermatthias.de8554e996bcli/diff: Replace manual pushing with Table::extend() mail@beyermatthias.defbef60eedcli/sync: Replace manual pushing with Table::extend() mail@beyermatthias.de370ae3643cli/patch: Replace manual iterator partitioning with Itertools::partition_result() mail@beyermatthias.de3f489354bcli: Add itertools dependency mail@beyermatthias.de9c2f97abecli/remote: Replace manual building table from iterator mail@beyermatthias.de4bd45cdabcli/inbox: Replace manual building table from iterator mail@beyermatthias.de016cab1dbterm/table: Add Table::with_opts() to set options after Table obj was constructed mail@beyermatthias.defb458537bcli/patch: Replace manual building table from iterator mail@beyermatthias.de41a742ed9term/table: Add impl FromIterator for Table mail@beyermatthias.deff021d588cli: Rewrite#[path="…"]module declarations mail@beyermatthias.de11fc98c9cterm: Replace manual Extend impl for Table mail@beyermatthias.def00d1d674cli/self: Stop printing information about the node lorenz.leutgeb@radicle.xyze1af550a0cli/node: Print Node ID lorenz.leutgeb@radicle.xyz9b7529baahooks: Filter for “radicle.{xyz,zulipchat.com}” lorenz.leutgeb@radicle.xyzb301fa6a0doc: Mention handling of “radicle.xyz” lorenz.leutgeb@radicle.xyz79505fa90radicle/test/fixtures: Use “radicle.xyz” asconstlorenz.leutgeb@radicle.xyz1a3fda547radicle/explorer: Allow overriding default URL lorenz.leutgeb@radicle.xyze2c476a38radicle/test: Don’t hard-code “radicle.xyz” lorenz.leutgeb@radicle.xyz2127782b7term: Remove dependency onanyhowlorenz.leutgeb@radicle.xyzedd88a59bterm: Removemod commandlorenz.leutgeb@radicle.xyz79d928551node: Remove dependency onanyhowlorenz.leutgeb@radicle.xyz4bf3ab6fbgithub/actions: Add a workflow to build lorenz.leutgeb@radicle.xyz55cdd880bradicle-term: Pass inmut selfrather than rebinding mail@beyermatthias.de19c484e95radicle-term: Optimize impl of VStack::children() mail@beyermatthias.de93388e366radicle-term: Preallocate in Line::spaced() mail@beyermatthias.de3036509e4radicle-term: Add testcase for Line::spaced() mail@beyermatthias.de23b9d3063radicle: Remove unnecessary clone() mail@beyermatthias.de29a95fb1aradicle-fetch: Replace manual std::matches!() impl mail@beyermatthias.deded0d19d5protocol/wire/test: Definefn roundtripand 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