<?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: Marin Pesa</title>
    <description>The latest articles on DEV Community by Marin Pesa (@marinpesa).</description>
    <link>https://dev.to/marinpesa</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%2F3870061%2Fc9c2744c-c850-4f50-b178-efacac2d570f.png</url>
      <title>DEV Community: Marin Pesa</title>
      <link>https://dev.to/marinpesa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marinpesa"/>
    <language>en</language>
    <item>
      <title>AI-Agent with Python and Gemini AI</title>
      <dc:creator>Marin Pesa</dc:creator>
      <pubDate>Thu, 09 Apr 2026 14:38:18 +0000</pubDate>
      <link>https://dev.to/marinpesa/ai-agent-with-python-and-gemini-ai-3d3e</link>
      <guid>https://dev.to/marinpesa/ai-agent-with-python-and-gemini-ai-3d3e</guid>
      <description>&lt;h1&gt;
  
  
  CONTENT:
&lt;/h1&gt;




&lt;p&gt;AI agents are everywhere in 2026 — OpenClaw, Claude Code, Cursor. But how do they actually work under the hood? I built one from scratch using Python and Google's Gemini API to find out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is an AI Agent (Really)?
&lt;/h2&gt;

&lt;p&gt;Strip away the hype: an AI agent is a loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while task_not_done:
    1. Send context to LLM
    2. LLM decides: respond OR call a tool
    3. If tool call → execute it, feed result back to LLM
    4. If response → done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The magic is in &lt;strong&gt;function calling&lt;/strong&gt; — the LLM doesn't just generate text, it generates structured tool calls that your code executes.&lt;/p&gt;

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

&lt;p&gt;An autonomous agent using the &lt;code&gt;google-genai&lt;/code&gt; SDK that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read files&lt;/strong&gt; from the local filesystem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write files&lt;/strong&gt; with generated content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run Python scripts&lt;/strong&gt; and capture output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chain multiple tools&lt;/strong&gt; in sequence to solve complex tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example interaction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "Read data.csv, analyze it, and write a summary to report.txt"

Agent: [calls get_file_content("data.csv")]
Agent: [analyzes the data]
Agent: [calls write_file("report.txt", "Summary: ...")]
Agent: "Done. I've analyzed the CSV and written the summary to report.txt."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent decides on its own which tools to use and in what order. No hardcoded workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Function Calling Works
&lt;/h2&gt;

&lt;p&gt;You define tools as Python functions with clear descriptions:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_file_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&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="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Read and return the content of a file at the given path.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_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;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&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;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&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;content&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="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Write content to a file at the given path.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_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;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&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;Successfully wrote to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_python_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&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="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Execute a Python file and return its output.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;result&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;file_path&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You pass these to the Gemini API as tool declarations. The model returns a &lt;code&gt;function_call&lt;/code&gt; object instead of text when it wants to use a tool. Your code executes the function, sends the result back, and the loop continues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Lessons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Absolute Paths Matter
&lt;/h3&gt;

&lt;p&gt;My biggest debugging headache: the agent would pass raw user input as file paths instead of resolving them to absolute paths first. A &lt;code&gt;resolve_path()&lt;/code&gt; utility function fixed hours of mysterious "file not found" errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Agent Loop Is Everything
&lt;/h3&gt;

&lt;p&gt;The core loop handles three states:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Model wants to call a tool&lt;/strong&gt; → execute it, feed result back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model generates text&lt;/strong&gt; → return to user&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model generates nothing&lt;/strong&gt; → something went wrong, break&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Getting this loop right is 80% of building an agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Prompts Shape Behavior
&lt;/h3&gt;

&lt;p&gt;The difference between a helpful agent and a chaotic one is the system prompt. Mine specifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Available tools and when to use them&lt;/li&gt;
&lt;li&gt;How to handle errors&lt;/li&gt;
&lt;li&gt;When to ask for clarification vs. just doing it&lt;/li&gt;
&lt;li&gt;Output format expectations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Boot.dev Module
&lt;/h2&gt;

