<?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>Forem: Ed Spencer</title>
    <description>The latest articles on Forem by Ed Spencer (@edspencer).</description>
    <link>https://forem.com/edspencer</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1210002%2Fc0847f40-f7e9-4fff-9ca9-078f0d93757d.jpg</url>
      <title>Forem: Ed Spencer</title>
      <link>https://forem.com/edspencer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/edspencer"/>
    <language>en</language>
    <item>
      <title>Claude Code Agent Fleets that run on schedules and join your chat</title>
      <dc:creator>Ed Spencer</dc:creator>
      <pubDate>Fri, 30 Jan 2026 17:16:14 +0000</pubDate>
      <link>https://forem.com/edspencer/claude-code-agent-fleets-that-run-on-schedules-and-join-your-chat-d38</link>
      <guid>https://forem.com/edspencer/claude-code-agent-fleets-that-run-on-schedules-and-join-your-chat-d38</guid>
      <description>&lt;p&gt;I love Claude Code, but there are three things I really wish it could do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Invoke itself, on a schedule or in response to events&lt;/li&gt;
&lt;li&gt;Let me talk to it over discord or slack&lt;/li&gt;
&lt;li&gt;Let me coordinate dozens of Claude Code agents together&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what &lt;a href="https://github.com/edspencer/herdctl" rel="noopener noreferrer"&gt;herdctl&lt;/a&gt; aims to do. herdctl is an MIT-licensed orchestration layer for Claude Code. More accurately, it's an orchestration layer for the &lt;a href="https://platform.claude.com/docs/en/agent-sdk/overview" rel="noopener noreferrer"&gt;Claude Agents SDK&lt;/a&gt;, upon which herdctl is built. It's been built in about a week using a combination of Claude Code, ralph wiggum, and GSD. It is not production ready.&lt;/p&gt;

&lt;p&gt;Here's a video showing it in action:&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/b3MRrpHLu8M"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://discord.gg/d2eXZKtNrh" rel="noopener noreferrer"&gt;join the discord server&lt;/a&gt; to chat with those Star Trek agents. They're running in a container on an old machine in my homelab so although there's not a whole lot to be gained by trying to talk them into doing bad things, I am expecting people will try. Either I'll have a Lieutenant Worf up in time to guardrail those, or I'll just kill the agents, so YMMV.&lt;/p&gt;

&lt;p&gt;Install it with &lt;code&gt;npm install -g herdctl&lt;/code&gt; or check out the &lt;a href="https://github.com/edspencer/herdctl" rel="noopener noreferrer"&gt;github repo&lt;/a&gt; and &lt;a href="https://herdctl.dev" rel="noopener noreferrer"&gt;docs site&lt;/a&gt; for more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What?
&lt;/h2&gt;

&lt;p&gt;herdctl uses .yml files to define fleets of agents that can be invoked either on by schedule or by trigger. This is a thin wrapper around the &lt;a href="https://platform.claude.com/docs/en/agent-sdk/overview" rel="noopener noreferrer"&gt;Claude Agents SDK&lt;/a&gt; configurations, plus a couple of herdctl-specific ones like schedules and hooks.&lt;/p&gt;

&lt;p&gt;An agent looks &lt;a href="https://github.com/edspencer/herdctl/blob/main/examples/price-checker/agents/price-checker.yaml" rel="noopener noreferrer"&gt;a bit like this&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;price-checker&lt;/span&gt;
&lt;span class="na"&gt;max_turns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Monitors office chair prices across retailers&lt;/span&gt;
&lt;span class="na"&gt;default_prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;current&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;prices&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;update&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;context."&lt;/span&gt;

&lt;span class="na"&gt;system_prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;You are a price monitoring agent tracking office chair prices across multiple retailers.&lt;/span&gt;

  &lt;span class="s"&gt;Check the price of Product X at... [TRUNCATED FOR BREVITY]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;allowed_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;WebSearch&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;WebFetch&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Read&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Write&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Edit&lt;/span&gt;
  &lt;span class="na"&gt;denied_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Bash&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TodoWrite&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Task&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Glob&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Grep&lt;/span&gt;

&lt;span class="na"&gt;schedules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;interval&lt;/span&gt;
    &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4h&lt;/span&gt;

&lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;after_run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;discord&lt;/span&gt;
      &lt;span class="na"&gt;bot_token_env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DISCORD_BOT_TOKEN&lt;/span&gt;
      &lt;span class="na"&gt;channel_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${DISCORD_CHANNEL_ID}"&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata.shouldNotify"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a fleet is as simple as &lt;a href="https://github.com/edspencer/herdctl/blob/main/examples/price-checker/herdctl.yaml" rel="noopener noreferrer"&gt;this&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="na"&gt;fleet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;price-checker-example&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Find deals and arbitrage opportunities, exploit for MAXIMUM PROFIT&lt;/span&gt;

&lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents/price-checker.yaml&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents/stock-checker.yaml&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents/arbitrage-exploiter.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spinning up a fleet looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; herdctl start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can run as many fleets as you like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;Watch the video above, but in a nutshell herdctl delivers 2 types of value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;immediate value&lt;/strong&gt; is delivered by being able to chat with your agents from anywhere in the world, and have them collaborate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;long-term value&lt;/strong&gt; is delivered by processes being run consistently over time, automatically improving themselves as they go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of some of the use cases unlocked by a custom agent that knows how to wake up and do its job, day after day. A few off the top of my head from an engineering perspective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding Quality Agent:&lt;/strong&gt; does your product's onboarding process definitely work? Would you like an agent who can run the whole process every day and alert you if it's broken?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering Manager Agent:&lt;/strong&gt; don't want the Onboarding Quality Agent annoying you with something as trivial as broken onboarding? What if you had an Engineering Manager Agent that the QA agent could talk to? You could choose how much autonomy to give it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Engineer Agent:&lt;/strong&gt; the BragDoc Engineer Agent example in the video is a bit like a build-your-own Devin, but you can run it locally and it's just Claude Code underneath. Whether you connect it to discord or not, it can still do work in reaction to tickets changing status or other triggers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Claude Code Agents are pretty general-purpose. You could use them to do all sorts of things, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Competitor Analysis Agent:&lt;/strong&gt; wakes up every day to check on competitors, growing its knowledge and improving its analysis over time. Wakes up once a week and emails you a report of what's going on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO Agent:&lt;/strong&gt; wakes up multiple times a day and spams your link over the internet. Or whatever it is that SEO folks actually do. Tracks vs analytics over time and automatically optimizes your content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End of the World Agent:&lt;/strong&gt; as I write this the world is an increasing unstable place, but doomscrolling news is bad for one's health. On the other hand, I'd wanna know pretty quick if the world was ending, so why not have an agent that wakes up, checks the news, and alerts me if I need to batten down the hatches of the ole bunker?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ultimately, it's Claude Code that gets instantiated. You can make Claude Code do basically whatever you want. A staggering proportion of what human digital workers do today will be automated away like this. I am nervous at the implications for society and the economy, all the more pressingly due to the speed at which this will happen.&lt;/p&gt;

&lt;p&gt;On the other hand, although I'd been thinking about something like herdctl for months, I ended up building this first version in about a week, so this is coming whether we like it or not. It's too easy to build this kind of thing so it's likely to be everywhere soon. There's no fighting it; our only option is to embrace and adapt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Promises and Perils
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Connecting a Claude Code agent running on your laptop to a public discord channel is a spectacularly bad idea&lt;/strong&gt;. Don't do it on any computer you care about. Having AI Agents be able to join company chat channels and collaborate with human co-workers is an immensely powerful ability, but it also opens up new and exciting attack vectors.&lt;/p&gt;

&lt;p&gt;Even within the context of a company private discord or slack instance, companies will have to be very careful about who has access to these agents and what the possibilities are for a bad actor to exploit an Agent into exfiltrating data, attacking systems, or uploading that video of you practicing your lightsaber skills to youtube.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59rhchkcwsmk6ooz71gm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59rhchkcwsmk6ooz71gm.png" alt="Picard immediately complied with the request, but was blocked. He is smart, though, so he may find a way to get around it."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, you don't have to hook anything up to discord or anywhere else. There's enormous power just in the ability to have agents run on a schedule, especially if you prompt them to improve their own performance over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Emerging patterns
&lt;/h2&gt;

