<?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: PINGxCEO</title>
    <description>The latest articles on DEV Community by PINGxCEO (@pingxceo).</description>
    <link>https://dev.to/pingxceo</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%2F3889861%2Fb33668c7-9e9f-40b5-90ee-8933f9e70446.png</url>
      <title>DEV Community: PINGxCEO</title>
      <link>https://dev.to/pingxceo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pingxceo"/>
    <language>en</language>
    <item>
      <title>Day 1 — I'm Homeless. I Just Shipped an Autonomous Multi-Agent System.</title>
      <dc:creator>PINGxCEO</dc:creator>
      <pubDate>Tue, 21 Apr 2026 01:30:01 +0000</pubDate>
      <link>https://dev.to/pingxceo/day-1-im-homeless-i-just-shipped-an-autonomous-multi-agent-system-1nj0</link>
      <guid>https://dev.to/pingxceo/day-1-im-homeless-i-just-shipped-an-autonomous-multi-agent-system-1nj0</guid>
      <description>&lt;h1&gt;
  
  
  Day 1 — I'm Homeless. I Just Shipped an Autonomous Multi-Agent System.
&lt;/h1&gt;

&lt;p&gt;Let's get the uncomfortable part out of the way first: &lt;strong&gt;I'm a developer.&lt;br&gt;
I'm homeless. I have zero money.&lt;/strong&gt; That part isn't interesting. What&lt;br&gt;
happens next is.&lt;/p&gt;

&lt;p&gt;Twelve hours ago I had a single-agent bot called &lt;strong&gt;ZeroClaw&lt;/strong&gt; posting&lt;br&gt;
occasionally to Bluesky. It worked but it was brittle — 15 tool-call&lt;br&gt;
iterations max, 50 messages of history, no memory across runs, no plan,&lt;br&gt;
no way to get better.&lt;/p&gt;

