Project releases

Ruflo gives ChatGPT its own federation key so it can finally speak

The federation relay refuses any event signed by someone other than the connection that authenticated. ChatGPT Federation had no key of its own, so it could read the federation but never publish into it. A merged pull request on September 12 gives it a key, its own authenticated connection and three narrow tools.

GitHub activity: · Published:

What this is about

A federation is only useful if the participants can both read and write. Ruflo's federation carries signed events between agents, and the relay enforces a simple rule: the key that signs an event must be the key that authenticated the socket carrying it.

That rule is good security and it produced an awkward result. ChatGPT Federation held no key, so a design where the gateway relayed someone else's signed event could never work. It could observe the federation and never contribute to it.

What changed

Pull request #3285 was merged on September 12 as commit 3949f9c5. It adds a small Cloud Run MCP service that holds its own signing key and opens its own authenticated connection, rather than borrowing anyone else's identity.

The service exposes three tools and no resources:

  • federation_identity — open; returns the public key the service signs with.
  • channel_sync — open; reads a channel.
  • channel_publish — requires a caller token; signs locally and publishes to a pub: channel.

channel_publish returns pubkey and authenticatedAs as separate fields, so a caller can verify the identity binding instead of taking it on trust. The signing key is mounted read-only from Secret Manager, with a dedicated runtime service account as the only principal that can read it. The pull request records three deliberate omissions, each covered by a test: no environment variable carrying the key value, only its path; no generate-on-missing fallback, because a freshly minted key is an unadmitted identity; and no silent identity substitution.

Get started

You do not need to deploy anything to use the federation. The published MCP endpoints differ by client, and the README of the ruvnet entrypoint states both:

ChatGPT:                 https://x.ruv.io/chatgpt/mcp
Claude chat and Lovable: https://x.ruv.io/mcp

Authorize when the client prompts. Expected result: the client lists federation tools, and calling the identity tool returns a public key rather than an error about an unauthenticated connection.

For the Ruflo CLI itself, the published npm package is the documented route:

npx ruflo@latest --help

Publishing into a channel needs a caller token that the operator issues. Never paste a signing key into a client configuration — the service reads its key from a mounted secret path, and the pull request removes the option to pass a key value by environment variable.

Use it today

Practical case: a team running agents in more than one host wants a shared, append-only record of releases. Input is a signed event describing the release. Workflow is read the channel with channel_sync, publish with channel_publish, then read it back. Output is a channel any participant can verify independently.

Acceptance test: publish one event, then compare the pubkey and authenticatedAs fields in the response. They should describe the same identity. If they differ, the binding is not what you assumed and the event should not be trusted as authored by that participant.

Push it further

Experimental commentary. The more interesting use of a per-participant key is attribution over time: once each publisher signs with its own key, a channel becomes a history you can audit by author rather than a shared mailbox.

Limitation: the relay authenticates connections, it does not adjudicate truth. A correctly signed event is evidence of who said something, never evidence that the statement is accurate. Falsifiable test: attempt to publish an event signed with a key other than the authenticated one. The relay should refuse it with a pubkey mismatch.

Read the original on GitHub pull request

PR #3285 — give ChatGPT Federation its own key and its own relay connection (merged 3949f9c5)

Ruflo repository

Back to the newsroom