Changes which were needed after the upgrade:
- Replace vite-plugin-virtual (vite 8 incompatible) with vite's
built-in `define` for the buildTimeConfig injection
- tsconfig: drop deprecated `baseUrl` (TS 5+ resolves `paths`
relative to tsconfig)
- Vitest 4: import `defineConfig` from `vitest/config` so `test`
is valid in vite configs
- Zod 4: rename `.errors` to `.issues`, make `ZodSchema` a
type-only import, drop the removed `SafeParseReturnType`
- Tighten/loosen generic casts in localStore to match stricter
zod 4 inference
- ESLint 9 `no-useless-assignment`: remove redundant initializers
and dead reassignments; disable the rule where Svelte's reactive
blocks confuse the analyser
- Svelte/eslint `prefer-svelte-reactivity`: disable for legacy
Svelte usages of URL / Set
- Misc naming-convention and prefer-const fixes
Playwright 1.52 hangs under Node 24 when loading test files that
transitively import modules with top-level await (tests/support/
support.ts). Node 24 enables require(esm) by default, and the old
CJS-based .ts transformer deadlocks on TLA.
Also update CLAUDE.md: playwright 1.59's --project flag is variadic
and greedily consumes trailing args, so the file path must come
before --project.
This also drops .tool-versions to keep a single source of truth for the
node version in .nvmrc. We also point the github actions to .nvmrc now.
I'm the only dev who's using asdf to manage my tooling and I decided to
just configure it to fall back to .nvmrc via `legacy_version_file =
yes`.
Deploys two workers: og-injector intercepts social crawler requests and
injects Open Graph meta tags; open-graph renders 1200×630 PNG cards
using Satori with repo/user avatars ported from avatar.ts.
When a saved node (e.g. localhost) is down, the app previously showed a
dead-end "Node not found" page with no way to navigate away.
Now the not-found page displays the seed selector inline with the error
title, showing which node failed and letting users switch to a different
one directly. The same treatment applies when navigating to a repo on an
unreachable node.
They were not run by the test suite at all, because they lacked the
.spec.ts suffix. This change makes sure they're run again and fixes a
all failing specs.
Work around an issue where radicle-node takes a long time to respond to
status and config requests blocking the UI because we use the node
avatar from the config in almost all layouts.
radicle 0.18.0 -> 0.21.0
radicle-surf 0.22.0 -> 0.27.0
radicle-term 0.14.0 -> 0.17.0
radicle-crypto 0.13.0 -> 0.15.0
Fixes the following issues:
- broken pinned repo listing while repos are being fetched
- broken source tree browser when there are `[]` characters in folder names
Enable hot-reloading of web configuration (pinned repos, avatar, banner,
description) by sending SIGHUP to the process, eliminating the need for
server restarts when updating these settings.
Co-authored-by: Fintan Halpenny <fintan.halpenny@gmail.com>
Allow radicle-explorer to connect to a locally running radicle-httpd via
https://app.radicle.xyz/nodes/localhost. This was previously disabled to
encourage use of Radicle Desktop, but is now useful for testing the new
always-on node in local development environments.
Remove support for /nodes/radicle.local, an undocumented and unused convention.
Fix remote node loading when Cloudflare URL-encodes port separator (: → %3A).
Our Cloudflare deployments via GitHub broke. We can run deployments
manually to app.radicle.xyz via:
npm run deploy
This also takes care of injecting the plausible.io script.
We recently moved app.radicle.xyz to Cloudflare, which by default
normalizes all URLs to be encoded on redirect. The redirects happen
because we run in SPA mode.
Turns out "content-type: text; charset=utf-8" wasn't valid, it had to be
"content-type: text/plain; charset=utf-8" for browsers to recognise it
properly.
We also remove the `/api/v1/profile` endpoint because that was only
supposed to be used with a local node and not publicly accessible. All
fields that are still used in the UI were moved to `/api/v1/node`.
We bump the API and crate versions since this is a breaking change.
squash or drop!: Small suggestion for improvement
Previously the /api/v1/stats endpoint would count any repository that is
in the storage regardless of whether the repository is publicly seeded or not.
We just use the radicleExplorer that is configured in the app config and
don't query the node for it. Besides simplifying things this also makes
the button work on iOS again, because we don't have the async http
request anymore.
- don't keep the tooltip open when hovering over it
- offset the tooltip to the right, so it doesn't overlap with other
content
- tweak colors so it pops out of the background more
- tweak elevation shadows to stand out more
- don't show node ID DID in popover