From 9ef4141b1f1bf3af321fdae8ecd5b342a22bf346 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 24 Jun 2026 14:29:08 +0000 Subject: [PATCH 1/2] blog: restore 'Introducing Agent Relay' announcement post Recreate the Feb 27 launch post by Will Washburn as a blog entry under web/content/blog/. Auto-discovered by getAllPosts(), so it wires into the blog index, RSS feed, and sitemap with no further changes. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0167EmGPy7mZKgFWD6bsa2gE --- web/content/blog/introducing-agent-relay.mdx | 92 ++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 web/content/blog/introducing-agent-relay.mdx diff --git a/web/content/blog/introducing-agent-relay.mdx b/web/content/blog/introducing-agent-relay.mdx new file mode 100644 index 0000000..7a08aee --- /dev/null +++ b/web/content/blog/introducing-agent-relay.mdx @@ -0,0 +1,92 @@ +--- +title: 'Introducing Agent Relay' +description: 'Your software should coordinate. Agent Relay is an open-source SDK that gives agents real-time, cross-provider communication — so you stop being the message bus in the middle.' +date: '2026-02-27' +author: 'Will Washburn' +category: 'Announcement' +tags: + - Agent Relay + - Multi-agent systems + - Agent communication + - SDK +--- + +**TLDR:** Your software should coordinate. Our SDK can help you do that. + +Tell me if this sounds familiar. + +You have multiple terminals open. One agent is building a plan. Another is executing it. You're tabbing between them like a very patient middle manager. You copy errors out of CI and paste them into Claude. You paste feedback from Codex into OpenCode. You press enter to say yes, it's totally fine that claude runs `find . -type f -name "*.ts" -print0 | xargs -0 grep -Hn "any"` just this once. Your research agent finds something interesting and writes it to a `SUPER_DETAILED_RESEARCH.md` document. Your planner needs it, but after pasting the markdown in the planner finds something else it needs context on. So you find the other terminal and copy the markdown back into the research prompt. Then you tweak the plan. Then you adjust the codex terminal running the plan. Then you review the output. Then you start again because it wasn't quite right. Ugh, compacting again?! Man… I'm exhausted. Software used to be fun! You know what's not fun? Being a glorified message bus for a bunch of LLMs. + +Today I'm excited to show you a better way, one where you are no longer the bottleneck. + +Instead of YOU being the glue in the middle… what if they could just, like, talk to each other? + +## The Agent Relay SDK + +Relay gives you a deterministic foundation for multi-agent systems: + +- real time push communication +- Spawning and releasing agents +- channels, emoji reactions, read receipts — basically slack, but for headless and built FOR agents + +Relay is NOT a custom harness so you can bring your own configuration as you like it. Your skills and configurations should work out of the box. + +Imagine getting two agents to play tic tac toe. With the relay SDK this is simple: + +```typescript +import { AgentRelay, Models } from "@agent-relay/sdk"; + +const relay = new AgentRelay(); + +relay.onMessageReceived = (msg) => + console.log(`[${msg.from} → ${msg.to}]: ${msg.text}`); + +const channel = ["tic-tac-toe"]; + +const x = await relay.claude.spawn({ + name: "PlayerX", + model: Models.Claude.SONNET, + channels: channel, + task: "Play tic-tac-toe as X against PlayerO. You go first.", +}); + +const o = await relay.codex.spawn({ + name: "PlayerO", + model: Models.Codex.GPT_5_3_CODEX_SPARK, + channels: channel, + task: "Play tic-tac-toe as O against PlayerX.", +}); + +await Promise.all([ + relay.waitForAgentReady("PlayerX"), + relay.waitForAgentReady("PlayerO"), +]); + +relay.system().sendMessage({ to: "PlayerX", text: "Start." }); + +await AgentRelay.waitForAny([x, o], 5 * 60 * 1000); +await relay.shutdown(); +``` + +Without Relay: + +- You'd have to copy the board state between agents. +- You'd be the one to decide whose turn it is. +- You'd be bored and miserable watching ties happen in slow motion + +The same primitive scales for other more complex tasks. When you have long running workflows it's hugely beneficial to have feedback while the work is being done; planners and executors and researchers can all discuss and evaluate plans forward _without_ waiting for a human to say "k". + +Of course you can observe and interject when you need to, but the agents are surprisingly good at making it work without you. + +## Don't we already have subagents? + +While this _feels_ similar to subagents, they're actually quite different and complementary. + +1. Subagents are hierarchical. (i.e Parent → child → result) That works for "do this subtask." but it breaks for systems or long running work. What happens when you need to adjust or have feedback in real time? With relay, you can still take advantage of subagents (and should!) to complete a subtask. With relay, you can have peer conversations back and forth to come to a conclusion. This generally allows for more creative and emergent solutions. +2. Subagents don't work cross provider. You want to be able to use the best model from multiple providers for the given task and you want it to work seamlessly with other agents. + +## Open source and open to contributions + +If you've felt like the manager of a very fast, very forgetful engineering team… This is for you. Go to (or probably just point your agent to) [https://github.com/AgentWorkforce/relay](https://github.com/AgentWorkforce/relay) and try it out. + +Build something that doesn't require you to be the runtime. From e584862a79e2e495051a301d1e10435994dc3265 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 24 Jun 2026 15:45:24 +0000 Subject: [PATCH 2/2] ci: populate static-assets incremental cache before Cloudflare upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The web app uses OpenNext's staticAssetsIncrementalCache: SSG pages (all blog posts and docs) are served from a prerendered cache copied into assets/cdn-cgi/_next_cache by 'opennextjs-cloudflare populateCache'. Both the preview and production workflows ran bare 'wrangler versions upload' / 'wrangler deploy', which skip that step, so the cache was never uploaded. The Worker then fell back to on-demand MDX rendering, which fails in the Workers runtime — every blog/docs page 500'd on cache-miss. Add a populateCache step after cf:build in both workflows. Verified locally: without it all SSG MDX pages 500; with it they return 200. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_0167EmGPy7mZKgFWD6bsa2gE --- .github/workflows/deploy.yml | 9 +++++++++ .github/workflows/preview.yml | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e98a4d4..f40b2a4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -37,6 +37,15 @@ jobs: NEXT_PUBLIC_POSTHOG_KEY: ${{ vars.NEXT_PUBLIC_POSTHOG_KEY }} run: npm run cf:build + # Copy the prerendered SSG cache into the assets bundle + # (assets/cdn-cgi/_next_cache). The site serves blog/docs pages from the + # static-assets incremental cache; without this the Worker falls back to + # on-demand MDX rendering, which fails in the Workers runtime (500). The + # bare `wrangler deploy` below does not run this, so do it here. + - name: Populate static-assets cache + working-directory: web + run: npx opennextjs-cloudflare populateCache remote + - name: Deploy to Cloudflare working-directory: web env: diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 8c90a88..de6b050 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -40,6 +40,15 @@ jobs: NEXT_PUBLIC_POSTHOG_KEY: ${{ vars.NEXT_PUBLIC_POSTHOG_KEY }} run: npm run cf:build + # Copy the prerendered SSG cache into the assets bundle + # (assets/cdn-cgi/_next_cache). The site serves blog/docs pages from the + # static-assets incremental cache; without this the Worker falls back to + # on-demand MDX rendering, which fails in the Workers runtime (500). The + # bare `wrangler versions upload` below does not run this, so do it here. + - name: Populate static-assets cache + working-directory: web + run: npx opennextjs-cloudflare populateCache remote + - name: Upload preview version id: preview working-directory: web