diff --git a/_guides/protocol.md b/_guides/protocol.md
index 3c151de..a4c4141 100644
--- a/_guides/protocol.md
+++ b/_guides/protocol.md
@@ -822,9 +822,8 @@ collaboration.
[git-v2]: https://git-scm.com/docs/protocol-v2
[Tor]: https://torproject.org/
[Ed25519]: https://ed25519.cr.yp.to/
-[iris.radicle.xyz]: https://app.radicle.xyz/nodes/iris.radicle.xyz
-[rosa.radicle.xyz]: https://app.radicle.xyz/nodes/rosa.radicle.xyz
-[seed.radicle.xyz]: https://app.radicle.xyz/nodes/seed.radicle.xyz
+[iris.radicle.xyz]: {{ "iris.radicle.xyz " | explore }}
+[rosa.radicle.xyz]: {{ "rosa.radicle.xyz " | explore }}
[reverse-dns]: https://en.wikipedia.org/wiki/Reverse_domain_name_notation
[tuf]: https://theupdateframework.github.io/specification/latest/
[noise]: http://www.noiseprotocol.org/noise.html
@@ -835,15 +834,15 @@ collaboration.
[causality]: https://en.wikipedia.org/wiki/Causal_consistency
[dag]: https://en.wikipedia.org/wiki/Directed_acyclic_graph
[topo]: https://en.wikipedia.org/wiki/Topological_sorting
-[rip-1]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0001-heartwood.md
-[rip-2]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0002-identity.md
-[rip-3]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0003-storage-layout.md
+[rip-1]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0001-heartwood.md" | explore }}
+[rip-2]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0002-identity.md" | explore }}
+[rip-3]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0003-storage-layout.md" | explore }}
[nat]: https://en.wikipedia.org/wiki/Network_address_translation
[framing]: https://en.wikipedia.org/wiki/Frame_(networking)
[fs]: https://en.wikipedia.org/wiki/Forward_secrecy
[ecdh]: https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
-[rips]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82
-[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+[rips]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82" | explore }}
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
[did]: https://www.w3.org/TR/did-core/
[seed]: /guides/seeder/
[peer-to-peer]: https://en.wikipedia.org/wiki/Peer-to-peer
diff --git a/_guides/user.md b/_guides/user.md
index a4f1bd2..9a1c247 100644
--- a/_guides/user.md
+++ b/_guides/user.md
@@ -133,7 +133,7 @@ This command runs an installer script that automates the setup process, by:
> compile from the [source code][heartwood] or get the [binaries] if you
> prefer.
-[heartwood]: https://app.radicle.xyz/seeds/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
[binaries]: {{ site.url }}/download
Once you've installed Radicle, you can make sure that it was successful by
@@ -2087,7 +2087,7 @@ to resolve `.onion` addresses.
[tor]: https://www.torproject.org
[install-tor]: https://community.torproject.org/onion-services/setup/install/
[cyph-man]: https://www.activism.net/cypherpunk/manifesto.html
-[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
[cobs]: /guides/protocol/#collaborative-objects
[ch1]: /guides/user/#1-getting-started
[ch2]: /guides/user/#2-collaborating-the-radicle-way
diff --git a/_layouts/index.html b/_layouts/index.html
index c840282..20233f6 100644
--- a/_layouts/index.html
+++ b/_layouts/index.html
@@ -9,7 +9,7 @@
{% include header.html %}
diff --git a/_layouts/post.html b/_layouts/post.html
index bff9ada..b2cad39 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -19,7 +19,7 @@
{% include footer.html %}
diff --git a/_pages/faq.md b/_pages/faq.md
index 6808d1c..363dd3f 100644
--- a/_pages/faq.md
+++ b/_pages/faq.md
@@ -37,7 +37,7 @@ the problem for over 4 years in total. Previous iterations of Radicle can be
found online, but are considered deprecated in favor of [Heartwood][heartwood],
the latest generation of the protocol.
-[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
# Technical Questions
@@ -85,7 +85,7 @@ Radicle checks this automatically, by verifying changes to the maintainer set
through the repository identity document. All you need to know is that you have
the correct Repository ID (RID). See [RIP-2][rip-2] for more information.
-[rip-2]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0002-identity.md
+[rip-2]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0002-identity.md" | explore }}
## Isn't SHA-1 broken? How do you handle hash collisions?
diff --git a/_pages/history.md b/_pages/history.md
index 94e31c7..f6a19cc 100644
--- a/_pages/history.md
+++ b/_pages/history.md
@@ -73,8 +73,8 @@ developer stack.
[radworks]: https://radworks.org
[ipfs]: https://ipfs.tech/
-[heartwood]: https://app.radicle.xyz/seeds/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
-[web]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
+[web]: {{ "rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5" | explore }}
[689]: https://github.com/radicle-dev/radicle-alpha/issues/689
[as]: https://cloudhead.io
[ed]: https://eleftherios.io/
diff --git a/_pages/work.md b/_pages/work.md
index cb98712..a978c59 100644
--- a/_pages/work.md
+++ b/_pages/work.md
@@ -2,8 +2,8 @@
title: Work for Radicle
subtitle: Everything you ever wanted to know
---
-[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
-[rips]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
+[rips]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82" | explore }}
[zulip]: https://radicle.zulipchat.com
# Work for Radicle
@@ -61,7 +61,7 @@ We are looking for a protocol developer to push the Radicle protocol forward.
- Design [Radicle Improvement Proposals][rips] to help define the future of Radicle.
- Integrate design decisions into the existing implementation in the [`heartwood`][heartwood] repository.
-- [Collaborate](https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/patches?status=merged) with external contributors to help maintain the project.
+- [Collaborate]({{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/patches?status=merged" | explore }}) with external contributors to help maintain the project.
- Improve and debug the existing implementation of the protocol.
#### Experience
@@ -88,7 +88,7 @@ We are looking for a developer, who is interested in UX/DX, to push Radicle tool
#### Key Responsibilities
-- Provide new changes into the [`heartwood`](https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5) repository.
+- Provide new changes into the [`heartwood`]({{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}) repository.
- Improve `rad`, the Radicle CLI.
- Improving the workflows of other developers using Radicle.
- Collaborate with external contributors to help maintain the project.
diff --git a/_plugins/explorer.rb b/_plugins/explorer.rb
new file mode 100644
index 0000000..17888e3
--- /dev/null
+++ b/_plugins/explorer.rb
@@ -0,0 +1,15 @@
+module Jekyll
+ module Explorer
+ def explore(input)
+ base = "https://app.radicle.xyz/nodes"
+ if input.include?(' ')
+ prefix, suffix = input.split(' ', 2)
+ "#{base}/#{prefix}/#{suffix}"
+ else
+ "#{base}/iris.radicle.xyz/#{input}"
+ end
+ end
+ end
+end
+
+Liquid::Template.register_filter(Jekyll::Explorer)
diff --git a/_posts/2024-09-10-radicle-1.0.0.md b/_posts/2024-09-10-radicle-1.0.0.md
index b9a1c8d..ccdf7b0 100644
--- a/_posts/2024-09-10-radicle-1.0.0.md
+++ b/_posts/2024-09-10-radicle-1.0.0.md
@@ -117,9 +117,9 @@ Together, we can make significant progress towards reclaiming the internet.
[cobs]: /guides/protocol#collaborative-objects
[vscode]: https://app.radicle.at/nodes/seed.radicle.gr/rad:z3Makm6fsQQXmpSFE43DZqwupaEhk
-[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
[jetbrains]: https://app.radicle.at/nodes/seed.radicle.gr/rad:z3WHS4GSf8hChLjGYfPkJY7vCxsBK
-[fe]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5
+[fe]: {{ "rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5" | explore }}
[rc1]: https://x.com/radicle/status/1772659708978991605?s=20
[website]: /
[guides]: /guides
diff --git a/_posts/2025-05-30-radicle-with-github-actions.md b/_posts/2025-05-30-radicle-with-github-actions.md
index 31a4168..7fc6387 100644
--- a/_posts/2025-05-30-radicle-with-github-actions.md
+++ b/_posts/2025-05-30-radicle-with-github-actions.md
@@ -5,7 +5,7 @@ author: rudolfs
layout: blog
---
-A chat with [burrito](https://app.radicle.xyz/nodes/iris.radicle.xyz/users/did:key:z6MkrubmdTJKR42YZd7yDYysyx4JRez1wmvxjpmhzhTMKxsr) aka [Dietrich Ayala](https://metafluff.com) today sparked the idea to write down how we started dogfooding Radicle before we had our native Radicle CI going. He also encouraged me to just set a deadline for writing blog posts in general, so this had to be written and published by the end of today.
+A chat with [burrito]({{ "users/did:key:z6MkrubmdTJKR42YZd7yDYysyx4JRez1wmvxjpmhzhTMKxsr" | explore }}) aka [Dietrich Ayala](https://metafluff.com) today sparked the idea to write down how we started dogfooding Radicle before we had our native Radicle CI going. He also encouraged me to just set a deadline for writing blog posts in general, so this had to be written and published by the end of today.
We wanted to dogfood Radicle as soon as possible, but there was one caveat: we didn't have a solution for CI at the time. So what we did was just reuse our existing GitHub actions and push both to Radicle and GitHub. The code review would happen in Radicle, and GitHub would run our tests. For easy visual indication, we used workflow status badges generated for each branch pushed to GitHub.
@@ -56,4 +56,4 @@ sed -e "s||$branchName|g" \
EOF
```
-This is how we used to run tests and builds. Now, we're dogfooding [our own CI solution](https://app.radicle.xyz/nodes/rosa.radicle.xyz/rad:zwTxygwuz5LDGBq255RA2CbNGrz8) together with [Woodpecker](https://app.radicle.xyz/nodes/iris.radicle.xyz/rad:z39Cf1XzrvCLRZZJRUZnx9D1fj5ws). If you want to learn more about CI in Radicle, check out the conversations on [Zulip](https://radicle.zulipchat.com/#narrow/channel/452370-radicle-ci).
+This is how we used to run tests and builds. Now, we're dogfooding [our own CI solution]({{ "rad:zwTxygwuz5LDGBq255RA2CbNGrz8" | explore }}) together with [Woodpecker]({{ "rad:z39Cf1XzrvCLRZZJRUZnx9D1fj5ws" | explore }}). If you want to learn more about CI in Radicle, check out the conversations on [Zulip](https://radicle.zulipchat.com/#narrow/channel/452370-radicle-ci).
diff --git a/_posts/2025-07-23-using-radicle-ci-for-development.md b/_posts/2025-07-23-using-radicle-ci-for-development.md
index f39571f..f379360 100644
--- a/_posts/2025-07-23-using-radicle-ci-for-development.md
+++ b/_posts/2025-07-23-using-radicle-ci-for-development.md
@@ -47,7 +47,7 @@ I have written a CI engine for myself,
There are adapters for running CI locally on the host or in a
container, GitHub actions, Woodpecker, and several others. See [`CI
broker
-README.md`](https://app.radicle.xyz/nodes/radicle.liw.fi/rad:zwTxygwuz5LDGBq255RA2CbNGrz8/tree/README.md)
+README.md`]({{ "radicle.liw.fi rad:zwTxygwuz5LDGBq255RA2CbNGrz8/tree/README.md" | explore }})
and [integration
documentation](https://explorer.radicle.gr/nodes/seed.radicle.gr/rad:z4Uh671FzoooaHjLvmtW9BtGMF9qm)
for a more complete list. The adapter interface is intentionally easy
@@ -182,7 +182,7 @@ To push changes, run `git push`.
There you go. I now have a Radicle repository to play with. As of
publishing this blog post, the repository is alive on the Radicle
network, if you want to [look at
-it](https://app.radicle.xyz/nodes/radicle.liw.fi/rad:z3dhWQMH8J6nX3Qo97o5oSFMTfgyr)
+it]({{ "radicle.liw.fi rad:z3dhWQMH8J6nX3Qo97o5oSFMTfgyr" | explore }})
or clone it.
# CI configuration in the repository
@@ -212,7 +212,7 @@ I find the most frustrating part of using CI to be to wait for a CI
run to finish on a server and then try to deduce from the run log what
went wrong. I've alleviated this by writing an extension to `rad` to
run CI locally:
-[`rad-ci`](https://app.radicle.xyz/nodes/radicle.liw.fi/rad%3Az6QuhJTtgFCZGyQZhRMZmZKJ3SVG).
+[`rad-ci`]({{ "radicle.liw.fi rad:z6QuhJTtgFCZGyQZhRMZmZKJ3SVG" | explore }}).
It can produce a huge amount of output, so I've abbreviated that
below.
@@ -481,7 +481,7 @@ but not other systems, since I only use Debian. I would very much
appreciate help with expanding that documentation.
It's probably easiest to install
-[`rad-ci`](https://app.radicle.xyz/nodes/radicle.liw.fi/rad:z6QuhJTtgFCZGyQZhRMZmZKJ3SVG)
+[`rad-ci`]({{ "radicle.liw.fi rad:z6QuhJTtgFCZGyQZhRMZmZKJ3SVG" | explore }})
from source code or with `cargo install`, but I have a `deb` package
for those using Debian or derivatives in my [APT
repository](http://apt.liw.fi/).
diff --git a/_posts/2025-08-12-canonical-references.md b/_posts/2025-08-12-canonical-references.md
index e53adf7..1cd45a8 100644
--- a/_posts/2025-08-12-canonical-references.md
+++ b/_posts/2025-08-12-canonical-references.md
@@ -184,10 +184,10 @@ your hearts content ❤️🌱
[^1]: Here we are using the term in the sense that some content made may not be considered part of the canon of some story or universe. For example, some Star Wars content may be considered as canon by George Lucas, but some may not be.
-[^2]: [RIP-4 Canonical References](https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82/patches/1d1ce874f7c39ecdcd8c318bbae46ffd02fe1ea8?tab=changes)
+[^2]: [RIP-4 Canonical References]({{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82/patches/1d1ce874f7c39ecdcd8c318bbae46ffd02fe1ea8?tab=changes" | explore }})
-[^3]: [First patch attempting to implement canonical references](https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/patches/c54883e5ffb1f8a99f432e3ac79c0b728cd0dab3)
+[^3]: [First patch attempting to implement canonical references]({{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/patches/c54883e5ffb1f8a99f432e3ac79c0b728cd0dab3" | explore }})
-[^4]: [Second patch implementing canonical references using the identity payload](https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/patches/bea09df15505cfcebc72ad40f629747d2e82f670)
+[^4]: [Second patch implementing canonical references using the identity payload]({{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/patches/bea09df15505cfcebc72ad40f629747d2e82f670" | explore }})
[^5]: [Git ref format and reference patterns](https://git-scm.com/docs/git-check-ref-format)
diff --git a/_posts/2025-08-14-jujutsu-with-radicle.md b/_posts/2025-08-14-jujutsu-with-radicle.md
index 8ac8704..0ebd1a5 100644
--- a/_posts/2025-08-14-jujutsu-with-radicle.md
+++ b/_posts/2025-08-14-jujutsu-with-radicle.md
@@ -565,11 +565,11 @@ Come help in discussion on our [Zulip], and enjoy being Radicle 🌱👾
[git-remote-helpers]: https://git-scm.com/docs/gitremote-helpers
-[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
[Zulip]: https://radicle.zulipchat.com
[download]: /download
[guide-user-cobs]: /guides/user#2-collaborating-the-radicle-way
[guide-user-patch]: /guides/user#working-with-patches
[guides]: /guides
-[rip-storage]: https://app.radicle.xyz/nodes/rosa.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0003-storage-layout.md
-[rip-storage-namespace]: https://app.radicle.xyz/nodes/rosa.radicle.xyz/rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0003-storage-layout.md#layout
+[rip-storage]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0003-storage-layout.md" | explore }}
+[rip-storage-namespace]: {{ "rad:z3trNYnLWS11cJWC6BbxDs5niGo82/tree/0003-storage-layout.md#layout" | explore }}
diff --git a/index.md b/index.md
index 044b3d9..c9f778e 100644
--- a/index.md
+++ b/index.md
@@ -12,7 +12,7 @@ Unlike centralized code hosting platforms, there is no single entity
controlling the network. Repositories are replicated across peers in a
decentralized manner, and users are in full control of their data and workflow.
-
+
@@ -99,14 +99,14 @@ and other clients can be developed.
└────────────────┘└─────────────────┘
-Browse our repositories ↗
+Browse our repositories ↗
# Contributing
Radicle is *free and open source* software under the MIT and Apache 2.0
licenses. Get involved by [contributing code][contribute].
-[contribute]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/CONTRIBUTING.md
+[contribute]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5/tree/CONTRIBUTING.md" | explore }}
# Updates
@@ -168,7 +168,7 @@ channel on Zulip.
[bsky]: https://bsky.app/profile/{{ site.atproto }}
[mast]: {{ site.fedi | fedi_to_https }}
[zulip]: https://radicle.zulipchat.com
-[heartwood]: https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
+[heartwood]: {{ "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5" | explore }}
[desktop]: /desktop
[cobs]: /guides/protocol#collaborative-objects
[local-first]: https://www.inkandswitch.com/local-first/