<?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: Cess Mbugua</title>
    <description>The latest articles on DEV Community by Cess Mbugua (@mbugua_cessy).</description>
    <link>https://dev.to/mbugua_cessy</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%2F3626809%2F8965597d-6873-451e-8e28-585d0370197b.jpeg</url>
      <title>DEV Community: Cess Mbugua</title>
      <link>https://dev.to/mbugua_cessy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mbugua_cessy"/>
    <language>en</language>
    <item>
      <title>Day 17 of 60: I Deployed My First Production AI API and It's Live 24/7 (This Changes Everything)</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Tue, 19 May 2026 18:56:52 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-17-of-60-i-deployed-my-first-production-ai-api-and-its-live-247-this-changes-everything-569o</link>
      <guid>https://dev.to/mbugua_cessy/day-17-of-60-i-deployed-my-first-production-ai-api-and-its-live-247-this-changes-everything-569o</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Today everything became real.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every system I've built over the past 16 days lived only on my local machine. The moment I closed my laptop it went offline. n8n Cloud couldn't reach it without ngrok running. No client could access it. I couldn't share it with anyone without being physically present.&lt;/p&gt;

&lt;p&gt;Today I fixed that. My AI Agent API is live. 24/7. No laptop required.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## The Gap This Closes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is a clear line between a developer project and a professional product.&lt;/p&gt;

&lt;p&gt;A portfolio of systems that only run locally is a collection of demos. A deployed API that runs 24/7 from a cloud server is a product; something you can hand to a client, link to from your LinkedIn, or build a business on.&lt;/p&gt;

&lt;p&gt;Today I crossed that line.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## What Got Deployed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A production-ready FastAPI server combining the capabilities from the last three projects into one unified AI agent API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Document Q&amp;amp;A endpoint:&lt;/strong&gt; ask questions against any document&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research endpoint:&lt;/strong&gt; multi-agent research and report generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data analysis endpoint:&lt;/strong&gt; CSV analysis with AI-generated insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployed to Render's free cloud hosting. Permanently accessible at a real URL. n8n Cloud workflows can now call it directly. Clients can access it. It's in my portfolio.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;requirements.txt:&lt;/strong&gt; the dependency file that tells cloud platforms what to install. Standard for every Python deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment variables in production:&lt;/strong&gt; storing API keys securely on Render so they are never in code or GitHub. This is non-negotiable in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production start command:&lt;/strong&gt; the uvicorn command Render uses to start the server. Different from how you run it locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Health check endpoint:&lt;/strong&gt; the GET / endpoint that tells Render your service is alive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-deploy from GitHub:&lt;/strong&gt; every time I push new code Render redeploys automatically. Continuous deployment from day one.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;🌐 Live API → &lt;a href="https://ai-agent-api-w7uh.onrender.com" rel="noopener noreferrer"&gt;https://ai-agent-api-w7uh.onrender.com&lt;/a&gt;&lt;br&gt;
🔗 GitHub → &lt;a href="https://github.com/mbuguacessy-glitch" rel="noopener noreferrer"&gt;https://github.com/mbuguacessy-glitch&lt;/a&gt;&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
43 more to go!. &lt;/p&gt;

&lt;h1&gt;
  
  
  python #fastapi #deployment #render #claudeapi #automation #learninpublic #buildinpublic #100DaysOfCode
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Day 15 of 60: I Built a Multi-Agent Research System That Researches, Writes and Reviews Reports in Under 60 Seconds</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Mon, 18 May 2026 14:01:00 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-15-of-60-i-built-a-multi-agent-research-system-that-researches-writes-and-reviews-reports-in-4f20</link>
      <guid>https://dev.to/mbugua_cessy/day-15-of-60-i-built-a-multi-agent-research-system-that-researches-writes-and-reviews-reports-in-4f20</guid>
      <description>&lt;p&gt;&lt;strong&gt;Today's build is the most sophisticated thing I've shipped so far.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A single AI call handles one task well. But complex research requires four fundamentally different cognitive tasks; finding information, synthesising it, writing a structured report, and reviewing its quality. Each needs different instructions. Different tools. Different evaluation criteria.&lt;/p&gt;