&lt;p&gt;This project was part of Boot.dev's "AI Agents with Python" module. The course structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with raw API calls&lt;/li&gt;
&lt;li&gt;Add function declarations&lt;/li&gt;
&lt;li&gt;Build the agent loop&lt;/li&gt;
&lt;li&gt;Handle multi-step tool chains&lt;/li&gt;
&lt;li&gt;Add error handling and edge cases&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step builds on the last. By the end you understand exactly how tools like Claude Code work at the fundamental level — they're just this loop, scaled up with more tools and better prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Understanding how agents work from the inside out changes how you think about AI tooling. You stop being a consumer of agents and start being a builder. My next project — &lt;strong&gt;AutoApply&lt;/strong&gt; — uses this exact pattern at a larger scale: multiple agents orchestrated by Paperclip, each with their own tools, coordinating to automate job applications.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/marinpesa15/ai-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ai-agent
pip &lt;span class="nb"&gt;install &lt;/span&gt;google-genai
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOOGLE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key
python main.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;From sysadmin to AI developer — one project at a time. Building in public.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/marinpesa15/ai-agent" rel="noopener noreferrer"&gt;github.com/marinpesa15/ai-agent&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>gemini</category>
      <category>career</category>
    </item>
    <item>
      <title>First Pygame Project</title>
      <dc:creator>Marin Pesa</dc:creator>
      <pubDate>Thu, 09 Apr 2026 14:33:24 +0000</pubDate>
      <link>https://dev.to/marinpesa/first-pygame-project-3db7</link>
      <guid>https://dev.to/marinpesa/first-pygame-project-3db7</guid>
      <description>&lt;h1&gt;
  
  
  CONTENT:
&lt;/h1&gt;




&lt;p&gt;As part of my Python learning journey on &lt;a href="https://boot.dev" rel="noopener noreferrer"&gt;Boot.dev&lt;/a&gt;, I rebuilt the classic &lt;strong&gt;Asteroids&lt;/strong&gt; arcade game using Python and Pygame. It's one of those projects that looks simple on the surface but teaches you a surprising amount about real programming concepts.&lt;/p&gt;

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

&lt;p&gt;A fully playable Asteroids clone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spaceship you control with keyboard input&lt;/li&gt;
&lt;li&gt;Asteroids that split into smaller pieces when shot&lt;/li&gt;
&lt;li&gt;Collision detection between ship, bullets, and asteroids&lt;/li&gt;
&lt;li&gt;Screen wrapping (fly off one edge, appear on the other)&lt;/li&gt;
&lt;li&gt;Increasing difficulty as you progress&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Object-Oriented Programming — For Real
&lt;/h3&gt;

&lt;p&gt;This was the project where OOP clicked for me. Every game object — the ship, asteroids, bullets — is its own class with its own &lt;code&gt;update()&lt;/code&gt; and &lt;code&gt;draw()&lt;/code&gt; methods. Inheritance makes sense when your &lt;code&gt;Ship&lt;/code&gt;, &lt;code&gt;Asteroid&lt;/code&gt;, and &lt;code&gt;Shot&lt;/code&gt; all share a &lt;code&gt;CircleShape&lt;/code&gt; base class.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Game Loop
&lt;/h3&gt;

&lt;p&gt;Every game is the same pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Handle input&lt;/li&gt;
&lt;li&gt;Update game state&lt;/li&gt;
&lt;li&gt;Draw everything&lt;/li&gt;
&lt;li&gt;Repeat at 60 FPS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Understanding this loop is fundamental. It's the same pattern used in animation, simulation, and even some backend event loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vectors and Trigonometry
&lt;/h3&gt;

&lt;p&gt;Rotating a ship, calculating bullet trajectories, detecting circular collisions — it all comes down to basic vector math. Pygame's &lt;code&gt;Vector2&lt;/code&gt; made this manageable, but you still need to understand what &lt;code&gt;sin&lt;/code&gt;, &lt;code&gt;cos&lt;/code&gt;, and &lt;code&gt;atan2&lt;/code&gt; actually do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Collision Detection
&lt;/h3&gt;

&lt;p&gt;Checking if two circles overlap is easy (distance &amp;lt; sum of radii). But doing it efficiently for dozens of objects per frame? That's where you start thinking about performance and data structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Boot.dev Experience
&lt;/h2&gt;

&lt;p&gt;Boot.dev structures these projects well. You get a clear spec, build incrementally, and each step introduces a new concept. The Asteroids project specifically covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classes and inheritance&lt;/li&gt;
&lt;li&gt;Pygame basics&lt;/li&gt;
&lt;li&gt;Game loops and delta time&lt;/li&gt;
&lt;li&gt;User input handling&lt;/li&gt;
&lt;li&gt;Collision detection&lt;/li&gt;
&lt;li&gt;Spawning and destroying game objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anyone starting with Python and wanting a project that's more fun than a todo app — highly recommended.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/marinpesa15/asteroids.git
&lt;span class="nb"&gt;cd &lt;/span&gt;asteroids
pip &lt;span class="nb"&gt;install &lt;/span&gt;pygame
python main.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Part of my transition from IT sysadmin to Python developer. More projects coming — including an AI agent and a full automation platform.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/marinpesa15/asteroids" rel="noopener noreferrer"&gt;github.com/marinpesa15/asteroids&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pygame</category>
      <category>python</category>
      <category>bootdev</category>
      <category>career</category>
    </item>
    <item>
      <title>Automation for Applications</title>
      <dc:creator>Marin Pesa</dc:creator>
      <pubDate>Thu, 09 Apr 2026 14:32:04 +0000</pubDate>
      <link>https://dev.to/marinpesa/automation-for-applications-3pkf</link>
      <guid>https://dev.to/marinpesa/automation-for-applications-3pkf</guid>
      <description>&lt;h1&gt;
  
  
  CONTENT:
