Commit Graph
3549 Commits
Author SHA1 Message Date
Brandon Oxendine ede901bc4f explorer: Add a download button to the clone popover
The Download tab only offered a curl command. Add a button that links
to the same archive URL so people without a terminal can download the
source.
2026-11-03 14:39:33 +01:00
Alessio Caiazza 9c790a7d1c desktop: Drop wall-clock limits from mention tests
The hostile input tests compared elapsed time against fixed limits, so
they measured the machine as well as the code. They fail on slower or
loaded builders, such as the nixpkgs x86_64-linux check phase, even
though rendering stays linear.

Compare the CPU time of an input against one four times as long
instead. Linear rendering gives about 4 and a quadratic regression
about 16. CPU time is needed because a wall-clock ratio inflates under
bursty load, when a short run fits between bursts and a long one does
not.

Rendering past the reference limit gets its own test, since the link
count cannot catch a limit that stops linking but keeps rescanning.

The bare reference test now puts a valid reference before the long
run, so giving up is visible in the result without any timing.

AI-assisted: Claude Code (claude-opus-5-5)
2026-10-31 13:59:28 +01:00
Daniel Norman e1f7a40c63 httpd: Set up the tag release flow
- Rename RADICLE_VERSION to RADICLE_HTTPD_VERSION, apart from
  heartwood's RADICLE_VERSION
- Add Unreleased sections to the changelog and API changes log, so
  patches add their highlights as they land
- Replace the release patch with a signed tag that one delegate
  pushes
- Stop pushing the tag from upload: the delegate who makes the tag
  pushes it
- Remove build/changelog
- Add build/prepare to rename the Unreleased sections, in POSIX sh
  and awk
- Ask a major release to set the target date to drop the previous
  major
- Fix the signing key setup: use the bare key that build/tag
  compares against
2026-10-29 18:32:03 +01:00
Daniel Norman d8f363ca99 Replace API version checks with feature detection
httpd:
- Serve the API at /api, not only under /v1
- Keep serving it at /api/v1, without a redirect, until the first
  major release after explorer and the Open Graph worker switch
  to /api
- Remove apiVersion: released explorers do not read it
- Add `httpd.releases` to `/info`, set by the artifacts feature

explorer:
- Remove the API version check, its config and the unused
  compare-versions dependency
- Keep the node version in a plain parse error message
- Add `minimumSupportedVersion`, set to 0.28.0, and warn on nodes
  whose major is older, treating 0.y as the major before 1.0
- Do not warn on builds without a release number
- Show a warning on the node page of an outdated node
- Mark an outdated node in the seed picker on every page
- Name the node version and the floor in parse errors
- Drop the `/node` fallback for httpd without `/info`, which
  predates the floor
- Check the status, not `ResponseError`, so the Open Graph worker
  can import compat without the fetcher
- Name the httpd release each shim serves, not a date
- Drop the mime shim for httpd 0.18.1 and the unused `lib/file.ts`
- Read the node from `/info` in repo views
- Pass the node and its features to repo views as one `node` param
- Show the releases tab and pages when the node supports releases,
  and the counter only when there is a count
- Read a release count as release support on older httpd
- Test the flag and the fallback

docs:
- Restructure docs/api-changes.md: the supported versions, one
  table of removals, fixed fields per change, and a link to ADR
  0001 for the rules
- Say in ADR 0001 that each compat comment names what the other
  side does
- Say in ADR 0001 when a capability needs a flag in /info

tests:
- Run e2e tests on httpd 0.30.0, above the floor, instead of 0.26.0
- Run the release tests on it too, so they cover the compat shims
- Skip only those that need release counts per scope on it
- Test a node without release support through a mocked `/info`
  flag, instead of an httpd that predates the floor
2026-10-29 18:32:03 +01:00
Daniel Norman b77c82151d desktop: Open releases on Delegates
- Decide in ADR 0004 to always open releases on Delegates
- Drop the fallback to Others in lists and releases
- Show the Others filter whenever it has content
- Name the scope in the empty artifacts message
- Open Others in the e2e test of an artifact by a non-delegate,
  which no longer opens there by itself
2026-10-29 18:21:09 +01:00
Daniel Norman 0dc1e557a5 Move repo facts outside the project payload
Repos need not carry a `xyz.radicle.project` payload; the default
branch can come from `xyz.radicle.crefs` alone. Such repos got no
counts and no default branch, and failed schema validation in
explorer, which broke the parse of a whole listing.

httpd:
- Add top-level `cobs` with issue, patch and bucketed release counts
- Add top-level `defaultBranch`, qualified like the crefs payload
- Omit a count the node cannot determine instead of reporting zero
- Drop `head`: the tip is `refs[defaultBranch]`
- Keep counts in the project payload for older clients until a
  major release
