Commit Graph
100 Commits
Author SHA1 Message Date
Rūdolfs Ošiņš e888a949c2 Link guides to radicle.dev instead of hosting them
The guides live on radicle.dev. The old URLs redirect to the respective
radicle.dev pages.
2026-10-08 17:51:07 +02:00
Rūdolfs Ošiņš aaa5a482a9 Fix npm audit reported issues 2026-10-05 11:13:59 +02:00
Rūdolfs Ošiņš 6719f0c7fe Document hardened {@html} handling 2026-10-05 10:46:32 +02:00
Rūdolfs Ošiņš 23b2f4645e Remove {@html} from error messages 2026-10-05 10:46:23 +02:00
Rūdolfs Ošiņš 1369a2ebd0 Harden peer branch selector 2026-10-05 10:46:08 +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
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
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
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 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
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
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 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
Rūdolfs Ošiņš 77fd1383de Improve basic principles wording 2026-07-26 08:38:19 +02:00
Rūdolfs Ošiņš 8e4349184a Upgrade npm dependencies honoring a 7 day cooldown 2026-07-22 14:43:52 +02:00
Rūdolfs Ošiņš 3c2935704f Upgrade npm dependencies
This also upgrades dompurify to the latest version, outside our cooldown
window, for a security fix (verified safe with extra security checks).

Newer dompurify versions expose a bug where happy-dom renders one of our
custom elements incorrectly in tests, unlike real browsers. Switch the unit
test environment from happy-dom to jsdom to fix the failing tests.
2026-07-16 11:34:41 +02:00
Rūdolfs Ošiņš 447d8887a3 Bump httpd release version against which e2e tests run 2026-07-15 17:13:32 +02:00
Rūdolfs Ošiņš cb4ac69c29 Release 0.26.0 2026-07-15 16:27:45 +02:00
Rūdolfs Ošiņš 221eb9b890 Serve landing homepage on the radicle.network deployment
The canonical radicle.network deployment serves the marketing landing
page at `/`, while self-hosted deployments keep the node view. Opt in
at build time without changing the default.
2026-07-15 15:42:22 +02:00
Rūdolfs Ošiņš 62b9c21f57 Release radicle-httpd and radicle-search together
radicle-search now ships in the same release as radicle-httpd: one
tag, one changelog, one reproducible build, with per-binary artifacts
in sibling folders on files.radicle.dev.

meilisearch-sdk: use the pure-Rust JWT backend (jwt_rust_crypto) instead
of jwt_aws_lc_rs, dropping aws-lc-sys, which fails to cross-compile to
the Apple targets under cargo-zigbuild.
2026-07-15 15:42:22 +02:00
Rūdolfs Ošiņš f5675e6268 Rename [iris|rosa].radicle.xyz -> [iris|rosa].radicle.network 2026-07-15 15:42:22 +02:00
Rūdolfs Ošiņš 8e2148599e Probe archive download support on demand
The source and commit views hit the /raw archive endpoint with a
HEAD request on every page load to decide whether to show the
download UI. That endpoint runs `git archive` server-side.

Move detection to user interaction: the clone popover probes when
the Download tab is opened, and the commit view checks on click,
navigating on success or showing a message on failure.

Cache only successful results per URL so transient or moving-ref 404s
aren't latched for the session.
2026-06-11 13:38:49 +02:00
Rūdolfs Ošiņš a3386040d5 Dedupe job runs by runId to fix duplicate keys
The same run can appear under multiple job COBs at a commit,
causing an each_key_duplicate crash. Keep one view per runId,
letting a terminal status override a stale "started" one.
2026-05-29 17:03:49 +02:00
Rūdolfs Ošiņš 17cd7adcb8 Harden rendered markdown links 2026-05-28 16:16:41 +02:00
Rūdolfs Ošiņš 747d9b05f9 Restrict job log links to http(s) URLs 2026-05-28 16:16:41 +02:00
Rūdolfs Ošiņš 74b3c079ad Show a commit message placeholder when there is no message
This way we can still navigate to the single commit view.
2026-05-28 10:25:40 +02:00
Rūdolfs Ošiņš 676597a669 Add a .npmrc cooldown setting of 7 days 2026-05-22 09:34:41 +02:00
Rūdolfs Ošiņš d80658a9f0 Upgrade all npm dependencies with a 7 day cooldown 2026-05-22 09:34:15 +02:00
Rūdolfs Ošiņš 7fbbbd3224 Fix did wrapping in JobCob dropdown 2026-05-22 08:53:05 +02:00
Rūdolfs Ošiņš 18953e9b08 Redesign JobCob popover 2026-05-21 15:47:18 +02:00
Rūdolfs Ošiņš 900074b282 Center checkmark icon in viewBox 2026-05-21 12:57:51 +02:00
Rūdolfs Ošiņš 915d309e14 Tolerate null agent in /node response
Public seeds return `"agent": null` because their deployed httpd
binaries can't parse i2p/onion rows that newer nodes write to the
address table — `AddressStore::get` fails and the handler falls back
to `None`. Allow null in the zod schema and hide the user-agent row
in the UI when it's missing.