&lt;p&gt;So I stopped using one agent and built three.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## The Real World Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you send a complex research question to a single Claude prompt you get a single pass. The response might be well-written but poorly researched. Or well-researched but poorly structured. Or both good but containing errors nobody checked.&lt;/p&gt;

&lt;p&gt;In the real world every high-quality deliverable goes through multiple specialist hands. Research agencies, law firms, consulting firms, and newsrooms all use teams, not because one person cannot do the work, but because specialisation and review produce dramatically better results.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## The Analogy That Made It Click&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of a newspaper editorial team. When a breaking story comes in three people handle it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The journalist:&lt;/strong&gt; gathers facts, interviews sources, finds the data. Does not write the final article.&lt;br&gt;
&lt;strong&gt;The writer:&lt;/strong&gt; takes the journalist's notes and turns them into a polished, structured article. Was not at the scene.&lt;br&gt;
&lt;strong&gt;The editor:&lt;/strong&gt; reads the finished article before it publishes. Checks facts, identifies gaps, suggests improvements. Did not gather or write anything.&lt;/p&gt;

&lt;p&gt;Three specialists. Three distinct roles. One final product better than any one of them could produce alone.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;## How the System Works&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;Topic comes in
↓
Researcher Agent: searches the web via Tavily
                   summarises findings
↓
Writer Agent: takes research output
               produces structured written report
↓
Reviewer Agent: reads the report
                 returns quality score + specific improvements
↓
Final reviewed report delivered in under 60 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The cast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Researcher&lt;/code&gt; = The journalist: finds information via Tavily web search&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Writer&lt;/code&gt; = The writer: turns research into a structured report&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Reviewer&lt;/code&gt; = The editor: checks quality and flags improvements&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Orchestrator&lt;/code&gt; = The news desk: coordinates handoffs between agents&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Claude&lt;/code&gt; = The intelligence powering all three with different instructions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Tavily&lt;/code&gt; = The press pass: gives the Researcher access to live web search&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;## What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest shift today was thinking in &lt;strong&gt;roles not prompts&lt;/strong&gt;. Every agent has its own identity, its own instructions, and its own output format. The output of each becomes the input of the next.&lt;/p&gt;

&lt;p&gt;This is the architecture behind every serious AI product being built in 2026. Content agencies, research firms, legal teams, and marketing departments all need research-to-report pipelines that don't require a human at every step.&lt;/p&gt;




&lt;p&gt;**🔗 Full project on GitHub → &lt;a href="https://github.com/mbuguacessy-glitch" rel="noopener noreferrer"&gt;https://github.com/mbuguacessy-glitch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;45 more to go.** &lt;/p&gt;

&lt;h1&gt;
  
  
  ai #multiagent #claudeapi #python #automation #learninpublic #buildinpublic #100DaysOfCode
&lt;/h1&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Day 14 of 60: I Completed RAG and Now I Understand Why It Changes Everything</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Sat, 16 May 2026 15:15:25 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-14-of-60-i-completed-rag-and-now-i-understand-why-it-changes-everything-5bj1</link>
      <guid>https://dev.to/mbugua_cessy/day-14-of-60-i-completed-rag-and-now-i-understand-why-it-changes-everything-5bj1</guid>
      <description>&lt;p&gt;Today I finished what I started yesterday. RAG is done. And I finally understand why every serious AI engineer needs to know this.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## Quick Recap: What is RAG?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Retrieval Augmented Generation. Instead of relying purely on what an LLM was trained on, RAG retrieves relevant information from an external knowledge base and passes it to the model as context before generating a response.&lt;/p&gt;