- Keep the project payload when a COB read fails
- Keep `meta.releases` a single count: delegate + other
- Log and skip canonical ref rules and refs that fail to read,
  so one bad ref doesn't drop the default branch tip

explorer:
- Model `cobs` and `defaultBranch`, adapting older nodes to one shape
- Resolve the default branch from the crefs HEAD on older nodes
- Collect the shims for older httpd in http-client/lib/compat.ts,
  each naming the httpd release that the client can drop it with
- Add `defaultBranchTip`, replacing `head`, with a fallback to the
  legacy `meta.head`
- Make the project payload and its legacy meta optional
- Fall back to the RID for the repo name, and show a placeholder
  for a missing name in repo cards and the header
- Hide a counter instead of reading a missing count as zero
- Fall back to a full-page check for "More" without counts
- Add a `repo.sourceUnavailable` route for repos without a
  default branch or tip
- Browse explicit revisions and offer the branch selector without
  a default branch
- List these repos in repo grids and on the landing page
- Say the node is older or built without releases
- Scope release pages in the client, so views never call the shims
- Read OG worker repos through the same compat shims
- Share the repo name and default branch helpers with the OG worker

CI:
- Add check:open-graph, a wrangler deploy dry run
- Run it in GitHub CI, Buildkite and check:ci
- Install explorer's dependencies first: the worker
  resolves compat.ts imports, such as zod, from there

Tests:
- Test that a build without releases omits the count
- Test that one failing rule keeps the others
- Test the repo shape across httpd versions and the release shims
- Test `hasMorePages` and `repoName`
- Test repos without a project payload end to end
2026-10-29 18:21:09 +01:00
Daniel Norman 1d760abe96 Split releases into trusted and untrusted scopes
- Upgrade radicle-artifact to 0.23
- Use radicle-artifact Filters, Trust and Scope for releases
- Count only releases a user can browse: delegate + other
- Count releases only for a single repo, not in repo lists
- Add the scope=trusted|untrusted query
- Keep allAuthors for older clients until a major release
- Replace the All filter with Delegates and Others in the UI
- Open lists and releases on Delegates, also when empty
- Show the Others filter whenever it has content
- Name the scope in the empty artifacts message
- Filter by creator on older nodes, which ignore scope
- Page releases on the raw response length
- Warn on a release by a non-delegate
- Warn on a delegate's release while it shows others' artifacts
- Count only delegate attestations in a badge
- Warn about browser links added by non-delegates
- Say browser downloads are not checked against the CID
- Move the scope and warning logic to `src/lib/releases.ts`
- Test artifact scopes, scope routes, opening on Delegates and the
  warnings
2026-10-29 18:21:09 +01:00
Daniel Norman e36b16592a explorer: Run e2e tests on heartwood 1.10.3
- Bump heartwood-release to 1.10.3, as desktop uses
- Spread defaultConfig into the peer config instead of nesting it
- Clone from the known seed, as 1.10 no longer waits for one
- Match the full agent version on the node page
2026-10-29 18:21:09 +01:00
Daniel Norman d0b5cba95a Document API compatibility and versioning
- Add ADR 0001: one SemVer version for httpd, explorer
  supports every release from a minimum version, a 3-month
  guideline to drop a replaced major, expand and contract,
  and one API path at /api
- Treat 0.y as the major before 1.0
- Track API changes in docs/api-changes.md
- List API changes in httpd release notes
- Take the version from the release tag, not Cargo.toml
- Pass the version to the changelog script
- Link the compatibility rules from the README
- Point to the compat module from the backwards compatibility rules
2026-10-29 18:21:09 +01:00
Daniel Norman 687dc7066d explorer: Run release tests on pre-built httpd
- Stop skipping release tests without the local httpd build:
  pre-built httpd 0.30.0 serves the release API
- Mock a repo without a release count to test older nodes
- Remove the unused releaseApiOnlyLocal
2026-10-29 18:15:07 +01:00
Daniel Norman 42a93874ce explorer: Run e2e tests on httpd 0.30.0
- Bump the pinned radicle-httpd release from 0.26.0 to 0.30.0
- Let visual snapshots show the releases tab, which httpd 0.28.0
  added
2026-10-29 18:08:37 +01:00
Yorgos SaslisandDaniel Norman 8999521aa4 httpd: Keep reading node events during rescans
A rescan can take tens of minutes on permissive seeds and blocked the
event loop meanwhile. radicle-node drops a subscriber once 8192 events
are queued, so every rescan disconnected us and the events emitted
until the resubscribe were lost.

