Commit Graph
3583 Commits
Author SHA1 Message Date
Brandon Oxendine ac793e1215 desktop: Keep embeds when editing a description 2026-11-10 16:54:20 +01:00
Daniel Norman 068263a272 desktop: Register releases with radicle-artifact
- Add a register phase after tag, like httpd's build/register
- Record the DMG, deb and AppImage in the release of the tag, with
  their files.radicle.dev URLs and sha256
- Move the Zulip announcement into its own announce phase
- Document how to install rad-artifact in README.md
2026-11-10 13:32:16 +01:00
Daniel Norman f50122d8d8 desktop: Sign the release tag
- Sign the release tag with the Radicle key, like the httpd tag
- Check that the signing key matches the Radicle identity first
- Document the Git signing setup in README.md
2026-11-10 13:32:16 +01:00
Daniel Norman 3b64bbf556 desktop: Prefix the release commit and tag
- Write "desktop: Release <version>" as the release commit subject and
  the tag message, like httpd
- Drop the v before the version everywhere else too: changelog
  headings, the releases/ folders and the apt branch
- Still find older release commits, which lack the prefix and have a v
2026-11-10 13:32:16 +01:00
Rūdolfs Ošiņš 58e848d1d0 Add Wrangler do dev deps
We need it to deploy radicle.network.
2026-11-10 12:16:18 +01:00
Rūdolfs Ošiņš cafd882ad9 explorer: Use oak as the default seed
oak.radicle.garden balances between its seed nodes at the network
level, so we don't need to spread users across iris and rosa anymore.
A picked seed that's neither a default nor bookmarked gets cleared,
which moves users who picked iris or rosa to the new default.
2026-11-10 12:00:51 +01:00
Daniel Norman 1ac894481d httpd: Register the bundle in its own step
- Move the explorer bundle build and registration to register-bundle
- Keep register to the archives and their checksums
- Add register-bundle as its own step in RELEASE.md
- Drop -w explorer, which failed with "No workspaces found"
2026-11-09 15:21:29 +01:00
Daniel Norman f426d679a1 httpd: Prefix the release tag message
- Write "httpd: Release <version>" so the tag matches the release commit
- Show the component in the radicle-artifact release title
2026-11-09 14:07:13 +01:00
Daniel Norman 11cf896b90 httpd: Release 0.31.0 releases/httpd/0.31.0 2026-11-09 09:51:23 +01:00
Daniel Norman ea992a558c Format markdown 2026-11-09 09:17:04 +01:00
Rūdolfs Ošiņš cb90c7ebcd Release v0.18.0 releases/desktop/0.18.0 2026-11-09 09:03:21 +01:00
Daniel Norman 1f258810aa Update Node to 24.22.2
- Pin .nvmrc to the latest Node 24 release
2026-11-09 08:50:17 +01:00
Rūdolfs Ošiņš 1386f65557 desktop: Cache evaluated boards
Heartwood doesn't cache custom COBs, so every board read replayed the
board's whole history, about 2.5 s for 3,000 ops. Evaluated boards are
now kept in `boards.db` next to radicle-artifact's cache, keyed by the
board's ref tips, so a read with nothing new takes a few milliseconds and
an op fetched from any peer still triggers a fresh evaluation.
2026-11-06 18:21:33 +01:00
Brandon OxendineandRūdolfs Ošiņš 682a406d85 desktop: Add the board view
Every issue and patch of a repository shows on its board, in a column
derived from its state until someone moves it. Cards move by drag and
drop or from their menu, closing columns close and reopen issues for
those allowed to, and a drop that isn't allowed says why. Changes wait
2.5 seconds and are written as one op. Patches link to issues with a
keyword and a full reference. Boards stay hidden until turned on under
Settings → Labs.

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-11-06 18:21:33 +01:00
Brandon OxendineandRūdolfs Ošiņš 3c6b455da0 desktop: Add board commands
The port lists, creates and renames boards, edits their columns, and
applies a batch of card moves and removals as one op, so a burst of
changes costs one update of the signed refs. Changes the board would
ignore are refused before writing and reported back, and boards are only
written on the test network or in private repositories for now.

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-11-06 18:21:33 +01:00
Brandon OxendineandRūdolfs Ošiņš 3f32a750b8 desktop: Add the board COB
A board arranges a repository's issues and patches in columns and stores
only where each card sits, as `works.monadic.board` in its own crate so
other clients can reuse it. Moves follow the issue and patch access
rules, ops that fail them are ignored rather than rejected, and positions
are fractional keys so concurrent moves converge. ADR 0005 records the
decisions.

Co-authored-by: Rūdolfs Ošiņš <rudolfs@osins.org>
2026-11-06 18:21:33 +01:00
Rūdolfs Ošiņš 787be14d73 desktop: Share the avatar stack
Board cards show assignees the way the repository header shows
delegates, overlapping and fanning out on hover, so the stack moves
into its own component.
2026-11-06 18:21:33 +01:00
Rūdolfs Ošiņš 244e2dc44c desktop: Write pending changes before the window closes
Views can hold back writes to batch them, which would be lost if the
window closed in the meantime. The first close is held until registered
views have flushed, writing locally without announcing, with a 5 second
fallback. On macOS, Quit goes through the same path instead of
terminating the app directly.
2026-11-06 18:21:33 +01:00
Rūdolfs OšiņšandBrandon Oxendine e29def0dda desktop: Extend shared form components
`Checkbox` reports changes, `SegmentedSwitch` options can show an icon and
a label together, `TextInput` takes a `maxlength`, and a new `Select` is a
styled dropdown that also works inside a popover, where a nested `Popover`
would close its parent.

