<?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: Sospeter Mong'are</title>
    <description>The latest articles on DEV Community by Sospeter Mong'are (@msnmongare).</description>
    <link>https://dev.to/msnmongare</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F117091%2F89122cee-2645-481e-b979-f96819dc9d1b.jpeg</url>
      <title>DEV Community: Sospeter Mong'are</title>
      <link>https://dev.to/msnmongare</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/msnmongare"/>
    <language>en</language>
    <item>
      <title>Stop Trading Time for Money: A Software Engineer's Guide to Building Wealth Through Code</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Fri, 31 Jul 2026 08:02:30 +0000</pubDate>
      <link>https://dev.to/msnmongare/stop-trading-time-for-money-a-software-engineers-guide-to-building-wealth-through-code-90n</link>
      <guid>https://dev.to/msnmongare/stop-trading-time-for-money-a-software-engineers-guide-to-building-wealth-through-code-90n</guid>
      <description>&lt;p&gt;One piece of advice every software engineer should think about is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Figure out how to use your skills to make money, not just trade time for money."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first, it sounds like someone is saying jobs are bad. That's not the point.&lt;/p&gt;

&lt;p&gt;The real message is about leverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Difference Between Working &lt;em&gt;In&lt;/em&gt; Software and Building With Software
&lt;/h2&gt;

&lt;p&gt;Most developers begin their careers by trading time for money.&lt;/p&gt;

&lt;p&gt;You write code for a company, complete freelance projects, or work as a consultant. Your income depends on the number of hours you work.&lt;/p&gt;

&lt;p&gt;There is absolutely nothing wrong with this. In fact, it's how most successful engineers develop their skills, gain experience, and build financial stability.&lt;/p&gt;

&lt;p&gt;The limitation is simple: if you stop working, the income usually stops too.&lt;/p&gt;

&lt;p&gt;Now imagine a different model.&lt;/p&gt;

&lt;p&gt;Instead of building the same solution repeatedly for different clients, you build it once and allow hundreds or even thousands of customers to use it.&lt;/p&gt;

&lt;p&gt;That's leverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  You're Not Just a Developer. You're a Problem Solver.
&lt;/h2&gt;

&lt;p&gt;One of the biggest mistakes software engineers make is believing their value lies in writing code.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;Your real value lies in understanding problems well enough to build solutions that people are willing to pay for.&lt;/p&gt;

&lt;p&gt;The code is simply the tool.&lt;/p&gt;

&lt;p&gt;Every project you've worked on has exposed you to problems that businesses struggle with every day.&lt;/p&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What tasks do companies repeat constantly?&lt;/li&gt;
&lt;li&gt;What processes waste the most time?&lt;/li&gt;
&lt;li&gt;What integrations are always painful?&lt;/li&gt;
&lt;li&gt;What manual work could be automated?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are business opportunities disguised as technical problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Productize What You Already Know
&lt;/h2&gt;

&lt;p&gt;Many developers chase the next trendy idea when their biggest opportunity is hiding in the work they're already doing.&lt;/p&gt;

&lt;p&gt;Suppose you've built payment integrations for multiple companies.&lt;/p&gt;

&lt;p&gt;Instead of manually implementing the same integrations over and over, you could build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A unified payments API&lt;/li&gt;
&lt;li&gt;A webhook management platform&lt;/li&gt;
&lt;li&gt;A payment reconciliation tool&lt;/li&gt;
&lt;li&gt;A payment testing environment&lt;/li&gt;
&lt;li&gt;A subscription billing platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than getting paid once for every integration, you create a product that many businesses can subscribe to.&lt;/p&gt;

&lt;p&gt;The same principle applies across every industry.&lt;/p&gt;

&lt;p&gt;If you've solved a problem more than three times, there's a good chance that problem deserves a product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Software That Works While You Sleep
&lt;/h2&gt;

&lt;p&gt;The beauty of software is that it scales.&lt;/p&gt;

&lt;p&gt;Imagine you've built an inventory management system for a retail shop.&lt;/p&gt;

&lt;p&gt;If you sell it as custom software, every new client requires another implementation, customization, and deployment.&lt;/p&gt;

&lt;p&gt;But if you build it as a cloud-based SaaS platform, every new retailer simply signs up, configures their business, and starts paying a monthly subscription.&lt;/p&gt;

&lt;p&gt;The same product serves hundreds or thousands of businesses with minimal additional effort from you.&lt;/p&gt;

&lt;p&gt;That's the power of recurring revenue.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How much should I charge for this project?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How many businesses have this problem?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Developers Have More Opportunities Than Ever
&lt;/h2&gt;

&lt;p&gt;Today's software engineers can build businesses around almost any technical skill. Here are a few examples:&lt;/p&gt;

&lt;h3&gt;
  
  
  SaaS Applications
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Inventory Management System&lt;/li&gt;
&lt;li&gt;Property Management Platform&lt;/li&gt;
&lt;li&gt;School Management System&lt;/li&gt;
&lt;li&gt;HR &amp;amp; Payroll Software&lt;/li&gt;
&lt;li&gt;Appointment Booking Platform&lt;/li&gt;
&lt;li&gt;CRM for SMEs&lt;/li&gt;
&lt;li&gt;Restaurant POS System&lt;/li&gt;
&lt;li&gt;Hotel Management Software&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  APIs for Developers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Payment Aggregation API&lt;/li&gt;
&lt;li&gt;SMS &amp;amp; Email API&lt;/li&gt;
&lt;li&gt;WhatsApp Messaging API&lt;/li&gt;
&lt;li&gt;Identity Verification API&lt;/li&gt;
&lt;li&gt;Currency Exchange API&lt;/li&gt;
&lt;li&gt;Address Validation API&lt;/li&gt;
&lt;li&gt;Document Generation API&lt;/li&gt;
&lt;li&gt;Authentication &amp;amp; Single Sign-On API&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automation Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Invoice Processing Automation&lt;/li&gt;
&lt;li&gt;Employee Onboarding Automation&lt;/li&gt;
&lt;li&gt;Approval Workflow System&lt;/li&gt;
&lt;li&gt;Procurement Automation&lt;/li&gt;
&lt;li&gt;Customer Support Workflow Automation&lt;/li&gt;
&lt;li&gt;Marketing Campaign Automation&lt;/li&gt;
&lt;li&gt;Data Synchronization Platform&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI-Powered Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI Customer Support Assistant&lt;/li&gt;
&lt;li&gt;AI Resume Screening Platform&lt;/li&gt;
&lt;li&gt;AI Meeting Notes Generator&lt;/li&gt;
&lt;li&gt;AI Document Search &amp;amp; Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;AI Contract Analysis Tool&lt;/li&gt;
&lt;li&gt;AI Sales Assistant&lt;/li&gt;
&lt;li&gt;AI Knowledge Base Assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Developer Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API Testing Platform&lt;/li&gt;
&lt;li&gt;Error Monitoring Service&lt;/li&gt;
&lt;li&gt;Database Migration Tool&lt;/li&gt;
&lt;li&gt;CI/CD Deployment Platform&lt;/li&gt;
&lt;li&gt;Log Management System&lt;/li&gt;
&lt;li&gt;Feature Flag Service&lt;/li&gt;
&lt;li&gt;Code Quality Analyzer&lt;/li&gt;
&lt;li&gt;API Documentation Generator&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Industry-Specific Software
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Healthcare Clinic Management&lt;/li&gt;
&lt;li&gt;Insurance Claims Platform&lt;/li&gt;
&lt;li&gt;Construction Project Management&lt;/li&gt;
&lt;li&gt;Agriculture Farm Management&lt;/li&gt;
&lt;li&gt;Logistics &amp;amp; Fleet Tracking&lt;/li&gt;
&lt;li&gt;Manufacturing ERP&lt;/li&gt;
&lt;li&gt;Legal Case Management&lt;/li&gt;
&lt;li&gt;Sacco Management System&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integration Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ERP Integration Hub&lt;/li&gt;
&lt;li&gt;CRM Integration Platform&lt;/li&gt;
&lt;li&gt;Accounting Software Connectors&lt;/li&gt;
&lt;li&gt;E-commerce Integration Platform&lt;/li&gt;
&lt;li&gt;Data Synchronization Engine&lt;/li&gt;
&lt;li&gt;Enterprise API Gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monitoring &amp;amp; Security Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API Monitoring Dashboard&lt;/li&gt;
&lt;li&gt;Uptime Monitoring Service&lt;/li&gt;
&lt;li&gt;Security Vulnerability Scanner&lt;/li&gt;
&lt;li&gt;Audit Logging Platform&lt;/li&gt;
&lt;li&gt;Fraud Detection System&lt;/li&gt;
&lt;li&gt;Access Management Platform&lt;/li&gt;
&lt;li&gt;Compliance Monitoring Dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The internet has made it possible for a single engineer to serve customers across the world.&lt;/p&gt;

&lt;p&gt;You no longer need thousands of employees to build a successful software company.&lt;/p&gt;

&lt;p&gt;Sometimes, all you need is one valuable product solving one painful problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Job Is Not the Enemy
&lt;/h2&gt;

&lt;p&gt;There's a common misconception that every developer should quit their job and become an entrepreneur.&lt;/p&gt;

&lt;p&gt;That's terrible advice for most people.&lt;/p&gt;

&lt;p&gt;Your job provides more than a salary.&lt;/p&gt;

&lt;p&gt;It gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-world experience&lt;/li&gt;
&lt;li&gt;Access to business problems&lt;/li&gt;
&lt;li&gt;Industry knowledge&lt;/li&gt;
&lt;li&gt;Professional relationships&lt;/li&gt;
&lt;li&gt;Capital to invest in your own ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of your job as a paid research lab.&lt;/p&gt;

&lt;p&gt;Pay attention to the frustrations customers repeatedly face.&lt;/p&gt;

&lt;p&gt;Observe the repetitive work your team performs.&lt;/p&gt;

&lt;p&gt;Listen to the complaints people make every day.&lt;/p&gt;

&lt;p&gt;Hidden inside those frustrations are business opportunities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think Like a Business Owner
&lt;/h2&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What app should I build?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What expensive problem can I solve repeatedly?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"How do I get more freelance clients?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Can I build a product that hundreds of clients can use?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What programming language should I learn next?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What industry do I understand well enough to improve with software?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions lead to businesses, not just careers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Journey
&lt;/h2&gt;

&lt;p&gt;Most successful software entrepreneurs don't start by building billion-dollar companies.&lt;/p&gt;

&lt;p&gt;They start by solving one real problem.&lt;/p&gt;

&lt;p&gt;Then they solve it again.&lt;/p&gt;

&lt;p&gt;Then they turn that solution into a product.&lt;/p&gt;

&lt;p&gt;The journey often looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer → Problem Solver → Product Builder → Business Owner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal isn't to stop trading time for money overnight.&lt;/p&gt;

&lt;p&gt;The goal is to gradually build assets that generate value beyond your own working hours.&lt;/p&gt;

&lt;p&gt;Because the most powerful thing about being a software engineer isn't your ability to write code.&lt;/p&gt;

&lt;p&gt;It's your ability to create systems that continue delivering value long after you've finished writing them.&lt;/p&gt;

</description>
      <category>software</category>
      <category>softwareengineering</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Your AI Agent Is Not an Engineer</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Mon, 27 Jul 2026 08:44:59 +0000</pubDate>
      <link>https://dev.to/msnmongare/your-ai-agent-is-not-an-engineer-435k</link>
      <guid>https://dev.to/msnmongare/your-ai-agent-is-not-an-engineer-435k</guid>
      <description>&lt;h3&gt;
  
  
  Building Reliable Software in the Age of Agentic Coding
&lt;/h3&gt;

&lt;p&gt;A few weeks into using coding agents seriously, not for autocomplete, but for actually driving multi-file changes, wiring up integrations, standing up agent pipelines, I noticed a pattern. The code that came out looked right. It compiled, it ran, the demo worked. And then, days later, something broke in a way that made it obvious the agent had never actually understood the system it was working in. It had pattern-matched its way to a plausible-looking answer.&lt;/p&gt;

&lt;p&gt;That's the core thing to internalize: a coding agent is a very good pattern completer, not an engineer. Engineers hold intent, constraints, failure modes, and tradeoffs in their heads at the same time. Agents hold a context window. Confusing the two is where reliability problems start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What coding agents are actually good at
&lt;/h2&gt;

&lt;p&gt;To be fair to the tools, they've earned their place in the workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Boilerplate and scaffolding.&lt;/strong&gt; CRUD endpoints, config files, test skeletons, repetitive glue code across a codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translating a clear spec into a first draft.&lt;/strong&gt; If you can describe the shape of what you want precisely, an agent will get you 80% of the way there fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working across unfamiliar syntax.&lt;/strong&gt; An agent that's seen a thousand times more Terraform or SQL dialects than you have can save real research time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mechanical refactors.&lt;/strong&gt; Rename this across 40 files, migrate this API surface, update this dependency's usage pattern everywhere it appears.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are real productivity gains. The mistake is extrapolating from "good at boilerplate" to "can be trusted with architecture."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where they fail
&lt;/h2&gt;