Workaround until heartwood ships `StoreExt::agent_of` (reads only
the `agent` column, no address hydration) and httpd adopts it.
2026-05-21 12:33:15 +02:00
Rūdolfs Ošiņš 7ae8d607fe httpd: Bump radicle to 0.24.0 and radicle-job to 0.6.0
These crates are interlocked: radicle-job 0.6.0 requires radicle
0.24.x, so they must be bumped together.
2026-05-18 18:04:52 +02:00
Rūdolfs Ošiņš 3afaa8469a httpd: Bump radicle-surf, radicle-term and radicle-crypto
Bump radicle-surf to 0.27.1
Bump radicle-term to 0.18.0
Bump radicle-crypto to 0.17.0
2026-05-18 17:51:18 +02:00
Rūdolfs Ošiņš fe42175e8c Update npm dependencies with a 5 day cooldown 2026-05-12 17:05:27 +02:00
Rūdolfs Ošiņš 09840c0aa8 Mask error stack in visual snapshots
This prevents flakes in the visual test suite due to stack frame naming
mismatches in the command copy code box.

E.g.
```diff
-{"stack":"Error: Response error\n at Dx.fet
+{"stack":"Error: Response error\n at wx.fet
```
2026-05-12 16:50:43 +02:00
Rūdolfs Ošiņš 9391cd072f Replace @radicle/gray-matter with js-yaml frontmatter parser 2026-05-07 23:04:55 +02:00
Rūdolfs Ošiņš 6fb702f886 Recover gracefully from mermaid render errors
When mermaid.render fails, suppress mermaid's "Syntax error"
overlay and show our own small warning above the original code
block so the source stays visible. Subsequent diagrams in the
same document still render.
2026-05-07 18:31:28 +02:00
Rūdolfs Ošiņš 9ebc5f6b3b Initialize mermaid only once
Hoist the dynamic import and initialize() into a
module-scoped promise. Previous code re-ran initialize()
on every afterUpdate that had a mermaid block.
2026-05-07 18:31:28 +02:00
Rūdolfs Ošiņš 0bcc2b4c2d Lazy-load mermaid
Switch to a dynamic import in afterUpdate and drop
manualChunks so Rolldown auto-splits the lazy chunk.
Eager bundle drops from 1.3 MB to 610 KB gzipped.
2026-05-07 18:31:28 +02:00
Rūdolfs Ošiņš 3b85f70f88 Force mermaid securityLevel to strict
'loose' allowed HTML and click directives in diagram labels,
bypassing the DOMPurify pass on the surrounding markdown.
2026-05-07 18:31:28 +02:00
Rūdolfs Ošiņš 9e268d9ac0 Scope DOMPurify config to call sites
Replace global setConfig with an exported sanitizeConfig passed
inline. The global config leaked into mermaid's internal
strict-mode sanitization, stripping valid SVG diagrams.
2026-05-07 18:31:28 +02:00
Rūdolfs Ošiņš 9e669eaf05 Decode percent-escapes in OG card route segments 2026-05-06 10:57:21 +02:00
Rūdolfs Ošiņš 3f798744bb Use linkify-it for commit description URLs
Replace the hand-rolled URL regex with `linkify-it` (already a
transitive dep via `marked-linkify-it`). Add unit tests.
2026-05-06 09:54:04 +02:00
Rūdolfs Ošiņš 613e5e1810 Fix node/user avatar generated wrongly from hostname
It should always be generated from the Node Id.
2026-05-05 16:01:01 +02:00
Rūdolfs Ošiņš dbe0ed7f77 Add a link to radicle.dev to the node sidebar footer 2026-04-29 15:55:18 +02:00
Rūdolfs Ošiņš 4da9321a1d Revert "Link header Radicle logo to radicle.dev landing page"
This reverts commit 9e9a799c28.
2026-04-29 15:55:06 +02:00
Rūdolfs Ošiņš 9e9a799c28 Link header Radicle logo to radicle.dev landing page 2026-04-29 15:14:20 +02:00
Rūdolfs Ošiņš f472fe892b Add "Sort by activity" toggle to UserReposView 2026-04-29 12:12:35 +02:00
Rūdolfs Ošiņš e64aee34ca Cancel in-flight activity fetches on navigation 2026-04-29 12:12:12 +02:00
Rūdolfs Ošiņš 4ddca81f16 Add "Sort by activity" toggle to repo list 2026-04-29 12:12:03 +02:00
Rūdolfs Ošiņš 4dce10bc66 Show shimmer placeholder while activity loads 2026-04-29 12:11:59 +02:00
Rūdolfs Ošiņš 49274ac88c Load repo activity progressively per card 2026-04-29 12:11:50 +02:00
Rūdolfs Ošiņš d0a012dcf9 Revert "Update favicon and app icons"
This reverts commit 2556786a9e.
2026-04-24 13:09:54 +02:00
Rūdolfs Ošiņš 5a3337de88 httpd: Release 0.25.0 2026-04-23 16:04:29 +02:00
Rūdolfs Ošiņš fc648a6392 httpd: Rename endpoint /xyz.radworks.job/ -> /jobs/ 2026-04-23 15:57:54 +02:00
Rūdolfs Ošiņš 269c6e52ea Rename [iris,rosa].radicle.dev -> [iris,rosa].radicle.network 2026-04-23 11:16:56 +02:00
Rūdolfs Ošiņš b21faa104a Rename radicle.xyz -> radicle.dev where possible 2026-04-23 10:21:39 +02:00
Rūdolfs Ošiņš 7e725f3bdf Move public deployment from app.radicle.xyz to radicle.network 2026-04-23 00:08:23 +02:00
Rūdolfs Ošiņš 1003b165e5 ci: Allow binaries to be downloaded via redirect
By specifying `--location`, `curl` will follow redirects.
2026-04-23 00:07:31 +02:00
Rūdolfs Ošiņš c45c919826 Key Playwright browser cache on Playwright version
To avoid missing browsers in feature branches.
2026-04-22 17:48:45 +02:00
Rūdolfs Ošiņš b2f74ebd15 Upgrade all Javascript dependencies
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
2026-04-22 17:48:45 +02:00
Rūdolfs Ošiņš 9ca1d7973e Fix GitHub actions warnings
Gets rid of "Node.js 20 actions are deprecated".
2026-04-22 15:25:27 +02:00
Rūdolfs Ošiņš ad75d6488c Bump playwright 1.52.0 -> 1.59.1
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.
2026-04-22 14:36:52 +02:00
Rūdolfs Ošiņš a1b0723908 Bump nodejs 22.12.0 -> 24.15.0
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`.
2026-04-22 11:20:25 +02:00
Rūdolfs Ošiņš ecbea99f56 Show canonical branches and tags in peer selector 2026-04-22 09:45:00 +02:00
Rūdolfs OšiņšandFintan Halpenny 42bc27c1f8 httpd: Add canonical and peer refs to repo API
Co-authored-by: Fintan Halpenny <fintan.halpenny@gmail.com>
2026-04-22 09:45:00 +02:00
Rūdolfs Ošiņš a184186944 Add helper script to run unit tests against local httpd
As opposed to running it against a pre-compiled binary with a pinned
version.
2026-04-22 09:40:47 +02:00
Rūdolfs Ošiņš 64f91fa41d Show job cobs on repo source and patches 2026-04-21 17:29:39 +02:00
Rūdolfs Ošiņš 7cef0618ce httpd: Add API endpoint for job cobs
Serve them on /repos/{rid}/xyz.radworks.job/{sha}.
2026-04-21 11:38:15 +02:00
Rūdolfs Ošiņš 78ccb93d84 Move header injection to open-graph worker
Remove og-injector middleware that ran on every request. Social crawlers are
redirected to the open-graph worker via a cloudflare rule now.
2026-04-15 14:23:04 +02:00
Rūdolfs Ošiņš 74e15e2535 Add open-graph card generation via Cloudflare Workers
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.
2026-04-13 12:45:57 +02:00
Rūdolfs Ošiņš 21dc8a6262 Simplify zod schema 2026-03-26 17:48:48 -06:00
Rūdolfs Ošiņš afb0f903ee Replace last deprecated Avatar with UserAvatar
We missed this one spot in the grand UI redesign.
2026-03-26 17:43:47 -06:00