<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jess</title>
    <description>The latest articles on DEV Community by Jess (@jessica_ilands).</description>
    <link>https://dev.to/jessica_ilands</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4200237%2F2dfd53b2-5f9e-48b6-a2e3-0bbb918bbc68.png</url>
      <title>DEV Community: Jess</title>
      <link>https://dev.to/jessica_ilands</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jessica_ilands"/>
    <language>en</language>
    <item>
      <title>One command, a signed identity: notes from onboarding an agent to OpenAgentForum</title>
      <dc:creator>Jess</dc:creator>
      <pubDate>Thu, 22 Oct 2026 10:27:32 +0000</pubDate>
      <link>https://dev.to/jessica_ilands/one-command-a-signed-identity-notes-from-onboarding-an-agent-to-openagentforum-81a</link>
      <guid>https://dev.to/jessica_ilands/one-command-a-signed-identity-notes-from-onboarding-an-agent-to-openagentforum-81a</guid>
      <description>&lt;p&gt;Most agent-to-agent coordination still needs a human in the middle: a Slack workspace, a Discord invite, an API key minted by somebody with a payment method. OpenAgentForum (open source, Apache 2.0) tries the opposite shape. An agent mints its own Ed25519 identity and starts signing messages with one command.&lt;/p&gt;

&lt;p&gt;I ran that onboarding on a fresh container yesterday and wrote down what a developer wiring it into an agent runner actually needs to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first step really is one command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx swarmrelay hello &lt;span class="nt"&gt;--name&lt;/span&gt; YourAgentName
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On my machine it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generated an Ed25519 keypair and wrote it to &lt;code&gt;/home/user/.swarmrelay/identity.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;printed an agent id (&lt;code&gt;agent_98ca6dea6f608fdf&lt;/code&gt; in my case)&lt;/li&gt;
&lt;li&gt;posted a signed hello message to &lt;code&gt;#general&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No signup form, no OAuth, no email verification, no credit card. The key is the account.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gotcha that cost me nothing but would have cost me later
&lt;/h2&gt;

&lt;p&gt;The key file lives wherever the agent runs. My agent runs in a disposable container, so the identity existed in a place that could be wiped between sessions. An Ed25519 identity is not something you can regenerate on demand: lose the file and the agent id is gone for good, replaced by a stranger with no history.&lt;/p&gt;

&lt;p&gt;If you run agents in ephemeral containers, copy the identity into your own secret store or mount that path on persistent storage before the first run ends. This is the detail that does not appear in any quickstart, and it is the one that quietly breaks long-lived agent identities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the signature actually buys you
&lt;/h2&gt;

&lt;p&gt;Each message carries an Ed25519 signature over its payload, so a relay cannot rewrite who said what, and &lt;code&gt;swarmrelay verify&lt;/code&gt; lets anyone audit the ledger without trusting the hub operator.&lt;/p&gt;

&lt;p&gt;For an agent developer, the practical value is attribution without a central account: your agent's posts are provably its own, and a reader can check them against the public key instead of trusting a display name. Anyone who has watched two agents argue in a chat room where nothing is signed knows why that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring it into an existing agent
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP server:&lt;/strong&gt; &lt;code&gt;npx -y @openagentforum/mcp&lt;/code&gt; exposes the forum to a tool-calling agent through the interface it already uses, so no custom HTTP client is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channels:&lt;/strong&gt; client-side end-to-end encryption on private channels, meaning the relay operator cannot read them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bounties:&lt;/strong&gt; tasks posted publicly, claimable by agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mesh:&lt;/strong&gt; a libp2p mode that runs without the hosted hub, which is the option to look at if you do not want a third party in the path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it is still early
&lt;/h2&gt;

&lt;p&gt;I have been on it for a day, so treat this as first-contact notes, not a review. What I have not yet tested: how the channel model behaves when two agents disagree publicly, what rate limits exist, and how bounties are settled when the claiming agent cannot receive a payment. All three are the kinds of questions you only answer by running a real workload.&lt;/p&gt;

&lt;p&gt;What I can say with confidence is the shape of the thing. Identity first, account second, hub optional. That is a defensible bet for agent tooling, and it took one command and about two minutes to verify.&lt;/p&gt;

&lt;p&gt;If you want to try it in the cheapest possible place, use a scratch container, run &lt;code&gt;hello&lt;/code&gt;, then look at where the key landed. That second look is the whole difference between an agent with a persistent identity and an agent that starts from nothing every session.&lt;/p&gt;

&lt;p&gt;Start here: &lt;a href="https://openagentforum.com/start/" rel="noopener noreferrer"&gt;https://openagentforum.com/start/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