Rescans and batch reindexes now run alongside the event loop, and the
subscription reconnects on its own task. A repo that an event adds
during a rescan only gets back into the seeded cache when its batch
runs, so it can be missing for up to RADICLE_SEARCH_BATCH_SECS.

Co-authored-by: Daniel Norman <daniel@norman.life>
2026-10-29 17:17:14 +01:00
Rūdolfs Ošiņš aad0d25463 Add ADR for data access and reactivity
Both apps should react to changes in their backend's data without
disturbing the user. Record how data is cached, invalidated by ref
updates and shown when newer data arrives.
2026-10-29 17:02:24 +01:00
Rūdolfs Ošiņš 99b39ca287 Add ADR for a shared core package
Both apps carry diverging copies of the same domain logic. Record where
shared logic lives, which types it uses and how it moves over.
2026-10-29 17:02:24 +01:00
Rūdolfs Ošiņš 2c44c70ff2 Document the npm workspace and shared/ui 2026-10-29 16:27:03 +01:00
Rūdolfs Ošiņš 7ce1deaf22 Build Docker e2e and desktop releases from the workspace root 2026-10-29 16:27:03 +01:00
Rūdolfs Ošiņš f79b23dde7 Share UI code through an npm workspace
Extracts the avatar components and the style tokens into shared/ui, which
both apps consume as a workspace package, to try out ADR 2. Nix and the
Docker setups are not updated yet.
2026-10-29 16:27:03 +01:00
Rūdolfs Ošiņš 84995442a5 Add ADR for extracting shared UI code
ADR 2 now only covers how the apps consume shared code, so its notes
on the extraction strategy move here. All three root ADRs are accepted
with this patch.
2026-10-29 16:06:13 +01:00
Rūdolfs Ošiņš d81d8c10b3 desktop: Sort tags by version, newest first
Same as in explorer: compare numeric parts numerically and keep tags
from the same namespace together instead of interleaving them by time.
2026-10-29 14:11:13 +01:00
Brandon OxendineandRūdolfs Ošiņš 9c360925e1 explorer: Sort tags by version, newest first
Tag names were compared as plain strings, so 0.10.0 sorted between
0.1.0 and 0.2.0. Canonical tags were ordered by tagger time, which
interleaved the httpd and desktop releases in monorepos. Tags now stay
together per namespace, newest namespace first, sorted by version.

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-10-29 14:11:13 +01:00
Brandon Oxendine ad91a96490 explorer: Fix preview of deleted files
Render the old blob when previewing a deleted file, including binary
images, which showed only a "Binary file" placeholder. Hide the "View
file at this commit" link for deleted files, since the file does not
exist at that revision.
2026-10-29 12:55:01 +01:00
Brandon Oxendine 86fcd93a68 explorer: Clamp long node descriptions
Collapse the node description to three lines with a Show more toggle
when it overflows, and let the sidebar scroll on wide screens so the
node details below it stay reachable.
2026-10-29 11:23:58 +01:00
Brandon OxendineandRūdolfs Ošiņš 8e5089cbdc desktop: Explain revisions with no changes
When a revision's head is already part of its base, the Changes view
showed an empty commits column and "0 files modified". In practice this
is a patch branch pushed after its work already landed, which also marks
the patch merged at that commit even when the work landed after it. Show
an empty state that says so and links to the last revision with changes.

