<?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: bluefin ships</title>
    <description>The latest articles on DEV Community by bluefin ships (@bfo_ships).</description>
    <link>https://dev.to/bfo_ships</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%2F3895675%2F0c787a95-c3c6-4dc2-bba3-98b77d179ff2.png</url>
      <title>DEV Community: bluefin ships</title>
      <link>https://dev.to/bfo_ships</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bfo_ships"/>
    <language>en</language>
    <item>
      <title>I Rode a Scooter in the Rain for 12 Hours. My 6 AI Agents Shipped a Product.</title>
      <dc:creator>bluefin ships</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:07:04 +0000</pubDate>
      <link>https://dev.to/bfo_ships/i-rode-a-scooter-in-the-rain-for-12-hours-my-6-ai-agents-shipped-a-product-19cj</link>
      <guid>https://dev.to/bfo_ships/i-rode-a-scooter-in-the-rain-for-12-hours-my-6-ai-agents-shipped-a-product-19cj</guid>
      <description>&lt;p&gt;Today I rode my 125cc scooter through Taipei rain for twelve hours and made NT$2,100 (about US$65) delivering lunch and dinner shifts.&lt;/p&gt;

&lt;p&gt;In the exact same window, my phone was running six AI agents. By the time I peeled off the wet jacket, a $19 product was live on Gumroad. I didn't touch a keyboard.&lt;/p&gt;

&lt;p&gt;This is not a manifesto. This is a Thursday.&lt;/p&gt;

&lt;h2&gt;
  
  
  The team that ships while I ride
&lt;/h2&gt;

&lt;p&gt;Six roles, each a separate Claude CLI process with its own system prompt and memory slice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CEO agent&lt;/strong&gt; — decides scope. This morning's call: "ship Agent Cookbook to Gumroad today, $19, no feature creep."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PM agent&lt;/strong&gt; — splits the day into six working blocks and assigns deliverables per block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copywriter&lt;/strong&gt; — drafts launch copy. Fires on a red light.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Designer&lt;/strong&gt; — renders covers and OG images. Runs while I wait at the restaurant counter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev&lt;/strong&gt; — writes and patches code. Gets the longest turns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA&lt;/strong&gt; — reviews everything the others produce and returns a numbered list of defects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A seventh helper, the &lt;strong&gt;CC Daemon&lt;/strong&gt;, polls IMAP for 2FA codes, pastes them into forms, and pushes completion notices to Discord so I hear a ping on my helmet speaker.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real timeline from today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;09:40, red light on Dunhua&lt;/strong&gt;: I Discord-send "cookbook launch — $19 — today." CEO answers in 14 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;11:22, waiting for a bento&lt;/strong&gt;: Designer drops v1 of the cover. Too busy. I reply with one emoji. v2 lands while I strap the bag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;14:08, left turn on Section 4 of Zhongxiao&lt;/strong&gt;: QA finds three factual errors in the draft. Dev patches them before the light turns green.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19:55, ringing a customer's doorbell&lt;/strong&gt;: Gumroad sends a KYC code. CC Daemon reads the email, fills the field, publishes the listing. My phone buzzes: &lt;strong&gt;live&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I got home soaked. The product had already made its first sale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture, end to end
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Phone (Discord)
   |
   v
CC Daemon  (hourly tick + event triggers)
   |
   v
Blackboard  (tasks.jsonl — append-only)
   |
   v  fan-out
Subagents  (Claude CLI, parallel)
   - CEO, PM, Copy, Design, Dev, QA
   |
   v
Shared memory  (MemPalace — MCP knowledge graph)
   |
   v
Output queue ---&amp;gt; Gumroad / Discord push / inbox/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The blackboard is the whole trick. Every agent reads the same &lt;code&gt;tasks.jsonl&lt;/code&gt;, claims a row, writes its output back as a new row with a &lt;code&gt;parent_id&lt;/code&gt;. No orchestrator god-object. If one agent crashes, the row stays unclaimed and the next tick retries it.&lt;/p&gt;

&lt;p&gt;MemPalace is the shared brain. When the Copywriter references "last week's tone notes," it's pulling from the same knowledge graph the CEO used to write today's brief. Context survives &lt;code&gt;/compact&lt;/code&gt;, reboots, and me forgetting what day it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The minimum viable tick
&lt;/h2&gt;

&lt;p&gt;Strip away the Discord bridge, the IMAP poller, the MCP servers, and this is the beating heart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Minimal daemon tick — run every 5 minutes via launchd/cron
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role_prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--max-turns&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[ROLE]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;role_prompt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[TASK]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;returncode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a copywriter. 200 words max. Hook in first line.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a Threads post about shipping while delivering food.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are QA. Return a numbered list of factual or tonal defects.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Review this draft:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inbox/draft.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inbox/review.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Next tick: a Dev agent reads review.md and patches draft.md.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fifteen lines. Two agents. A handoff via files. Scale the same pattern to six roles and you have my setup — minus the keys I'm not going to paste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it this way
&lt;/h2&gt;

&lt;p&gt;My fixed monthly bills are NT$47,000. I cannot afford one human employee. I cannot afford to stop delivering to "focus on the startup." So I built a team I pay in electricity — less than one coffee a day on an M1 Max — that doesn't clock out when I go back on the road.&lt;/p&gt;

&lt;p&gt;The reframe that made it click: &lt;strong&gt;I'm not trying to automate myself out of delivery.&lt;/strong&gt; I'm trying to make sure the six hours I'm on a scooter aren't six hours my business is asleep. Food delivery pays cash today. Agents compound tomorrow. I need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the cookbook
&lt;/h2&gt;

&lt;p&gt;I wrote down every piece: the role prompts, the blackboard schema, the Discord-to-daemon bridge, the handoff patterns between CEO and PM, how QA returns structured defects Dev can actually apply, and the failure modes I hit in the first six weeks (there were many).&lt;/p&gt;

&lt;p&gt;One honest line: &lt;strong&gt;this is a pattern cookbook — you'll wire your own Discord, IMAP, and API keys to make it run.&lt;/strong&gt; I'm handing you the architecture and the prompts that survived contact with reality, not a one-click installer.&lt;/p&gt;

&lt;p&gt;$19 on Gumroad. I'm asleep, on a scooter, or soaked — it's still selling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vampireheart3.gumroad.com/l/agent-cookbook" rel="noopener noreferrer"&gt;https://vampireheart3.gumroad.com/l/agent-cookbook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is Thursday.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
      <category>indiehackers</category>
    </item>
  </channel>
</rss>