&lt;p&gt;The model doesn't need to have been trained on your data. It just needs to be able to read it at the moment you ask.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;##: The Complete RAG Pipeline&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;Documents ingested → chunked into pieces
↓
Each chunk converted into a vector embedding
↓
Embeddings stored in a vector database
↓
User query comes in
↓
Query converted to embedding
↓
Vector database searched for similar chunks
↓
Relevant chunks retrieved
↓
Chunks + query passed to Claude
↓
Claude generates grounded response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;## What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three concepts that finally clicked today:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chunking:&lt;/strong&gt; you can't pass an entire document to an LLM at once. You split it into smaller overlapping pieces so nothing important falls through the gaps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vector embeddings:&lt;/strong&gt; text converted into numbers that capture meaning. Similar concepts end up close together in vector space. That's how the search knows what's relevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grounding:&lt;/strong&gt; the difference between an AI that guesses and an AI that knows. RAG grounds every response in real retrieved data.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## Why This Changes My Builds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every automation I've built so far sends data directly in the prompt. RAG means I can now build systems that reference entire company knowledge bases, months of historical data, or hundreds of documents, and still return accurate, grounded responses.&lt;/p&gt;

&lt;p&gt;The builds coming next are on a completely different level.&lt;/p&gt;




&lt;p&gt;No GitHub link today, pure learning day documented publicly.&lt;/p&gt;

&lt;p&gt;46 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  rag #ai #learninpublic #buildinpublic #python #claudeapi #100DaysOfCode
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Day 13 of 60: Today I Started Learning RAG</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Fri, 15 May 2026 18:32:35 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-13-of-60-today-i-started-learning-rag-21eh</link>
      <guid>https://dev.to/mbugua_cessy/day-13-of-60-today-i-started-learning-rag-21eh</guid>
      <description>&lt;p&gt;&lt;strong&gt;RAG. Retrieval Augmented Generation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No build today. Just learning. And honestly it was one of the most mind-expanding study sessions since I started this challenge.&lt;/p&gt;




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

&lt;p&gt;Every AI model I've worked with so far: Claude, GPT, any LLM, has a knowledge cutoff. It knows what it was trained on and nothing else. Ask it about your company's internal documents, your client's data, or anything that happened after training; it has no idea.&lt;/p&gt;

&lt;p&gt;RAG fixes that.&lt;/p&gt;

&lt;p&gt;Instead of relying purely on what the model was trained on, RAG retrieves relevant information from an external source; a database, a document store, a knowledge base — and passes it to the model as context before generating a response.&lt;/p&gt;

&lt;p&gt;The model doesn't need to have been trained on your data. It just needs to be able to read it at the moment you ask.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Changes Everything for Automation
&lt;/h2&gt;

&lt;p&gt;Every automation I've built so far sends data directly to Claude in the prompt. That works for small, structured inputs.&lt;/p&gt;

&lt;p&gt;But what about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A chatbot that answers questions about a company's entire document library?&lt;/li&gt;
&lt;li&gt;A support system that references hundreds of past tickets to resolve new ones?&lt;/li&gt;
&lt;li&gt;A report generator that pulls from months of historical data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can't paste all of that into a prompt. RAG is how you solve that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned Today
&lt;/h2&gt;

&lt;p&gt;The core RAG pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User query
↓
Search knowledge base for relevant chunks
↓
Pass retrieved chunks + query to LLM
↓
LLM generates response grounded in real data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The builds that are coming next are going to be on a completely different level.&lt;/p&gt;




&lt;p&gt;No GitHub link today, just a study day documented publicly.&lt;/p&gt;

&lt;p&gt;47 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  rag #ai #learninpublic #buildinpublic #python #claudeapi #100DaysOfCode
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>llm</category>
      <category>rag</category>
    </item>
    <item>
      <title>Day 12 of 60: I Built the Final Piece That Completes a Full AI Automation Stack (Zero Human Reporting)</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Thu, 14 May 2026 19:27:58 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-12-of-60-i-built-the-final-piece-that-completes-a-full-ai-automation-stack-zero-human-5990</link>
      <guid>https://dev.to/mbugua_cessy/day-12-of-60-i-built-the-final-piece-that-completes-a-full-ai-automation-stack-zero-human-5990</guid>
      <description>&lt;p&gt;&lt;strong&gt;Today I closed the loop.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every business running automations eventually faces the same question: what actually happened this week? Someone has to pull data from multiple sources, count the records, write a summary, and send it. For one client that's 30 minutes. For ten clients it's half a day. Every single week.&lt;/p&gt;