Co-authored-by: Brandon Oxendine <brandon.oxendine@gmail.com>
2026-11-06 18:21:33 +01:00
Daniel Norman c13c7fa5d9 httpd: Register and attest releases
- Add build/register for a delegate to record each archive in the tag's
  release with radicle-artifact, from their own machine
- Build the explorer bundle with config/default.json in build/register,
  and register and seed it as a collection in the same release
- Record the CI build that fetch leaves in artifacts/; make build drop it
- Add build/attest for other delegates to attest a matching build
- Document registration, attestation and how to verify a download
2026-11-06 10:45:37 +01:00
Daniel Norman 9a9a78b5a2 httpd: Build release archives in CI
- Add build/ci to build the archives of an annotated release tag
- Run it on the large_linux_arm Buildkite queue
- Keep the archives as artifacts and show checksums in an annotation
- Pass --load to docker, as a remote builder keeps the image in its cache
- Add build/fetch to download the archives of the CI release job
- Pick the job by its step key, so a failed test elsewhere does not hide it
- Add build/compare to check a build against another
- Document the CI build, the download and the comparison
2026-11-06 10:45:37 +01:00
Daniel Norman 63a5bb2266 httpd: Make release builds reproducible
- Pin the rust and alpine images by digest
- Check that the rust image matches rust-toolchain
- Install pinned zig 0.17.0 and cargo-zigbuild 0.23.4
- Install cargo-zigbuild before the source copy, to cache it
- Build on linux/arm64 on every host, with docker or podman
- Use 8-character commit IDs and read RADICLE_HTTPD_VERSION
- Name the tagged commit in the announcement, not a build ID
- Link macOS binaries with -dead_strip_dylibs and -rtlib=none
- Move signing out of build into build/sign, which checks checksums
- Fix Dockerfile lint warnings
2026-11-06 10:45:37 +01:00
Rūdolfs Ošiņš b522155767 explorer: Key visual test caches on the OS release
ubuntu-latest is moving to Ubuntu 26.04, and runners on the new image
restored the 24.04 WebKit build from the cache. It couldn't find
libicudata.so.74 and failed to launch, so the visual tests failed
without any visual diffs.
2026-11-06 10:38:02 +01:00
Daniel Norman f546e10a81 explorer: Ignore crypto-bigint advisory
- Ignore RUSTSEC-2026-0387 in audit config
- Record that radicle uses Ed25519 only, so p256 is never used
2026-11-06 11:41:21 +05:30
Daniel Norman 7ce7541051 explorer: Fix cargo audit advisories
- Bump libz-sys, tokio, zstd, zstd-safe and zstd-sys
- Allow zstd 0.13.4 and zstd-safe 7.4.0 inside the cooldown
- Fix RUSTSEC-2026-0386, 0391, 0395 to 0406 and 0410
- Fix RUSTSEC-2026-0418
- Drop expired cooldown exceptions
2026-11-06 11:36:09 +05:30
Daniel Norman b5fccde171 Fix npm audit advisories
- Drop rimraf from explorer and use rm -rf in deploy
2026-11-06 10:57:01 +05:30
Rūdolfs OšiņšandBrandon Oxendine aa606ee12c explorer: Put the download archive button first
Co-authored-by: Brandon Oxendine <brandon.oxendine@gmail.com>
2026-11-04 15:01:47 +01:00
Rūdolfs Ošiņš 0bc014dded Fix e2e tests 2026-11-04 10:49:08 +01:00
Brandon Oxendine 41592b29b3 desktop: Mark the latest commit in a patch revision 2026-11-04 10:03:06 +01:00
Daniel Norman e3c965ffa8 Update changelog 2026-11-04 09:50:18 +01:00
Daniel Norman f64094bb27 explorer: Remove the env var config
- Remove custom-environment-variables.json: nothing sets its
  variables, and PREFERRED_SEEDS mapped to a key the app never reads
- Remove deploymentId: only Vercel set it, and we don't deploy there
- Always show the self-hosting hint in parse errors, as before
- Document local.json as the way to configure a build
2026-11-04 09:41:44 +01:00
Daniel Norman 7e8b0ecb95 Move prettier config to root 2026-11-04 09:32:49 +01:00
Rūdolfs Ošiņš 73de4c0cc1 explorer: Deny install scripts in the Open Graph worker
The worker isn't part of the npm workspace, so the root allowScripts
doesn't cover it, and npm 12 refuses to install its dependencies under
strict-allow-scripts. The wrangler dry-run bundle doesn't need any of
these scripts.
2026-11-03 17:33:10 +01:00
Brandon Oxendine 2d2e4c6b27 explorer: Keep comment code blocks inside the card 2026-11-03 16:46:28 +01:00
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