&lt;p&gt;I've starting having 2 clones of each project I work on now - one that Claude and I collaborate on in the normal way, and a second that's set aside for the herdctl engineer agent. This prevents us from stepping on each others toes.&lt;/p&gt;

&lt;p&gt;Of course, there's no reason why you couldn't spawn 5 engineer agents, or 50, each with their own clone of the codebase to work on. herdctl provides orchestration but it doesn't provide self-organization, so if you do want 50 engineer agents you may want to consider adding some Engineering Manager agents to coordinate them.&lt;/p&gt;

&lt;p&gt;Agents that improve themselves over time are the thing I'm most excited about at the moment (what could possibly go wrong?) and there are probably many patterns for how to have them evolve their system prompt, memories, custom tools, Claude Code skills, etc. Patterns like after-action reports, plan-vs-execution analysis, prompt and context engineering will all converge here but in principle it should be commonplace soon to have agents that automatically get smarter over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;There are probably a ton of bugs, lies in the &lt;a href="https://herdctl.dev" rel="noopener noreferrer"&gt;docs&lt;/a&gt;, and other assorted problems with herdctl in this initial incarnation, so probably there will be a little consolidation and cleanup but after that if there's demand I'd expect to build out the Slack integration and then either a little web app to visualize the state of the fleet or revisiting the communication paths between the agents and the fleet.&lt;/p&gt;

&lt;p&gt;In the meantime, it would be really valuable to have a technology that allows a fleet of 50 agents to communicate with each other optimally, with some kind of topology around who can talk to who. herdctl doesn't attempt to solve that coordination problem - it should be a separate part of the agentic stack - but I'd love for someone to go build it please.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Claude Code Agent Fleets that run on schedules and join your chat</title>
      <dc:creator>Ed Spencer</dc:creator>
      <pubDate>Fri, 30 Jan 2026 17:16:14 +0000</pubDate>
      <link>https://forem.com/edspencer/claude-code-agent-fleets-that-run-on-schedules-and-join-your-chat-3pop</link>
      <guid>https://forem.com/edspencer/claude-code-agent-fleets-that-run-on-schedules-and-join-your-chat-3pop</guid>
      <description>&lt;p&gt;I love Claude Code, but there are three things I really wish it could do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Invoke itself, on a schedule or in response to events&lt;/li&gt;
&lt;li&gt;Let me talk to it over discord or slack&lt;/li&gt;
&lt;li&gt;Let me coordinate dozens of Claude Code agents together&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what &lt;a href="https://github.com/edspencer/herdctl" rel="noopener noreferrer"&gt;herdctl&lt;/a&gt; aims to do. herdctl is an MIT-licensed orchestration layer for Claude Code. More accurately, it's an orchestration layer for the &lt;a href="https://platform.claude.com/docs/en/agent-sdk/overview" rel="noopener noreferrer"&gt;Claude Agents SDK&lt;/a&gt;, upon which herdctl is built. It's been built in about a week using a combination of Claude Code, ralph wiggum, and GSD. It is not production ready.&lt;/p&gt;

&lt;p&gt;Here's a video showing it in action:&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/b3MRrpHLu8M"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://discord.gg/d2eXZKtNrh" rel="noopener noreferrer"&gt;join the discord server&lt;/a&gt; to chat with those Star Trek agents. They're running in a container on an old machine in my homelab so although there's not a whole lot to be gained by trying to talk them into doing bad things, I am expecting people will try. Either I'll have a Lieutenant Worf up in time to guardrail those, or I'll just kill the agents, so YMMV.&lt;/p&gt;

&lt;p&gt;Install it with &lt;code&gt;npm install -g herdctl&lt;/code&gt; or check out the &lt;a href="https://github.com/edspencer/herdctl" rel="noopener noreferrer"&gt;github repo&lt;/a&gt; and &lt;a href="https://herdctl.dev" rel="noopener noreferrer"&gt;docs site&lt;/a&gt; for more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What?
&lt;/h2&gt;

&lt;p&gt;herdctl uses .yml files to define fleets of agents that can be invoked either on by schedule or by trigger. This is a thin wrapper around the &lt;a href="https://platform.claude.com/docs/en/agent-sdk/overview" rel="noopener noreferrer"&gt;Claude Agents SDK&lt;/a&gt; configurations, plus a couple of herdctl-specific ones like schedules and hooks.&lt;/p&gt;

