Radish alpha
h
rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Radicle Heartwood Protocol & Stack
Radicle
Git
treewide: radicle.{xyz → dev,network}
Merged lorenz opened 3 days ago

We have moved to radicle.dev, so adjust the domain name in various places.

43 files changed +204 -131 099722dd aa177b04
modified .env.seed
@@ -1,2 +1,2 @@
-
RADICLE_DOMAIN=seed.radicle.xyz
+
RADICLE_DOMAIN=seed.radicle.dev
RADICLE_NODE_OPTIONS=--force
modified .github/README.md
@@ -26,7 +26,7 @@ GitHub, but only via Radicle directly. However, pull requests are still
accepted.

To view existing issues and patches with your web browser, navigate to
-
[app.radicle.xyz][heartwood].
+
[radicle.network][heartwood].

To contribute issues and patches, please consider [installing][install]
Radicle and follow our [guides][guides].
@@ -34,7 +34,7 @@ Radicle and follow our [guides][guides].
## Feedback

If you have feedback, feel free to create issues using `rad issue`, join
-
[our Zulip][zulip], or email [feedback@radicle.xyz][mail-feedback].
+
[our Zulip][zulip], or email [feedback@radicle.dev][mail-feedback].
Emails sent to this address are [automatically posted][zulip-help-email] to
[our **public** #feedback channel on Zulip][zulip-feedback], revealing the
[`From` header][rfc2822s3.6.2] (which usually contains your name and email
@@ -42,12 +42,12 @@ address). This allows us to discuss your feedback on Zulip, and, if necessary,
respond to you via email.


-
[guides-protocol]: https://radicle.xyz/guides/protocol
-
[guides]: https://radicle.xyz/guides
-
[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
-
[homepage]: https://radicle.xyz
+
[guides-protocol]: https://radicle.dev/guides/protocol
+
[guides]: https://radicle.dev/guides
+
[heartwood]: https://radicle.network/nodes/seed.radicle.dev/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+
[homepage]: https://radicle.dev
[install]: ../README.md#installation
-
[mail-feedback]: mailto:feedback@radicle.xyz
+
[mail-feedback]: mailto:feedback@radicle.dev
[readme]: ../README.md
[rfc2822s3.6.2]: https://datatracker.ietf.org/doc/html/rfc2822#section-3.6.2
[run]: ../README.md#running
modified .typos.toml
@@ -27,7 +27,7 @@ extend-ignore-re = [
    "`radicle`",
    "radicle heartwood protocol & stack", # Old fixture.
    "radicle-\\w+", # Crates in Cargo style
-
    "radicle\\.((example|zulipchat)\\.com|xyz)", # URLs
+
    "radicle\\.((example|zulipchat)\\.com|dev|network|xyz)", # URLs
    "radicle\\w*::", # Crates in Rust code style
    "xyz\\.radicle\\.(issue|patch|id)", # COB Type Names
]
modified ARCHITECTURE.md
@@ -1,3 +1,3 @@
# ARCHITECTURE

-
See the [Protocol Guide](https://radicle.xyz/guides/protocol).
+
See the [Protocol Guide](https://radicle.dev/guides/protocol).
modified CHANGELOG.md
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

+
## Domain Name Migration
+

+
Following a domain move of the project, the names of the bootstrap nodes change:
+
`{iris,rosa}.radicle.{xyz → network}`.
+
Old names in the Radicle configuration will be detected and cause warnings to
+
be printed.
+
The systemd credential IDs that node uses change: `{xyz → dev}.radicle.node.*`.
+
COB type names and payload IDs remain unchanged for backwards compatibility.
+

## New Features

- Teach `rad patch show` to show the full commit range for each revision.
modified CONTRIBUTING.md
@@ -28,7 +28,7 @@ simple guidelines.
  before submitting a patch. We wouldn't want you to waste your time!
* If you need help or would like to discuss your changes, come to our community chat on [Zulip][zulip].

-
[guide]: https://radicle.xyz/guides/user#working-with-patches
+
[guide]: https://radicle.dev/guides/user#working-with-patches
[zulip]: https://radicle.zulipchat.com

### Submitting patches
@@ -194,9 +194,9 @@ for the reader:
    for rid in self.storage.inventory()? {
        ...

-
### Referring to radicle.xyz in Code
+
### Referring to radicle.dev in Code

-
While <https://radicle.xyz> is the main website of the project, and also the domain
+
While <https://radicle.dev> is the main website of the project, and also the domain
associated with COBs implemented in this repo, we strive to write code that is as
independent as reasonably possible from this particular domain name. For example, it
should not be used for default configuration values, or if it is, there should be a
@@ -208,11 +208,18 @@ or fork it altogether. It also tends to produce better, more flexible, code.
In tests, instead use names that are compliant with RFC 2606, e.g.
"radicle.example.com".

-
Note that as of 2025-08, there are still a few mentions of "radicle.xyz" in the
+
Note that as of 2025-08, there are still a few mentions of "radicle.dev" in the
codebase (mostly tests or user hints, fallback for configuration), and some of them
are not easy to remove. However, this is in no way a justification to add more
references.

+
In 2026-04, the project moved from "radicle.xyz" to "radicle.dev", and many IDs,
+
most notably COB type names and payload IDs (both in reverse domain name notation)
+
were not changed to stay backward compatible. So, while generally, "radicle.xyz"
+
should not be used anymore, think twice before changing such occurrences to
+
"radicle.dev". The same holds for "xyz.radicle", but in that case please think
+
thrice.
+

### Proposing changes

When proposing changes via a patch:
modified Cargo.lock
@@ -3217,6 +3217,7 @@ dependencies = [
 "cyphernet",
 "fastrand",
 "gix-packetline",
+
 "indexmap",
 "lexopt",
 "log",
 "mio",
modified Cargo.toml
@@ -4,9 +4,9 @@ resolver = "2"

[workspace.package]
edition = "2024"
-
homepage = "https://radicle.xyz"
+
homepage = "https://radicle.dev"
license = "MIT OR Apache-2.0"
-
repository = "https://app.radicle.xyz/seeds/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5"
+
repository = "https://radicle.network/seeds/seed.radicle.dev/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5"
version = "0.9.0"

# Even though some crates in this workspace may build fine
@@ -34,6 +34,7 @@ gix-hash = { version = "0.22.1", default-features = false, features = ["sha1"] }
gix-packetline = { version = "0.21.1", default-features = false }
human-panic = "2.0.6"
humantime = "2.3"
+
indexmap = { version = "2", default-features = false }
itertools = "0.14"
lexopt = "0.3.0"
libc = "0.2.137"
modified README.md
@@ -11,11 +11,11 @@ Radicle was designed to be a secure, decentralized and powerful alternative to
code forges such as GitHub and GitLab that preserves user sovereignty
and freedom.

-
See the [Radicle home page](https://radicle.xyz/) for general
+
See the [Radicle home page](https://radicle.dev/) for general
information, and the [Zulip chat](https://radicle.zulipchat.com/) to
talk to the project.

-
See the [Protocol Guide](https://radicle.xyz/guides/protocol) for an
+
See the [Protocol Guide](https://radicle.dev/guides/protocol) for an
in-depth description of how Radicle works.

## Installation
@@ -32,9 +32,9 @@ in-depth description of how Radicle works.

Run the following command to install the latest binary release:

-
    curl -sSf https://radicle.xyz/install | sh
+
    curl -sSf https://radicle.dev/install | sh

-
Or visit our [download](https://radicle.xyz/download) page.
+
Or visit our [download](https://radicle.dev/download) page.

### 📦 From source

@@ -50,7 +50,7 @@ commands from inside this repository:
Or directly from our seed node:

    cargo install --force --locked --root ~/.radicle \
-
        --git https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5.git \
+
        --git https://seed.radicle.dev/z3gqcJUoA1n9HaHKufZs5FCSGazv5.git \
        crates/radicle-cli crates/radicle-node crates/radicle-remote-helper

## Running
@@ -63,7 +63,7 @@ For running in debug mode, see [HACKING.md](HACKING.md).
## Feedback

If you have feedback, feel free to create issues using `rad issue`, join
-
[our Zulip][zulip], or email [feedback@radicle.xyz][mail-feedback].
+
[our Zulip][zulip], or email [feedback@radicle.dev][mail-feedback].
Emails sent to this address are [automatically posted][zulip-help-email] to
[our **public** #feedback channel on Zulip][zulip-feedback], revealing the
[`From` header][rfc2822s3.6.2] (which usually contains your name and email
@@ -84,5 +84,5 @@ See [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) for details.
[zulip]: https://radicle.zulipchat.com/
[zulip-feedback]: https://radicle.zulipchat.com/#narrow/channel/392584-feedback
[zulip-help-email]: https://talently.zulip.com/help/message-a-channel-by-email
-
[mail-feedback]: mailto:feedback@radicle.xyz
+
[mail-feedback]: mailto:feedback@radicle.dev
[rfc2822s3.6.2]: https://datatracker.ietf.org/doc/html/rfc2822#section-3.6.2
modified RELEASE.md
@@ -93,7 +93,7 @@ install the binaries, as well as launching the new binaries on our team seed
node.

This is achieved through the `build/upload` script, which requires SSH access to
-
`files.radicle.xyz`, for example:
+
`files.radicle.dev`, for example:

```
SSH_LOGIN=<user> build/upload 1.3.0-rc.3
@@ -102,14 +102,14 @@ SSH_LOGIN=<user> build/upload 1.3.0-rc.3
Once the files are released we can install the binaries via:

```
-
curl -O -L https://files.radicle.xyz/releases/latest/radicle-$TARGET.tar.xz
+
curl -O -L https://files.radicle.dev/releases/latest/radicle-$TARGET.tar.xz
```

where `$TARGET` is the relevant architecture and version.

### Release on Team Node
To help with testing the pre-release internally, we upgrade our team node,
-
`seed.radicle.xyz`, which is restricted to only replicate from our team's Node
+
`seed.radicle.dev`, which is restricted to only replicate from our team's Node
IDs.

We do this using NixOS and the [`radicle-nix`][radicle-nix] and
@@ -133,7 +133,7 @@ Radicle 1.5.0-rc.2 (7b00bf2e3) is released.
## Installation

```
-
curl -sSf https://radicle.xyz/install | sh -s -- --no-modify-path --version=1.5.0-rc.2
+
curl -sSf https://radicle.dev/install | sh -s -- --no-modify-path --version=1.5.0-rc.2
```

## Notes
@@ -243,11 +243,11 @@ Remember that `heartwood/CHANGELOG.md` must be updated to include the latest
changes in the patch release. These must be forward-ported to the `master`
branch.

-
[radicle-infra]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z254T5p17bdFPmzfDojsdjo4HjpoZ
+
[radicle-infra]: https://radicle.network/nodes/seed.radicle.dev/rad:z254T5p17bdFPmzfDojsdjo4HjpoZ
[radicle-nix]: https://github.com/radicle-nix/radicle-nix
-
[get-started]: https://radicle.xyz/#get-started
-
[radicle-xyz]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z371PVmDHdjJucejRoRYJcDEvD5pp
-
[updates]: https://radicle.xyz/#updates
+
[get-started]: https://radicle.dev/#get-started
+
[radicle-xyz]: https://radicle.network/nodes/seed.radicle.dev/rad:z371PVmDHdjJucejRoRYJcDEvD5pp
+
[updates]: https://radicle.dev/#updates
[zulip]: https://radicle.zulipchat.com/#narrow/channel/409174-announcements
-
[mastodon]: https://toot.radicle.xyz/explore
-
[bsky]: https://bsky.app/profile/radicle.xyz
+
[mastodon]: https://toot.radicle.dev/@radicle
+
[bsky]: https://bsky.app/profile/radicle.dev
modified build/Dockerfile
@@ -3,7 +3,7 @@ ARG RUST_VERSION="1.85"
ARG ALPINE_VERSION="3.20"

FROM rust:${RUST_VERSION}-alpine${ALPINE_VERSION} as builder
-
LABEL maintainer="Radicle Team <team@radicle.xyz>"
+
LABEL maintainer="Radicle Team <team@radicle.dev>"
WORKDIR /src
COPY . .

modified build/release
@@ -7,12 +7,12 @@ if [ $# -ne 1 ]; then
fi

SSH_LOGIN=${SSH_LOGIN:-release}
-
SSH_ADDRESS=${SSH_ADDRESS:-$SSH_LOGIN@files.radicle.xyz}
+
SSH_ADDRESS=${SSH_ADDRESS:-$SSH_LOGIN@files.radicle.dev}
SSH_KEY="$(rad path)/keys/radicle"

main() {
  version="$1"
-
  destination="/var/www/files.radicle.xyz/releases"
+
  destination="/var/www/files.radicle.dev/releases"

  if [ -z "$version" ]; then
    echo "fatal: empty version number" >&2 ; exit 1
modified build/upload
@@ -2,7 +2,7 @@
set -e

SSH_LOGIN=${SSH_LOGIN:-release}
-
SSH_ADDRESS=${SSH_ADDRESS:-$SSH_LOGIN@files.radicle.xyz}
+
SSH_ADDRESS=${SSH_ADDRESS:-$SSH_LOGIN@files.radicle.dev}
SSH_KEY="$(rad path)/keys/radicle"

main() {
@@ -17,7 +17,7 @@ main() {
    echo "fatal: empty version number" >&2 ; exit 1
  fi

-
  destination="/var/www/files.radicle.xyz/releases/$version"
+
  destination="/var/www/files.radicle.dev/releases/$version"

  # Create remote folder.
  ssh -i "$SSH_KEY" "$SSH_ADDRESS" mkdir -p "$destination"
modified crates/radicle-cli/examples/rad-config.md
@@ -4,9 +4,9 @@ In its simplest form, `rad config` prints the current configuration.
```
$ rad config
{
-
  "publicExplorer": "https://app.radicle.xyz/nodes/$host/$rid$path",
+
  "publicExplorer": "https://radicle.network/nodes/$host/$rid$path",
  "preferredSeeds": [
-
    "z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.xyz:8776"
+
    "z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.network:8776"
  ],
  "web": {
    "pinned": {
@@ -71,7 +71,7 @@ $ rad config schema
    "publicExplorer": {
      "description": "Public explorer. This is used for generating links.",
      "$ref": "#/$defs/Explorer",
-
      "default": "https://app.radicle.xyz/nodes/$host/$rid$path"
+
      "default": "https://radicle.network/nodes/$host/$rid$path"
    },
    "preferredSeeds": {
      "description": "Preferred seeds. These seeds will be used for explorer links/nand in other situations when a seed needs to be chosen.",
@@ -115,7 +115,7 @@ $ rad config schema
      "type": "string",
      "pattern": "^.+@.+:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$",
      "examples": [
-
        "z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@rosa.radicle.xyz:8776",
+
        "z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@rosa.radicle.network:8776",
        "z6MkvUJtYD9dHDJfpevWRT98mzDDpdAtmUjwyDSkyqksUr7C@xmrhfasfg5suueegrnc4gsgyi2tyclcy5oz7f5drnrodmdtob6t2ioyd.onion:8776",
        "z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU@f2atcc7udeub5kh4nkljtjwyk7ikjviorufzgwnfwhkphljl3vhq.b32.i2p:8776",
        "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi@seed.example.com:8776",
@@ -815,7 +815,7 @@ You can also get any value in the configuration by path, eg.
$ rad config get node.alias
alice
$ rad config get preferredSeeds
-
z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.xyz:8776
+
z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.network:8776
$ rad config get node.limits.routingMaxSize
1000
```
modified crates/radicle-cli/examples/rad-help.md
@@ -6,7 +6,7 @@ See `rad <COMMAND> --help` to learn about a specific command.

Do you have feedback?
 - Chat <radicle.zulipchat.com>
-
 - Mail <feedback@radicle.xyz>
+
 - Mail <feedback@radicle.dev>
   (Messages are automatically posted to the public #feedback channel on Zulip.)

Usage: rad[EXE] <COMMAND>
modified crates/radicle-cli/examples/rad-inbox.md
@@ -110,7 +110,7 @@ Your inbox is empty.
Now let's do an identity update.

``` ~alice
-
$ rad id update --title "Modify description" --description "Use website" --payload xyz.radicle.project description '"https://radicle.xyz"' -q
+
$ rad id update --title "Modify description" --description "Use website" --payload xyz.radicle.project description '"https://radicle.dev"' -q
[..]
$ rad sync -a
✓ Synced with 1 seed(s)
@@ -128,7 +128,7 @@ $ rad inbox show 1
  "payload": {
    "xyz.radicle.project": {
      "defaultBranch": "master",
-
      "description": "https://radicle.xyz",
+
      "description": "https://radicle.dev",
      "name": "heartwood"
    }
  },
modified crates/radicle-cli/examples/rad-init-sync-preferred.md
@@ -16,7 +16,7 @@ You can show it any time by running `rad .` from this directory.
Your repository has been synced to the network and is now discoverable by peers.
View it in your browser at:

-
    https://app.radicle.xyz/nodes/[...]/rad:z3Rry7rpdWuGpfjPYGzdJKQADsoNW
+
    https://radicle.network/nodes/[...]/rad:z3Rry7rpdWuGpfjPYGzdJKQADsoNW

To push changes, run `git push`.
```
modified crates/radicle-cli/examples/rad-node.md
@@ -125,8 +125,8 @@ $ rad sync status
✗ Error: to sync a repository, your node must be running. To start it, run `rad node start`
```
``` (fail)
-
$ rad node connect z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk@radicle.xyz:8776
-
✗ Connecting to z6Mkt67…v4N1tRk@radicle.xyz:8776... <canceled>
+
$ rad node connect z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk@radicle.example:58776
+
✗ Connecting to z6Mkt67…v4N1tRk@radicle.example:58776... <canceled>
✗ Error: failed to open node control socket "[..]/.radicle/node/control.sock" (entity not found)
✗ Hint: to start your node, run `rad node start`.
```
modified crates/radicle-cli/examples/rad-patch-open-explore.md
@@ -7,7 +7,7 @@ $ git push rad HEAD:refs/patches
✓ Patch acab0ec777a97d013f30be5d5d1aec32562ecb02 opened
✓ Synced with 1 seed(s)

-
  https://app.radicle.xyz/nodes/[..]/rad:z3yXbb1sR6UG6ixxV2YF9jUP7ABra/patches/acab0ec777a97d013f30be5d5d1aec32562ecb02
+
  https://radicle.network/nodes/[..]/rad:z3yXbb1sR6UG6ixxV2YF9jUP7ABra/patches/acab0ec777a97d013f30be5d5d1aec32562ecb02

To rad://z3yXbb1sR6UG6ixxV2YF9jUP7ABra/z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk
 * [new reference]   HEAD -> refs/patches
@@ -25,7 +25,7 @@ To compare against your previous revision acab0ec, run:

✓ Synced with 1 seed(s)

-
  https://app.radicle.xyz/nodes/[..]/rad:z3yXbb1sR6UG6ixxV2YF9jUP7ABra/patches/acab0ec777a97d013f30be5d5d1aec32562ecb02
+
  https://radicle.network/nodes/[..]/rad:z3yXbb1sR6UG6ixxV2YF9jUP7ABra/patches/acab0ec777a97d013f30be5d5d1aec32562ecb02

To rad://z3yXbb1sR6UG6ixxV2YF9jUP7ABra/z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk
 + e12525d...b2b6432 changes -> patches/acab0ec777a97d013f30be5d5d1aec32562ecb02 (forced update)
@@ -41,7 +41,7 @@ $ git push rad master
✓ Canonical reference refs/heads/master updated to target commit b2b6432af93f8fe188e32d400263021b602cfec8
✓ Synced with 1 seed(s)

-
  https://app.radicle.xyz/nodes/[..]/rad:z3yXbb1sR6UG6ixxV2YF9jUP7ABra/tree/b2b6432af93f8fe188e32d400263021b602cfec8
+
  https://radicle.network/nodes/[..]/rad:z3yXbb1sR6UG6ixxV2YF9jUP7ABra/tree/b2b6432af93f8fe188e32d400263021b602cfec8

To rad://z3yXbb1sR6UG6ixxV2YF9jUP7ABra/z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk
   f2de534..b2b6432  master -> master
modified crates/radicle-cli/examples/rad-warn-old-nodes.md
@@ -3,6 +3,12 @@ $ rad config push preferredSeeds z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm
z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@seed.radicle.garden:8776
$ rad config push node.connect z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@ash.radicle.garden:8776
z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@ash.radicle.garden:8776
+
$ rad config push node.connect z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.xyz:8776
+
z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@ash.radicle.garden:8776
+
z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.xyz:8776
+
$ rad config push preferredSeeds z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@rosa.radicle.xyz:8776
+
z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@seed.radicle.garden:8776
+
z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo@rosa.radicle.xyz:8776
```

Note the warnings that the above configuration causes:
@@ -38,8 +44,10 @@ $ rad debug
    "RAD_RNG_SEED": "0"
  },
  "warnings": [
-
    "Value of configuration option `node.connect` at index 0 mentions node with address 'ash.radicle.garden:8776', which has been renamed to 'rosa.radicle.xyz:8776'. Please edit your configuration file to use the new address.",
-
    "Value of configuration option `preferredSeeds` at index 0 mentions node with address 'seed.radicle.garden:8776', which has been renamed to 'iris.radicle.xyz:8776'. Please edit your configuration file to use the new address."
+
    "Value of configuration option `node.connect` at index 0 mentions node with hostname 'ash.radicle.garden', which has been renamed to 'rosa.radicle.network'. Please edit your configuration file to use the new address.",
+
    "Value of configuration option `node.connect` at index 1 mentions node with hostname 'iris.radicle.xyz', which has been renamed to 'iris.radicle.network'. Please edit your configuration file to use the new address.",
+
    "Value of configuration option `preferredSeeds` at index 0 mentions node with hostname 'seed.radicle.garden', which has been renamed to 'iris.radicle.network'. Please edit your configuration file to use the new address.",
+
    "Value of configuration option `preferredSeeds` at index 1 mentions node with hostname 'rosa.radicle.xyz', which has been renamed to 'rosa.radicle.network'. Please edit your configuration file to use the new address."
  ]
}
```
@@ -48,8 +56,10 @@ Also, `rad node status` will warn us:

```
$ rad node status
-
! Warning: Value of configuration option `node.connect` at index 0 mentions node with address 'ash.radicle.garden:8776', which has been renamed to 'rosa.radicle.xyz:8776'. Please edit your configuration file to use the new address.
-
! Warning: Value of configuration option `preferredSeeds` at index 0 mentions node with address 'seed.radicle.garden:8776', which has been renamed to 'iris.radicle.xyz:8776'. Please edit your configuration file to use the new address.
+
! Warning: Value of configuration option `node.connect` at index 0 mentions node with hostname 'ash.radicle.garden', which has been renamed to 'rosa.radicle.network'. Please edit your configuration file to use the new address.
+
! Warning: Value of configuration option `node.connect` at index 1 mentions node with hostname 'iris.radicle.xyz', which has been renamed to 'iris.radicle.network'. Please edit your configuration file to use the new address.
+
! Warning: Value of configuration option `preferredSeeds` at index 0 mentions node with hostname 'seed.radicle.garden', which has been renamed to 'iris.radicle.network'. Please edit your configuration file to use the new address.
+
! Warning: Value of configuration option `preferredSeeds` at index 1 mentions node with hostname 'rosa.radicle.xyz', which has been renamed to 'rosa.radicle.network'. Please edit your configuration file to use the new address.
Node is stopped.
To start it, run `rad node start`.
```
modified crates/radicle-cli/src/main.rs
@@ -27,7 +27,7 @@ See `rad <COMMAND> --help` to learn about a specific command.

Do you have feedback?
 - Chat <\x1b]8;;https://radicle.zulipchat.com\x1b\\radicle.zulipchat.com\x1b]8;;\x1b\\>
-
 - Mail <\x1b]8;;mailto:feedback@radicle.xyz\x1b\\feedback@radicle.xyz\x1b]8;;\x1b\\>
+
 - Mail <\x1b]8;;mailto:feedback@radicle.dev\x1b\\feedback@radicle.dev\x1b]8;;\x1b\\>
   (Messages are automatically posted to the public #feedback channel on Zulip.)\
";
pub const TIMESTAMP: &str = env!("SOURCE_DATE_EPOCH");
@@ -116,7 +116,7 @@ fn main() {
        env!("CARGO_PKG_VERSION")
    )
    .homepage(env!("CARGO_PKG_HOMEPAGE"))
-
    .support("Open a support request at https://radicle.zulipchat.com/ or file an issue via Radicle itself, or e-mail to team@radicle.xyz"));
+
    .support("Open a support request at https://radicle.zulipchat.com/ or file an issue via Radicle itself, or e-mail to team@radicle.dev"));

    if let Some(lvl) = radicle::logger::env_level() {
        let logger = Box::new(radicle::logger::Logger::new(lvl));
modified crates/radicle-cli/src/warning.rs
@@ -1,19 +1,30 @@
use std::collections::HashMap;
use std::sync::LazyLock;

-
use radicle::node::Address;
use radicle::node::config::ConnectAddress;
+
use radicle::node::{Address, HostName};
use radicle::profile::Config;

-
static NODES_RENAMED: LazyLock<HashMap<Address, Address>> = LazyLock::new(|| {
+
const IRIS: &str = "iris.radicle.network";
+
const ROSA: &str = "rosa.radicle.network";
+

+
static NODES_RENAMED: LazyLock<HashMap<HostName, HostName>> = LazyLock::new(|| {
    HashMap::from([
        (
-
            "seed.radicle.garden:8776".parse().unwrap(),
-
            "iris.radicle.xyz:8776".parse().unwrap(),
+
            HostName::Dns("seed.radicle.garden".to_string()),
+
            HostName::Dns(IRIS.to_string()),
+
        ),
+
        (
+
            HostName::Dns("iris.radicle.xyz".to_string()),
+
            HostName::Dns(IRIS.to_string()),
+
        ),
+
        (
+
            HostName::Dns("ash.radicle.garden".to_string()),
+
            HostName::Dns(ROSA.to_string()),
        ),
        (
-
            "ash.radicle.garden:8776".parse().unwrap(),
-
            "rosa.radicle.xyz:8776".parse().unwrap(),
+
            HostName::Dns("rosa.radicle.xyz".to_string()),
+
            HostName::Dns(ROSA.to_string()),
        ),
    ])
});
@@ -24,9 +35,10 @@ fn nodes_renamed_for_option(
) -> Vec<String> {
    iter.into_iter().enumerate().fold(Vec::new(), |mut warnings, (i, value)| {
        let old: Address = value.into();
-
        if let Some(new) = NODES_RENAMED.get(&old) {
+
        let old = old.host();
+
        if let Some(new) = NODES_RENAMED.get(old) {
            warnings.push(format!(
-
                "Value of configuration option `{option}` at index {i} mentions node with address '{old}', which has been renamed to '{new}'. Please edit your configuration file to use the new address."
+
                "Value of configuration option `{option}` at index {i} mentions node with hostname '{old}', which has been renamed to '{new}'. Please edit your configuration file to use the new address."
            ));
        }
        warnings
modified crates/radicle-node/Cargo.toml
@@ -23,6 +23,7 @@ crossbeam-channel = { workspace = true }
cyphernet = { workspace = true, features = ["dns", "ed25519", "p2p-ed25519", "noise-framework", "noise_sha2"] }
fastrand = { workspace = true }
gix-packetline = { workspace = true, features = ["blocking-io"] }
+
indexmap = { workspace = true }
lexopt = { workspace = true }
log = { workspace = true, features = ["kv", "std"] }
mio = { version = "1", features = ["net", "os-poll"] }
modified crates/radicle-node/src/main.rs
@@ -213,6 +213,55 @@ enum ExecutionError {
    },
}

+
/// Loads a credential from systemd, if available.
+
///
+
/// The credential ID should only be given as a suffix, as this function will
+
/// try different prefixes for backwards compatibility reasons.
+
///
+
/// The prefix `dev.radicle.node` is the preferred prefix, and should be used
+
/// for new credentials, while the prefix `xyz.radicle.node` is deprecated and
+
/// should be migrated away from. If it is used, a warning is logged.
+
#[cfg(all(feature = "systemd", target_os = "linux"))]
+
fn load_credential(id_suffix: &str) -> Option<String> {
+
    const INFIX_NODE: &str = ".radicle.node.";
+
    const PREFIX_DEV: &str = "dev";
+
    const PREFIX_XYZ: &str = "xyz";
+

+
    let id_dev = format!("{}{}{}", PREFIX_DEV, INFIX_NODE, id_suffix);
+

+
    let credential = match radicle_systemd::credential::path(&id_dev) {
+
        Ok(option) => option,
+
        Err(err) => {
+
            log::warn!(target: "node", "Failed to obtain path of the passphrase file via systemd credential with '{id_dev}': {err}");
+
            None
+
        }
+
    };
+

+
    let credential = credential.or_else(|| {
+
        let id_xyz = format!("{}{}{}", PREFIX_XYZ, INFIX_NODE, id_suffix);
+
        match radicle_systemd::credential::path(&id_xyz) {
+
            Ok(option) => {
+
                log::warn!(target: "node", "Obtain path of the passphrase file via systemd credential with '{id_xyz}'. Using this credential ID is discouraged. Please change the ID to '{id_dev}'.");
+
                option
+
            },
+
            Err(err) => {
+
                log::warn!(target: "node", "Failed to obtain path of the passphrase file via systemd credential with '{id_xyz}': {err}");
+
                None
+
            }
+
        }
+
    });
+

+
    credential.and_then(|ref path| {
+
        match std::fs::read_to_string(path) {
+
            Ok(passphrase) => Some(passphrase),
+
            Err(err) => {
+
                log::warn!(target: "node", "Failed to read passphrase from '{}': {err}", path.display());
+
                None
+
            }
+
        }
+
    })
+
}
+

fn execute(options: Options) -> Result<(), ExecutionError> {
    let home = profile::home()?;

@@ -244,39 +293,14 @@ fn execute(options: Options) -> Result<(), ExecutionError> {
    let passphrase = None;

    #[cfg(all(feature = "systemd", target_os = "linux"))]
-
    let passphrase = passphrase.or_else(|| {
-
        const ID: &str = "xyz.radicle.node.passphrase";
-
        match radicle_systemd::credential::path(ID) {
-
            Err(err) => {
-
                log::warn!(target: "node", "Failed to obtain path of the passphrase file via systemd credential with '{ID}': {err}");
-
                None
-
            },
-
            Ok(Some(ref path)) => match std::fs::read_to_string(path) {
-
                Ok(passphrase) => Some(passphrase.into()),
-
                Err(err) => {
-
                    log::warn!(target: "node", "Failed to read passphrase from '{}': {err}", path.display());
-
                    None
-
                }
-
            }
-
            Ok(None) => None,
-
        }
-
    });
+
    let passphrase = passphrase.or_else(|| load_credential("passphrase").map(|s| s.into()));

    let passphrase = passphrase.or_else(profile::env::passphrase);

    let secret_path = options.secret;

    #[cfg(all(feature = "systemd", target_os = "linux"))]
-
    let secret_path = secret_path.or_else(|| {
-
        const ID: &str = "xyz.radicle.node.secret";
-
        match radicle_systemd::credential::path(ID) {
-
            Err(err) => {
-
                log::warn!(target: "node", "Failed to obtain path of the secret key via systemd credential with ID '{ID}': {err}");
-
                None
-
            },
-
            Ok(path) => path
-
        }
-
    });
+
    let secret_path = secret_path.or_else(|| load_credential("secret").map(PathBuf::from));

    let secret_path = secret_path
        .or_else(|| config.node.secret.clone())
modified crates/radicle-node/src/tests.rs
@@ -233,11 +233,11 @@ fn test_inbound_connection() {

#[test]
fn test_persistent_peer_connect() {
-
    use std::collections::HashSet;
+
    use indexmap::IndexSet;

    let bob = Peer::new("bob", [8, 8, 8, 8]);
    let eve = Peer::new("eve", [9, 9, 9, 9]);
-
    let connect = HashSet::<ConnectAddress>::from_iter([
+
    let connect = IndexSet::<ConnectAddress>::from_iter([
        (bob.id(), bob.address()).into(),
        (eve.id(), eve.address()).into(),
    ]);
@@ -1186,7 +1186,7 @@ fn test_inventory_relay() {

#[test]
fn test_persistent_peer_reconnect_attempt() {
-
    use std::collections::HashSet;
+
    use indexmap::IndexSet;

    let mut bob = Peer::new("bob", [8, 8, 8, 8]);
    let mut eve = Peer::new("eve", [9, 9, 9, 9]);
@@ -1196,7 +1196,7 @@ fn test_persistent_peer_reconnect_attempt() {
        MockStorage::empty(),
        peer::Config {
            config: Config {
-
                connect: HashSet::from_iter([
+
                connect: IndexSet::from_iter([
                    (bob.id(), bob.address()).into(),
                    (eve.id(), eve.address()).into(),
                ]),
@@ -1246,7 +1246,7 @@ fn test_persistent_peer_reconnect_attempt() {

#[test]
fn test_persistent_peer_reconnect_success() {
-
    use std::collections::HashSet;
+
    use indexmap::IndexSet;

    let bob = Peer::with_storage("bob", [9, 9, 9, 9], MockStorage::empty());
    let mut alice = Peer::config(
@@ -1255,7 +1255,7 @@ fn test_persistent_peer_reconnect_success() {
        MockStorage::empty(),
        peer::Config {
            config: Config {
-
                connect: HashSet::from_iter([(bob.id, bob.addr()).into()]),
+
                connect: IndexSet::from_iter([(bob.id, bob.addr()).into()]),
                ..Config::new(node::Alias::new("alice"))
            },
            ..peer::Config::default()
modified crates/radicle-protocol/Cargo.toml
@@ -4,7 +4,7 @@ description = "The Radicle Protocol"
homepage.workspace = true
license.workspace = true
version = "0.7.0"
-
authors = ["Radicle Team <team@radicle.xyz>"]
+
authors = ["Radicle Team <team@radicle.dev>"]
edition.workspace = true
rust-version.workspace = true

modified crates/radicle/Cargo.toml
@@ -42,7 +42,7 @@ dunce = { workspace = true }
fast-glob = { version = "0.3.2" }
fastrand = { workspace = true, features = ["std"] }
git2 = { workspace = true, features = ["vendored-libgit2"] }
-
indexmap = { version = "2", features = ["serde"] }
+
indexmap = { workspace = true, features = ["serde"] }
log = { workspace = true, features = ["std"] }
nonempty = { workspace = true, features = ["serialize"] }
qcheck = { workspace = true, optional = true }
modified crates/radicle/src/explorer.rs
@@ -90,7 +90,7 @@ impl Default for Explorer {
    fn default() -> Self {
        Self(String::from(
            std::option_env!("RADICLE_EXPLORER")
-
                .unwrap_or("https://app.radicle.xyz/nodes/$host/$rid$path"),
+
                .unwrap_or("https://radicle.network/nodes/$host/$rid$path"),
        ))
    }
}
modified crates/radicle/src/identity/doc.rs
@@ -153,7 +153,7 @@ impl VersionError {
    pub fn verbose(&self) -> String {
        const UNKNOWN_VERSION_ERROR: &str = r#"
Perhaps a new version of the identity document is released which is not supported by the current client.
-
See https://radicle.xyz for the latest versions of Radicle.
+
See https://radicle.dev for the latest versions of Radicle.
The CLI command `rad id migrate` will help to migrate to an up-to-date versions."#;

        match self {
modified crates/radicle/src/node/config.rs
@@ -1,9 +1,9 @@
-
use std::collections::HashSet;
use std::ops::Deref;
use std::str::FromStr;
use std::{fmt, net};

use cyphernet::addr::PeerAddr;
+
use indexmap::IndexSet;
use localtime::LocalDuration;
use serde::{Deserialize, Serialize};
use serde_json as json;
@@ -42,7 +42,7 @@ pub mod seeds {
            #[allow(clippy::unwrap_used)] // Value is manually verified.
            NodeId::from_str("z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7").unwrap(),
            vec![
-
                HostName::Dns("iris.radicle.xyz".to_owned()),
+
                HostName::Dns("iris.radicle.network".to_owned()),
                #[cfg(feature = "tor")]
                #[allow(clippy::unwrap_used)] // Value is manually verified.
                OnionAddrV3::from_str(
@@ -60,7 +60,7 @@ pub mod seeds {
            #[allow(clippy::unwrap_used)] // Value is manually verified.
            NodeId::from_str("z6Mkmqogy2qEM2ummccUthFEaaHvyYmYBYh3dbe9W4ebScxo").unwrap(),
            vec![
-
                HostName::Dns("rosa.radicle.xyz".to_owned()),
+
                HostName::Dns("rosa.radicle.network".to_owned()),
                #[cfg(feature = "tor")]
                #[allow(clippy::unwrap_used)] // Value is manually verified.
                OnionAddrV3::from_str(
@@ -89,11 +89,11 @@ impl Network {
        match self {
            Self::Main => [
                (
-
                    "iris.radicle.xyz",
+
                    "iris.radicle.network",
                    seeds::RADICLE_NODE_BOOTSTRAP_IRIS.clone(),
                ),
                (
-
                    "rosa.radicle.xyz",
+
                    "rosa.radicle.network",
                    seeds::RADICLE_NODE_BOOTSTRAP_ROSA.clone(),
                ),
            ]
@@ -287,7 +287,7 @@ pub struct ConnectAddress(
        with = "String",
        regex(pattern = r"^.+@.+:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$"),
        extend("examples" = [
-
            "z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@rosa.radicle.xyz:8776",
+
            "z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@rosa.radicle.network:8776",
            "z6MkvUJtYD9dHDJfpevWRT98mzDDpdAtmUjwyDSkyqksUr7C@xmrhfasfg5suueegrnc4gsgyi2tyclcy5oz7f5drnrodmdtob6t2ioyd.onion:8776",
            "z6Mkvky2mnSYCTUMKRdAUoZXBXLLKtnWEkWeYQcGjjnmobAU@f2atcc7udeub5kh4nkljtjwyk7ikjviorufzgwnfwhkphljl3vhq.b32.i2p:8776",
            "z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi@seed.example.com:8776",
@@ -547,7 +547,11 @@ pub struct Config {
    /// Peers to connect to on startup.
    /// Connections to these peers will be maintained.
    #[serde(default)]
-
    pub connect: HashSet<ConnectAddress>,
+
    #[cfg_attr(
+
        feature = "schemars",
+
        schemars(with = "std::collections::HashSet<ConnectAddress>")
+
    )]
+
    pub connect: IndexSet<ConnectAddress>,
    /// Specify the node's public addresses
    #[serde(default)]
    pub external_addresses: Vec<Address>,
@@ -617,7 +621,7 @@ impl Config {
            user_agent: Some(UserAgent::default()),
            peers: PeerConfig::default(),
            listen: vec![],
-
            connect: HashSet::default(),
+
            connect: IndexSet::default(),
            external_addresses: vec![],
            network: Network::default(),
            proxy: None,
modified crates/radicle/src/test/fixtures.rs
@@ -228,7 +228,7 @@ pub fn populate(repo: &git::raw::Repository, scale: usize) -> Vec<git::fmt::Qual
            .to_lowercase();
        let name = git::fmt::refname!("feature")
            .join(git::fmt::RefString::try_from(random.as_str()).unwrap());
-
        let signature = git::raw::Signature::now("Radicle", "radicle@radicle.xyz").unwrap();
+
        let signature = git::raw::Signature::now("Radicle", "radicle@radicle.dev").unwrap();

        rng.fill(&mut buffer);

modified debian/control
@@ -1,12 +1,12 @@
Source: radicle
-
Maintainer: The Radicle Team <team@radicle.xyz>
+
Maintainer: The Radicle Team <team@radicle.dev>
Uploaders: Lars Wirzenius <liw@liw.fi>, Sebastian Martinez <sebastian@rhizoma.dev>
Section: vcs
Priority: optional
Standards-Version: 4.6.2
Build-Depends: debhelper (>= 10~),
  asciidoctor
-
Homepage: https://radicle.xyz/
+
Homepage: https://radicle.dev/

Package: radicle
Architecture: any
modified debian/copyright
@@ -1,7 +1,7 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: heartwood
-
Upstream-Contact: https://radicle.xyz/
-
Source: https://app.radicle.xyz/seeds/seed.radicle.xyz
+
Upstream-Contact: https://radicle.dev/
+
Source: https://radicle.network/seeds/seed.radicle.dev

Files: *
Copyright: 2019-2021, The Radicle Foundation
modified flake.nix
@@ -28,7 +28,7 @@

  nixConfig = {
    keepOutputs = true;
-
    extra-substituters = ["https://attic.radicle.xyz/radicle"];
+
    extra-substituters = ["https://attic.radicle.dev/radicle"];
    extra-trusted-public-keys = ["radicle:TruHbueGHPm9iYSq7Gq6wJApJOqddWH+CEo+fsZnf4g="];
  };

@@ -184,7 +184,7 @@
            grep = rec {
              generators = [
                {
-
                  word = "radicle.xyz";
+
                  word = "radicle.dev";
                  files = "\\.rs$";
                  excludes = [];
                }
modified git-remote-rad.1.adoc
@@ -1,5 +1,5 @@
= git-remote-rad(1)
-
The Radicle Team <team@radicle.xyz>
+
The Radicle Team <team@radicle.dev>
:doctype: manpage
:revnumber: 0.8.0
:revdate: 2023-10-12
modified rad-id.1.adoc
@@ -1,5 +1,5 @@
= rad-id(1)
-
The Radicle Team <team@radicle.xyz>
+
The Radicle Team <team@radicle.dev>
:doctype: manpage
:revnumber: 1.0.0
:revdate: 2024-04-22
modified rad-patch.1.adoc
@@ -1,5 +1,5 @@
= rad-patch(1)
-
The Radicle Team <team@radicle.xyz>
+
The Radicle Team <team@radicle.dev>
:doctype: manpage
:revnumber: 1.0.0
:revdate: 2024-04-22
modified rad.1.adoc
@@ -1,5 +1,5 @@
= rad(1)
-
The Radicle Team <team@radicle.xyz>
+
The Radicle Team <team@radicle.dev>
:doctype: manpage
:revnumber: 1.0.0
:revdate: 2024-04-22
@@ -111,7 +111,7 @@ the logs will go to the system journal. These can be viewed with **journalctl**(
To connect to a specific peer, the *connect* sub-command can be used:
For example, to connect to a community node, you can run:

-
    $ rad node connect z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.xyz:8776
+
    $ rad node connect z6MkrLMMsiPWUcNPHcRajuMi9mDfYckSoJyPwwnknocNYPm7@iris.radicle.network:8776

The argument given to *connect* is called a node _address_. It is composed of
a Node ID (NID), followed by an *@* symbol, and the _host_ name and _port_.
modified radicle-node.1.adoc
@@ -1,5 +1,5 @@
= radicle-node(1)
-
The Radicle Team <team@radicle.xyz>
+
The Radicle Team <team@radicle.dev>
:doctype: manpage
:revnumber: 1.0.0
:revdate: 2024-04-22
modified scripts/changelog
@@ -49,7 +49,7 @@ echo
echo "## Installation"
echo
echo '```'
-
echo "curl -sSf https://radicle.xyz/install | sh -s -- --no-modify-path --version=$version"
+
echo "curl -sSf https://radicle.dev/install | sh -s -- --no-modify-path --version=$version"
echo '```'
echo
echo "## Notes"
modified scripts/just/check-keywords.sh
@@ -6,6 +6,10 @@ echo "${CHECK}Checking for forbidden words in staged files...${NORMAL}"
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep '\.rs$' || true)

if [ -n "$STAGED_FILES" ]; then
+
    if echo "$STAGED_FILES" | xargs rg --context=3 --fixed-strings 'radicle.dev'; then
+
        exit 1
+
    fi
+

    if echo "$STAGED_FILES" | xargs rg --context=3 --fixed-strings 'radicle.xyz'; then
        exit 1
    fi
modified simulation/README.md
@@ -15,9 +15,9 @@ A suite of tools to create simulated Radicle networks to run tests in:

`heartwood` already has the following types of tests (as of 2026-04):

-
- [Unit](https://app.radicle.xyz/nodes/iris.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/crates/radicle/src/profile.rs#L842)
-
- [End-to-End](https://app.radicle.xyz/nodes/iris.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/crates/radicle-node/src/tests/e2e.rs)
-
- [CLI](https://app.radicle.xyz/nodes/iris.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/crates/radicle-cli/tests/commands/checkout.rs)
+
- [Unit](https://radicle.network/nodes/iris.radicle.network/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/crates/radicle/src/profile.rs#L842)
+
- [End-to-End](https://radicle.network/nodes/iris.radicle.network/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/crates/radicle-node/src/tests/e2e.rs)
+
- [CLI](https://radicle.network/nodes/iris.radicle.network/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/crates/radicle-cli/tests/commands/checkout.rs)

However we can only run them on the currently checked out version of `heartwood`, this leaves gaps in our testing coverage, particularly for cross-version and cross-platform testing.

@@ -73,7 +73,7 @@ This will give us the following workflow for constructing test scenarios:

## Plan

-
- [ ] Migrate existing [simulation environment repo](https://app.radicle.xyz/nodes/iris.radicle.xyz/rad%3Az2CzknCvAq9jSCpKdyjMppbvGmxyZ) into `heartwood`.
+
- [ ] Migrate existing [simulation environment repo](https://radicle.network/nodes/iris.radicle.network/rad%3Az2CzknCvAq9jSCpKdyjMppbvGmxyZ) into `heartwood`.
  1. [ ] `radicle-node` timoni module.
  2. [ ] `radicle-node` custom container builder.
  3. [ ] `instances` topology definition files.
modified windows/Package.wxs
@@ -14,7 +14,7 @@

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <Package
-
    Id="xyz.radicle"
+
    Id="dev.radicle"
    Name="Radicle"
    Manufacturer="Radicle Team"
    Version="$(env.RADICLE_VERSION)"
@@ -25,7 +25,7 @@
  >
    <MediaTemplate EmbedCab="yes" />
    <MajorUpgrade DowngradeErrorMessage="A newer version of Radicle is already installed." />
-
    <Property Id="ARPURLINFOABOUT" Value="https://www.radicle.xyz/" />
+
    <Property Id="ARPURLINFOABOUT" Value="https://www.radicle.dev/" />
    <StandardDirectory Id="LocalAppDataFolder">
      <Directory Id="INSTALLFOLDER" Name="Radicle">  
        <Component Id="InstallFolderComponent" Guid="*">