&lt;p&gt;The failures aren't random, they cluster in predictable places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Silent scope narrowing.&lt;/strong&gt; Ask an agent to "handle errors properly" and it will handle the errors it can see in the current file, not the ones three layers up the call stack that your actual production traffic hits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confident wrongness.&lt;/strong&gt; Agents don't have a strong signal for "I'm not sure." They'll write a Daraja API callback handler that looks idiomatic and is subtly wrong about idempotency, with the same confidence as one that's correct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local optimization, global blindness.&lt;/strong&gt; An agent fixing a bug in one service has no model of the three other services that depend on the behavior it just changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security as an afterthought.&lt;/strong&gt; Left to their own devices, agents will happily hardcode a secret, skip input validation, or generate SQL that's one crafted string away from an injection, because none of that breaks the immediate task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test theater.&lt;/strong&gt; Agents will write tests that pass, sometimes because they wrote the test to match the implementation's actual (wrong) behavior rather than the intended one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is a knock on the tools. It's what you'd expect from a system optimizing for "produce plausible next tokens" rather than "hold this system accountable over time."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why fundamentals matter more, not less
&lt;/h2&gt;

&lt;p&gt;The tempting narrative is that agentic coding makes engineering fundamentals less relevant, that if the AI writes the code, you don't need to understand it as deeply. The opposite is true.&lt;/p&gt;

&lt;p&gt;When you're the one writing every line, your understanding is forced on you by the act of typing it. When an agent writes it, understanding becomes optional, and skipping it is exactly how systems accumulate debt nobody can explain later. The engineer's job shifts from &lt;em&gt;writing&lt;/em&gt; correct code to &lt;em&gt;specifying, verifying, and bounding&lt;/em&gt; correct code. That's arguably a harder skill, not an easier one. It requires the same grounding in data modeling, failure modes, concurrency, and system boundaries, just applied at review time instead of write time.&lt;/p&gt;

&lt;p&gt;If you don't already know what a race condition looks like, you won't catch one in a 400-line diff an agent generated in nine seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context management
&lt;/h2&gt;

&lt;p&gt;Most agent failures I've traced back aren't reasoning failures, they're context failures. The agent didn't have the right information in front of it, so it filled the gap with something plausible.&lt;/p&gt;

&lt;p&gt;Practical habits that help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the agent's working context scoped to the smallest slice of the system that's actually relevant. A bloated context window doesn't mean better decisions, it often means diluted attention.&lt;/li&gt;
&lt;li&gt;Externalize constraints instead of assuming they're inferred: rate limits, idempotency requirements, data retention rules, compliance boundaries. Say them explicitly, every time, rather than trusting the agent remembers them from three turns ago.&lt;/li&gt;
&lt;li&gt;Treat the agent's memory of your codebase as a snapshot, not a live view. If you changed something in another session, don't assume it knows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing AI-generated code
&lt;/h2&gt;

&lt;p&gt;Agent-written code needs a different testing posture than human-written code, because the failure distribution is different. Where a human engineer tends to make errors of omission under time pressure, an agent tends to make errors of &lt;em&gt;false confidence&lt;/em&gt;, it will implement something that looks complete but quietly diverges from the spec.&lt;/p&gt;

&lt;p&gt;That argues for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing the test cases yourself, or at minimum reviewing them line by line, rather than letting the agent write both the implementation and its own tests.&lt;/li&gt;
&lt;li&gt;Testing the boundaries the agent wasn't explicitly told about, the empty list, the network timeout, the malformed webhook payload, since those are exactly where pattern-completion breaks down.&lt;/li&gt;
&lt;li&gt;Running generated code against real, messy data before trusting it against clean fixtures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security risks
&lt;/h2&gt;

&lt;p&gt;Agentic coding introduces a security surface that didn't exist five years ago, and it's not hypothetical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Secrets leakage.&lt;/strong&gt; Agents pulling credentials into logs, commits, or prompts they shouldn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency sprawl.&lt;/strong&gt; An agent reaching for a package to solve a small problem, without anyone evaluating its maintenance status or supply-chain risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Injection through generated code.&lt;/strong&gt; String-built queries, unsanitized inputs, permissive CORS, the classic mistakes, just produced faster and in more places at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection in agent pipelines.&lt;/strong&gt; If your agent reads external content (a webpage, a customer message, a file) as part of its task, that content can carry instructions the agent will follow unless you've explicitly hardened against it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is solved by "the agent is usually careful." It's solved by treating every agent-touched surface as untrusted until reviewed, the same discipline you'd apply to a contributor you'd never met.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reviewing agent decisions
&lt;/h2&gt;

&lt;p&gt;Code review of agent output has to be different from code review of a colleague's PR, because the failure mode is different. A colleague's mistake usually comes with a reasoning trail you can interrogate. An agent's mistake often doesn't, it just produced the output.&lt;/p&gt;

&lt;p&gt;That means review has to reconstruct the "why," not just check the "what":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask the agent to explain its reasoning &lt;em&gt;before&lt;/em&gt; accepting a nontrivial change, and read the explanation critically, not as a formality.&lt;/li&gt;
&lt;li&gt;Diff against intent, not just against the previous version. Does this change actually do what was asked, or does it do something adjacent that happens to pass the visible tests?&lt;/li&gt;
&lt;li&gt;Be especially suspicious of changes that touch more files than the task seemed to require. That's often where an agent "helpfully" over-scoped.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keeping humans in control
&lt;/h2&gt;

&lt;p&gt;The workflows that hold up under real production load share a shape: agents propose, humans dispose. Concretely, that looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents work in tightly scoped tasks with clear, checkable success criteria, not open-ended "improve this system" mandates.&lt;/li&gt;
&lt;li&gt;Every agent-generated change goes through the same review gates as human-generated change, with no shortcut for "the AI wrote it so it's probably fine."&lt;/li&gt;
&lt;li&gt;Irreversible or high-blast-radius actions, deployments, schema migrations, anything touching payments or customer data, require an explicit human approval step, not just an agent's self-assessed confidence.&lt;/li&gt;
&lt;li&gt;Someone on the team remains accountable for understanding the system end to end, even if they didn't type most of the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Coding agents are a genuine force multiplier for the parts of engineering that were always mechanical. They are not a substitute for the parts that were never mechanical: judgment about tradeoffs, understanding of failure modes, and accountability for what ships. Building reliable software with agentic tools doesn't mean trusting them more as they get better. It means getting sharper about exactly where the boundary of their competence sits, and refusing to let that boundary quietly drift because the code that came out looked right.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>agents</category>
      <category>ai</category>
      <category>software</category>
    </item>
    <item>
      <title>How to Check Whether Your Git Branch Is Up to Date With QA, Master, and Your Remote Branch</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:31:15 +0000</pubDate>
      <link>https://dev.to/msnmongare/how-to-check-whether-your-git-branch-is-up-to-date-with-qa-master-and-your-remote-branch-5253</link>
      <guid>https://dev.to/msnmongare/how-to-check-whether-your-git-branch-is-up-to-date-with-qa-master-and-your-remote-branch-5253</guid>
      <description>&lt;p&gt;When working with Git in a team environment, especially with a workflow such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature branch -&amp;gt; qa -&amp;gt; master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it is important to know whether your branch is up to date before creating or completing a Pull Request.&lt;/p&gt;

&lt;p&gt;A common mistake is assuming that this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your branch is up to date with 'origin/feature/smongare'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means your branch is also up to date with &lt;code&gt;qa&lt;/code&gt; and &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;That message only confirms that your &lt;strong&gt;local feature branch&lt;/strong&gt; is synchronized with its &lt;strong&gt;remote feature branch&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's look at how to properly check everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Understanding Local and Remote Branches
&lt;/h2&gt;

&lt;p&gt;Suppose you have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/smongare
qa
master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your local repository may look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/smongare
qa
master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the remote repository has separate branches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;origin/feature/smongare
origin/qa
origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can visualize the relationship like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Local Repository                 Remote Repository

feature/smongare  &amp;lt;----------&amp;gt;  origin/feature/smongare
qa                &amp;lt;----------&amp;gt;  origin/qa
master            &amp;lt;----------&amp;gt;  origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your local branches may not automatically know about the latest changes made remotely.&lt;/p&gt;

&lt;p&gt;That is why the first step is always to fetch the latest information.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Fetch the Latest Changes
&lt;/h2&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does not modify your working files or merge anything into your current branch.&lt;/p&gt;

&lt;p&gt;It simply updates your local knowledge of the remote branches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;origin/feature/smongare
origin/qa
origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;your Git repository knows the latest commit positions of the remote branches.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Check Whether Your Feature Branch Is Up to Date With QA
&lt;/h2&gt;

&lt;p&gt;Suppose you are currently on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/qa...feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3 commits  -&amp;gt; exist in QA but not in your feature branch
5 commits  -&amp;gt; exist in your feature branch but not in QA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QA:               A - B - C - D - E
                         \
Feature Branch:          F - G - H - I - J
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your feature branch is missing 3 commits from &lt;code&gt;qa&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You should probably bring the latest changes from &lt;code&gt;qa&lt;/code&gt; into your feature branch before completing your PR.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Understanding the Output
&lt;/h2&gt;

&lt;p&gt;The command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/qa...feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns two numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;commits in QA&amp;gt; &amp;lt;commits in feature branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Result:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your feature branch contains everything currently in &lt;code&gt;qa&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Your feature branch has 5 additional commits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QA:      0 missing commits
Feature: 5 additional commits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is generally what you expect when developing a feature.&lt;/p&gt;




&lt;h3&gt;
  
  
  Result:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your feature branch is behind &lt;code&gt;qa&lt;/code&gt; by 3 commits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QA:      3 commits your branch does not have
Feature: 5 commits QA does not have
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should consider updating your feature branch.&lt;/p&gt;




&lt;h3&gt;
  
  
  Result:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your feature branch is behind &lt;code&gt;qa&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It has no commits that are not already in &lt;code&gt;qa&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Check Your Feature Branch Against Master
&lt;/h2&gt;

&lt;p&gt;You can perform the same check against &lt;code&gt;master&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/master...feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means your feature branch contains all commits currently in &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, if your Pull Request is targeting &lt;code&gt;qa&lt;/code&gt;, then &lt;code&gt;qa&lt;/code&gt; is the more important branch to check before completing the PR.&lt;/p&gt;

&lt;p&gt;Your typical workflow might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/smongare
        |
        v
       QA
        |
        v
     MASTER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before PR to QA:
Check feature/smongare against qa

Before PR to master:
Check qa against master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Check Whether Your Local Feature Branch Matches the Remote Feature Branch
&lt;/h2&gt;

&lt;p&gt;Your &lt;code&gt;git status&lt;/code&gt; already tells you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your branch is up to date with 'origin/feature/smongare'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Local feature/smongare
        =
Remote origin/feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also verify it manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/feature/smongare...feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then both branches are identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. See the Actual Commits Missing From Your Feature Branch
&lt;/h2&gt;

&lt;p&gt;Numbers are useful, but sometimes you want to see the actual commits.&lt;/p&gt;

&lt;p&gt;To see commits that exist in &lt;code&gt;qa&lt;/code&gt; but not in your feature branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; feature/smongare..origin/qa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a1b2c3d Fix Airflow connection
e4f5g6h Update dbt configuration
i7j8k9l Add new environment variables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are commits that your feature branch does not currently contain.&lt;/p&gt;

&lt;p&gt;To see commits in &lt;code&gt;master&lt;/code&gt; that your feature branch does not have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; feature/smongare..origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see commits in your feature branch that are not in &lt;code&gt;qa&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; origin/qa..feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. A Complete Check for All Branches
&lt;/h2&gt;

&lt;p&gt;You can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch origin

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Compared with QA:"&lt;/span&gt;
git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/qa...feature/smongare

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Compared with MASTER:"&lt;/span&gt;
git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/master...feature/smongare

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Compared with remote feature branch:"&lt;/span&gt;
git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/feature/smongare...feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compared with QA:
0 5

Compared with MASTER:
0 5

Compared with remote feature branch:
0 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your feature branch contains all the latest changes from &lt;code&gt;qa&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your feature branch contains all the latest changes from &lt;code&gt;master&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your local feature branch is identical to the remote feature branch&lt;/li&gt;
&lt;li&gt;Your feature branch has 5 commits that have not yet been merged into &lt;code&gt;qa&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. The Most Important Check Before a PR
&lt;/h2&gt;

&lt;p&gt;Suppose your Pull Request is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/smongare -&amp;gt; qa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important thing is to ensure that your branch works with the latest version of &lt;code&gt;qa&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can merge the latest &lt;code&gt;qa&lt;/code&gt; changes into your feature branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch origin

git checkout feature/smongare

git merge origin/qa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Git reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Already up to date.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then your feature branch already contains the latest changes from &lt;code&gt;qa&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If there are conflicts, Git will show them.&lt;/p&gt;

&lt;p&gt;You can then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Resolve the conflicts&lt;/li&gt;
&lt;li&gt;Stage the resolved files
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Complete the merge
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Push the updated feature branch
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your Azure DevOps Pull Request will then be updated with the latest changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Key Lesson
&lt;/h2&gt;

&lt;p&gt;This:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your branch is up to date with 'origin/feature/smongare'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;only tells you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local feature branch = remote feature branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; tell you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature branch = qa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature branch = master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To properly check your branch relationships:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then compare branches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/qa...feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rev-list &lt;span class="nt"&gt;--left-right&lt;/span&gt; &lt;span class="nt"&gt;--count&lt;/span&gt; origin/master...feature/smongare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And before completing a Pull Request to &lt;code&gt;qa&lt;/code&gt;, the safest approach is usually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge origin/qa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the simplest ways to discover potential conflicts before Azure DevOps blocks or complicates your Pull Request.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Airflow 3 Simple Auth Manager</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Wed, 15 Jul 2026 10:03:46 +0000</pubDate>
      <link>https://dev.to/msnmongare/airflow-3-simple-auth-manager-19k3</link>
      <guid>https://dev.to/msnmongare/airflow-3-simple-auth-manager-19k3</guid>
      <description>&lt;p&gt;If you've recently upgraded to &lt;a href="https://airflow.apache.org/" rel="noopener noreferrer"&gt;Apache Airflow&lt;/a&gt; 3 and logged into the webserver, you may have noticed something different about how login and permissions work. Gone is the Flask-AppBuilder (FAB) based login system that powered Airflow 2. In its place is the &lt;strong&gt;Simple Auth Manager&lt;/strong&gt;, the new default authentication and authorization system for Airflow 3.&lt;/p&gt;