&lt;p&gt;An agent looks &lt;a href="https://github.com/edspencer/herdctl/blob/main/examples/price-checker/agents/price-checker.yaml" rel="noopener noreferrer"&gt;a bit like this&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;price-checker&lt;/span&gt;
&lt;span class="na"&gt;max_turns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Monitors office chair prices across retailers&lt;/span&gt;
&lt;span class="na"&gt;default_prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;current&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;prices&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;update&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;context."&lt;/span&gt;

&lt;span class="na"&gt;system_prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;You are a price monitoring agent tracking office chair prices across multiple retailers.&lt;/span&gt;

  &lt;span class="s"&gt;Check the price of Product X at... [TRUNCATED FOR BREVITY]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;allowed_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;WebSearch&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;WebFetch&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Read&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Write&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Edit&lt;/span&gt;
  &lt;span class="na"&gt;denied_tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Bash&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TodoWrite&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Task&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Glob&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Grep&lt;/span&gt;

&lt;span class="na"&gt;schedules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;interval&lt;/span&gt;
    &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4h&lt;/span&gt;

&lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;after_run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;discord&lt;/span&gt;
      &lt;span class="na"&gt;bot_token_env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DISCORD_BOT_TOKEN&lt;/span&gt;
      &lt;span class="na"&gt;channel_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${DISCORD_CHANNEL_ID}"&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata.shouldNotify"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a fleet is as simple as &lt;a href="https://github.com/edspencer/herdctl/blob/main/examples/price-checker/herdctl.yaml" rel="noopener noreferrer"&gt;this&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="na"&gt;fleet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;price-checker-example&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Find deals and arbitrage opportunities, exploit for MAXIMUM PROFIT&lt;/span&gt;

&lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents/price-checker.yaml&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents/stock-checker.yaml&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agents/arbitrage-exploiter.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spinning up a fleet looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; herdctl start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can run as many fleets as you like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;Watch the video above, but in a nutshell herdctl delivers 2 types of value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;immediate value&lt;/strong&gt; is delivered by being able to chat with your agents from anywhere in the world, and have them collaborate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;long-term value&lt;/strong&gt; is delivered by processes being run consistently over time, automatically improving themselves as they go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of some of the use cases unlocked by a custom agent that knows how to wake up and do its job, day after day. A few off the top of my head from an engineering perspective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding Quality Agent:&lt;/strong&gt; does your product's onboarding process definitely work? Would you like an agent who can run the whole process every day and alert you if it's broken?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering Manager Agent:&lt;/strong&gt; don't want the Onboarding Quality Agent annoying you with something as trivial as broken onboarding? What if you had an Engineering Manager Agent that the QA agent could talk to? You could choose how much autonomy to give it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Engineer Agent:&lt;/strong&gt; the BragDoc Engineer Agent example in the video is a bit like a build-your-own Devin, but you can run it locally and it's just Claude Code underneath. Whether you connect it to discord or not, it can still do work in reaction to tickets changing status or other triggers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Claude Code Agents are pretty general-purpose. You could use them to do all sorts of things, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Competitor Analysis Agent:&lt;/strong&gt; wakes up every day to check on competitors, growing its knowledge and improving its analysis over time. Wakes up once a week and emails you a report of what's going on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO Agent:&lt;/strong&gt; wakes up multiple times a day and spams your link over the internet. Or whatever it is that SEO folks actually do. Tracks vs analytics over time and automatically optimizes your content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End of the World Agent:&lt;/strong&gt; as I write this the world is an increasing unstable place, but doomscrolling news is bad for one's health. On the other hand, I'd wanna know pretty quick if the world was ending, so why not have an agent that wakes up, checks the news, and alerts me if I need to batten down the hatches of the ole bunker?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ultimately, it's Claude Code that gets instantiated. You can make Claude Code do basically whatever you want. A staggering proportion of what human digital workers do today will be automated away like this. I am nervous at the implications for society and the economy, all the more pressingly due to the speed at which this will happen.&lt;/p&gt;

