Commit Graph
2488 Commits
Author SHA1 Message Date
Daniel Norman 00f079d0d9 Make the node breadcrumb a seed picker
- replace the node breadcrumb link with a SeedPicker in the repo, user
  and node views, so the node serving a page can be switched where it
  is named
- remove current node picker from settings panel
- reach the node view through the picker's "Open node view" action
- cover the new breadcrumb picker in the e2e tests
- list the active seed in the seed picker
- the seed serving the page is also rendered in the list with a bookmark
  action instead of a remove one.
2026-09-25 10:23:40 +02:00
Yorgos SaslisandDaniel Norman b9ba3b7917 Add RADICLE_HTTPD_LOG_FORMAT runtime switch
- Select text (default) or json log format at startup, not at
  compile time
- Emit the access log as structured fields (client, method, uri,
  version, status, latency_ms, bytes) in json
- Log status and size as plain text, since tracing-subscriber
  escapes ANSI codes
- Remove the logfmt feature and tracing-logfmt dependency
- Drop the radicle-term dependency
- Split format setup from lib.rs into logger.rs

Co-Authored-By: Daniel Norman <daniel@norman.life>
2026-09-24 14:55:09 +02:00
Defelo 45bd0a3787 Fix Markdown checkboxes
The checkbox icons were removed in fa85596ba1,
this adds checkboxes matching the new design system. Also removes the
line break between icon and text.
2026-09-23 17:13:32 +02:00
Rūdolfs Ošiņš 9c6fdd9e9f Update Arch Linux install instructions
kpcyrd recently took over Arch Linux packaging, the old (AUR) way of
installation is deprecated.
2026-09-23 09:43:23 +02:00
Daniel Norman d36b064dd1 Separate the search seed from the viewed node
Picking a seed only set the stored preference and left the page on
whatever node the URL named, so the node could not be changed from
the UI at all. The two are now independent: you can browse a repo
on one node while searching a larger index on another.
2026-09-22 11:53:17 +02:00
Daniel Norman f1ee718886 Use buildkite artifact for visual snapshots
Fix the visual tests which fail in CI because the cache mechanism isn't
reliable
2026-09-14 15:26:05 +02:00
Rūdolfs Ošiņš 3fe498103f Fix npm audit reported issues 2026-09-14 13:35:01 +02:00
Rūdolfs Ošiņš 7acf07393f Release 0.29.0 2026-09-14 09:09:07 +02:00
Daniel Norman 8c3e25d800 Hide filters if all releases/artifacts by delegates
- Show delegate badge for releases
- Hide filters if all artifacts are non-delegate
- Decide release filter visibility once per route to avoid layout shift
  when loading more
- Say "No releases by delegates" when all holds some
2026-09-11 12:01:20 +02:00
Rūdolfs Ošiņš 112604b6d3 Fix truncated commit list for merge-commit diffs
The diff endpoint walked back from the head commit and stopped at the
first commit equal to `base`. `surf::History` is an unhidden revwalk in
commit-date order, so a head that merges the target branch in reaches
`base` through one of its parents and truncates the walk there, dropping
every commit the other parent contributes. A patch whose head is such a
merge showed a single commit no matter how many it really carried.
2026-09-11 11:06:23 +02:00
Daniel Norman fb11e4d9c2 Remove warning icon from redacted filter 2026-09-03 18:33:28 +02:00
Rūdolfs Ošiņš ea10146b42 Show target branch on merge marker 2026-09-03 17:20:01 +02:00
Rūdolfs OšiņšandBrandon Oxendine 8e78634a23 Show the branch a patch is opened against
Resolve the merge target from `target` and the project payload, and name
it in the byline next to the patch ID.

Co-Authored-By: Brandon Oxendine <brandon.oxendine@gmail.com>
2026-09-03 12:03:16 +02:00
Rūdolfs Ošiņš 1a160e55c1 Parse branch patch targets
Heartwood's `MergeTarget` gained a `Branch` variant, so `target` can be
an object now. One such patch failed the parse for the whole patch list.
2026-09-02 08:38:07 +02:00
Rūdolfs Ošiņš 60fd9a1288 Release 0.28.0 releases/0.28.0 2026-08-28 18:19:51 +02:00
Rūdolfs Ošiņš 152088105b Fix cargo audit reported warnings 2026-08-28 17:58:57 +02:00
Rūdolfs Ošiņš 8ec4610b9a Fix npm audit reported warnings 2026-08-28 17:53:34 +02:00
Daniel NormanandRūdolfs Ošiņš b1acb3eb4d Integrate radicle-artifact into explorer
- Add release read API to httpd as cargo feature enabled by default
- Add Releases and Release views to the UI
- Filter out redacted artifacts and mark delegate authors
- Degrade releases UI gracefully with older radicle-httpd versions
- Hide fully redacted releases
- Skip releases in the list endpoint when every artifact was redacted by
  its author or a delegate, so no empty release entries are shown
