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
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