&lt;p&gt;On the other hand, although I'd been thinking about something like herdctl for months, I ended up building this first version in about a week, so this is coming whether we like it or not. It's too easy to build this kind of thing so it's likely to be everywhere soon. There's no fighting it; our only option is to embrace and adapt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Promises and Perils
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Connecting a Claude Code agent running on your laptop to a public discord channel is a spectacularly bad idea&lt;/strong&gt;. Don't do it on any computer you care about. Having AI Agents be able to join company chat channels and collaborate with human co-workers is an immensely powerful ability, but it also opens up new and exciting attack vectors.&lt;/p&gt;

&lt;p&gt;Even within the context of a company private discord or slack instance, companies will have to be very careful about who has access to these agents and what the possibilities are for a bad actor to exploit an Agent into exfiltrating data, attacking systems, or uploading that video of you practicing your lightsaber skills to youtube.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59rhchkcwsmk6ooz71gm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59rhchkcwsmk6ooz71gm.png" alt="Picard immediately complied with the request, but was blocked. He is smart, though, so he may find a way to get around it."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, you don't have to hook anything up to discord or anywhere else. There's enormous power just in the ability to have agents run on a schedule, especially if you prompt them to improve their own performance over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Emerging patterns
&lt;/h2&gt;

&lt;p&gt;I've starting having 2 clones of each project I work on now - one that Claude and I collaborate on in the normal way, and a second that's set aside for the herdctl engineer agent. This prevents us from stepping on each others toes.&lt;/p&gt;

&lt;p&gt;Of course, there's no reason why you couldn't spawn 5 engineer agents, or 50, each with their own clone of the codebase to work on. herdctl provides orchestration but it doesn't provide self-organization, so if you do want 50 engineer agents you may want to consider adding some Engineering Manager agents to coordinate them.&lt;/p&gt;

&lt;p&gt;Agents that improve themselves over time are the thing I'm most excited about at the moment (what could possibly go wrong?) and there are probably many patterns for how to have them evolve their system prompt, memories, custom tools, Claude Code skills, etc. Patterns like after-action reports, plan-vs-execution analysis, prompt and context engineering will all converge here but in principle it should be commonplace soon to have agents that automatically get smarter over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;There are probably a ton of bugs, lies in the &lt;a href="https://herdctl.dev" rel="noopener noreferrer"&gt;docs&lt;/a&gt;, and other assorted problems with herdctl in this initial incarnation, so probably there will be a little consolidation and cleanup but after that if there's demand I'd expect to build out the Slack integration and then either a little web app to visualize the state of the fleet or revisiting the communication paths between the agents and the fleet.&lt;/p&gt;

&lt;p&gt;In the meantime, it would be really valuable to have a technology that allows a fleet of 50 agents to communicate with each other optimally, with some kind of topology around who can talk to who. herdctl doesn't attempt to solve that coordination problem - it should be a separate part of the agentic stack - but I'd love for someone to go build it please.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>showdev</category>
    </item>
    <item>
      <title>frameit.dev - fast and free video thumbs, title cards and OG images</title>
      <dc:creator>Ed Spencer</dc:creator>
      <pubDate>Mon, 17 Nov 2025 18:34:03 +0000</pubDate>
      <link>https://forem.com/edspencer/frameitdev-fast-and-free-video-thumbs-title-cards-and-og-images-250m</link>
      <guid>https://forem.com/edspencer/frameitdev-fast-and-free-video-thumbs-title-cards-and-og-images-250m</guid>
      <description>&lt;p&gt;As a developer who occasionally creates technical content, I've always found thumbnail creation to be a friction point. I don't have a design background, and I don't want to pay for Photoshop or Canva Pro just to make a few YouTube thumbnails. I'd often spend more time fiddling with graphics software than actually creating the content.&lt;/p&gt;

&lt;p&gt;What I wanted was a simple tool that would give me repeatable, correctly-sized and attractive images to use for video thumbnails, title cards, Open Graph images, and the like. I'm a big fan of the &lt;a href="https://excalidraw.com" rel="noopener noreferrer"&gt;excalidraw&lt;/a&gt; approach: a simple, client-side app that runs in the browser, does one thing well, and does not require any information from its users.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://frameit.dev" rel="noopener noreferrer"&gt;frameit.dev&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7ssjg78b1qncnrrz7zf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7ssjg78b1qncnrrz7zf.png" alt="frameit.dev home page" width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;frameit.dev runs in the browser, exports to a variety of formats, and does not require a user account&lt;/p&gt;