&lt;p&gt;This guide explains what Apache Airflow is for readers who are new to it, what an auth manager does, how the Simple Auth Manager works, how to configure it, and what you need to know before relying on it, especially in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Apache Airflow?
&lt;/h2&gt;

&lt;p&gt;If you're brand new to Airflow, here's the short version: &lt;a href="https://airflow.apache.org/" rel="noopener noreferrer"&gt;Apache Airflow&lt;/a&gt; is an open-source platform used to author, schedule, and monitor workflows. A "workflow" in Airflow is called a &lt;strong&gt;DAG&lt;/strong&gt; (Directed Acyclic Graph), which is essentially a series of tasks with dependencies between them, written as Python code. Data engineers commonly use Airflow to orchestrate things like ETL pipelines, machine learning training jobs, and routine data syncs between systems.&lt;/p&gt;

&lt;p&gt;Because Airflow has a web-based UI where you can view, trigger, and monitor these workflows, it needs a way to control who can log in and what they're allowed to do once they're in. That's where an &lt;strong&gt;auth manager&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is an Auth Manager?
&lt;/h2&gt;

&lt;p&gt;An auth manager is the component in Airflow responsible for two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; — verifying who a user is (usually via username and password, or an external identity provider)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorization&lt;/strong&gt; — determining what that user is allowed to see and do once logged in&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Airflow's auth manager system is pluggable, meaning you can swap in different implementations depending on your needs. You could use one built around your company's identity provider, for example, or write a custom one. The &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/auth-manager/index.html" rel="noopener noreferrer"&gt;Auth Manager documentation&lt;/a&gt; covers the full interface and the available options.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is the Simple Auth Manager?
&lt;/h2&gt;

&lt;p&gt;The Simple Auth Manager is the auth manager that comes by default in Airflow 3. As its name suggests, its logic and implementation are intentionally simple. It replaces FabAuthManager, the default in Airflow 2, as part of a broader effort to remove the FAB dependency from Airflow's core and make the authentication layer pluggable.&lt;/p&gt;

&lt;p&gt;The intended usage of the Simple Auth Manager is only for development and testing purposes, and &lt;strong&gt;it should not be used in production&lt;/strong&gt;. It's deliberately limited in scope: it doesn't support flexible role definitions or custom mappings between roles and capabilities. If you need a production-grade authentication setup, Airflow supports other pluggable auth managers, including ones built around cloud identity providers, and you can write your own using the &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/auth-manager/index.html#writing-your-own-auth-manager" rel="noopener noreferrer"&gt;auth manager interface&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The full official reference for this feature lives in the &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/auth-manager/simple/index.html" rel="noopener noreferrer"&gt;Simple Auth Manager documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How User Management Works
&lt;/h2&gt;

&lt;p&gt;Unlike FAB, which stored users and roles in Airflow's metadata database, the Simple Auth Manager is fully config-controlled and doesn't touch the database at all. Users are defined directly in your &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html" rel="noopener noreferrer"&gt;Airflow configuration file&lt;/a&gt; (&lt;code&gt;airflow.cfg&lt;/code&gt;), or via environment variables.&lt;/p&gt;

&lt;p&gt;Here's the basic format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[core]&lt;/span&gt;
&lt;span class="py"&gt;simple_auth_manager_users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bob:admin,peter:viewer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The list of users is comma-separated, and each user is a username/role pair separated by a colon. In the example above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;bob&lt;/strong&gt; is assigned the &lt;strong&gt;admin&lt;/strong&gt; role&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;peter&lt;/strong&gt; is assigned the &lt;strong&gt;viewer&lt;/strong&gt; role&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Passwords Are Auto-Generated
&lt;/h3&gt;

&lt;p&gt;You'll notice the configuration only specifies usernames and roles, not passwords. That's intentional. Passwords are auto-generated for each user and printed in the webserver logs. Once generated, they're saved to a file set by &lt;code&gt;core.simple_auth_manager_passwords_file&lt;/code&gt;, which defaults to &lt;code&gt;$AIRFLOW_HOME/simple_auth_manager_passwords.json.generated&lt;/code&gt;. You can open that file and read (or manually update) the passwords if needed.&lt;/p&gt;

&lt;p&gt;If you're running Airflow through &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/start.html" rel="noopener noreferrer"&gt;Breeze&lt;/a&gt; (Airflow's local development environment) for local development, two users come predefined out of the box: &lt;code&gt;admin&lt;/code&gt; and &lt;code&gt;viewer&lt;/code&gt;, each with a password matching their username.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A common gotcha:&lt;/strong&gt; setting environment variables like &lt;code&gt;AIRFLOW__SIMPLE_AUTH_MANAGER__USERNAME&lt;/code&gt; and &lt;code&gt;PASSWORD&lt;/code&gt; won't reliably let you pre-seed a specific password. Since Airflow generates a random password on startup by default, this trips up a lot of people trying to force a known password this way. If you need deterministic credentials, editing the generated passwords file directly after startup is currently the more dependable route.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roles and Permissions
&lt;/h2&gt;

&lt;p&gt;The Simple Auth Manager doesn't let you create custom roles or fine-tune permission mappings. There's no option to manage roles and permissions; they're defined as part of the implementation and can't be modified. There are four fixed roles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Permissions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Viewer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read-only access to Dags, assets, and pools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Viewer permissions, plus full edit, create, and delete permissions on Dags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Op&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User permissions, plus full permissions on pools, assets, config, connections, and variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Admin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is a deliberate tradeoff. Rather than giving you the granular role-based access control (RBAC) that FAB offered, the Simple Auth Manager sticks to four broad tiers that are easy to reason about and hard to misconfigure, at the cost of flexibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Team Support
&lt;/h2&gt;

&lt;p&gt;If you're running Airflow for multiple teams sharing a single environment, the Simple Auth Manager supports basic team-based resource isolation. When &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/multi-team.html" rel="noopener noreferrer"&gt;multi-team mode&lt;/a&gt; is enabled, users can be associated with one or more teams, and teams restrict which resources (DAGs, connections, variables, pools) a user can access.&lt;/p&gt;

&lt;p&gt;Enable it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[core]&lt;/span&gt;
&lt;span class="py"&gt;multi_team&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then assign teams to users by adding a third colon-separated field, with multiple teams separated by a pipe character:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[core]&lt;/span&gt;
&lt;span class="py"&gt;multi_team&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="py"&gt;simple_auth_manager_users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bob:admin:team1|team2,peter:viewer:team1,alice:op:team2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, bob is an admin with access to both team1 and team2, peter is a viewer restricted to team1, and alice is an op restricted to team2.&lt;/p&gt;

&lt;p&gt;A couple of details worth flagging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resources that aren't explicitly assigned to a team are treated as global and remain accessible to everyone, including team-restricted users.&lt;/li&gt;
&lt;li&gt;Admins bypass team restrictions entirely. You can still assign an admin to a team, but it has no practical effect since admins already have access to everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Disabling Authentication Entirely
&lt;/h2&gt;

&lt;p&gt;For fast local development or throwaway testing environments, the Simple Auth Manager offers an option to skip authentication altogether. This lets anyone who accesses the Airflow UI automatically log in as an admin with full permissions.&lt;/p&gt;

&lt;p&gt;You enable it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[core]&lt;/span&gt;
&lt;span class="py"&gt;simple_auth_manager_all_admins&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"True"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is convenient when you're spinning up a local instance just to test a DAG, but it should never be used anywhere reachable outside your own machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating a JWT Token for the API
&lt;/h2&gt;

