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