&lt;p&gt;Today I automated that entirely.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;## What I Built&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
A Python script that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connects to Airtable and reads all lead records&lt;/li&gt;
&lt;li&gt;Sends the data to Claude with a reporting prompt&lt;/li&gt;
&lt;li&gt;Receives a clean written summary report back&lt;/li&gt;
&lt;li&gt;Saves it as a timestamped .txt file&lt;/li&gt;
&lt;li&gt;Prints it to the terminal&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The report includes lead counts by urgency, status breakdowns, key highlights, and recommended next actions. No human involved.&lt;/p&gt;



&lt;p&gt;**&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Matters: The Full Stack
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
This was Challenge 5 of 5 in Phase 1. Here's what the complete pipeline looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Challenge 4 → Intake comes in
              Raw client text → Claude extracts → Pydantic validates → Airtable stores

Challenge 5 → Report goes out
              Airtable data → Claude analyses → Written report → saved as .txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Intake in. Report out. No human touches either end.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## The Analogy That Made It Click&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of a bank branch manager's end-of-day report. The teller system holds every transaction. Every evening a junior manager spends an hour pulling numbers and writing a summary for the regional director.&lt;/p&gt;

&lt;p&gt;What I built is the automated equivalent; a script that reads every record, hands them to Claude who writes the summary in plain English, and delivers the report automatically. Same quality. Every day. Zero manual effort.&lt;/p&gt;

&lt;p&gt;The junior manager now spends that hour on something that actually requires human judgement.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Phase 1 is complete. Five challenges. Five scripts. One complete automation stack.&lt;/p&gt;

&lt;p&gt;The biggest lesson across all five: &lt;strong&gt;the most valuable automations aren't the flashy ones; they're the ones that eliminate the invisible repetitive work nobody talks about but everyone does.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔗 Full project on GitHub → &lt;a href="https://github.com/mbuguacessy-glitch" rel="noopener noreferrer"&gt;https://github.com/mbuguacessy-glitch&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;48 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  python #claudeapi #automation #airtable #learninpublic #buildinpublic #100DaysOfCode
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>python</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Day 11 of 60: I Built a Script That Reads Raw Client Intake Text and Creates Clean CRM Records Automatically</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Wed, 13 May 2026 21:02:19 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-11-of-60-i-built-a-script-that-reads-raw-client-intake-text-and-creates-clean-crm-records-1f3d</link>
      <guid>https://dev.to/mbugua_cessy/day-11-of-60-i-built-a-script-that-reads-raw-client-intake-text-and-creates-clean-crm-records-1f3d</guid>
      <description>&lt;p&gt;Every agency hits the same wall. A potential client fills out an intake form. What comes back is a block of unstructured text. Someone has to read it, extract the budget buried in the prose, assess urgency, and manually create a CRM record.&lt;/p&gt;

&lt;p&gt;For five clients a week that's an annoyance. For fifty it becomes a part-time job. For a hundred it breaks the business.&lt;/p&gt;

&lt;p&gt;So I automated it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A Python script that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads raw intake text exactly as a client types it&lt;/li&gt;
&lt;li&gt;Sends it to Claude with a structured extraction prompt&lt;/li&gt;
&lt;li&gt;Receives a clean JSON object back&lt;/li&gt;
&lt;li&gt;Validates every field with Pydantic&lt;/li&gt;
&lt;li&gt;Saves the complete record to Airtable automatically&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No human reads the intake. No human creates the CRM entry. A clean lead appears in Airtable ready for follow-up — in seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  New Skills This Introduced
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Structured extraction prompting&lt;/strong&gt;&lt;br&gt;
Telling Claude to return only JSON with specific fields, making AI output predictable and parseable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pydantic field validation&lt;/strong&gt;&lt;br&gt;
Catching bad AI output before it corrupts your data, defining exactly what shape the data must be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@field_validator&lt;/strong&gt;&lt;br&gt;
Custom rules that fix or reject individual fields e.g. if urgency is not Low/Medium/High, default to Medium.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pyairtable&lt;/strong&gt;&lt;br&gt;
Writing records to Airtable via API from Python — your CRM integration layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;glob()&lt;/strong&gt;&lt;br&gt;
Looping over all files matching a pattern, process 2 intakes or 200 with the same code.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The most valuable thing today wasn't the code, it was the pattern. Unstructured text in. Validated structured data out. Saved to a system of record.&lt;/p&gt;