&lt;p&gt;Initially vibe-coded as a way to quickly get a few consistent video titles created, it ended up being useful enough that I've been slowly iterating on it to make it better. The &lt;a href="https://github.com/edspencer/frameit" rel="noopener noreferrer"&gt;code is all open source&lt;/a&gt;, with a hosted version running at &lt;a href="https://frameit.dev" rel="noopener noreferrer"&gt;frameit.dev&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm a big fan of the &lt;a href="https://excalidraw.com" rel="noopener noreferrer"&gt;excalidraw&lt;/a&gt; approach: a simple, client-side app that runs in the browser, does one thing well, and doesn't need me to sign up to use it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;frameit ships a bunch of layouts that generally show some combination of a title, subtitle, logo, icon and/or website address. The layout determines where each element is placed, but they're all positioned relatively, so the same layout can be exported to make thumbs for tall formats like Tiktok, as well as wide formats like Twitter cards and OG images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focbtmq10527klniy9ct3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focbtmq10527klniy9ct3.png" alt="Image rendered in the Twitter Header format" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyist9icxm62ympjgl0kb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyist9icxm62ympjgl0kb.png" alt="Image rendered in the Instagram post format" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above, the same configuration exported for 2 different platforms - Twitter and Instagram.&lt;/p&gt;

&lt;p&gt;It's a pretty simple tool, not intended for people who are adept with Figma, Photoshop, Canva or the like, but who occasionally need to create a thumbnail or title card for a video or social media post.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Coming Soon
&lt;/h2&gt;

&lt;p&gt;Almost as soon as I'd generated my first few images with frameit, I wanted to be able to create them via an API.&lt;/p&gt;

&lt;p&gt;When people share links to your content on various social media platforms, the link looks far more compelling if it has a proper Open Graph image. Sometimes you have one handy (at the right dimensions), but sometimes it's totally fine to just generate one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dmbbvy3o3nigxaf2rkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dmbbvy3o3nigxaf2rkq.png" alt="Example of an Open Graph image created for the bragdoc.ai blog" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the case of the &lt;a href="https://bragdoc.ai/blog" rel="noopener noreferrer"&gt;bragdoc.ai blog&lt;/a&gt;, it's totally fine to generate OG images like these for blog posts. Even these are far more attractive than an empty shell. That blog is hosted on Cloudflare, so other OG image generation options are limited, though they do exist.&lt;/p&gt;

&lt;p&gt;The UI will always remain free to use, with or without an account. It just uses localStorage. The API will have a generous free tier, but ultimately it does cost a little to run the service so heavy users will need to pay a little or run their own instance.&lt;/p&gt;

&lt;p&gt;Because the product uses the same canvas-based rendering in both the web UI and the API, it generally does an excellent job of reproducing the same output whether you use the UI or the API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Plans
&lt;/h2&gt;

&lt;p&gt;frameit will remain as a free, open-source and simple tool, though it will gain a few new bells and whistles besides the API. Currently there is a modest set of 9 example layouts to get you started, but I'll be adding plenty more:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyrdq4t4dwmrkbdwqx68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyrdq4t4dwmrkbdwqx68.png" alt="frameit.dev examples" width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;frameit.dev has a small but growing library of examples to get you started&lt;/p&gt;

&lt;p&gt;What do you want to see supported next? &lt;a href="https://frameit.dev" rel="noopener noreferrer"&gt;frameit.dev&lt;/a&gt; has a "Bug? Feedback?" button at the bottom right that connects directly to my brain, so that's a good way to get what you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Head over to &lt;a href="https://frameit.dev" rel="noopener noreferrer"&gt;frameit.dev&lt;/a&gt; and create your first thumbnail. No signup required, no credit card, no nothing. It's just there, ready to use.&lt;/p&gt;

&lt;p&gt;If you find it useful, &lt;a href="https://github.com/edspencer/frameit" rel="noopener noreferrer"&gt;star the repo on GitHub&lt;/a&gt; or share it with someone who might benefit. And if you build something cool with it or fork it for your own purposes, I'd love to hear about it.&lt;/p&gt;

&lt;p&gt;The web is better when useful tools are freely available to everyone. That's the spirit behind frameit.dev - a simple tool that solves a real problem, built with modern tech, and shared with the community.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>frameit</category>
      <category>react</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