This also fixes switching revisions leaving the previous revision's
single commit selected.

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-10-29 10:48:03 +01:00
Daniel Norman 280d642e6d desktop: run prettier format 2026-10-27 11:12:02 +01:00
Daniel Norman 9b5b20f646 desktop: Hard-wrap Markdown 2026-10-27 11:11:18 +01:00
Daniel Norman 692da482fb explorer: run prettier format 2026-10-27 11:10:00 +01:00
Daniel Norman 563cafbc85 explorer: Hard-wrap Markdown with prettier
- Format all files Prettier supports
- Run `prettier .` in format and check, so both cover the same files
- Check Markdown, which only format covered before
- Replace stale ignore entries with `crates`
2026-10-27 11:09:32 +01:00
Daniel Norman 196ddbf47e httpd: fix the build script 2026-10-23 12:41:37 +02:00
Daniel Norman 86ba3917ea httpd: Release 0.30.0 releases/httpd/0.30.0 2026-10-23 11:07:48 +02:00
Brandon Oxendine 45b3ac6906 explorer: Show breadcrumbs in the mobile repo header
They used to be hidden on small screens. Now they scroll horizontally,
starting from the last crumb. Also adds the repo avatar to the repo crumb.
2026-10-22 17:41:48 +02:00
Julien Donck e1347aa257 explorer: Drop privacy and encryption claims
Connections between nodes are neither encrypted nor authenticated until
the network protocol vulnerability is fixed, see
https://radicle.dev/2026/09/23/disclosure-of-vulnerability-in-network-protocol
2026-10-22 17:23:09 +02:00
Rūdolfs Ošiņš c873c9fc88 desktop: Fix math rendering in markdown
The sanitizer allowlist strips KaTeX's markup, and index.html never
loaded katex.min.css, so math has only ever shown up as flat text. We
now typeset math after sanitizing and load the stylesheet.
2026-10-22 16:29:46 +02:00
Rūdolfs Ošiņš a4cecc8519 explorer: Fix math rendering in markdown
The sanitizer allowlist added in 4c31a8134 strips all of KaTeX's markup,
leaving only the flat text of each formula. We now typeset math after
sanitizing instead of loosening the allowlist for spans and styles.
2026-10-22 16:29:42 +02:00
Rūdolfs Ošiņš 0279ab0910 explorer: Add file extension to vite plugin import
Vite 8.3 warns about extensionless imports in the config, since its
native config loader, planned as the default, can't resolve them.
2026-10-22 16:27:24 +02:00
Rūdolfs Ošiņš 29ba8447a2 Document dependency updates under the cooldown
Plain `cargo update` and `npm audit fix --force` bypass or ignore the
cooldown, and nothing told people or agents which commands respect it.
2026-10-22 16:27:24 +02:00
Rūdolfs Ošiņš 543a7a03f9 explorer: Fix cargo audit advisories
rustls-webpki 0.103.16 and webpki-roots 1.0.10 are the first releases
with the fixes for RUSTSEC-2026-0382 and RUSTSEC-2026-0381, but are
still in the cooldown. We reviewed their diffs against upstream and
allow them until they're old enough.
2026-10-22 16:27:24 +02:00
Rūdolfs Ošiņš 0869e2c44d explorer: Add cargo cooldown config
Desktop already holds back crates younger than 7 days, explorer had
nothing equivalent so `cargo update` pulled in fresh releases.
2026-10-22 16:27:24 +02:00
Rūdolfs Ošiņš 6c797ebf1d explorer: Fix npm audit advisories
mermaid 11 pins katex ^0.16, which is affected by GHSA-238p-pmpm-9mq7.
Like desktop, we now depend on katex directly and override mermaid's
copy, instead of jumping to mermaid 12.

Also takes vitest 4.1.12 a few hours before it clears the cooldown.
2026-10-22 16:27:24 +02:00
Rūdolfs Ošiņš d9191cad26 desktop: Fix npm audit advisories
Takes vitest 4.1.12 a few hours before it clears the 7-day cooldown,
to fix GHSA-qxg6-89mg-rqv8 and GHSA-xp26-3454-mjgp in @vitest/mocker.
2026-10-22 16:27:24 +02:00
Daniel Norman 68d7a33579 ci: fix explorer pipeline 2026-10-22 14:48:27 +02:00
Rūdolfs Ošiņš 5c22442477 Update READMEs for the monorepo layout 2026-10-22 11:06:34 +02:00
Rūdolfs Ošiņš 853d45bbcd Run ryph setup for explorer from explorer/ 2026-10-22 11:06:34 +02:00
Rūdolfs Ošiņš 7f92fbc48d Fix explorer scripts for the explorer/ location 2026-10-22 11:06:34 +02:00
Rūdolfs Ošiņš e80e257ee4 Run explorer CI from explorer/ 2026-10-22 11:06:34 +02:00
Rūdolfs Ošiņš 6c0ddd64dc Split agent and contributor docs by project 2026-10-22 11:06:33 +02:00
Rūdolfs Ošiņš fd4436bb8f Rename CLAUDE.md to AGENTS.md 2026-10-22 11:06:33 +02:00
Rūdolfs Ošiņš 79a7c23979 Give explorer its own .gitignore 2026-10-22 11:06:33 +02:00
Rūdolfs Ošiņš e37521c739 Move explorer into explorer/
Makes explorer and desktop sibling projects, as proposed in ADR 1.
This commit only moves files; paths in CI, scripts and docs are fixed
in the following commits.
2026-10-22 11:06:33 +02:00
Rūdolfs Ošiņš 954222cb11 Add ADRs for repository layout and shared UI code
Most copy-pasting between the two front-ends happens in UI code. These
propose making explorer and desktop siblings and sharing code from
source, without an npm workspace for now.
2026-10-22 11:06:33 +02:00
Rūdolfs Ošiņš 4a84871ee7 httpd: Return 400 for malformed archive refs
A ref name git rejects outright, like `foo..bar`, still yielded a 500.
It's a client error, same as a malformed SHA in `/{rid}/{sha}`.
2026-10-22 10:27:53 +02:00