&lt;p&gt;This same pattern applies to support ticket classification, lead qualification, invoice extraction, contract review, and survey analysis. Once you understand it, you can deliver one of the highest-value automations in the market.&lt;/p&gt;




&lt;p&gt;🔗 Full project on GitHub → &lt;a href="https://github.com/mbuguacessy-glitch" rel="noopener noreferrer"&gt;https://github.com/mbuguacessy-glitch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;49 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  python #claudeapi #automation #airtable #learninpublic #buildinpublic #100DaysOfCode
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 10 of 60 of learning AI automation in public</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Tue, 12 May 2026 17:07:42 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-10-of-60-of-learning-ai-automation-in-public-oni</link>
      <guid>https://dev.to/mbugua_cessy/day-10-of-60-of-learning-ai-automation-in-public-oni</guid>
      <description>&lt;p&gt;Today I solved a problem that has been sitting in the back of my mind since Day 1.&lt;br&gt;
My n8n workflows and my Python scripts have been living in completely separate worlds. Today I connected them.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## The Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've built powerful automation pipelines in n8n. I've built Python scripts that call Claude directly. But they couldn't talk to each other.&lt;/p&gt;

&lt;p&gt;Every time I needed complex data transformation or custom AI logic that n8n couldn't handle natively. I had to build a whole separate system with no connection between the two. Duplicated effort. Disconnected systems. Limited capability.&lt;/p&gt;

&lt;p&gt;This is the gap that stops most automation engineers from reaching the next level.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## What I Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;FastAPI Python server&lt;/strong&gt; that runs locally and exposes Python logic as HTTP endpoints. My n8n workflows send data to these endpoints via HTTP Request nodes, the same way they call any external API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python processes the data&lt;/li&gt;
&lt;li&gt;Calls Claude API&lt;/li&gt;
&lt;li&gt;Returns a structured JSON response back to n8n&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From n8n's perspective, Python is just another API to call.&lt;br&gt;
From Python's perspective, n8n is just a client sending requests.&lt;br&gt;
Both systems stay independent but now work together seamlessly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## New Skills This Introduced&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FastAPI:&lt;/strong&gt; building a Python web server&lt;br&gt;
&lt;strong&gt;@app.post() decorator:&lt;/strong&gt; creating API endpoints&lt;br&gt;
&lt;strong&gt;Pydantic BaseModel&lt;/strong&gt; — validating incoming request data&lt;br&gt;
&lt;strong&gt;uvicorn:&lt;/strong&gt; running the FastAPI server&lt;br&gt;
&lt;strong&gt;HTTP Request node in n8n:&lt;/strong&gt; calling Python from a workflow&lt;br&gt;
&lt;strong&gt;async def:&lt;/strong&gt; asynchronous function basics&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest mindset shift today was realising that &lt;strong&gt;every tool communicates through HTTP&lt;/strong&gt;. n8n, Make.com, Zapier, they all have HTTP Request nodes. That means any Python logic I wrap in a FastAPI endpoint becomes instantly callable from any automation platform in the world.&lt;/p&gt;

&lt;p&gt;I didn't just learn FastAPI today. I learned how to make Python a first-class citizen in any automation stack.&lt;/p&gt;




&lt;p&gt;🔗 &lt;strong&gt;Full project on GitHub → &lt;a href="https://github.com/mbuguacessy-glitch/ai-webhook-processor" rel="noopener noreferrer"&gt;https://github.com/mbuguacessy-glitch/ai-webhook-processor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Day 10 of my 60-day public AI automation build challenge. Learning by doing.. every day.&lt;/p&gt;

&lt;p&gt;50 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  python #fastapi #n8n #claudeapi #automation #learninpublic #buildinpublic #100DaysOfCode
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>buildinpublic</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 9 of 60: Today I built something cool and then spent just as long trying to push it to GitHub.</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Mon, 11 May 2026 15:51:29 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-9-of-60-today-i-built-something-cool-and-then-spent-just-as-long-trying-to-push-it-to-github-5gba</link>
      <guid>https://dev.to/mbugua_cessy/day-9-of-60-today-i-built-something-cool-and-then-spent-just-as-long-trying-to-push-it-to-github-5gba</guid>
      <description>&lt;p&gt;Today I built something cool and then spent just as long trying to push it to GitHub.&lt;br&gt;