&lt;p&gt;Airflow 3's &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html" rel="noopener noreferrer"&gt;public REST API&lt;/a&gt; is JWT-based, and the Simple Auth Manager provides the endpoint that issues those tokens. To generate one, send a POST request with your username and password:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ENDPOINT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080"&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; &lt;span class="s1"&gt;'POST'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINT_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/auth/token"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "username": "&amp;lt;username&amp;gt;",
    "password": "&amp;lt;password&amp;gt;"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then include the returned token in subsequent API requests. If &lt;code&gt;simple_auth_manager_all_admins&lt;/code&gt; is enabled, you can generate a token without providing any credentials at all. For more detail, see the &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/auth-manager/simple/token.html" rel="noopener noreferrer"&gt;Simple Auth Manager token guide&lt;/a&gt; and the &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/auth-manager/simple/sam-token-api-ref.html" rel="noopener noreferrer"&gt;token API reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Things to Keep in Mind
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It's not built for production.&lt;/strong&gt; This is the single most important thing to understand. The Simple Auth Manager exists to give Airflow 3 a working, dependency-light default so the core project could drop its hard reliance on FAB. If you're deploying to production, you should either configure a different auth manager or make sure access to your Airflow environment is locked down through other means (network isolation, a reverse proxy with its own auth layer, VPN access, and so on).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No database, no dynamic role editing.&lt;/strong&gt; Everything lives in your configuration file. That makes it simple to version-control and reason about, but it also means you can't add or edit roles without changing the auth manager implementation itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passwords are ephemeral by default.&lt;/strong&gt; Since Airflow generates them fresh unless you intervene, plan for how you'll retrieve or fix credentials, particularly in containerized or ephemeral environments like Docker Compose or Kubernetes, where logs might not be easy to inspect after the fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-team isolation isn't full multi-tenancy.&lt;/strong&gt; It's resource-level filtering based on team assignment, not a hard security boundary. Global (unassigned) resources are visible to everyone, so don't rely on it as your only access control layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Switching auth managers later is a heavy lift.&lt;/strong&gt; If you start with the Simple Auth Manager and later move to a production-grade option, all users, roles, and permissions need to be recreated in the new system. It's worth deciding early if the Simple Auth Manager is only a placeholder for you or a long-term fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is Simple Auth Manager safe to use in production?&lt;/strong&gt;&lt;br&gt;
No. It's explicitly intended for development and testing only. For production, use a different auth manager and control access through additional layers like network isolation or a reverse proxy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do I find my auto-generated password?&lt;/strong&gt;&lt;br&gt;
Check the webserver logs on startup, or look in the file set by &lt;code&gt;core.simple_auth_manager_passwords_file&lt;/code&gt; (default: &lt;code&gt;$AIRFLOW_HOME/simple_auth_manager_passwords.json.generated&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I create custom roles in Simple Auth Manager?&lt;/strong&gt;&lt;br&gt;
No. Only four fixed roles exist: Viewer, User, Op, and Admin. Custom roles require a different auth manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I disable login entirely for local testing?&lt;/strong&gt;&lt;br&gt;
Set &lt;code&gt;simple_auth_manager_all_admins = "True"&lt;/code&gt; under &lt;code&gt;[core]&lt;/code&gt; in your Airflow configuration. Everyone who accesses the UI will be logged in as an admin automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;The Simple Auth Manager is Apache Airflow's answer to needing a lightweight, dependency-free authentication system out of the box for Airflow 3. It's easy to configure, requires no database, and gets you up and running in minutes with config-defined users and four fixed roles. But its simplicity is also its boundary: no custom roles, no dynamic user management, and an explicit warning against production use. If you're evaluating Airflow 3 for a real deployment, treat the Simple Auth Manager as your development sandbox and plan your production authentication strategy separately.&lt;/p&gt;

&lt;p&gt;For more on Airflow's authentication options, see the official &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/auth-manager/index.html" rel="noopener noreferrer"&gt;Auth Manager documentation&lt;/a&gt; and &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/security/index.html" rel="noopener noreferrer"&gt;Airflow Security guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>airflow</category>
      <category>kafka</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What Is a Proxy Server? Types, Setup, and How It Differs From a VPN</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Wed, 15 Jul 2026 05:59:40 +0000</pubDate>
      <link>https://dev.to/msnmongare/proxies-explained-types-setup-and-how-they-differ-from-a-vpn-3k91</link>
      <guid>https://dev.to/msnmongare/proxies-explained-types-setup-and-how-they-differ-from-a-vpn-3k91</guid>
      <description>&lt;p&gt;If you've ever looked into web scraping, bypassing geo-restricted content, or just browsing more privately, you've probably run into the term "proxy." But what exactly is it, and how does it stack up against a VPN? This guide breaks down everything you need to know before buying or setting one up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Proxy?
&lt;/h2&gt;

&lt;p&gt;A proxy server acts as a middleman between your computer and the internet. Instead of connecting directly to a website, your traffic first passes through the proxy server, which forwards your request and relays the response back to you. In the process, it can mask your real IP address, filter content, cache data, or help you get around geographic restrictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Proxies
&lt;/h2&gt;

&lt;p&gt;Proxies aren't one-size-fits-all. They vary by protocol, anonymity level, IP source, and intended use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  By Protocol
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/HTTPS proxy&lt;/strong&gt;: Handles web traffic only, making it a good fit for browsing. It's simple and fast, but limited strictly to web protocols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOCKS proxy (SOCKS4/SOCKS5)&lt;/strong&gt;: Handles any type of traffic, including web browsing, torrents, email, and gaming. More flexible than HTTP proxies, though slightly slower since it lacks built-in caching.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  By Anonymity Level
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transparent proxy&lt;/strong&gt;: Doesn't hide your IP address; the destination server can see you're using a proxy and knows your real IP. Commonly used by companies and schools for content filtering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anonymous proxy&lt;/strong&gt;: Hides your IP address but still identifies itself as a proxy to the destination server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elite/high-anonymity proxy&lt;/strong&gt;: Hides your IP address and gives no indication that a proxy is being used at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  By Source or Ownership
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Datacenter proxy&lt;/strong&gt;: Uses IP addresses from cloud or hosting providers. Fast and inexpensive, but easier for websites to detect and block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Residential proxy&lt;/strong&gt;: Uses IP addresses assigned by ISPs to real households. Harder to detect and typically more expensive, often used for web scraping or ad verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile proxy&lt;/strong&gt;: Uses IP addresses from mobile carriers (4G/5G networks). Very difficult to block, and usually the most expensive option.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  By Use Case
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reverse proxy&lt;/strong&gt;: Sits in front of a server (rather than your device) to distribute load, cache content, or add a layer of security. Nginx and Cloudflare are common examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotating proxy&lt;/strong&gt;: Automatically switches IP addresses at set intervals, which is especially useful for web scraping at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Connect a Proxy on Your Computer
&lt;/h2&gt;

&lt;p&gt;Setting up a proxy varies slightly depending on your operating system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Windows:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Settings → Network &amp;amp; Internet → Proxy&lt;/li&gt;
&lt;li&gt;Under "Manual proxy setup," toggle on "Use a proxy server"&lt;/li&gt;
&lt;li&gt;Enter the proxy's IP address and port number&lt;/li&gt;
&lt;li&gt;Save your settings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;On macOS:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to System Settings → Network → select your connection → Details (or Advanced)&lt;/li&gt;
&lt;li&gt;Open the "Proxies" tab&lt;/li&gt;
&lt;li&gt;Check the relevant protocol (Web Proxy HTTP, Secure Web Proxy HTTPS, or SOCKS Proxy)&lt;/li&gt;
&lt;li&gt;Enter the server address and port&lt;/li&gt;
&lt;li&gt;Apply the changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;At the browser level:&lt;/strong&gt; Firefox allows you to configure proxy settings independently under Settings → Network Settings, without affecting the rest of your operating system. Chrome, by contrast, defaults to your system-wide proxy settings, though extensions like FoxyProxy can manage rules on a per-browser basis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Via command line or apps:&lt;/strong&gt; Many applications, including curl, git, and torrent clients, accept proxy settings directly through config files or environment variables such as &lt;code&gt;http_proxy&lt;/code&gt; and &lt;code&gt;https_proxy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Whichever method you choose, you'll need the proxy's IP address, port number, and possibly a username and password, all of which are provided by whoever supplies the proxy, such as a paid service or your workplace.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Confirm Your Proxy Is Connected
&lt;/h2&gt;

&lt;p&gt;Once you've bought a proxy and entered your settings, it's worth double-checking that it's actually working before you rely on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Check whether your IP address changed.&lt;/strong&gt; Before connecting, visit a site like whatismyipaddress.com or ipinfo.io and note your current IP. Then enable the proxy and reload the same site. If the IP shown is now different, and matches the proxy provider's location (a different city or country), it's working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Check the proxy status in your OS or browser settings.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; Settings → Network &amp;amp; Internet → Proxy should show "In use" next to your manual proxy entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; System Settings → Network → your connection → Details → Proxies should show your configured address under the checked protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firefox:&lt;/strong&gt; Settings → Network Settings will show your saved proxy configuration; there's no separate "connected" indicator, but if pages load and the IP check above confirms it, it's active.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Use command-line tools.&lt;/strong&gt; If you set proxy environment variables (&lt;code&gt;http_proxy&lt;/code&gt;/&lt;code&gt;https_proxy&lt;/code&gt;), test with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-x&lt;/span&gt; http://your-proxy-ip:port https://ipinfo.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it returns the proxy's IP instead of your own, the connection is live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Watch for authentication prompts.&lt;/strong&gt; If your proxy requires a username and password, your browser or OS should prompt you for credentials the first time you try to browse. If you're never prompted and pages fail to load, the proxy likely isn't applied correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Check for DNS leaks.&lt;/strong&gt; Even with a proxy active, your DNS requests might still go through your ISP, which can reveal your real location indirectly. Sites like dnsleaktest.com can confirm whether your DNS queries are also routed through the proxy or leaking.&lt;/p&gt;

&lt;p&gt;A few signs your proxy is &lt;em&gt;not&lt;/em&gt; working: your IP address stays the same as before, pages time out or fail to load entirely (often a wrong port or protocol mismatch), or you see "proxy refused connection" errors (usually wrong credentials or an IP not whitelisted by the provider).&lt;/p&gt;

&lt;p&gt;The quickest gut-check: change your settings, then check your IP on a site like ipinfo.io. If it shows the proxy's location instead of yours, you're connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proxy vs. VPN: What's the Difference?
&lt;/h2&gt;

&lt;p&gt;While proxies and VPNs both reroute your internet traffic, they serve different purposes and offer very different levels of protection.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Proxy&lt;/th&gt;
&lt;th&gt;VPN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually none&lt;/td&gt;
&lt;td&gt;Encrypts all traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Often app/browser-specific&lt;/td&gt;
&lt;td&gt;Covers the entire device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generally faster (no encryption overhead)&lt;/td&gt;
&lt;td&gt;Slightly slower due to encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low, traffic can be intercepted&lt;/td&gt;
&lt;td&gt;High, encrypted tunnel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bypassing geo-blocks, scraping, simple IP masking&lt;/td&gt;
&lt;td&gt;Privacy and security, especially on public Wi-Fi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS leaks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Common, since only some traffic is routed&lt;/td&gt;
&lt;td&gt;Typically routes DNS through the encrypted tunnel too&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;A proxy simply reroutes your traffic and hides your IP address for specific apps or browsers, but it doesn't encrypt anything. That means anyone snooping on the same network, like public Wi-Fi, could potentially still see your data. A VPN, on the other hand, encrypts everything at the operating-system level, protecting all of your device's traffic rather than just what passes through your browser.&lt;/p&gt;

&lt;p&gt;If your goal is something like web scraping or accessing region-locked content, a proxy is usually sufficient and more affordable. But if privacy and security are your priority, especially on public networks, a VPN is the better choice.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>proxy</category>
      <category>vpn</category>
    </item>
    <item>
      <title>RAG Is Not an AI Agent</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Fri, 10 Jul 2026 07:11:23 +0000</pubDate>
      <link>https://dev.to/msnmongare/rag-is-not-an-ai-agent-b7a</link>
      <guid>https://dev.to/msnmongare/rag-is-not-an-ai-agent-b7a</guid>
      <description>&lt;p&gt;One of the biggest misconceptions in AI today is treating &lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt; and &lt;strong&gt;AI agents&lt;/strong&gt; as the same thing.&lt;/p&gt;

&lt;p&gt;They're not.&lt;/p&gt;

&lt;p&gt;RAG improves an LLM's ability to answer questions using external knowledge. AI agents go a step further by reasoning, planning, making decisions, and taking actions.&lt;/p&gt;

&lt;p&gt;Understanding the difference will help you design better AI systems and avoid using the wrong architecture for the job.&lt;/p&gt;




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

&lt;p&gt;Retrieval-Augmented Generation (RAG) is an architecture that gives an LLM access to information outside its training data.&lt;/p&gt;

&lt;p&gt;Instead of relying solely on what the model learned during training, it retrieves relevant documents from a knowledge base and includes them in the prompt before generating a response.&lt;/p&gt;

&lt;p&gt;Think of RAG as &lt;strong&gt;"open-book AI."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  RAG Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          User Question
                 │
                 ▼
        Embed the Question
                 │
                 ▼
         Vector Database
                 │
       Retrieve Documents
                 │
                 ▼
      Prompt + Retrieved Context
                 │
                 ▼
                LLM
                 │
                 ▼
             Final Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The LLM does &lt;strong&gt;not&lt;/strong&gt; search the internet by itself or decide what action to take. It simply answers using the retrieved context.&lt;/p&gt;




&lt;h2&gt;
  
  
  What RAG Does Well
&lt;/h2&gt;

&lt;p&gt;RAG is excellent when your AI needs accurate, up-to-date, or organization-specific information.&lt;/p&gt;

&lt;p&gt;Common use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal company knowledge bases&lt;/li&gt;
&lt;li&gt;Customer support chatbots&lt;/li&gt;
&lt;li&gt;HR policy assistants&lt;/li&gt;
&lt;li&gt;Product documentation&lt;/li&gt;
&lt;li&gt;Legal document search&lt;/li&gt;
&lt;li&gt;Medical reference systems&lt;/li&gt;
&lt;li&gt;Financial knowledge assistants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of retraining an LLM every time information changes, you simply update the knowledge base.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where RAG Ends
&lt;/h2&gt;

&lt;p&gt;This is where many people get confused.&lt;/p&gt;

&lt;p&gt;A RAG system can retrieve information and generate an answer.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;cannot inherently&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decide which tool to use&lt;/li&gt;
&lt;li&gt;Execute code&lt;/li&gt;
&lt;li&gt;Send emails&lt;/li&gt;
&lt;li&gt;Book meetings&lt;/li&gt;
&lt;li&gt;Query multiple systems intelligently&lt;/li&gt;
&lt;li&gt;Break large tasks into smaller ones&lt;/li&gt;
&lt;li&gt;Plan multiple steps&lt;/li&gt;
&lt;li&gt;Retry after failures&lt;/li&gt;
&lt;li&gt;Decide whether another search is needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find all unpaid invoices and email each customer."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A RAG system cannot complete this task.&lt;/p&gt;

&lt;p&gt;It might explain &lt;em&gt;how&lt;/em&gt; to do it, but it won't actually perform the work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where AI Agents Begin
&lt;/h2&gt;

&lt;p&gt;AI agents are built for &lt;strong&gt;decision-making and action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of following one fixed pipeline, an agent reasons about the task before deciding what to do next.&lt;/p&gt;

&lt;p&gt;A typical agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand the objective&lt;/li&gt;
&lt;li&gt;Create a plan&lt;/li&gt;
&lt;li&gt;Choose the right tool&lt;/li&gt;
&lt;li&gt;Execute the tool&lt;/li&gt;
&lt;li&gt;Evaluate the result&lt;/li&gt;
&lt;li&gt;Try another approach if needed&lt;/li&gt;
&lt;li&gt;Continue until the goal is achieved&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI Agent Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;              User Request
                    │
                    ▼
                 Planner
                    │
      ┌─────────────┼─────────────┐
      ▼             ▼             ▼
 Search Web     Query Database   Run Code
      │             │             │
      └─────────────┼─────────────┘
                    ▼
              Evaluate Result
                    │
          Need Another Step?
            Yes           No
             │             │
             ▼             ▼
       Choose Next Tool   Final Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the difference.&lt;/p&gt;

&lt;p&gt;The workflow isn't fixed.&lt;/p&gt;

&lt;p&gt;The agent decides what to do while solving the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Key Difference
&lt;/h2&gt;

&lt;p&gt;A RAG pipeline follows a predefined sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Retrieve → Generate → Respond
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent follows a reasoning loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Think → Plan → Choose Tool → Execute → Observe → Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One retrieves knowledge.&lt;/p&gt;

&lt;p&gt;The other solves problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Can an AI Agent Use RAG?
&lt;/h2&gt;

&lt;p&gt;Absolutely.&lt;/p&gt;

&lt;p&gt;In fact, many production AI agents use RAG as &lt;strong&gt;one of their tools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 AI Agent
                     │
     ┌───────────────┼────────────────┐
     ▼               ▼                ▼
     RAG         SQL Database      Calendar API
     │               │                │
     └───────────────┼────────────────┘
                     ▼
              Final Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, RAG is simply one capability among many.&lt;/p&gt;

&lt;p&gt;The agent decides &lt;strong&gt;when&lt;/strong&gt; to retrieve documents and &lt;strong&gt;when&lt;/strong&gt; to use other tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Use RAG?
&lt;/h2&gt;

&lt;p&gt;Choose RAG when your goal is to answer questions using trusted knowledge.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Company documentation chatbot&lt;/li&gt;
&lt;li&gt;University handbook assistant&lt;/li&gt;
&lt;li&gt;Product manuals&lt;/li&gt;
&lt;li&gt;Insurance policy lookup&lt;/li&gt;
&lt;li&gt;Research assistant&lt;/li&gt;
&lt;li&gt;FAQ systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If users mainly ask questions, RAG is often enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Use an AI Agent?
&lt;/h2&gt;

&lt;p&gt;Choose an AI agent when the system needs to make decisions or perform actions.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schedule meetings&lt;/li&gt;
&lt;li&gt;Generate reports from multiple systems&lt;/li&gt;
&lt;li&gt;Process invoices&lt;/li&gt;
&lt;li&gt;Customer service workflows&lt;/li&gt;
&lt;li&gt;Software engineering assistants&lt;/li&gt;
&lt;li&gt;DevOps automation&lt;/li&gt;
&lt;li&gt;Data analysis&lt;/li&gt;
&lt;li&gt;Multi-step business processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the task involves reasoning, planning, or interacting with multiple tools, an agent is the better fit.&lt;/p&gt;




&lt;h2&gt;
  
  
  RAG vs AI Agent at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;RAG&lt;/th&gt;
&lt;th&gt;AI Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Retrieves knowledge&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answers questions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uses external tools&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Makes decisions&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plans multiple steps&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executes actions&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adapts workflow dynamically&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retries after failures&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;RAG and AI agents aren't competing technologies.&lt;/p&gt;

&lt;p&gt;They're complementary.&lt;/p&gt;

&lt;p&gt;RAG gives an AI access to knowledge.&lt;/p&gt;

&lt;p&gt;AI agents give an AI the ability to reason, decide, and act.&lt;/p&gt;

&lt;p&gt;A useful way to remember it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RAG = LLM + Your Data

AI Agent = LLM + Memory + Planning + Tools + State

Production AI = Agent + RAG + Reliable Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most capable AI systems today don't choose between RAG and agents. They combine both. The agent decides &lt;em&gt;what&lt;/em&gt; needs to be done, while RAG ensures it has the right information to do it well.&lt;/p&gt;

</description>
      <category>rag</category>
      <category>ai</category>
      <category>beginners</category>
      <category>python</category>
    </item>
    <item>
      <title>LangChain &amp; LangGraph Concepts You Should Know</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Fri, 10 Jul 2026 05:58:30 +0000</pubDate>
      <link>https://dev.to/msnmongare/langchain-langgraph-concepts-you-should-know-1la5</link>
      <guid>https://dev.to/msnmongare/langchain-langgraph-concepts-you-should-know-1la5</guid>
      <description>&lt;p&gt;Here are five foundational &lt;strong&gt;LangChain&lt;/strong&gt; and &lt;strong&gt;LangGraph&lt;/strong&gt; concepts every AI engineer should understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Chains (The AI Workflow)
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;chain&lt;/strong&gt; is a sequence of steps where the output of one step becomes the input of the next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&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;User Question
      ↓
Retrieve Documents
      ↓
LLM Generates Answer
      ↓
Format Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it as a pipeline for AI tasks.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Tools (Giving AI Superpowers)
&lt;/h3&gt;

&lt;p&gt;LLMs only know what was in their training data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt; let them interact with the outside world.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search the web&lt;/li&gt;
&lt;li&gt;Query SQL databases&lt;/li&gt;
&lt;li&gt;Call REST APIs&lt;/li&gt;
&lt;li&gt;Execute Python code&lt;/li&gt;
&lt;li&gt;Read PDFs&lt;/li&gt;
&lt;li&gt;Send emails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of only generating text, the AI can now &lt;em&gt;do things&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Memory (Remembering Conversations)
&lt;/h3&gt;

&lt;p&gt;Memory allows an AI to remember information across interactions.&lt;/p&gt;

&lt;p&gt;Without memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: My name is Sam.
...
User: What's my name?

AI: I don't know.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI: Your name is Sam.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Memory can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short-term (current conversation)&lt;/li&gt;
&lt;li&gt;Long-term (saved facts)&lt;/li&gt;
&lt;li&gt;Semantic memory (knowledge)&lt;/li&gt;
&lt;li&gt;Episodic memory (past interactions)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Agents (Reason + Choose Tools)
&lt;/h3&gt;

&lt;p&gt;An &lt;strong&gt;agent&lt;/strong&gt; doesn't follow a fixed workflow.&lt;/p&gt;

&lt;p&gt;Instead, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understands the goal&lt;/li&gt;
&lt;li&gt;Decides what to do&lt;/li&gt;
&lt;li&gt;Chooses the right tool&lt;/li&gt;
&lt;li&gt;Executes it&lt;/li&gt;
&lt;li&gt;Evaluates the result&lt;/li&gt;
&lt;li&gt;Repeats until the task is complete&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User:
"Find the latest exchange rate and calculate how much 250 USD is in KES."

Agent:
→ Search exchange rate
→ Use calculator
→ Return final answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow is dynamic rather than predetermined.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Graphs (LangGraph's Superpower)
&lt;/h3&gt;

&lt;p&gt;Traditional chains are linear.&lt;/p&gt;

&lt;p&gt;LangGraph introduces &lt;strong&gt;graphs&lt;/strong&gt;, where execution can branch, loop, pause, or resume.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          Start
             │
             ▼
      Understand Task
        ┌────┴────┐
        ▼         ▼
   Search Web   Query Database
        │         │
        └────┬────┘
             ▼
      Evaluate Results
        ┌────┴────┐
     Good?      No
       │         │
       ▼         │
    Final Answer │
                 │
                 ▼
          Try Another Tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes LangGraph ideal for building autonomous AI agents that can recover from errors, make decisions, and manage complex workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Way to Remember
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangChain&lt;/strong&gt; = LLM + tools + workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents&lt;/strong&gt; = LangChain + reasoning + tool selection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph&lt;/strong&gt; = Agents + state + loops + branching + durable execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're learning modern AI engineering, mastering these five concepts will give you a strong foundation for building production-ready AI applications.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>langchain</category>
      <category>python</category>
    </item>
    <item>
      <title>Understanding Integration Runtimes in Azure Data Factory (ADF)</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Thu, 02 Jul 2026 12:54:49 +0000</pubDate>
      <link>https://dev.to/msnmongare/understanding-integration-runtimes-in-azure-data-factory-adf-2pc6</link>
      <guid>https://dev.to/msnmongare/understanding-integration-runtimes-in-azure-data-factory-adf-2pc6</guid>
      <description>&lt;p&gt;When people begin learning Azure Data Factory (ADF), one concept that often causes confusion is the &lt;strong&gt;Integration Runtime (IR)&lt;/strong&gt;. Pipelines, datasets, and linked services are fairly intuitive, but many beginners wonder:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"If Azure Data Factory orchestrates everything, what exactly is an Integration Runtime?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The simplest answer is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An Integration Runtime is the compute infrastructure that Azure Data Factory uses to move data, transform data, and execute activities.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think of Azure Data Factory as the brain that plans the work, while the Integration Runtime is the muscle that carries it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do We Need an Integration Runtime?
&lt;/h2&gt;

&lt;p&gt;Imagine you're a logistics manager.&lt;/p&gt;

&lt;p&gt;You create a schedule for transporting goods from Nairobi to Mombasa. You know what should be transported, when it should leave, and where it should arrive.&lt;/p&gt;

&lt;p&gt;However, without a truck, nothing actually moves.&lt;/p&gt;

&lt;p&gt;Azure Data Factory works the same way.&lt;/p&gt;

&lt;p&gt;A pipeline defines &lt;em&gt;what&lt;/em&gt; should happen, but the Integration Runtime is responsible for actually performing the work.&lt;/p&gt;

&lt;p&gt;It is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moving data between different data sources&lt;/li&gt;
&lt;li&gt;Running data transformation jobs&lt;/li&gt;
&lt;li&gt;Connecting securely to cloud and on-premises systems&lt;/li&gt;
&lt;li&gt;Executing activities within your pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without an Integration Runtime, your pipeline has instructions but no execution engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Integration Runtime
&lt;/h2&gt;

&lt;p&gt;Azure Data Factory provides three types of Integration Runtime, each designed for different scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Azure Integration Runtime
&lt;/h2&gt;

&lt;p&gt;This is the default Integration Runtime provided and managed by Microsoft.&lt;/p&gt;

&lt;p&gt;You don't install or maintain any servers. Azure automatically provisions and scales the compute resources needed to execute your workloads.&lt;/p&gt;

&lt;p&gt;It is ideal when your data resides entirely in the cloud.&lt;/p&gt;

&lt;p&gt;Common use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copying data from Azure SQL Database to Azure Data Lake&lt;/li&gt;
&lt;li&gt;Moving data between cloud storage accounts&lt;/li&gt;
&lt;li&gt;Running Mapping Data Flows&lt;/li&gt;
&lt;li&gt;Executing cloud-native activities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Azure SQL Database
        │
        ▼
Azure Integration Runtime
        │
        ▼
Azure Data Lake Storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Advantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fully managed by Microsoft&lt;/li&gt;
&lt;li&gt;Automatically scales&lt;/li&gt;
&lt;li&gt;No infrastructure to maintain&lt;/li&gt;
&lt;li&gt;Highly available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most cloud-to-cloud data movement, Azure Integration Runtime is the recommended choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Self-hosted Integration Runtime (SHIR)
&lt;/h2&gt;

&lt;p&gt;What happens if your data is not in Azure?&lt;/p&gt;

&lt;p&gt;Suppose your organization has an on-premises SQL Server inside a corporate network protected by a firewall.&lt;/p&gt;

&lt;p&gt;Azure Data Factory cannot directly access it.&lt;/p&gt;

&lt;p&gt;This is where the Self-hosted Integration Runtime comes in.&lt;/p&gt;

&lt;p&gt;The Self-hosted IR is software that you install on a Windows machine, virtual machine, or server within your network.&lt;/p&gt;

&lt;p&gt;It acts as a secure bridge between Azure and your private environment.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On-Prem SQL Server
        │
        ▼
Self-hosted Integration Runtime
        │
        ▼
Azure Blob Storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the runtime resides inside your network, it can securely communicate with your local databases while also communicating with Azure Data Factory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common use cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;Oracle Database&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;SAP&lt;/li&gt;
&lt;li&gt;Local file servers&lt;/li&gt;
&lt;li&gt;Private APIs&lt;/li&gt;
&lt;li&gt;Any data source behind a firewall&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one of the most commonly used Integration Runtimes in enterprise environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Azure SSIS Integration Runtime
&lt;/h2&gt;

&lt;p&gt;Many organizations have existing ETL processes built using SQL Server Integration Services (SSIS).&lt;/p&gt;

&lt;p&gt;Rather than rebuilding those packages from scratch, Azure allows you to run them in the cloud using Azure SSIS Integration Runtime.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SSIS Package
      │
      ▼
Azure SSIS Integration Runtime
      │
      ▼
Azure SQL Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This option is mainly used during cloud migration projects where businesses want to continue using their existing SSIS investments.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real-World Example
&lt;/h2&gt;

&lt;p&gt;Imagine you work for a bank.&lt;/p&gt;

&lt;p&gt;Every night, customer transactions stored in an on-premises SQL Server need to be copied into Azure Data Lake for reporting and analytics.&lt;/p&gt;

&lt;p&gt;The architecture would look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ADF Pipeline
      │
      ▼
Self-hosted Integration Runtime
      │
      ▼
On-Prem SQL Server
      │
      ▼
Azure Data Lake Storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The pipeline starts according to a schedule.&lt;/li&gt;
&lt;li&gt;Azure Data Factory sends the job to the Self-hosted Integration Runtime.&lt;/li&gt;
&lt;li&gt;The Self-hosted IR connects to the SQL Server.&lt;/li&gt;
&lt;li&gt;It reads the required data.&lt;/li&gt;
&lt;li&gt;It securely transfers the data into Azure Data Lake.&lt;/li&gt;
&lt;li&gt;The pipeline completes successfully.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice that Azure Data Factory never directly connects to the SQL Server. The Self-hosted Integration Runtime performs that task.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which Integration Runtime Should You Use?
&lt;/h2&gt;

&lt;p&gt;The choice depends on where your data resides and what type of workload you're running.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommended Integration Runtime&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Azure SQL Database to Azure Blob Storage&lt;/td&gt;
&lt;td&gt;Azure Integration Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure SQL Database to Azure Data Lake&lt;/td&gt;
&lt;td&gt;Azure Integration Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL Server on-premises to Azure&lt;/td&gt;
&lt;td&gt;Self-hosted Integration Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle behind a firewall&lt;/td&gt;
&lt;td&gt;Self-hosted Integration Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local files to Azure Storage&lt;/td&gt;
&lt;td&gt;Self-hosted Integration Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running Mapping Data Flows&lt;/td&gt;
&lt;td&gt;Azure Integration Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running existing SSIS packages&lt;/td&gt;
&lt;td&gt;Azure SSIS Integration Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Understanding the Difference Between Pipelines and Integration Runtime
&lt;/h2&gt;

&lt;p&gt;One common misconception among beginners is assuming that pipelines execute the work.&lt;/p&gt;

&lt;p&gt;They don't.&lt;/p&gt;

&lt;p&gt;A pipeline is simply an orchestration layer.&lt;/p&gt;

&lt;p&gt;Think of the relationship this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pipeline&lt;/strong&gt; decides &lt;em&gt;what&lt;/em&gt; should happen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activity&lt;/strong&gt; defines the specific task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linked Service&lt;/strong&gt; stores the connection information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset&lt;/strong&gt; represents the data being used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration Runtime&lt;/strong&gt; performs the actual work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without an Integration Runtime, the pipeline has instructions but no execution engine.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Analogy
&lt;/h2&gt;

&lt;p&gt;Imagine you're running a courier company.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The customer places an order.&lt;/li&gt;
&lt;li&gt;The operations manager plans the delivery.&lt;/li&gt;
&lt;li&gt;The address tells the driver where to collect and deliver the package.&lt;/li&gt;
&lt;li&gt;The package is the data.&lt;/li&gt;
&lt;li&gt;The truck transports the package.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Azure Data Factory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer order = Business requirement&lt;/li&gt;
&lt;li&gt;Pipeline = Delivery plan&lt;/li&gt;
&lt;li&gt;Activity = Delivery task&lt;/li&gt;
&lt;li&gt;Linked Service = Pickup and destination addresses&lt;/li&gt;
&lt;li&gt;Dataset = The package&lt;/li&gt;
&lt;li&gt;Integration Runtime = The truck&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without the truck, nothing gets delivered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Integration Runtime is one of the most important concepts in Azure Data Factory because it is responsible for executing your data integration workloads.&lt;/p&gt;

&lt;p&gt;Choosing the correct Integration Runtime depends on your environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Azure Integration Runtime&lt;/strong&gt; for cloud-to-cloud data movement and transformations.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Self-hosted Integration Runtime&lt;/strong&gt; when accessing on-premises or private network resources.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Azure SSIS Integration Runtime&lt;/strong&gt; when migrating or running existing SSIS packages in Azure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you understand the role of the Integration Runtime, Azure Data Factory becomes much easier to visualize. Instead of thinking of it as just another Azure service, you'll see it as a complete orchestration platform where pipelines coordinate the work, and Integration Runtimes provide the execution power that makes everything happen.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuredatafactory</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Install Apache Airflow 3.1.3 on WSL (Windows Subsystem for Linux)</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Wed, 01 Jul 2026 07:46:51 +0000</pubDate>
      <link>https://dev.to/msnmongare/how-to-install-apache-airflow-313-on-wsl-windows-subsystem-for-linux-1kk5</link>
      <guid>https://dev.to/msnmongare/how-to-install-apache-airflow-313-on-wsl-windows-subsystem-for-linux-1kk5</guid>
      <description>&lt;h2&gt;
  
  
  What is Apache Airflow?
&lt;/h2&gt;

&lt;p&gt;Apache Airflow is an open-source platform used to programmatically author, schedule, and monitor workflows. It's widely used in data engineering, MLOps, and backend automation pipelines. If you're building ETL pipelines, running scheduled tasks, or orchestrating complex workflows, Airflow is a tool you'll likely encounter.&lt;/p&gt;

&lt;p&gt;Airflow 3 is a major upgrade from Airflow 2 - it introduces a new React-based UI, a dedicated API server (replacing the old webserver), improved task isolation via the Task SDK, and better scalability overall.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, make sure you have the following in place:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Windows Subsystem for Linux (WSL2) installed
&lt;/h3&gt;

&lt;p&gt;You need WSL 2 with &lt;strong&gt;Ubuntu 24.04 (Noble)&lt;/strong&gt; installed on your Windows machine. If you haven't set it up yet, open PowerShell as Administrator and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart your machine when prompted, then launch &lt;strong&gt;Ubuntu&lt;/strong&gt; from the Start menu.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Always work inside the Linux home directory (&lt;code&gt;~&lt;/code&gt;), not a Windows-mounted path like &lt;code&gt;/mnt/c/...&lt;/code&gt;. Performance and file permission issues can occur on mounted drives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. MobiXterm or Windows Terminal (optional but recommended)
&lt;/h3&gt;

&lt;p&gt;Either gives you a better terminal experience for working inside WSL.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Basic familiarity with the Linux terminal
&lt;/h3&gt;

&lt;p&gt;You don't need to be a Linux expert, but knowing how to navigate directories (&lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;) and run commands will help.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Update Your System
&lt;/h2&gt;

&lt;p&gt;Open your WSL terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures your package lists and installed packages are up to date.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Install Python 3 and Check the Version
&lt;/h2&gt;

&lt;p&gt;Ubuntu 24.04 ships with Python 3.12 by default. Verify it's available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like &lt;code&gt;Python 3.12.x&lt;/code&gt;. Airflow 3.1.3 supports Python 3.10, 3.11, and 3.12 - so you're good.&lt;/p&gt;

&lt;p&gt;If Python isn't installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3 python3-dev python3-pip python3-venv &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Set Your AIRFLOW_HOME (Important - Do This First)
&lt;/h2&gt;

&lt;p&gt;Airflow needs a home directory to store its configuration, logs, and database. Set this &lt;strong&gt;before&lt;/strong&gt; installing Airflow so it knows where to store everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AIRFLOW_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/airflow-3.1.3/airflow_home
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make this permanent so it survives terminal restarts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export AIRFLOW_HOME=~/airflow-3.1.3/airflow_home'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; If you skip this step, Airflow defaults to &lt;code&gt;~/airflow&lt;/code&gt; and may pick up config files from a previous Airflow installation, causing unexpected warnings or errors.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Create a Project Directory and Virtual Environment
&lt;/h2&gt;

&lt;p&gt;Create a dedicated folder for your Airflow 3.1.3 installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/airflow-3.1.3
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/airflow-3.1.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a virtual environment inside it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv &lt;span class="nb"&gt;env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate the virtual environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source env&lt;/span&gt;/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your terminal prompt should now show &lt;code&gt;(env)&lt;/code&gt; at the beginning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;(env) user@DESKTOP-XXXX:~/airflow-3.1.3$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Upgrade pip
&lt;/h2&gt;

&lt;p&gt;Before installing Airflow, upgrade pip to the latest version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 6: Install Apache Airflow 3.1.3 with Constraints
&lt;/h2&gt;

&lt;p&gt;Install Airflow using the official constraints file. This is &lt;strong&gt;critical&lt;/strong&gt; - Airflow has many dependencies, and the constraints file ensures compatible versions are installed together without conflicts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"apache-airflow==3.1.3"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--constraint&lt;/span&gt; &lt;span class="s2"&gt;"https://raw.githubusercontent.com/apache/airflow/constraints-3.1.3/constraints-3.12.txt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may take several minutes. Once complete, verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3.1.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 7: Install the FAB Auth Manager Provider
&lt;/h2&gt;

&lt;p&gt;In Airflow 3, user authentication is handled by a separate provider package. Install it now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;apache-airflow-providers-fab &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--constraint&lt;/span&gt; &lt;span class="s2"&gt;"https://raw.githubusercontent.com/apache/airflow/constraints-3.1.3/constraints-3.12.txt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it's registered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow providers list | &lt;span class="nb"&gt;grep &lt;/span&gt;fab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apache-airflow-providers-fab  |  Flask App Builder ...  |  3.x.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 7b: Set FAB as the Auth Manager (Critical)
&lt;/h2&gt;

&lt;p&gt;This is the most important step that is easy to miss. Airflow 3 ships with a new lightweight &lt;code&gt;SimpleAuthManager&lt;/code&gt; as the default. While it works for single-user local setups, it does &lt;strong&gt;not&lt;/strong&gt; expose the &lt;code&gt;airflow users&lt;/code&gt; CLI command - meaning you won't be able to create admin users from the terminal.&lt;/p&gt;

&lt;p&gt;You must explicitly switch to the FAB auth manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check what auth manager is currently set:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow config get-value core auth_manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;airflow.api_fastapi.auth.managers.simple.simple_auth_manager.SimpleAuthManager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You are on the wrong auth manager. Switch it by opening your &lt;code&gt;airflow.cfg&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/airflow-3.1.3/airflow_home/airflow.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find the &lt;code&gt;[core]&lt;/code&gt; section and change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[core]&lt;/span&gt;
&lt;span class="py"&gt;auth_manager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;airflow.api_fastapi.auth.managers.simple.simple_auth_manager.SimpleAuthManager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[core]&lt;/span&gt;
&lt;span class="py"&gt;auth_manager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save and exit (&lt;code&gt;Ctrl+O&lt;/code&gt;, &lt;code&gt;Enter&lt;/code&gt;, &lt;code&gt;Ctrl+X&lt;/code&gt;). Verify the change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow config get-value core auth_manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should now return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SimpleAuthManager vs FabAuthManager:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SimpleAuthManager&lt;/code&gt; - Airflow 3's new default. Lightweight, no CLI user management, suited for single-user or automated setups&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FabAuthManager&lt;/code&gt; - Full-featured auth manager from Flask AppBuilder. Supports CLI user creation, roles, permissions, and OAuth. Required for proper multi-user setups and for the &lt;code&gt;airflow users&lt;/code&gt; command to work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You may see a &lt;code&gt;RemovedInAirflow4Warning&lt;/code&gt; about &lt;code&gt;airflow.security.permissions&lt;/code&gt; being deprecated. This is harmless in 3.1.3 - it's just a heads-up that some internal FAB APIs will change in Airflow 4.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 8: Initialize the Airflow Database
&lt;/h2&gt;

&lt;p&gt;Airflow 3 uses &lt;code&gt;db migrate&lt;/code&gt; instead of the old &lt;code&gt;db init&lt;/code&gt; command. This creates the metadata database and applies all schema migrations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow db migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 9: Create an Admin User
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow &lt;span class="nb"&gt;users &lt;/span&gt;create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--username&lt;/span&gt; admin &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--firstname&lt;/span&gt; YourFirstName &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lastname&lt;/span&gt; YourLastName &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; Admin &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--email&lt;/span&gt; your@email.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will be prompted to set a password. Type it carefully - input is hidden (no asterisks shown) in the terminal. Confirm it when prompted.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Remember this password - there's no plain-text copy stored anywhere. If you forget it, reset it with &lt;code&gt;airflow users reset-password --username admin&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 10: Start the Airflow API Server and Scheduler
&lt;/h2&gt;

&lt;p&gt;Airflow 3 requires &lt;strong&gt;three processes&lt;/strong&gt; running simultaneously - the &lt;strong&gt;API server&lt;/strong&gt;, the &lt;strong&gt;scheduler&lt;/strong&gt;, and optionally the &lt;strong&gt;dag-processor&lt;/strong&gt; (for larger setups). Open separate WSL terminal tabs or windows for each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal 1 - Start the API server:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/airflow-3.1.3
&lt;span class="nb"&gt;source env&lt;/span&gt;/bin/activate
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AIRFLOW_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/airflow-3.1.3/airflow_home
airflow api-server &lt;span class="nt"&gt;--port&lt;/span&gt; 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terminal 2 - Start the scheduler:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/airflow-3.1.3
&lt;span class="nb"&gt;source env&lt;/span&gt;/bin/activate
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AIRFLOW_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/airflow-3.1.3/airflow_home
airflow scheduler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In Airflow 3, &lt;code&gt;airflow webserver&lt;/code&gt; has been replaced by &lt;code&gt;airflow api-server&lt;/code&gt;. This is one of the key architectural changes from Airflow 2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the API server starts successfully you will see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when the scheduler starts you will see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;INFO:     Starting the scheduler
INFO:     Loaded executor: LocalExecutor
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 11: Access the Airflow UI
&lt;/h2&gt;

&lt;p&gt;Open your browser and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see the new &lt;strong&gt;Airflow 3 React-based login page&lt;/strong&gt;. Enter the username and password you created in Step 9.&lt;/p&gt;

&lt;p&gt;You should now be inside the &lt;strong&gt;Airflow 3 Dashboard&lt;/strong&gt; - ready to create and manage your DAGs!&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference: Starting Airflow After a Reboot
&lt;/h2&gt;

&lt;p&gt;Every time you restart your machine and want to use Airflow, run these commands in separate terminals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# All terminals: navigate, activate venv, and set AIRFLOW_HOME&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/airflow-3.1.3
&lt;span class="nb"&gt;source env&lt;/span&gt;/bin/activate
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AIRFLOW_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/airflow-3.1.3/airflow_home

&lt;span class="c"&gt;# Terminal 1&lt;/span&gt;
airflow api-server &lt;span class="nt"&gt;--port&lt;/span&gt; 8080

&lt;span class="c"&gt;# Terminal 2&lt;/span&gt;
airflow scheduler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If you added &lt;code&gt;AIRFLOW_HOME&lt;/code&gt; to your &lt;code&gt;~/.bashrc&lt;/code&gt; in Step 3, the export is automatic and you can skip that line.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Airflow 3 vs Airflow 2 - Key Differences
&lt;/h2&gt;

&lt;p&gt;If you're familiar with Airflow 2, here's what changed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Airflow 2.x&lt;/th&gt;
&lt;th&gt;Airflow 3.x&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;airflow webserver&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;airflow api-server&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;airflow db init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;airflow db migrate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User management built into core&lt;/td&gt;
&lt;td&gt;Requires &lt;code&gt;apache-airflow-providers-fab&lt;/code&gt; + FAB set as auth manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SequentialExecutor (default)&lt;/td&gt;
&lt;td&gt;LocalExecutor (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;execution_date&lt;/code&gt; in DAG context&lt;/td&gt;
&lt;td&gt;&lt;code&gt;logical_date&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flask-based UI&lt;/td&gt;
&lt;td&gt;React-based UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SubDAGs supported&lt;/td&gt;
&lt;td&gt;SubDAGs removed (use TaskGroups)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SLA support&lt;/td&gt;
&lt;td&gt;SLAs removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;airflow users&lt;/code&gt; command not found / invalid choice: 'users'
&lt;/h3&gt;

&lt;p&gt;This has two possible causes - fix them in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause 1 - FAB provider not installed:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;apache-airflow-providers-fab &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--constraint&lt;/span&gt; &lt;span class="s2"&gt;"https://raw.githubusercontent.com/apache/airflow/constraints-3.1.3/constraints-3.12.txt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cause 2 - Wrong auth manager set (most common):&lt;/strong&gt;&lt;br&gt;
Check your current auth manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow config get-value core auth_manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it shows &lt;code&gt;SimpleAuthManager&lt;/code&gt;, switch it to FAB in &lt;code&gt;airflow.cfg&lt;/code&gt; - see Step 7b above. This is the most common cause of the &lt;code&gt;users&lt;/code&gt; command missing even after the FAB provider is installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deprecation warnings about &lt;code&gt;[webserver]&lt;/code&gt; settings
&lt;/h3&gt;

&lt;p&gt;These occur when Airflow 3 picks up a config file from an old Airflow 2 installation. Make sure &lt;code&gt;AIRFLOW_HOME&lt;/code&gt; points to a fresh directory and not &lt;code&gt;~/airflow&lt;/code&gt; (the Airflow 2 default).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;No module named 'airflow.providers.fab'&lt;/code&gt; warning
&lt;/h3&gt;

&lt;p&gt;The FAB provider isn't installed. See Step 7 above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forgot your admin password
&lt;/h3&gt;

&lt;p&gt;Reset it without deleting the user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow &lt;span class="nb"&gt;users &lt;/span&gt;reset-password &lt;span class="nt"&gt;--username&lt;/span&gt; admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Port 8080 already in use
&lt;/h3&gt;

&lt;p&gt;Either stop the other process using port 8080, or start the API server on a different port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;airflow api-server &lt;span class="nt"&gt;--port&lt;/span&gt; 8081
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary of All Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set AIRFLOW_HOME (permanent)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export AIRFLOW_HOME=~/airflow-3.1.3/airflow_home'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc

&lt;span class="c"&gt;# Create project directory and virtual environment&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/airflow-3.1.3 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/airflow-3.1.3
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv &lt;span class="nb"&gt;env
source env&lt;/span&gt;/bin/activate

&lt;span class="c"&gt;# Install Airflow with constraints&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"apache-airflow==3.1.3"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--constraint&lt;/span&gt; &lt;span class="s2"&gt;"https://raw.githubusercontent.com/apache/airflow/constraints-3.1.3/constraints-3.12.txt"&lt;/span&gt;

&lt;span class="c"&gt;# Install FAB auth manager provider&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;apache-airflow-providers-fab &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--constraint&lt;/span&gt; &lt;span class="s2"&gt;"https://raw.githubusercontent.com/apache/airflow/constraints-3.1.3/constraints-3.12.txt"&lt;/span&gt;

&lt;span class="c"&gt;# Verify Airflow version&lt;/span&gt;
airflow version

&lt;span class="c"&gt;# Set FAB as auth manager in airflow.cfg (under [core] section)&lt;/span&gt;
&lt;span class="c"&gt;# auth_manager = airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager&lt;/span&gt;

&lt;span class="c"&gt;# Verify auth manager is set correctly&lt;/span&gt;
airflow config get-value core auth_manager

&lt;span class="c"&gt;# Initialize database&lt;/span&gt;
airflow db migrate

&lt;span class="c"&gt;# Create admin user&lt;/span&gt;
airflow &lt;span class="nb"&gt;users &lt;/span&gt;create &lt;span class="nt"&gt;--username&lt;/span&gt; admin &lt;span class="nt"&gt;--firstname&lt;/span&gt; YourFirstName &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lastname&lt;/span&gt; YourLastName &lt;span class="nt"&gt;--role&lt;/span&gt; Admin &lt;span class="nt"&gt;--email&lt;/span&gt; your@email.com

&lt;span class="c"&gt;# Start services (separate terminals)&lt;/span&gt;
airflow api-server &lt;span class="nt"&gt;--port&lt;/span&gt; 8080    &lt;span class="c"&gt;# Terminal 1&lt;/span&gt;
airflow scheduler                  &lt;span class="c"&gt;# Terminal 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Now that Airflow 3.1.3 is running, here are some things to explore next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write your first DAG&lt;/strong&gt; - create a Python file in &lt;code&gt;$AIRFLOW_HOME/dags/&lt;/code&gt; to define a workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore the new UI&lt;/strong&gt; - Airflow 3 ships with a brand new React-based interface with improved DAG views&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn about Assets&lt;/strong&gt; - Airflow 3 introduces Assets (formerly Datasets) for data-aware scheduling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up PostgreSQL&lt;/strong&gt; - replace SQLite with PostgreSQL as the Airflow metadata backend for production use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the Task SDK&lt;/strong&gt; - Airflow 3 ships with a standalone Task SDK for writing tasks in isolation&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;For the official Airflow 3 Quick Start guide, visit: &lt;a href="https://airflow.apache.org/docs/apache-airflow/stable/start.html" rel="noopener noreferrer"&gt;https://airflow.apache.org/docs/apache-airflow/stable/start.html&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written based on a real installation walkthrough on WSL2 Ubuntu 24.04 (Noble) with MobiXterm.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ai</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Build an AI Agent (with Python Example)</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Tue, 30 Jun 2026 08:33:14 +0000</pubDate>
      <link>https://dev.to/msnmongare/how-to-build-an-ai-agent-with-python-example-12jb</link>
      <guid>https://dev.to/msnmongare/how-to-build-an-ai-agent-with-python-example-12jb</guid>
      <description>&lt;p&gt;Artificial Intelligence is changing the way we build software. Instead of creating applications that simply follow predefined instructions, developers can now build AI agents that understand goals, make decisions, use tools, and complete tasks with minimal human intervention.&lt;/p&gt;

&lt;p&gt;An AI agent is much more than a chatbot. It is a software system that can think through a problem, decide what actions to take, interact with external tools, remember previous interactions, and achieve a specific objective.&lt;/p&gt;

&lt;p&gt;This guide walks you through the complete process of building an AI agent using the roadmap outlined below.&lt;/p&gt;




&lt;h1&gt;
  
  
  What is an AI Agent?
&lt;/h1&gt;

&lt;p&gt;An AI agent is a program that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understands a user's request&lt;/li&gt;
&lt;li&gt;Plans how to solve it&lt;/li&gt;
&lt;li&gt;Uses tools when necessary&lt;/li&gt;
&lt;li&gt;Remembers useful information&lt;/li&gt;
&lt;li&gt;Returns the best possible answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Instead of asking,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's today's weather?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You could ask,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check today's weather, then tell me whether I should carry an umbrella and reschedule my outdoor meeting."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An AI agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand the goal&lt;/li&gt;
&lt;li&gt;Call a weather API&lt;/li&gt;
&lt;li&gt;Analyze the forecast&lt;/li&gt;
&lt;li&gt;Make a recommendation&lt;/li&gt;
&lt;li&gt;Respond naturally&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 1: Define the Purpose and Scope
&lt;/h1&gt;

&lt;p&gt;Every AI agent starts with one important question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What problem is this agent solving?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without a clear purpose, the agent becomes confusing and unreliable.&lt;/p&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who will use it?&lt;/li&gt;
&lt;li&gt;What tasks should it perform?&lt;/li&gt;
&lt;li&gt;What should it never do?&lt;/li&gt;
&lt;li&gt;How will success be measured?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Suppose you are building a customer support agent.&lt;/p&gt;

&lt;p&gt;Purpose:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Help customers answer common questions about orders.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Success criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answers within 5 seconds&lt;/li&gt;
&lt;li&gt;90% accuracy&lt;/li&gt;
&lt;li&gt;Escalates complex issues to humans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cannot refund orders&lt;/li&gt;
&lt;li&gt;Cannot change passwords&lt;/li&gt;
&lt;li&gt;Cannot access customer payment information&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Step 2: Design the System Prompt
&lt;/h1&gt;

&lt;p&gt;The system prompt is the agent's personality and instruction manual.&lt;/p&gt;

&lt;p&gt;It tells the AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who it is&lt;/li&gt;
&lt;li&gt;What its job is&lt;/li&gt;
&lt;li&gt;What rules it should follow&lt;/li&gt;
&lt;li&gt;How it should respond&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a customer support assistant.

Your job is to answer customer questions politely.

If you don't know the answer,
say you don't know.

Never invent information.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good prompt often matters more than choosing a larger model.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 3: Choose an LLM
&lt;/h1&gt;

&lt;p&gt;The Large Language Model (LLM) is the agent's brain.&lt;/p&gt;

&lt;p&gt;Popular options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPT&lt;/li&gt;
&lt;li&gt;Claude&lt;/li&gt;
&lt;li&gt;Gemini&lt;/li&gt;
&lt;li&gt;Llama&lt;/li&gt;
&lt;li&gt;DeepSeek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Things to consider:&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;How much does each request cost?&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed
&lt;/h2&gt;

&lt;p&gt;How quickly does it respond?&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Window
&lt;/h2&gt;

&lt;p&gt;How much information can it remember in one conversation?&lt;/p&gt;

&lt;h2&gt;
  
  
  Accuracy
&lt;/h2&gt;

&lt;p&gt;Does it perform well for your task?&lt;/p&gt;

&lt;p&gt;For beginners, cloud-hosted models are the easiest place to start.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 4: Connect Tools
&lt;/h1&gt;

&lt;p&gt;Without tools, an AI only knows what it has already learned.&lt;/p&gt;

&lt;p&gt;With tools, it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search databases&lt;/li&gt;
&lt;li&gt;Call APIs&lt;/li&gt;
&lt;li&gt;Read documents&lt;/li&gt;
&lt;li&gt;Send emails&lt;/li&gt;
&lt;li&gt;Execute code&lt;/li&gt;
&lt;li&gt;Control applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;p&gt;Weather Agent&lt;/p&gt;

&lt;p&gt;Tool:&lt;/p&gt;

&lt;p&gt;Weather API&lt;/p&gt;

&lt;p&gt;Finance Agent&lt;/p&gt;

&lt;p&gt;Tool:&lt;/p&gt;

&lt;p&gt;Bank API&lt;/p&gt;

&lt;p&gt;Travel Agent&lt;/p&gt;

&lt;p&gt;Tool:&lt;/p&gt;

&lt;p&gt;Flight API&lt;/p&gt;

&lt;p&gt;Programming Agent&lt;/p&gt;

&lt;p&gt;Tool:&lt;/p&gt;

&lt;p&gt;Python interpreter&lt;/p&gt;

&lt;p&gt;Think of tools as giving your AI "hands."&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 5: Add Memory
&lt;/h1&gt;

&lt;p&gt;Most conversations require remembering previous information.&lt;/p&gt;

&lt;p&gt;There are different types of memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversation Memory
&lt;/h2&gt;

&lt;p&gt;Remember earlier messages.&lt;/p&gt;

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

&lt;p&gt;User:&lt;/p&gt;

&lt;p&gt;"My name is John."&lt;/p&gt;

&lt;p&gt;Later...&lt;/p&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;p&gt;"Hello John."&lt;/p&gt;




&lt;h2&gt;
  
  
  Working Memory
&lt;/h2&gt;

&lt;p&gt;Temporary memory while solving one task.&lt;/p&gt;

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

&lt;p&gt;Reading multiple files before producing a report.&lt;/p&gt;




&lt;h2&gt;
  
  
  Long-Term Memory
&lt;/h2&gt;

&lt;p&gt;Stores information for future conversations.&lt;/p&gt;

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

&lt;p&gt;Favorite programming language.&lt;/p&gt;

&lt;p&gt;Preferred writing style.&lt;/p&gt;

&lt;p&gt;Frequently used APIs.&lt;/p&gt;

&lt;p&gt;Many AI systems store memory using databases or vector databases.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 6: Orchestrate the Workflow
&lt;/h1&gt;

&lt;p&gt;Real AI agents rarely perform just one action.&lt;/p&gt;

&lt;p&gt;Instead, they execute a workflow.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User asks a question

↓

Understand request

↓

Choose tool

↓

Call API

↓

Analyze result

↓

Generate response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Frameworks like LangGraph and CrewAI help manage these workflows.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 7: Build a User Interface
&lt;/h1&gt;

&lt;p&gt;Your AI needs a way to interact with users.&lt;/p&gt;

&lt;p&gt;Common interfaces include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat applications&lt;/li&gt;
&lt;li&gt;Websites&lt;/li&gt;
&lt;li&gt;Mobile apps&lt;/li&gt;
&lt;li&gt;WhatsApp bots&lt;/li&gt;
&lt;li&gt;Slack bots&lt;/li&gt;
&lt;li&gt;REST APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI engine stays the same.&lt;/p&gt;

&lt;p&gt;Only the interface changes.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 8: Test and Improve
&lt;/h1&gt;

&lt;p&gt;Never assume your AI agent is perfect.&lt;/p&gt;

&lt;p&gt;Test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrong inputs&lt;/li&gt;
&lt;li&gt;Missing information&lt;/li&gt;
&lt;li&gt;Slow APIs&lt;/li&gt;
&lt;li&gt;Invalid requests&lt;/li&gt;
&lt;li&gt;Unexpected questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accuracy&lt;/li&gt;
&lt;li&gt;Speed&lt;/li&gt;
&lt;li&gt;User satisfaction&lt;/li&gt;
&lt;li&gt;Cost&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then improve continuously.&lt;/p&gt;




&lt;h1&gt;
  
  
  The AI Agent Architecture
&lt;/h1&gt;

&lt;p&gt;A complete AI agent usually looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
   │
   ▼
User Interface
   │
   ▼
System Prompt
   │
   ▼
Large Language Model
   │
   ▼
Decision Making
   │
   ├──── Weather API
   ├──── Database
   ├──── Email Service
   ├──── Search Engine
   └──── Custom Functions
   │
   ▼
Memory
   │
   ▼
Final Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  A Simple AI Agent in Python
&lt;/h1&gt;

&lt;p&gt;Let's build a very simple AI agent using Python and the OpenAI SDK.&lt;/p&gt;

&lt;p&gt;First, install the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set your API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-api-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create the agent.&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a helpful programming assistant.

Explain concepts clearly.

If you don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t know something,
say so honestly.
&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;ask_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&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;role&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;system&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SYSTEM_PROMPT&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;
            &lt;span class="p"&gt;}&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;

&lt;span class="k"&gt;while&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;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&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: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ask_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Agent:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You:
Explain Python decorators.

Agent:
Decorators are functions that modify the behavior of another function...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations!&lt;/p&gt;

&lt;p&gt;You have built your first AI agent.&lt;/p&gt;




&lt;h1&gt;
  
  
  Extending the Agent with a Tool
&lt;/h1&gt;

&lt;p&gt;Suppose we want the agent to answer the current time.&lt;/p&gt;

&lt;p&gt;Instead of asking the AI to guess, we create a Python function.&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_current_time&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;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%H:%M:%S&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent can call this function whenever the user asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"What time is it?"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of making up the answer, it retrieves the real system time.&lt;/p&gt;

&lt;p&gt;This simple idea scales to many real-world tools, such as weather APIs, databases, email services, payment gateways, and search engines.&lt;/p&gt;




&lt;h1&gt;
  
  
  Real-World AI Agent Ideas
&lt;/h1&gt;

&lt;p&gt;Once you understand the building blocks, you can create agents for almost any industry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer support assistant&lt;/li&gt;
&lt;li&gt;WhatsApp chatbot&lt;/li&gt;
&lt;li&gt;Fundraising assistant&lt;/li&gt;
&lt;li&gt;Medical appointment scheduler&lt;/li&gt;
&lt;li&gt;Personal finance advisor&lt;/li&gt;
&lt;li&gt;School management assistant&lt;/li&gt;
&lt;li&gt;HR recruitment assistant&lt;/li&gt;
&lt;li&gt;Sales assistant&lt;/li&gt;
&lt;li&gt;Software debugging assistant&lt;/li&gt;
&lt;li&gt;Content writing assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each follows the same architecture: define a purpose, guide the model with a clear prompt, connect the right tools, maintain useful memory, orchestrate the workflow, provide an interface, and continuously test and improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building an AI agent is not just about connecting an LLM to a chat window. A successful agent is designed around a clear goal, given the right instructions, equipped with tools to interact with the outside world, supported by memory to maintain context, and wrapped in a reliable workflow and user interface.&lt;/p&gt;

&lt;p&gt;The good news is that you do not need to build everything at once. Start with a simple conversational agent, then gradually add tools, memory, and automation as your application grows. By following these eight steps, you will have a solid foundation for creating intelligent AI applications that solve real-world problems.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>automation</category>
    </item>
    <item>
      <title>Understanding the Difference between Agents vs Automation</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Mon, 29 Jun 2026 06:36:05 +0000</pubDate>
      <link>https://dev.to/msnmongare/understanding-the-difference-between-agents-vs-automation-aoc</link>
      <guid>https://dev.to/msnmongare/understanding-the-difference-between-agents-vs-automation-aoc</guid>
      <description>&lt;p&gt;Artificial Intelligence has brought the term "AI Agent" into almost every technology conversation. As a result, many people now use the words &lt;em&gt;agent&lt;/em&gt; and &lt;em&gt;automation&lt;/em&gt; interchangeably. While both are designed to reduce manual work and improve efficiency, they solve problems in fundamentally different ways.&lt;/p&gt;

&lt;p&gt;Understanding this distinction is essential if you're building software, automating business processes, or deciding where AI fits into your organization.&lt;/p&gt;

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

&lt;p&gt;Automation is designed to execute predefined instructions.&lt;/p&gt;

&lt;p&gt;You tell the system exactly what to do, in what order, and under what conditions. Every time those conditions are met, it performs the same sequence of actions.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A customer submits a form.&lt;/li&gt;
&lt;li&gt;An email is automatically sent.&lt;/li&gt;
&lt;li&gt;A record is created in the database.&lt;/li&gt;
&lt;li&gt;A notification is sent to the sales team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every step is predetermined. If the process changes, the workflow must be updated.&lt;/p&gt;

&lt;p&gt;Automation excels at repetitive, predictable tasks where consistency is more important than decision-making.&lt;/p&gt;

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

&lt;p&gt;An AI agent is not focused on following instructions. It is focused on achieving a goal.&lt;/p&gt;

&lt;p&gt;Instead of executing a rigid sequence of steps, an agent observes its environment, evaluates available information, makes decisions, and adjusts its actions as circumstances change.&lt;/p&gt;

&lt;p&gt;If one approach fails, it can try another. If new information becomes available, it can revise its strategy without requiring a developer to define every possible scenario in advance.&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;p&gt;Automation asks:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"What steps should I execute?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An agent asks:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"What is the best way to accomplish this objective?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This ability to reason and adapt is what makes agents fundamentally different from traditional automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Imagine you're booking a business trip.&lt;/p&gt;

&lt;p&gt;An automated workflow might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Book the airline you specified.&lt;/li&gt;
&lt;li&gt;Reserve the hotel you selected.&lt;/li&gt;
&lt;li&gt;Email you the itinerary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It completes exactly what it was programmed to do.&lt;/p&gt;

&lt;p&gt;An AI agent, however, could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compare multiple flights.&lt;/li&gt;
&lt;li&gt;Choose the most cost-effective option.&lt;/li&gt;
&lt;li&gt;Avoid long layovers.&lt;/li&gt;
&lt;li&gt;Ensure arrival before your meeting.&lt;/li&gt;
&lt;li&gt;Rebook automatically if a flight is cancelled.&lt;/li&gt;
&lt;li&gt;Notify you of the changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective isn't to follow a checklist. The objective is to get you to your destination successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Automation Is the Better Choice
&lt;/h2&gt;

&lt;p&gt;Despite the excitement around AI agents, automation remains the right solution for many business processes.&lt;/p&gt;

&lt;p&gt;Choose automation when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The workflow is predictable.&lt;/li&gt;
&lt;li&gt;Business rules rarely change.&lt;/li&gt;
&lt;li&gt;Compliance requires consistent execution.&lt;/li&gt;
&lt;li&gt;Decisions are straightforward.&lt;/li&gt;
&lt;li&gt;Speed and reliability matter more than flexibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Payroll processing, invoice generation, scheduled backups, and email notifications are all excellent examples of automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  When an Agent Makes More Sense
&lt;/h2&gt;

&lt;p&gt;An AI agent becomes valuable when the environment is dynamic and decisions cannot be fully predefined.&lt;/p&gt;

&lt;p&gt;Use an agent when your system needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reason through complex situations.&lt;/li&gt;
&lt;li&gt;Adapt to changing conditions.&lt;/li&gt;
&lt;li&gt;Work toward goals rather than fixed procedures.&lt;/li&gt;
&lt;li&gt;Handle uncertainty.&lt;/li&gt;
&lt;li&gt;Decide between multiple possible actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples include customer support assistants, intelligent research systems, autonomous coding assistants, network troubleshooting agents, and procurement assistants that negotiate between vendors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Biggest Mistake
&lt;/h2&gt;

&lt;p&gt;One of the biggest misconceptions in AI today is believing every workflow should become an agent.&lt;/p&gt;

&lt;p&gt;It shouldn't.&lt;/p&gt;

&lt;p&gt;Replacing a simple, deterministic process with an AI agent often introduces unnecessary complexity, higher costs, and less predictable behavior.&lt;/p&gt;

&lt;p&gt;Likewise, trying to solve a complex, ever-changing problem with traditional automation can lead to brittle systems that constantly require manual updates.&lt;/p&gt;

&lt;p&gt;The smartest solutions combine both approaches.&lt;/p&gt;

&lt;p&gt;Automation handles the repetitive work, while agents take over where reasoning, judgment, and adaptability are required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Automation follows instructions.&lt;/p&gt;

&lt;p&gt;Agents pursue outcomes.&lt;/p&gt;

&lt;p&gt;Automation delivers consistency through predefined workflows. Agents deliver adaptability through intelligent decision-making.&lt;/p&gt;

&lt;p&gt;Neither is universally better. They solve different problems.&lt;/p&gt;

&lt;p&gt;The future of software isn't choosing agents over automation. It's understanding when each is the right tool for the job, and combining them to build systems that are both efficient and intelligent.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>agentskills</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Tell If a Task Needs an Agent or an Automation</title>
      <dc:creator>Sospeter Mong'are</dc:creator>
      <pubDate>Sat, 27 Jun 2026 08:18:57 +0000</pubDate>
      <link>https://dev.to/msnmongare/how-to-tell-if-a-task-needs-an-agent-or-an-automation-5eo6</link>
      <guid>https://dev.to/msnmongare/how-to-tell-if-a-task-needs-an-agent-or-an-automation-5eo6</guid>
      <description>&lt;p&gt;One of the biggest mistakes businesses make when adopting AI is trying to use an AI agent for every problem.&lt;/p&gt;

&lt;p&gt;Not every task needs reasoning. Not every workflow needs an LLM. Sometimes a simple automation is faster, cheaper, and more reliable.&lt;/p&gt;

&lt;p&gt;The question isn't &lt;em&gt;"Can AI do this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The real question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Does this task require thinking, or just doing?"&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule #1: If the steps are always the same, automate it.
&lt;/h2&gt;

&lt;p&gt;Traditional automation excels when the workflow is predictable.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending a welcome email after signup&lt;/li&gt;
&lt;li&gt;Copying files between systems&lt;/li&gt;
&lt;li&gt;Moving data from one database to another&lt;/li&gt;
&lt;li&gt;Creating invoices every month&lt;/li&gt;
&lt;li&gt;Backing up databases&lt;/li&gt;
&lt;li&gt;Syncing CRM records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tasks follow clear rules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger → Execute Steps → Finish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No decisions.&lt;br&gt;
No reasoning.&lt;br&gt;
No uncertainty.&lt;/p&gt;

&lt;p&gt;This is where tools like Power Automate, Azure Logic Apps, n8n, Airflow, Zapier, or simple scripts shine.&lt;/p&gt;


&lt;h2&gt;
  
  
  Rule #2: If the task requires judgment, use an AI agent.
&lt;/h2&gt;

&lt;p&gt;An agent becomes valuable when there isn't a fixed sequence of actions.&lt;/p&gt;

&lt;p&gt;Instead, it has to decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What information is needed?&lt;/li&gt;
&lt;li&gt;Which tool should I use?&lt;/li&gt;
&lt;li&gt;Is the answer sufficient?&lt;/li&gt;
&lt;li&gt;Should I ask the user another question?&lt;/li&gt;
&lt;li&gt;Do I need to search somewhere else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Analyze this support ticket, search the customer's purchase history, check whether a refund qualifies under company policy, then draft an appropriate response."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nobody hard-coded every possible path.&lt;/p&gt;

&lt;p&gt;The agent reasons about the problem before acting.&lt;/p&gt;

&lt;p&gt;Its workflow looks more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal
 ↓
Reason
 ↓
Choose Tool
 ↓
Observe Results
 ↓
Think Again
 ↓
Take Next Action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Rule #3: If the workflow contains uncertainty, you're entering agent territory.
&lt;/h2&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;p&gt;Can I write every step beforehand?&lt;/p&gt;

&lt;p&gt;If yes...&lt;/p&gt;

&lt;p&gt;Automation.&lt;/p&gt;

&lt;p&gt;If no...&lt;/p&gt;

&lt;p&gt;An agent may be the better solution.&lt;/p&gt;

&lt;p&gt;Consider these examples.&lt;/p&gt;

&lt;p&gt;Automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Every invoice goes to Finance."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Read the invoice and determine which department should approve it."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Archive every email older than 90 days."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Read the email and determine whether it's important enough to retain."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Generate a report every Monday."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Review this week's KPIs and explain the biggest business risks."&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Rule #4: If the task only follows instructions, don't use AI.
&lt;/h2&gt;

&lt;p&gt;Many teams build expensive AI systems that simply execute fixed logic.&lt;/p&gt;

&lt;p&gt;That's overengineering.&lt;/p&gt;

&lt;p&gt;If you already know the exact sequence of actions, a workflow engine is usually the better choice.&lt;/p&gt;

&lt;p&gt;AI should solve uncertainty, not replace an if-statement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rule #5: Sometimes the best solution is both.
&lt;/h2&gt;

&lt;p&gt;The most powerful enterprise systems combine automation with AI agents.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A customer submits a request.&lt;/li&gt;
&lt;li&gt;An automation triggers the workflow.&lt;/li&gt;
&lt;li&gt;An AI agent classifies the request.&lt;/li&gt;
&lt;li&gt;The agent decides which internal systems to query.&lt;/li&gt;
&lt;li&gt;Automation performs the approved actions.&lt;/li&gt;
&lt;li&gt;The workflow updates the CRM and sends notifications.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice the difference.&lt;/p&gt;

&lt;p&gt;Automation handles execution.&lt;/p&gt;

&lt;p&gt;The agent handles decision-making.&lt;/p&gt;

&lt;p&gt;Each does what it's best at.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Decision Framework
&lt;/h2&gt;

&lt;p&gt;Before building anything, ask these five questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are the steps predictable every time?&lt;/li&gt;
&lt;li&gt;Does the system need to make decisions?&lt;/li&gt;
&lt;li&gt;Will the workflow change depending on context?&lt;/li&gt;
&lt;li&gt;Does it need to understand natural language?&lt;/li&gt;
&lt;li&gt;Does it need to choose between multiple tools or actions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your answers are mostly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt; to predictable steps -&amp;gt; &lt;strong&gt;Automation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yes&lt;/strong&gt; to reasoning and decision-making -&amp;gt; &lt;strong&gt;Agent&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Don't start with AI.&lt;/p&gt;

&lt;p&gt;Start with the problem.&lt;/p&gt;

&lt;p&gt;If the work is repetitive, automate it.&lt;/p&gt;

&lt;p&gt;If the work requires understanding, reasoning, planning, and choosing the next action, build an agent.&lt;/p&gt;

&lt;p&gt;The smartest systems aren't the ones with the most AI.&lt;/p&gt;

&lt;p&gt;They're the ones that know when &lt;strong&gt;not&lt;/strong&gt; to use it.&lt;/p&gt;

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