Files
radicle-explorer/explorer/workers
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
..
2026-10-27 11:10:00 +01:00

Open Graph

Worker on open-graph.radicle.network that serves OG meta tags and preview card images for social media embeds.

How it works

radicle.network is a plain static SPA. A Cloudflare Redirect Rule 302s social media crawlers to open-graph.radicle.network, which returns HTML with OG tags. The og:image points to /cards/... on the same domain, where the worker renders PNG cards via Satori + resvg-wasm.

Browsers and search crawlers hit the SPA directly — no worker cost.

Routes

  • /* — OG HTML with meta tags (cached 2 hours)
  • /cards/* — PNG card images (cached 2 hours)

Card routes mirror app routes: /cards/nodes/:host/:rid, /cards/nodes/:host/:rid/issues/:id, etc. When API fetches fail, cards degrade: specific item -> repo -> node -> home.

Cloudflare Redirect Rule

Rules > Redirect Rules on the radicle.dev zone:

(http.host eq "radicle.network") and (
  (http.user_agent contains "Twitterbot") or
  (http.user_agent contains "facebookexternalhit") or
  (http.user_agent contains "Facebot") or
  (http.user_agent contains "LinkedInBot") or
  (http.user_agent contains "Slackbot") or
  (http.user_agent contains "Discordbot") or
  (http.user_agent contains "TelegramBot") or
  (http.user_agent contains "WhatsApp") or
  (http.user_agent contains "Pinterestbot") or
  (http.user_agent contains "ZulipURLPreview") or
  (http.user_agent contains "Bluesky Cardyb") or
  (http.user_agent contains "Mastodon")
)

Dynamic 302 to concat("https://open-graph.radicle.network", http.request.uri.path)

Rate Limiting

Security > WAF > Rate limiting rules on the radicle.network zone:

Verified bots are rate limited to 50 requests per 10 seconds across all of radicle.network, with a 1 minute block.

Deploy

npm run deploy:open-graph   # worker
npm run start:open-graph    # local dev