Both experiences taught me something valuable.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;## What I Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI Batch Document Classifier: a Python script that scans a folder of documents, sends each one to Claude API, and produces a master JSON report classifying every document by category, urgency, required action, and whether a deadline was mentioned. Urgent documents are surfaced first.&lt;/p&gt;

&lt;p&gt;The real world problem it solves: manually reading 30+ documents to triage them takes hours. This script does it in under 60 seconds.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;## How the Pipeline Works&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;**scan_documents()** finds all .txt files in documents/ folder
↓
**read_document()** reads full content of each file
↓
**classify_document()** sends content to Claude API → returns JSON
↓
**json.loads()** converts response into Python dictionary
↓
**save_results()** sorts by urgency → writes master JSON → prints summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;## Document Categories&lt;/strong&gt;&lt;br&gt;
contract | complaint | invoice | policy | meeting_notes | other&lt;/p&gt;

&lt;h2&gt;
  
  
  Urgency Levels
&lt;/h2&gt;

&lt;p&gt;urgent | standard | low&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## What I Learned About Reading Python Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today something clicked that hasn't before: how to read a Python script by sections rather than line by line.&lt;/p&gt;

&lt;p&gt;Every professional Python script tells a story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Imports:&lt;/strong&gt; what tools the script needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Functions:&lt;/strong&gt; what jobs each section does&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;main():&lt;/strong&gt; how all the jobs connect into a pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reading it section by section instead of trying to understand every line at once made the whole structure suddenly make sense.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The GitHub Struggle Was Real
&lt;/h2&gt;

&lt;p&gt;Pushing to GitHub today was an unexpected lesson in itself. My &lt;code&gt;.env&lt;/code&gt; file was committed in the first push but GitHub's push protection blocked it immediately.&lt;/p&gt;

&lt;p&gt;What followed was a deep dive into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git rm --cached&lt;/code&gt;, removing files from tracking&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git filter-branch&lt;/code&gt;, rewriting commit history to scrub secrets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.gitignore&lt;/code&gt;, understanding why it needs to be set up correctly before the first commit&lt;/li&gt;
&lt;li&gt;Regenerating exposed API keys immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Biggest lesson: &lt;strong&gt;set up your &lt;code&gt;.gitignore&lt;/code&gt; before your first commit. Not after. Before.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;🔗 &lt;strong&gt;Full project on GitHub → &lt;a href="https://github.com/mbuguacessy-glitch/ai-batch-document-classifier" rel="noopener noreferrer"&gt;https://github.com/mbuguacessy-glitch/ai-batch-document-classifier&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Day 9 of my 60-day public AI automation build challenge. Learning by doing, &lt;br&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%2Fqew2xwbvdk1f30vegw94.jpg" 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%2Fqew2xwbvdk1f30vegw94.jpg" alt=" "&gt;&lt;/a&gt;every mistake included.&lt;/p&gt;

&lt;p&gt;51 more to go. 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  python #claudeapi #automation #learninpublic #buildinpublic #github #100DaysOfCode
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 8 of 60 and this is me learning AI integration and automation in public</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Sat, 09 May 2026 20:04:25 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-8-of-60-and-this-is-me-learning-ai-integration-and-automation-in-public-8md</link>
      <guid>https://dev.to/mbugua_cessy/day-8-of-60-and-this-is-me-learning-ai-integration-and-automation-in-public-8md</guid>
      <description>&lt;h2&gt;
  
  
  **Today I called the Claude API from Python for the very first time.
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  ** What I Was Learning**
&lt;/h2&gt;