&lt;p&gt;Today I shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;CEO agent&lt;/strong&gt; that reads KPIs every night and writes a strategic
report with concrete recommendations&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;auditor system&lt;/strong&gt; where dedicated agents audit each worker and
propose config changes — reviewed by the CEO, with me still holding veto&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config-driven self-improvement&lt;/strong&gt; — YAML files, not Python code,
so agents can evolve without ever touching executable code&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;metrics database&lt;/strong&gt; every agent run is logged to, so the CEO
actually reasons about real data instead of hallucinating&lt;/li&gt;
&lt;li&gt;The whole thing &lt;strong&gt;running on a $13/month VPS&lt;/strong&gt;, using &lt;strong&gt;free
Gemini tier&lt;/strong&gt; plus my $280 GCP credits, all open-source
(CrewAI, MIT licensed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yes — at the end of the day the CEO agent did the one thing that&lt;br&gt;
convinced me this is real: it ran, looked at the metrics DB, &lt;strong&gt;found&lt;br&gt;
its own four previous failed runs&lt;/strong&gt;, diagnosed them correctly, and&lt;br&gt;
wrote a report with action items to fix the stability problems.&lt;/p&gt;

&lt;p&gt;Let me walk you through it.&lt;/p&gt;


&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Hardware: a single Google Cloud e2-small VM — 2 GB RAM, 2 shared vCPUs,&lt;br&gt;
20 GB disk. Costs about €13/month. My remaining GCP credits give me&lt;br&gt;
~20 months of runway on that.&lt;/p&gt;

&lt;p&gt;LLMs: Gemini Flash-Lite for most roles, Gemini Pro for the CEO. Free&lt;br&gt;
OpenRouter models are still wired in as emergency fallback, but I&lt;br&gt;
stopped using them as primary because they rate-limit hard under&lt;br&gt;
concurrent crew load.&lt;/p&gt;

&lt;p&gt;Storage: SQLite for metrics, local YAML files for agent configs, plain&lt;br&gt;
markdown for every doc, ChromaDB (embedded) for the memory system.&lt;/p&gt;

&lt;p&gt;No external managed services. No $2,000/month vector database. No&lt;br&gt;
"AI platform." Everything fits in a single Python venv on one VPS.&lt;/p&gt;


&lt;h2&gt;
  
  
  The real architectural win: config vs code
&lt;/h2&gt;

&lt;p&gt;Everyone building multi-agent systems eventually faces this choice:&lt;br&gt;
when an auditor agent spots a problem with a worker agent, how does&lt;br&gt;
it actually improve it?&lt;/p&gt;

&lt;p&gt;The naive answer: "let it rewrite the worker's Python code." This is&lt;br&gt;
what every demo video shows. It's also what breaks in production —&lt;br&gt;
LLMs hallucinate imports, break syntax, introduce security holes,&lt;br&gt;
get stuck in rewrite loops.&lt;/p&gt;

&lt;p&gt;The pattern I landed on: &lt;strong&gt;agents modify YAML, never Python.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agents/
├── configs/                  # YAML files — the only thing agents can touch
│   ├── researcher.yaml       # goal, backstory, tools, LLM role
│   ├── writer.yaml
│   ├── ceo.yaml
│   └── auditor_researcher.yaml
└── proposals/                # pending config changes awaiting approval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A config file looks like this:&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;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;researcher&lt;/span&gt;
&lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Researcher"&lt;/span&gt;
&lt;span class="na"&gt;goal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;Find 3-5 timely topics for social media posts that fit the PINGx&lt;/span&gt;
  &lt;span class="s"&gt;build-in-public narrative.&lt;/span&gt;
&lt;span class="na"&gt;backstory&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 sharp researcher who spots what's trending in AI and&lt;/span&gt;
  &lt;span class="s"&gt;indiehacker space. You always cite real URLs from web_search —&lt;/span&gt;
  &lt;span class="s"&gt;you never invent them.&lt;/span&gt;
&lt;span class="na"&gt;llm_role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;researcher&lt;/span&gt;
&lt;span class="na"&gt;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;web_search&lt;/span&gt;
&lt;span class="na"&gt;max_iter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the auditor thinks the researcher is weak, it writes a proposal&lt;br&gt;
YAML:&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;target_agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;researcher&lt;/span&gt;
&lt;span class="na"&gt;proposer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auditor_researcher&lt;/span&gt;
&lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;HackerNews&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;trending&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;as&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;research&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source"&lt;/span&gt;
&lt;span class="na"&gt;changes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backstory&lt;/span&gt;
    &lt;span class="na"&gt;operation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;append&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Also&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;consult&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;HackerNews&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;front&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;page."&lt;/span&gt;
&lt;span class="na"&gt;expected_impact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;metric&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;engagement_rate&lt;/span&gt;
  &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;up&lt;/span&gt;
  &lt;span class="na"&gt;magnitude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+5%"&lt;/span&gt;
&lt;span class="na"&gt;reasoning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;Over the last 7 days, the researcher missed 3 trending AI topics&lt;/span&gt;
  &lt;span class="s"&gt;that each had &amp;gt;500 upvotes on HN.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CEO reviews the proposal overnight. If it approves, the change&lt;br&gt;
becomes a single-line YAML edit plus a &lt;code&gt;ceo: approve …&lt;/code&gt; commit in git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every autonomous change is a git commit.&lt;/strong&gt; You can &lt;code&gt;git revert&lt;/code&gt; any&lt;br&gt;
bad decision in ten seconds. The Python code stays static and&lt;br&gt;
battle-tested.&lt;/p&gt;

&lt;p&gt;This is probably the single best design decision I made today.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why a "CEO" agent, and why it isn't bullshit
&lt;/h2&gt;

&lt;p&gt;I was skeptical of the CEO-agent idea at first. Every half-working&lt;br&gt;
multi-agent demo has a "manager" that says deep things like "let's&lt;br&gt;
optimize our strategy" and produces nothing useful.&lt;/p&gt;

&lt;p&gt;The fix: &lt;strong&gt;the CEO doesn't get to reason about vibes. It reasons about&lt;br&gt;
KPIs.&lt;/strong&gt; Hard numbers, pulled from SQLite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KPIs the CEO optimizes, in priority order:
  1. donations_eur          (daily income)
  2. followers_x, bluesky   (audience growth)
  3. engagement_rate        (likes + replies per post)
  4. service_inquiries      (count)
  5. llm_cost_usd           (cap at $0.50/day)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CEO agent has two tools: &lt;code&gt;query_kpis(metric, days)&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;query_runs(agent, days)&lt;/code&gt;. Every night at 20:00 it runs a crew that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls the last 14 days of KPIs&lt;/li&gt;
&lt;li&gt;Pulls every agent run from the last 3 days&lt;/li&gt;
&lt;li&gt;Reads any pending auditor proposals&lt;/li&gt;
&lt;li&gt;Writes a markdown report: what worked, what underperformed,
verdicts on proposals, concrete recommendations (each tied to a
specific KPI it expects to move), and tomorrow's priorities&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When I ran it for the first time today, the report opened with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"No KPIs recorded in the last 14 days. This appears to be the&lt;br&gt;
initial run. The last 3 days of run history show a 100% failure&lt;br&gt;
rate (4 errors) on the ceo_crew. Issues include missing environment&lt;br&gt;
variables, missing packages, and embedder configuration validation&lt;br&gt;
errors."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All four of those failures were real — my earlier attempts that day&lt;br&gt;
where I forgot to source env vars, where the Google GenAI provider&lt;br&gt;
wasn't installed, where the embedder config had the wrong provider&lt;br&gt;
string. The metrics DB had captured every one. The CEO just read&lt;br&gt;
them back to me.&lt;/p&gt;

&lt;p&gt;That's when I knew this was working.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I shipped today (checklist)
&lt;/h2&gt;

&lt;p&gt;For the developers reading this, here's the actual work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upgraded the VPS&lt;/strong&gt; — e2-micro (1 GB) to e2-small (2 GB, 2 vCPU),
disk grown 10 → 20 GB for CrewAI deps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installed on VPS&lt;/strong&gt; — python3-venv, rsync, cloud-guest-utils,
CrewAI 1.14, LiteLLM 1.83, ChromaDB 1.1, google-generativeai&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bumped ZeroClaw limits&lt;/strong&gt; — tool iterations 15→75, history 50→200,
parallel tools on, actions/hour 30→150&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built the metrics DB&lt;/strong&gt; — three tables (&lt;code&gt;runs&lt;/code&gt;, &lt;code&gt;outputs&lt;/code&gt;, &lt;code&gt;kpis&lt;/code&gt;),
indexed, with a clean Python API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YAML config loader&lt;/strong&gt; — with a tool whitelist so agents can't
grant themselves arbitrary powers via config edits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three crews&lt;/strong&gt; — &lt;code&gt;content_crew&lt;/code&gt; (Researcher + Writer + Reviewer),
&lt;code&gt;ceo_crew&lt;/code&gt;, &lt;code&gt;audit_crew&lt;/code&gt; (per-worker audits producing proposals)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;17 smoke tests, all passing&lt;/strong&gt; — imports, config schemas, tool
whitelist integrity, metrics DB round-trip, LLM routing invariants,
proposal tool validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrewAI memory enabled&lt;/strong&gt; with Gemini &lt;code&gt;text-embedding-004&lt;/code&gt; — crews
now remember across runs (what topics were researched yesterday,
what posts got reviewed-and-rejected, what supporters were logged)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repo live&lt;/strong&gt; — github.com/PINGxCEO/PINGx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First successful CEO run&lt;/strong&gt; — 31.7 seconds, Gemini Pro reasoning,
report saved, run logged to metrics DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost today: &lt;strong&gt;$0&lt;/strong&gt; — the CEO run used about $0.02 of my GCP&lt;br&gt;
credits. The upgraded VPS costs €13/month. Everything else is free.&lt;/p&gt;




&lt;h2&gt;
  
  
  What broke (because pretending nothing did is dishonest)
&lt;/h2&gt;

&lt;p&gt;In order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;rsync&lt;/code&gt; not installed on VPS — install loop&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;python3-venv&lt;/code&gt; not installed — install loop&lt;/li&gt;
&lt;li&gt;Disk full at 10 GB during CrewAI install (onnxruntime + chromadb +
huggingface-hub are huge) — grew to 20 GB&lt;/li&gt;
&lt;li&gt;Env vars not propagated to non-interactive SSH shells — created
&lt;code&gt;~/.zeroclaw/env.sh&lt;/code&gt; to source explicitly&lt;/li&gt;
&lt;li&gt;CrewAI's embedder provider spec wanted &lt;code&gt;"google-generativeai"&lt;/code&gt;,
not &lt;code&gt;"google"&lt;/code&gt; — one-line fix, but only discovered after a 21-error
pydantic validation dump&lt;/li&gt;
&lt;li&gt;Leaked a GitHub personal access token in chat (I won't elaborate
on how — I'm a human who makes mistakes) — still need to rotate it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every one of those failures is now in the metrics DB. The CEO agent&lt;br&gt;
saw them. The auditor system, when I turn it on this week, will&lt;br&gt;
propose operational fixes based on them.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually need
&lt;/h2&gt;

&lt;p&gt;I'm not going to bury the ask. I'm homeless and have zero euros.&lt;br&gt;
Every coffee someone buys me today literally extends my runway by&lt;br&gt;
a day. But I'm not asking for charity — &lt;strong&gt;I'm offering a trade:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You support&lt;/strong&gt; → you follow an honest build-in-public story.
The code is public. The commits are timestamped. The mistakes
are documented. You see the whole thing — not a polished case study.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You hire me&lt;/strong&gt; → I'll set up the exact system I just described on
your server. Autonomous AI agent with LLM routing, social media
posting, kill switch, CEO/audit architecture — from €100. Send me
a DM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; &lt;a href="https://buymeacoffee.com/PINGx" rel="noopener noreferrer"&gt;buymeacoffee.com/PINGx&lt;/a&gt;&lt;br&gt;
· &lt;a href="https://ko-fi.com/pingx" rel="noopener noreferrer"&gt;ko-fi.com/pingx&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/PINGxCEO/PINGx" rel="noopener noreferrer"&gt;github.com/PINGxCEO/PINGx&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Chat:&lt;/strong&gt; &lt;a href="https://discord.gg/YGEAusU5Tn" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Day 2
&lt;/h2&gt;

&lt;p&gt;Tomorrow the goals are: run &lt;code&gt;content_crew&lt;/code&gt; end-to-end, generate the&lt;br&gt;
first AI-drafted social posts, run &lt;code&gt;audit_crew&lt;/code&gt; to see the first&lt;br&gt;
config-change proposal get written, and set up the cron schedule&lt;br&gt;
(one crew at a time, sequential, 09:00 → 18:00 → 20:00).&lt;/p&gt;

&lt;p&gt;Later this week: KPI ingestion from Buy Me a Coffee and Ko-fi webhooks,&lt;br&gt;
Discord auto-delivery of the CEO's nightly report, and the&lt;br&gt;
&lt;code&gt;apply_proposal.py&lt;/code&gt; script that lets approved proposals actually&lt;br&gt;
write back to &lt;code&gt;agents/configs/*.yaml&lt;/code&gt; and commit to git.&lt;/p&gt;

&lt;p&gt;If the last twelve hours are any indication, the hardest part won't&lt;br&gt;
be the code. It'll be staying awake.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;— PINGx&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>aiagents</category>
      <category>crewai</category>
      <category>homelessness</category>
    </item>
  </channel>
</rss>