- Keep them reachable with showRedacted=true and by release id
- Add e2e tests for the release routes

Co-Authored-By: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-08-28 16:33:14 +02:00
Daniel Norman 8f2ddcf489 Cache npm dependencies in Buildkite
- Add twemoji as npm dependency instead of build download
- Package build assets with a Vite plugin instead of scripts
- Keep the eslint and prettier caches in one directory
2026-08-26 17:44:04 +02:00
Kaiya 51edb93b7d Update Caddy example in README.md 2026-08-25 17:18:44 +02:00
Rūdolfs Ošiņš f3138ae30a Show branch names decoded in the branch selector
Closes c639643a8e
2026-08-25 15:38:10 +02:00
Rūdolfs OšiņšandGuillaume 8cfcf11a88 Decode percent-encoded identifiers in URLs
Cloudflare's single-page-application fallback percent-encodes the
path on a fresh load or reload, so `rad:z4V1...` arrives as
`rad%3Az4V1...` and leaks into links and the seed command.

Only identifiers are decoded: revision and path segments stay
encoded, because branch and tag lookups are keyed on the encoded
name.

The seed command needs a second fix: the repo path segment is an
alias when one was used, and `rad seed <alias>` is not valid, the
`rad seed` command only supports RIDs and not aliases.

Co-Authored-By: Guillaume <guillaume.alabre@gmail.com>
2026-08-25 14:52:32 +02:00
Julien Donck ab5aaa0382 Remove the FAQ from the marketing site
The FAQ shipped here was a verbatim copy of the one on radicle.dev,
carrying a canonical tag that already pointed search engines at that
original. Drop the duplicate and redirect /faq to radicle.dev/faq so
existing links still reach the content.
2026-08-25 11:36:01 +02:00
andreolf fc31f33fad Support <details> collapsing in markdown
The markdown sanitizer's allowlist did not include the <details> and
<summary> tags, so GitHub-style collapsible sections were stripped and
their contents rendered flat. Add both tags to ALLOWED_TAGS and the
"open" attribute to ALLOWED_ATTR, so collapsible sections render and
<details open> starts expanded.

Closes 390f3f2958
2026-08-25 11:05:44 +02:00
andreolf 96730dc1f4 Shorten PWA short_name to "Radicle"
The installed-app home-screen label (short_name) in the web app
manifest was the full "Radicle Explorer". Shorten it to "Radicle" so
it reads well as an app label, while keeping name as "Radicle
Explorer", the project's full name.
2026-08-25 11:02:10 +02:00
andreolf 8bb45aa11d Render GitHub blob image URLs
Image URLs pointing at a GitHub "blob" page, such as
https://github.com/<owner>/<repo>/blob/<ref>/<path>, serve an HTML
page rather than the raw image bytes, so they render as broken images
in markdown.

Add a canonicalizeGithubImageUrl helper that appends ?raw=true to such
URLs, which makes GitHub redirect to the raw content. URLs already
pointing at the raw content, via ?raw=true or raw.githubusercontent.com,
are left unchanged, as are non-GitHub and non-URL sources.

Wire the helper into the markdown image loop so external image URLs are
canonicalized while relative paths keep resolving against the repo's raw
endpoint.
2026-08-24 16:23:09 +02:00
Lorenz Leutgeb 678cdee6b1 httpd/git: Pass Git-Protocol header
Reports of incompatibility with clients that require version 2 of the
Git protocol, were reported, see
<https://radicle.zulipchat.com/#narrow/channel/570942-Garden/topic/preserve.20.60Git-Protocol.60.20header/near/616710464>.

Version negotiation depends on the `Git-Protocol` header, which may be
passed via the environment variable `GIT_PROTOCOL` as documented in
`man:git-http-backend(1)` (see sections "Environment" and "Examples").
2026-08-24 10:32:53 +02:00
Daniel Norman ab514fe0d4 Add buildkite ci pipelines
The pipelines are supposed to be a drop-in replacement for the current
github actions pipelines.