&lt;p&gt;The exercise was built around a relatable scenario, an account manager who manually writes weekly performance summaries for 10 clients every Monday. Same structure every week. Only the numbers change. &lt;br&gt;
The goal wasn't to ship a product. The goal was to learn how to connect Python to Claude API and move data through a structured pipeline from start to finish.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;What the Exercise Taught Me&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The full data pipeline looked like this:&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;clients.csv → read_client_data() → list of dictionaries
↓
for loop picks up first client
↓
build_prompt() constructs personalised prompt
↓
generate_report() calls Claude API → returns report text
↓
save_report() writes to disk → returns filepath
↓
loop moves to next client
↓
summary printed + results logged to JSON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Three things I will carry into every project from here:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;`Path(&lt;strong&gt;file&lt;/strong&gt;).parent': how to make scripts work regardless of where they are run from&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client.messages.create()&lt;/code&gt;: the exact pattern for calling Claude API in Python&lt;/li&gt;
&lt;li&gt;The function-per-job pattern: organising a script into small single purpose functions connected by &lt;code&gt;main()&lt;/code&gt;. &lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Feels Like a Milestone&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every workflow I've built in the first 3 days used n8n to handle the Claude API connection visually. Today I learned how to do that same thing in raw Python. No drag and drop. No visual nodes. Just code.&lt;/p&gt;

&lt;p&gt;That's a different kind of understanding. And it opens up a completely different level of what I can build next.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Still learning. Still building. One day at a time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;52 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  python #claudeapi #learninpublic #buildinpublic #automation #100DaysOfCode
&lt;/h1&gt;

</description>
      <category>api</category>
      <category>automation</category>
      <category>claude</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 7 of 60 — today I stopped doing abstract Python challenges and started solving problems I could see myself automating in the real world.</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Thu, 07 May 2026 19:09:37 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-7-of-60-today-i-stopped-doing-abstract-python-challenges-and-started-solving-problems-i-could-2jgi</link>
      <guid>https://dev.to/mbugua_cessy/day-7-of-60-today-i-stopped-doing-abstract-python-challenges-and-started-solving-problems-i-could-2jgi</guid>
      <description>&lt;p&gt;I'm a student learning AI integration and automation by building one real workflow every day for 60 days.&lt;/p&gt;

&lt;p&gt;Day 8 of 60 — today I stopped doing abstract Python challenges and started solving problems I could see myself automating in the real world.&lt;/p&gt;

&lt;p&gt;5 challenges. All automation-relevant. All humbling in different ways.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;## The 5 Challenges I Tackled Today&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### 1. Product Inventory&lt;/strong&gt;&lt;br&gt;
Building logic that tracks stock levels, flags low inventory, and updates records. Sounds simple until you're handling edge cases — what if a product doesn't exist? What if the quantity goes negative?&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Processing a Sales Report
&lt;/h3&gt;

&lt;p&gt;Taking raw sales data and transforming it into something meaningful — totals, averages, top performers. This one was a loop and data structure workout.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Lead Qualification System
&lt;/h3&gt;

&lt;p&gt;This one hit close to home. Writing logic that scores and qualifies leads based on defined criteria — exactly the kind of thinking that powers the AI workflows I've been building since Day 1, but now in raw Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Bulk SMS Validator
&lt;/h3&gt;

&lt;p&gt;Validating a list of phone numbers before sending — checking format, length, and country codes. A real lesson in how much can go wrong with raw user input before it even reaches an API.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Daily Sales Target Tracker
&lt;/h3&gt;

&lt;p&gt;Tracking progress toward a daily target, calculating percentages, and flagging whether the target is on track or behind. Simple concept, precise execution required.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Today Taught Me
&lt;/h2&gt;

&lt;p&gt;Every single one of these challenges maps directly to something I could build as a real automation workflow. The inventory tracker becomes a stock alert pipeline. The lead qualifier becomes an AI scoring system. The SMS validator becomes a data cleaning step before a bulk messaging workflow.&lt;/p&gt;

&lt;p&gt;Python isn't separate from the automation work — it's the engine underneath it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where This is Heading
&lt;/h2&gt;

&lt;p&gt;Once I'm confident writing Python scripts for these kinds of problems, the next step is connecting them to APIs, databases, and AI models. That's when the real automation work begins.&lt;/p&gt;

&lt;p&gt;52 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  python #automation #learninpublic #buildinpublic #ai
&lt;/h1&gt;

</description>
      <category>automation</category>
      <category>beginners</category>
      <category>devjournal</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 6 of 60 — and today Python stopped being theory.</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Wed, 06 May 2026 19:53:59 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-6-of-60-and-today-python-stopped-being-theory-51in</link>
      <guid>https://dev.to/mbugua_cessy/day-6-of-60-and-today-python-stopped-being-theory-51in</guid>
      <description>&lt;p&gt;No new concepts today. Instead I sat down with real life challenges built around everything I've learned so far: variables, data types, operators, strings, lists, functions, loops, classes, objects, inheritance, exception handling and file handling.&lt;/p&gt;

&lt;p&gt;And that's where it got interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Real Life Challenges Hit Different
&lt;/h2&gt;

&lt;p&gt;Reading about Python concepts and actually applying them to solve a problem are two completely different things. The moment you're staring at a challenge with no step-by-step guide, your brain has to start making decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which data structure fits this problem?&lt;/li&gt;
&lt;li&gt;Where does a loop make sense vs a function?&lt;/li&gt;
&lt;li&gt;What could go wrong and where do I hane it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gap between knowing and doing is where real learning lives.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Challenges Revealed
&lt;/h2&gt;

&lt;p&gt;The basics I thought I understood looked different under pressure. Stringing multiple concepts together in one solution, a function that reads a file, handles exceptions, processes a list and returns a result — exposed exactly which parts I actually understood and which parts I just recognised.&lt;/p&gt;

&lt;p&gt;Recognising syntax and writing working code from scratch are not the same thing. Today made that very clear.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for AI Automation
&lt;/h2&gt;

&lt;p&gt;Every Python automation script I will write from here will be a real life challenge. APIs fail. Data comes in messy. Logic needs to be airtight. Solving structured problems now is the exact training ground for writing automation scripts that actually work in production.&lt;/p&gt;




&lt;p&gt;Theory is done. The real work has started.&lt;/p&gt;

&lt;p&gt;54 more to go. &lt;/p&gt;

&lt;h1&gt;
  
  
  python #learninpublic #buildinpublic #ai #automation #100DaysOfCode
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Day 4 of 60 — and today I put the workflows down and picked up Python.</title>
      <dc:creator>Cess Mbugua</dc:creator>
      <pubDate>Tue, 05 May 2026 14:52:11 +0000</pubDate>
      <link>https://dev.to/mbugua_cessy/day-4-of-60-and-today-i-put-the-workflows-down-and-picked-up-python-48k6</link>
      <guid>https://dev.to/mbugua_cessy/day-4-of-60-and-today-i-put-the-workflows-down-and-picked-up-python-48k6</guid>
      <description>&lt;p&gt;No build today. Just fundamentals. And honestly? It humbled me in the best way.&lt;/p&gt;




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

&lt;p&gt;Every automation I've built so far has relied on no-code/low-code tools like n8n to handle the logic. But I kept hitting moments where I thought , &lt;em&gt;if I knew Python, I could do this faster, cleaner, and with more control.&lt;/em&gt; So I decided to fix that.&lt;/p&gt;

&lt;p&gt;And then I hit &lt;strong&gt;Exception Handling and File Handling&lt;/strong&gt;  and that's where things got real.&lt;/p&gt;

&lt;p&gt;For someone coming from a workflow automation background where errors are just red nodes on a canvas, handling them in raw code requires a completely different mental model.&lt;/p&gt;

&lt;p&gt;I'm not through it yet. But I'm in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for AI Automation
&lt;/h2&gt;

&lt;p&gt;Python is the backbone of serious AI integration work. Every API wrapper, every data transformation, every custom agent , it's Python underneath. Learning it properly now means the workflows I build from Day 10 onwards will be on a completely different level.&lt;/p&gt;




&lt;p&gt;No GitHub link today — just a honest study day documented publicly.&lt;/p&gt;

&lt;p&gt;This is what Day 4 looks like. Not every day is a finished product and that's okay.&lt;/p&gt;

&lt;p&gt;56 more to go. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devjournal</category>
      <category>learning</category>
      <category>python</category>
    </item>
  </channel>
</rss>