&lt;/h1&gt;




&lt;p&gt;I got tired of spending 45 minutes per job application — tailoring my CV, writing a cover letter, uploading the same PDFs over and over. So I'm building &lt;strong&gt;AutoApply&lt;/strong&gt;: an AI-powered system that does it all autonomously through browser automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;You give it a natural language prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Go to LinkedIn, search for Junior Python Developer jobs near Augsburg, and apply to all of them."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system takes over your browser, finds matching jobs, tailors your CV per job, generates a personalized cover letter, and submits the application — all through the actual web portal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paperclip&lt;/strong&gt; — Open-source multi-agent orchestrator. Manages all agents like a company: CEO delegates, specialists execute, you approve from a dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser Use&lt;/strong&gt; — Python framework for AI-driven browser automation. 89% success rate on the WebVoyager benchmark, 86k+ GitHub stars. This is the "muscle" that controls the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude API (Anthropic)&lt;/strong&gt; — Powers the cover letter generation, CV tailoring, and quality checks. Sonnet for writing, Haiku for cheap filtering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; — Each agent runs as a Python HTTP service that Paperclip calls via its HTTP adapter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WeasyPrint&lt;/strong&gt; — Renders tailored CVs and cover letters as clean PDFs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────┐
│           PAPERCLIP ORCHESTRATOR             │
│                                              │
│  You (Board) ──approves──▶ CEO Agent         │
│                               │              │
│     ┌──────┬──────┬──────┬────┴────┐         │
│     ▼      ▼      ▼      ▼        ▼         │
│  Scout  Filter  Tailor  Letter  Applicant    │
│  (Browser (Haiku) (Sonnet)(Sonnet)(Browser   │
│   Use)                            Use)       │
└──────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The 7 Agents
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CEO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Breaks down your prompt, delegates tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Job Scout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No LLM&lt;/td&gt;
&lt;td&gt;Browser Use searches LinkedIn, extracts job data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pre-Filter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;td&gt;Checks if the job matches your profile (~$0.001/job)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CV Tailor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Reweights skills, injects keywords, generates PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cover Letter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Writes a personalized letter using the tailored CV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;QA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;td&gt;Checks CV ↔ letter consistency, no hallucinations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Applicant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No LLM&lt;/td&gt;
&lt;td&gt;Browser Use fills forms, uploads docs, submits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only 3 out of 7 agents need Claude tokens. Total cost: &lt;strong&gt;~$1/day for 10 applications.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CV Tailoring ≠ CV Fabrication
&lt;/h3&gt;

&lt;p&gt;The CV Tailor works from a structured &lt;code&gt;master_cv.json&lt;/code&gt;. It reweights, reorders, and rephrases — but &lt;strong&gt;never invents&lt;/strong&gt; skills or experience. The QA agent compares the tailored version against the master and flags any deviation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Human-in-the-Loop
&lt;/h3&gt;

&lt;p&gt;Two operating modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supervised&lt;/strong&gt; — Browser is visible. Agent pauses on CAPTCHAs, unknown form fields, or external portals. You step in, solve it, agent continues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous&lt;/strong&gt; — Headless browser. Problems get logged as FAILED and skipped. For when you trust the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fail Gracefully
&lt;/h3&gt;

&lt;p&gt;Not every job can be applied to automatically. The system recognizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No apply button → FAILED&lt;/li&gt;
&lt;li&gt;External portal redirect → FAILED&lt;/li&gt;
&lt;li&gt;CAPTCHA → WAITING_HUMAN (supervised) or FAILED (autonomous)&lt;/li&gt;
&lt;li&gt;Page 404 → FAILED&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Failed jobs get logged with a reason. No silent failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Status Model
&lt;/h2&gt;

&lt;p&gt;Every job goes through a clear pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FOUND → CV_READY → LETTER_READY → QA_PASSED → APPROVED → IN_PROGRESS → APPLIED
                                                                      → WAITING_HUMAN
                                                                      → FAILED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Currently in Sprint 0 — setting up Paperclip, building the FastAPI skeleton, and wiring the HTTP adapters. Planning 6 one-week sprints to MVP.&lt;/p&gt;

&lt;p&gt;The repo will be public once we have a working prototype. If you're interested in the project or want to contribute, drop a comment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Python, Paperclip, Browser Use, and Claude API. Two developers, 6 weeks, one mission: never write another cover letter by hand.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/marinpesa15" rel="noopener noreferrer"&gt;github.com/marinpesa15&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