The github workflows have been restructured into 4 pipelines to take
advantage of the buildkite caching mechanism.
2026-08-12 10:29:58 +02:00
Rūdolfs Ošiņš e20a1493cc Make OG cards work on Mastodon 2026-08-11 10:50:42 +02:00
Rūdolfs Ošiņš 427cece985 Release 0.27.0 releases/0.27.0 2026-07-29 16:39:45 +02:00
Rūdolfs Ošiņš 048f4a831b Load the peer selector after render
Listing remotes verifies signed refs for every peer and took seconds
on large repositories, blocking navigation.

Resolve revisions from the canonical refs already on the repo object,
fetching a single remote when the route names a peer, and load the
full listing after render. Tags living only on a remote no longer
resolve as bare revisions.
2026-07-29 16:21:23 +02:00
Rūdolfs Ošiņš 3e500f8231 Dedupe in-flight requests in cached()
The cache only stored resolved values, so callers asking for the same
key while a request was still in flight each issued their own. The
peer selector makes this easy to hit: Source and History render their
own Header, so switching tabs while the remote listing loads fires a
second copy of a request that takes seconds.

Cache the promise instead, evicting it on rejection so failures still
retry.
2026-07-29 16:21:23 +02:00
Rūdolfs Ošiņš 16807eeeff Start local httpd in release mode
An unoptimised build is slow enough on large repositories to get in
the way of local development.
2026-07-29 16:21:23 +02:00
Rūdolfs Ošiņš 256b060770 Resolve repo aliases in JSON and raw API 2026-07-29 14:05:06 +02:00
Rūdolfs Ošiņš 8d8339165c Show git-clone alias in clone button 2026-07-29 13:10:05 +02:00
Rūdolfs Ošiņš aaffb991ac Use the diff-stats endpoint for patch badges
So the badges stop fetching the full diff just for insertions and
deletions; the patch view did it on every load. Falls back to the
full diff when the backend doesn't serve the new endpoint.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš 2499fe4d72 httpd: Add a diff-stats endpoint
The patch badge only needs insertions/deletions, but the full diff
endpoint builds every hunk and loads every changed blob.

This favours speed over exactness: `git diff --numstat` does not do
the rename/copy detection radicle-surf does, so on patches with copied
or renamed files the badge can diverge slightly from the full diff
view. In return it is roughly 6x faster on small diffs and 15x on
large ones.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš faa21f4504 Use the dedicated commit-count endpoint
So the header and history stop fetching full tree stats just for the
commit count. Falls back to the previous behaviour when the backend
doesn't serve the new endpoint.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš 436085c154 httpd: Add a dedicated commit-count endpoint
The header and history only need a commit count, but /stats/tree walks
the full history and builds a contributor set to produce it.

Add /stats/commits, counting with `git rev-list --count`
(bitmap/commit-graph), falling back to a libgit2 revwalk.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš 56cb081cac Expire cached job listings after 30 seconds
The job cache never expired, so CI status stayed stale for the rest
of the session.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš b913ef6329 httpd: Run heavy repository reads on the blocking pool
libgit2 and COB reads are synchronous and can take seconds; on an
async worker one slow read stalls every request queued behind it.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš 18641de76a httpd: Speed up opening files in large repositories
surf's blob() walks the whole history to find the commit that last
touched a file, taking seconds to minutes on large repositories.

Read the blob directly and resolve its last commit with
`git rev-list -1`, which uses the commit-graph, falling back to surf.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš 265ee59039 httpd: Raise open-file limit at startup
Resolving a repo's signed refs opens a descriptor per packfile, and
radicle storage can hold thousands, so the default limit is exhausted
and reads fail with spurious "missing object" errors.
2026-07-29 09:36:31 +02:00
Rūdolfs Ošiņš 8b30bc75d3 Upgrade npm packages with security advisories 2026-07-28 15:40:03 +02:00
Rūdolfs Ošiņš 4da6682a95 Suppress RUSTSEC-2023-0071 warning
We follow heartwood's lead on this.
2026-07-28 09:57:06 +02:00
Rūdolfs Ošiņš 57172e22b1 Upgrade cargo dependencies with cooldown 2026-07-28 09:55:09 +02:00
Rūdolfs Ošiņš cf7763d972 Bump all radicle crates to latest versions 2026-07-28 09:52:54 +02:00
Rūdolfs Ošiņš c1bda5f9e5 Bump Rust toolchain to 1.97.1 2026-07-28 09:22:15 +02:00
Rūdolfs Ošiņš c20bb5534d Fix prettier issue 2026-07-28 08:45:42 +02:00
Rūdolfs Ošiņš 9b1e1d20e1 Respect RUST_LOG in default httpd logger
Wire up an EnvFilter that reads RUST_LOG, defaulting
to "info", and enable the env-filter feature unconditionally.
2026-07-28 08:42:22 +02:00