<?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>Forem: Aria13</title>
    <description>The latest articles on Forem by Aria13 (@ariauser13).</description>
    <link>https://forem.com/ariauser13</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3920259%2F5a8040f9-a943-4f8f-9ae5-6eaf3a68d68b.jpg</url>
      <title>Forem: Aria13</title>
      <link>https://forem.com/ariauser13</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ariauser13"/>
    <language>en</language>
    <item>
      <title>AI SEO Stack: $0-20/mo vs $500/mo Tools (Real Comparison)</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 14:13:14 +0000</pubDate>
      <link>https://forem.com/ariauser13/ai-seo-stack-0-20mo-vs-500mo-tools-real-comparison-4fmi</link>
      <guid>https://forem.com/ariauser13/ai-seo-stack-0-20mo-vs-500mo-tools-real-comparison-4fmi</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📥 Want the complete toolkit?&lt;/strong&gt; This article covers the key tools. The full guide includes tool-by-tool comparison tables, setup tutorials, and the exact workflow that replaced a $500/mo SEO stack with $20/mo AI tools.&lt;br&gt;
&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/211eee53" rel="noopener noreferrer"&gt;→ AI SEO Stack: $0-20/mo Guide&lt;/a&gt;&lt;/strong&gt; — €12, instant PDF · 30-day refund&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Semrush costs $119/mo. Ahrefs is $99/mo. Surfer SEO adds another $89/mo.&lt;/p&gt;

&lt;p&gt;That's $307/mo before you've written a single word.&lt;/p&gt;

&lt;p&gt;After 8 months of testing, I've replaced almost all of it with AI tools costing $0-20/mo — without sacrificing meaningful functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The $0-20/mo AI Stack vs The $500/mo Premium Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Keyword Research
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Premium&lt;/strong&gt;: Semrush ($119/mo) — exact volumes, competitor gap analysis&lt;br&gt;
&lt;strong&gt;AI stack&lt;/strong&gt;: Perplexity (free) + Google PAA (free) + Google Trends (free)&lt;br&gt;
&lt;strong&gt;What you lose&lt;/strong&gt;: Exact search volumes. &lt;strong&gt;What you gain&lt;/strong&gt;: Intent-based queries that convert better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content Briefs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Premium&lt;/strong&gt;: Surfer SEO ($89/mo)&lt;br&gt;
&lt;strong&gt;AI stack&lt;/strong&gt;: Claude.ai free/Pro ($0-20/mo) — use prompt: "Analyze top 5 results for [keyword]. What topics are they missing? Create a content brief that beats them on depth."&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Audit
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Premium&lt;/strong&gt;: Screaming Frog + Ahrefs ($259/yr + $99/mo)&lt;br&gt;
&lt;strong&gt;AI stack&lt;/strong&gt;: Screaming Frog free (500 URLs) + GSC (free) + PageSpeed Insights (free)&lt;br&gt;
&lt;strong&gt;What you lose&lt;/strong&gt;: Sites over 500 pages. &lt;strong&gt;What you gain&lt;/strong&gt;: Everything for free at indie scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content Optimization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Premium&lt;/strong&gt;: Clearscope ($170/mo)&lt;br&gt;
&lt;strong&gt;AI stack&lt;/strong&gt;: Claude/GPT-4 with custom prompt + Hemingway App (free)&lt;br&gt;
&lt;strong&gt;Total: $0-20/mo&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Weekly Workflow ($20/mo Version)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monday&lt;/strong&gt; (15 min): GSC review — flag "Crawled but not indexed" pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tuesday&lt;/strong&gt; (30 min): Perplexity research on 3 new keyword topics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wednesday&lt;/strong&gt; (45 min): Claude content brief for next article&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thursday&lt;/strong&gt; (2h): Write + publish with AI optimization pass&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friday&lt;/strong&gt; (20 min): Internal link audit for new content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total: ~4 hours/week. Cost: $0-20/mo.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Pay for Premium Tools
&lt;/h2&gt;

&lt;p&gt;The AI stack genuinely falls short when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're in highly competitive niches needing precise volume data&lt;/li&gt;
&lt;li&gt;You're managing 50+ clients where automated reporting matters&lt;/li&gt;
&lt;li&gt;You need accurate backlink analysis at scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For solo projects and small teams: AI stack wins on ROI by a wide margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  📥 The Complete AI SEO Stack Guide
&lt;/h2&gt;

&lt;p&gt;The full guide includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool-by-tool comparison table (20 tools, rated by use case and cost)&lt;/li&gt;
&lt;li&gt;Copy-paste prompts for keyword research, content briefs, and audits&lt;/li&gt;
&lt;li&gt;Complete weekly workflow with time estimates&lt;/li&gt;
&lt;li&gt;Setup tutorials for each free tool&lt;/li&gt;
&lt;li&gt;When to upgrade: honest assessment of AI tool limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/211eee53" rel="noopener noreferrer"&gt;→ AI SEO Stack: $0-20/mo vs $500/mo Tools&lt;/a&gt;&lt;/strong&gt; — €12, instant PDF download&lt;/p&gt;

&lt;p&gt;&lt;em&gt;30-day money-back guarantee. No questions asked.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Artisan : les photos avant/après, votre meilleur argument commercial (guide pratique)</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 14:10:32 +0000</pubDate>
      <link>https://forem.com/ariauser13/artisan-les-photos-avantapres-votre-meilleur-argument-commercial-guide-pratique-1cce</link>
      <guid>https://forem.com/ariauser13/artisan-les-photos-avantapres-votre-meilleur-argument-commercial-guide-pratique-1cce</guid>
      <description>&lt;p&gt;Vous êtes plaquiste, peintre, carreleur, électricien… Vous faites un travail remarquable — mais vos clients potentiels ne le voient pas encore. Les photos avant/après changent ça. Radicalement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi une photo vaut mieux qu'un long discours
&lt;/h2&gt;

&lt;p&gt;Quand un client cherche un artisan, il n'achète pas des heures de travail : &lt;strong&gt;il achète un résultat&lt;/strong&gt;. Une photo "avant" montrant le carrelage cassé et la photo "après" avec un sol impeccable, c'est la preuve concrète de votre savoir-faire. Aucun texte ne peut remplacer ça.&lt;/p&gt;

&lt;p&gt;Statistiquement, les annonces avec photos reçoivent &lt;strong&gt;3 à 5 fois plus de demandes de devis&lt;/strong&gt; sur les plateformes comme Habitissimo ou Houzz.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 règles pour des photos avant/après qui convertissent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Toujours photographier avant de commencer
&lt;/h3&gt;

&lt;p&gt;C'est l'erreur classique : on oublie de prendre la photo "avant" une fois qu'on est dans le feu de l'action. Réflexe à adopter : &lt;strong&gt;dès que vous arrivez sur chantier, avant de toucher quoi que ce soit&lt;/strong&gt;, sortez le téléphone.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Même angle, même lumière
&lt;/h3&gt;

&lt;p&gt;Pour que la transformation soit frappante, les deux photos doivent être prises &lt;strong&gt;exactement depuis le même endroit&lt;/strong&gt;, avec si possible la même lumière (ou l'équivalent en artificiel). Un écart d'angle réduit l'effet "waouh" de 80%.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. La qualité suffisante, c'est votre smartphone
&lt;/h3&gt;

&lt;p&gt;Pas besoin d'un appareil pro. Un iPhone ou Android récent suffit largement. En revanche :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nettoyez l'objectif&lt;/strong&gt; (doigts gras = flou sur toute la photo)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activez le mode portrait&lt;/strong&gt; pour les détails de finition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Évitez le contre-jour&lt;/strong&gt; : dos à la fenêtre, ou fenêtre sur le côté&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Montrez les détails de finition
&lt;/h3&gt;

&lt;p&gt;La vue d'ensemble, c'est bien. Mais les clients aiment aussi les gros plans : joints de carrelage parfaits, raccord de papier peint invisible, câblage propre dans un tableau électrique. Ces détails montrent votre soin du travail.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Demandez l'autorisation (et un commentaire)
&lt;/h3&gt;

&lt;p&gt;Avant de publier, confirmez avec votre client. La plupart acceptent volontiers — et certains vous laisseront même un &lt;strong&gt;avis Google&lt;/strong&gt; dans la foulée si vous le demandez poliment au moment où ils sont ravis du résultat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Où utiliser ces photos ?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fiche Google Business&lt;/strong&gt; : les photos chantier dans "Ajouter des photos" améliorent votre positionnement local&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook / Instagram&lt;/strong&gt; : format avant/après = fort taux d'engagement, les gens adorent swiper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Devis et e-mails&lt;/strong&gt; : joindre 2-3 photos de réalisations similaires rassure avant même le rendez-vous&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Votre site vitrine&lt;/strong&gt; : une galerie de chantiers réalisés est souvent la page la plus visitée&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Construire un portfolio qui travaille pour vous 24h/24
&lt;/h2&gt;

&lt;p&gt;Accumuler les photos c'est bien. Les présenter de façon professionnelle, c'est ce qui fait la différence entre "sympa" et "je le rappelle tout de suite".&lt;/p&gt;

&lt;p&gt;Un template vitrine orienté portfolio photo — avec galerie avant/après intégrée, présentation des réalisations par catégorie et formulaire de contact — peut se mettre en place en une après-midi sans compétence technique. C'est exactement ce que propose &lt;strong&gt;&lt;a href="https://buy.stripe.com/14AbJ0b7K9SPfRS2PV2401b" rel="noopener noreferrer"&gt;ChantierPhoto&lt;/a&gt;&lt;/strong&gt; (29€), un template clé en main conçu pour les artisans visuels qui veulent que leur site reflète enfin la qualité de leur travail.&lt;/p&gt;




&lt;p&gt;La photo avant/après la plus puissante que vous ayez jamais prise dort peut-être dans votre galerie. C'est le moment de la mettre au travail.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quel type de chantier vous donne les plus belles transformations à photographier ? Partagez en commentaire !&lt;/em&gt;&lt;/p&gt;

</description>
      <category>french</category>
      <category>freelance</category>
      <category>entrepreneur</category>
      <category>artisan</category>
    </item>
    <item>
      <title>800 Pages, 120 Indexed: How to Fix Your Crawl Budget (Step-by-Step)</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 14:06:51 +0000</pubDate>
      <link>https://forem.com/ariauser13/800-pages-120-indexed-how-to-fix-your-crawl-budget-step-by-step-3a56</link>
      <guid>https://forem.com/ariauser13/800-pages-120-indexed-how-to-fix-your-crawl-budget-step-by-step-3a56</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📥 TL;DR — Want the full technical playbook?&lt;/strong&gt; This article covers the core concepts. The complete guide includes GSC audit templates, robots.txt patterns for 12 CMS setups, and the implementation calendar that took us from 15% to 94% indexation.&lt;br&gt;
&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/4b081e47" rel="noopener noreferrer"&gt;→ Fix Your Crawl Budget: The Complete Playbook&lt;/a&gt;&lt;/strong&gt; — €12, instant PDF · 30-day refund&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;We had 800 pages. Google was indexing 120.&lt;/p&gt;

&lt;p&gt;That's 85% of our content invisible to search — despite being technically sound, well-written, and internally linked.&lt;/p&gt;

&lt;p&gt;The problem wasn't content quality. It was &lt;strong&gt;crawl budget waste&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's what we found, what we fixed, and what actually moved the needle.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Crawl Budget (And Why It Matters at Scale)
&lt;/h2&gt;

&lt;p&gt;Google doesn't crawl your entire site on every pass. It has a budget — determined by your domain authority and server response time.&lt;/p&gt;

&lt;p&gt;For small sites (&amp;lt;1,000 pages): rarely a problem.&lt;br&gt;
For large sites (10,000+ pages): it becomes the bottleneck between publishing and ranking.&lt;/p&gt;

&lt;p&gt;The part most guides miss: &lt;strong&gt;crawl budget is wasted on pages that will never rank&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every paginated URL, filter combination, or session-parameterized URL Googlebot visits is a crawl NOT spent on your actual content.&lt;/p&gt;




&lt;h2&gt;
  
  
  Our Crawl Budget Audit
&lt;/h2&gt;

&lt;p&gt;Pull your server crawl log. Cross-reference with GSC "Not Indexed" report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was eating our budget:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;URLs Wasted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pagination (/page/2, /page/3...)&lt;/td&gt;
&lt;td&gt;340&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Faceted navigation (?sort=price&amp;amp;color=red)&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session parameters in URLs&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thin tag/category pages&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's 680 URLs consuming crawl budget daily — 0 ranking potential.&lt;/p&gt;

&lt;p&gt;Fix those, and Google redirects crawl capacity to your real content.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5 Fixes That Worked
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Noindex Pagination (Except Page 1)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- On /blog/page/2 and all subsequent pages --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"robots"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"noindex, follow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep &lt;code&gt;follow&lt;/code&gt; so link equity still passes. Just stop indexation of content-free pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Canonical Tags on Filter/Facet Pages
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- On /shoes?color=red&amp;amp;size=42 --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/shoes/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consolidates crawl budget to the base page. Prevents duplicate content penalties.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Block Session Parameters in robots.txt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# robots.txt
&lt;/span&gt;&lt;span class="n"&gt;Disallow&lt;/span&gt;: /*?&lt;span class="n"&gt;session_id&lt;/span&gt;=
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /*?&lt;span class="n"&gt;ref&lt;/span&gt;=&lt;span class="n"&gt;email&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /*?&lt;span class="n"&gt;utm_source&lt;/span&gt;=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better fix: sessions in cookies, not URLs. But robots.txt works in the short term.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Internal Links to Underlinked Pages
&lt;/h3&gt;

&lt;p&gt;Pages with zero internal links are invisible to Googlebot even if they're technically indexed.&lt;/p&gt;

&lt;p&gt;Use Screaming Frog to find pages with &amp;lt;2 internal links. Add links from your high-traffic content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; No content page should have fewer than 3 relevant internal links pointing to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Server Response Time Under 200ms
&lt;/h3&gt;

&lt;p&gt;Googlebot respects rate limits. Slow servers = fewer crawls per day.&lt;/p&gt;

&lt;p&gt;Target &amp;lt;200ms TTFB. CDN for static assets. Aggressive page-level caching.&lt;/p&gt;

&lt;p&gt;Going from 800ms to 180ms TTFB alone increased our daily crawl rate by ~40%.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Results (6 Weeks Later)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Indexed pages&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;748&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSC daily crawl rate&lt;/td&gt;
&lt;td&gt;340/day&lt;/td&gt;
&lt;td&gt;1,200/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organic impressions&lt;/td&gt;
&lt;td&gt;12k/mo&lt;/td&gt;
&lt;td&gt;47k/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not all indexed pages ranked. But you can't rank what Google hasn't seen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ongoing Monitoring
&lt;/h2&gt;

&lt;p&gt;Weekly GSC audit habit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"Not indexed" count → should decrease weekly&lt;/li&gt;
&lt;li&gt;"Crawled but not indexed" → content quality issue&lt;/li&gt;
&lt;li&gt;"Discovered but not crawled" → internal linking issue&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Set up a Google Sheet pulling GSC data weekly. Flag anything that changes by &amp;gt;10%.&lt;/p&gt;




&lt;h2&gt;
  
  
  📥 The Complete Crawl Budget Playbook
&lt;/h2&gt;

&lt;p&gt;This article is the theory. The full playbook includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GSC audit template&lt;/strong&gt; (CSV with formulas to identify high-priority gaps)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;robots.txt patterns&lt;/strong&gt; for 12 common CMS setups (WordPress, Webflow, Next.js, Shopify...)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal linking matrix&lt;/strong&gt; for content cluster optimization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server configuration checklist&lt;/strong&gt; for Nginx, Apache, and Vercel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30-day implementation calendar&lt;/strong&gt; with weekly checkpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/4b081e47" rel="noopener noreferrer"&gt;→ 800 Pages, 120 Indexed: Fix Your Crawl Budget&lt;/a&gt;&lt;/strong&gt; — €12, instant PDF download&lt;/p&gt;

&lt;p&gt;&lt;em&gt;30-day money-back guarantee. No questions asked.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>First 100 Users: The Indie Playbook (No Ads, No Audience, No VC)</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 14:04:43 +0000</pubDate>
      <link>https://forem.com/ariauser13/first-100-users-the-indie-playbook-no-ads-no-audience-no-vc-10a6</link>
      <guid>https://forem.com/ariauser13/first-100-users-the-indie-playbook-no-ads-no-audience-no-vc-10a6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📥 TL;DR — Want the complete system?&lt;/strong&gt; This article covers the core principles. The full playbook includes 50+ outreach scripts, channel-by-channel tactics, and the exact templates that got real users on board.&lt;br&gt;
&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/1f68c7ba" rel="noopener noreferrer"&gt;→ First 100 Users: The Indie Playbook&lt;/a&gt;&lt;/strong&gt; — €12, instant PDF · 30-day refund&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Most founders I know spent their first month building features nobody asked for.&lt;/p&gt;

&lt;p&gt;I spent mine begging 3 people to try my product. It taught me more than 6 months of coding.&lt;/p&gt;

&lt;p&gt;Here's the honest playbook for getting your first 100 users — built from what actually worked across 5 product launches.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why "Build It and They Will Come" Is a Lie
&lt;/h2&gt;

&lt;p&gt;The indie dev fantasy: ship on Product Hunt, wake up to 500 signups, call it a win.&lt;/p&gt;

&lt;p&gt;Reality: Product Hunt is a bubble of other makers. Your target users aren't watching it. They're on Reddit complaining about the exact problem you solved. They're in Slack groups asking for recommendations. They're googling at 2am.&lt;/p&gt;

&lt;p&gt;Your first 100 users don't come from a launch. They come from &lt;strong&gt;distribution work that doesn't scale&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5 Channels That Actually Work (With Effort)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Warm Outreach — Your Most Underused Asset
&lt;/h3&gt;

&lt;p&gt;Every founder has 50-200 people who would try something they built.&lt;/p&gt;

&lt;p&gt;Not to buy. Not to spread the word. Just to &lt;strong&gt;try it&lt;/strong&gt; and give feedback.&lt;/p&gt;

&lt;p&gt;The mistake: most people are too embarrassed to ask. They send a generic "I built something, check it out" tweet instead of a direct DM to 10 specific people.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey [name], building something I think you'd actually find useful for [specific thing they mentioned].
Would you be up for 10 minutes to try it? No pitch, just want your honest reaction.
[link]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No newsletter. No public launch. Just real conversations.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Community Posts — The Long Game
&lt;/h3&gt;

&lt;p&gt;r/SideProject, r/IndieHackers, specific subreddits for your niche.&lt;/p&gt;

&lt;p&gt;The key insight: posts that &lt;strong&gt;teach something&lt;/strong&gt; perform 10x better than posts that announce something.&lt;/p&gt;

&lt;p&gt;Instead of: &lt;em&gt;"I built a tool for X"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Try: &lt;em&gt;"I spent 3 months solving X. Here's what I learned (and the tool I ended up shipping)"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The ratio: 90% value, 10% product. Don't bury the product — mention it naturally at the end.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Your Personal Story on IH / Dev.to
&lt;/h3&gt;

&lt;p&gt;"Launched, got 0 users, learned this" posts consistently get 5-10x more traction than feature announcements.&lt;/p&gt;

&lt;p&gt;Vulnerability + specificity = engagement. Broad advice = ignored.&lt;/p&gt;

&lt;p&gt;Write about what you actually did, what broke, what surprised you. Link your product where it makes sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Niche Forums and Newsletters
&lt;/h3&gt;

&lt;p&gt;Every industry has a newsletter that reaches 5,000 of exactly your target users.&lt;/p&gt;

&lt;p&gt;A mention in that newsletter outperforms a Product Hunt launch.&lt;/p&gt;

&lt;p&gt;How to get in: build something worth mentioning, then email the curator with the specific user benefit (not your features).&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Direct Competitor Research
&lt;/h3&gt;

&lt;p&gt;Go to the 1-star reviews of your competitors on G2, Capterra, or App Store.&lt;/p&gt;

&lt;p&gt;You'll find the exact complaints your product should solve. Reach out to those reviewers directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey, saw your review of [competitor]. Sounds like [specific frustration] was the main issue.
I built something that tackles that differently — interested in trying it?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conversion rate on this is surprisingly high because the pain is real and recent.&lt;/p&gt;




&lt;h2&gt;
  
  
  The First 10 Users Playbook (Week 1)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Day 1-2:&lt;/strong&gt; List 20 specific people from your network who match your ICP. DM 10 of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 3-4:&lt;/strong&gt; Post one detailed "what I learned" story on IH or Reddit in your niche. No product pitch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 5:&lt;/strong&gt; Find 3 competitor reviews mentioning the exact pain you solve. Reach out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 6-7:&lt;/strong&gt; Engage genuinely in 2-3 communities where your users hang out. Build credibility before promoting.&lt;/p&gt;

&lt;p&gt;If you do this consistently for 4 weeks, 100 users is realistic without spending a dollar.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Changes After User #10
&lt;/h2&gt;

&lt;p&gt;The first 10 come from direct effort.&lt;/p&gt;

&lt;p&gt;The next 90 come from what those 10 say to others — which depends entirely on whether your product actually helps them.&lt;/p&gt;

&lt;p&gt;This is why the real playbook is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get 10 users through effort&lt;/li&gt;
&lt;li&gt;Talk to every single one (yes, phone/video)&lt;/li&gt;
&lt;li&gt;Fix the 3 biggest friction points they hit&lt;/li&gt;
&lt;li&gt;Ask each one: "Who else would benefit from this?"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;User 100 is mostly a product problem, not a marketing problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes (That I Made)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Waiting for the perfect launch.&lt;/strong&gt; There's no such thing. Ship ugly and get feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Targeting everyone.&lt;/strong&gt; "This is for developers, designers, marketers..." = this is for nobody.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tracking the wrong metric.&lt;/strong&gt; Signups feel great. But "users who came back twice" is the real signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Giving up after week 2.&lt;/strong&gt; The first month is almost always 0-5 users. That's normal.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Metric: Do People Come Back?
&lt;/h2&gt;

&lt;p&gt;Getting to user #100 is a milestone. But the question that matters: do users return?&lt;/p&gt;

&lt;p&gt;If yes, you have something. If no, more users won't fix the problem — only better understanding of the problem will.&lt;/p&gt;




&lt;h2&gt;
  
  
  📥 Get the Full Playbook
&lt;/h2&gt;

&lt;p&gt;This article covered the principles. The full guide includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50+ outreach scripts (cold, warm, competitor research)&lt;/li&gt;
&lt;li&gt;Community post templates that don't get flagged as spam&lt;/li&gt;
&lt;li&gt;The exact IH and Reddit formatting that works in 2026&lt;/li&gt;
&lt;li&gt;The "user 10 to 100" framework with 30-day calendar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/1f68c7ba" rel="noopener noreferrer"&gt;→ First 100 Users: The Indie Playbook&lt;/a&gt;&lt;/strong&gt; — €12, instant PDF download&lt;/p&gt;

&lt;p&gt;&lt;em&gt;30-day money-back guarantee. No questions asked.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>indiehacking</category>
      <category>startup</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Auto-entrepreneur artisan : 5 erreurs fiscales qui vous coûtent cher (et comment les éviter)</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 14:01:10 +0000</pubDate>
      <link>https://forem.com/ariauser13/auto-entrepreneur-artisan-5-erreurs-fiscales-qui-vous-coutent-cher-et-comment-les-eviter-4bkk</link>
      <guid>https://forem.com/ariauser13/auto-entrepreneur-artisan-5-erreurs-fiscales-qui-vous-coutent-cher-et-comment-les-eviter-4bkk</guid>
      <description>&lt;p&gt;Quand on est artisan auto-entrepreneur, la comptabilité et la fiscalité passent souvent au second plan. On est là pour travailler avec ses mains, pas pour remplir des tableaux. Résultat : beaucoup d'artisans paient trop de charges, ratent des exonérations, ou se retrouvent avec des mauvaises surprises en fin d'année.&lt;/p&gt;

&lt;p&gt;Voici les 5 erreurs les plus fréquentes — et comment les corriger.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Confondre chiffre d'affaires et revenu imposable
&lt;/h2&gt;

&lt;p&gt;En auto-entreprise, vous êtes imposé sur votre &lt;strong&gt;chiffre d'affaires brut&lt;/strong&gt;, pas sur votre bénéfice. Mais l'administration applique un &lt;strong&gt;abattement forfaitaire&lt;/strong&gt; avant de calculer l'impôt :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;71 %&lt;/strong&gt; pour les activités d'achat-revente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;50 %&lt;/strong&gt; pour les prestations de services commerciales&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;34 %&lt;/strong&gt; pour les professions libérales&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vous êtes plombier et faites 40 000 € de CA, votre base imposable est 40 000 × (1 - 0,50) = &lt;strong&gt;20 000 €&lt;/strong&gt; — pas 40 000 €.&lt;/p&gt;

&lt;p&gt;Beaucoup d'artisans surestiment leur impôt parce qu'ils oublient cet abattement.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Ne pas opter pour le versement libératoire (quand c'est avantageux)
&lt;/h2&gt;

&lt;p&gt;Le &lt;strong&gt;versement libératoire de l'impôt sur le revenu&lt;/strong&gt; permet de payer l'IR en même temps que vos cotisations sociales, à un taux fixe :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 % pour les activités de vente&lt;/li&gt;
&lt;li&gt;1,7 % pour les services&lt;/li&gt;
&lt;li&gt;2,2 % pour les libéraux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avantage :&lt;/strong&gt; vous évitez les mauvaises surprises lors de la déclaration annuelle.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Condition :&lt;/strong&gt; revenus du foyer fiscal inférieurs à un certain plafond (vérifiez chaque année sur impots.gouv.fr).&lt;/p&gt;

&lt;p&gt;Si vous êtes en début d'activité et avez peu de revenus annexes, cette option peut vous faire économiser plusieurs centaines d'euros.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Oublier l'ACRE (exonération de début d'activité)
&lt;/h2&gt;

&lt;p&gt;L'&lt;strong&gt;ACRE&lt;/strong&gt; (Aide à la Création et Reprise d'Entreprise) permet d'obtenir une &lt;strong&gt;exonération partielle de cotisations sociales&lt;/strong&gt; pendant la première année.&lt;/p&gt;

&lt;p&gt;Le taux de cotisation passe de ~22 % à &lt;strong&gt;~11 %&lt;/strong&gt; pendant 12 mois.&lt;/p&gt;

&lt;p&gt;Problème : beaucoup d'artisans ne la demandent pas au moment de l'inscription, ou ne savent pas qu'elle s'applique aussi aux ex-chômeurs indemnisés.&lt;/p&gt;

&lt;p&gt;👉 À demander lors de la création sur le guichet unique (formalites.entreprises.gouv.fr).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Ne pas déclarer ses revenus régulièrement (même à zéro)
&lt;/h2&gt;

&lt;p&gt;En auto-entreprise, vous devez déclarer votre CA &lt;strong&gt;chaque mois ou chaque trimestre&lt;/strong&gt; — même si vous avez fait zéro euro.&lt;/p&gt;

&lt;p&gt;Oublier une déclaration = &lt;strong&gt;pénalité de 52 € minimum&lt;/strong&gt; par déclaration manquante + majoration des cotisations.&lt;/p&gt;

&lt;p&gt;Astuce : activez les rappels par SMS sur autoentrepreneur.urssaf.fr. C'est gratuit et ça évite les oublis.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Ignorer le seuil de TVA (franchise en base)
&lt;/h2&gt;

&lt;p&gt;En dessous de certains seuils de CA, vous êtes en &lt;strong&gt;franchise en base de TVA&lt;/strong&gt; — vous ne la facturez pas et ne la récupérez pas :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;85 800 €&lt;/strong&gt; pour les ventes de marchandises&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;34 400 €&lt;/strong&gt; pour les prestations de services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Si vous dépassez le seuil en cours d'année, vous basculez en TVA &lt;strong&gt;dès le 1er jour du mois de dépassement&lt;/strong&gt;. Vous devez facturer la TVA immédiatement — même si vous n'avez pas prévenu vos clients.&lt;/p&gt;

&lt;p&gt;Suivez votre CA mensuel et anticipez le basculement.&lt;/p&gt;




&lt;h2&gt;
  
  
  En résumé
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Erreur&lt;/th&gt;
&lt;th&gt;Impact financier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Confondre CA et revenu imposable&lt;/td&gt;
&lt;td&gt;Payer trop d'impôts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rater le versement libératoire&lt;/td&gt;
&lt;td&gt;Mauvaise surprise fiscale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oublier l'ACRE&lt;/td&gt;
&lt;td&gt;Perdre 10 % de cotisations en moins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Déclarations oubliées&lt;/td&gt;
&lt;td&gt;52 € de pénalité par oubli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basculement TVA non anticipé&lt;/td&gt;
&lt;td&gt;Litige avec clients + régularisation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La fiscalité en auto-entreprise n'est pas si complexe — mais les détails comptent. Un artisan qui maîtrise ces 5 points récupère facilement &lt;strong&gt;1 000 à 3 000 € par an&lt;/strong&gt; qu'il payait inutilement.&lt;/p&gt;




&lt;p&gt;Si vous voulez aller plus loin, j'ai trouvé un guide pratique rédigé spécifiquement pour les artisans auto-entrepreneurs : &lt;strong&gt;&lt;a href="https://buy.stripe.com/fZu4gycbO8OL8pq1LR2401c" rel="noopener noreferrer"&gt;Fiscalité Artisan — le guide pour ne pas payer trop d'impôts&lt;/a&gt;&lt;/strong&gt;. Il couvre les cotisations, les optimisations légales, et les pièges courants — en langage humain, sans jargon comptable. À 19 €, c'est rentabilisé au premier impôt évité.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Des questions sur votre situation ? Laissez un commentaire, je réponds.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>french</category>
      <category>freelance</category>
      <category>entrepreneur</category>
      <category>artisan</category>
    </item>
    <item>
      <title>Artisan : 5 astuces concrètes pour décrocher plus de clients grâce à Google</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 13:23:52 +0000</pubDate>
      <link>https://forem.com/ariauser13/artisan-5-astuces-concretes-pour-decrocher-plus-de-clients-grace-a-google-4h5k</link>
      <guid>https://forem.com/ariauser13/artisan-5-astuces-concretes-pour-decrocher-plus-de-clients-grace-a-google-4h5k</guid>
      <description>&lt;p&gt;En France, &lt;strong&gt;87% des particuliers cherchent un artisan sur Google&lt;/strong&gt; avant de décrocher leur téléphone. Pourtant, la plupart des artisans ont une fiche Google incomplète, peu ou pas d'avis, et aucune présence sur les réseaux.&lt;/p&gt;

&lt;p&gt;Voici 5 actions concrètes que tu peux faire cette semaine — sans budget publicitaire.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Remplis ta fiche Google Business à 100%
&lt;/h2&gt;

&lt;p&gt;La fiche Google Business (anciennement Google My Business) est ton vitrine gratuite la plus puissante. Beaucoup d'artisans ont une fiche créée par Google automatiquement… mais jamais réclamée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;À faire :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Va sur &lt;a href="https://business.google.com" rel="noopener noreferrer"&gt;business.google.com&lt;/a&gt; et réclame ta fiche&lt;/li&gt;
&lt;li&gt;Remplis &lt;strong&gt;catégorie principale&lt;/strong&gt; (ex: "Plombier", "Électricien", "Menuisier")&lt;/li&gt;
&lt;li&gt;Ajoute tes &lt;strong&gt;horaires&lt;/strong&gt;, ton &lt;strong&gt;numéro&lt;/strong&gt;, ton &lt;strong&gt;site web&lt;/strong&gt; ou ton &lt;strong&gt;numéro WhatsApp&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Écris une description de 250 mots avec ta ville + tes spécialités&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Une fiche complète apparaît 5x plus souvent dans les résultats locaux qu'une fiche vide.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Publie des photos de tes chantiers (avant/après)
&lt;/h2&gt;

&lt;p&gt;Les photos sont le premier critère que regarde un client sur ta fiche. Pas besoin d'un photographe pro — ton téléphone suffit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce qui fonctionne :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Photo &lt;strong&gt;avant&lt;/strong&gt; (le problème) + photo &lt;strong&gt;après&lt;/strong&gt; (ton travail)&lt;/li&gt;
&lt;li&gt;1 à 2 photos par chantier terminé&lt;/li&gt;
&lt;li&gt;Nomme les fichiers avec des mots-clés : &lt;code&gt;plombier-lyon-remplacement-chauffe-eau.jpg&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Objectif : &lt;strong&gt;minimum 20 photos&lt;/strong&gt; pour commencer à décrocher des demandes organiques.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Demande des avis — mais fais-le au bon moment
&lt;/h2&gt;

&lt;p&gt;Les avis Google sont de l'or. Un artisan avec 15 avis à 4,8★ bat systématiquement un concurrent sans avis, même si ce dernier est moins cher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La méthode simple :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Juste après avoir livré un chantier satisfaisant, dis à ton client : &lt;em&gt;"Si vous êtes content, un petit avis Google m'aiderait vraiment"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Envoie-lui par SMS un lien direct vers ta page d'avis (tu le trouves dans ton tableau de bord Google Business)&lt;/li&gt;
&lt;li&gt;Réponds à TOUS tes avis — positifs comme négatifs&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Répondre à un avis négatif avec calme et professionnalisme rassure bien plus les futurs clients qu'une série d'avis parfaits sans réponse.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Utilise les bons mots-clés dans tes descriptions
&lt;/h2&gt;

&lt;p&gt;Google lit le texte de ta fiche et de ton site. Si tu n'écris pas ce que tes clients cherchent, tu n'apparais pas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formule gagnante :&lt;/strong&gt; &lt;code&gt;[Métier] + [Ville/Quartier] + [Spécialité]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Exemples :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Électricien à Bordeaux — installation tableau électrique, mise aux normes"&lt;/li&gt;
&lt;li&gt;"Carreleur Lille et agglomération — salle de bain, terrasse, grand format"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ajoute aussi les villes voisines dans ta description si tu les couvres.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Poste 1 fois par semaine sur ta fiche Google
&lt;/h2&gt;

&lt;p&gt;Peu d'artisans le font, mais Google Business permet de publier des &lt;strong&gt;"posts"&lt;/strong&gt; (comme Facebook) directement sur ta fiche. Ces posts augmentent ta visibilité dans les recherches locales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idées de posts :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Photo d'un chantier terminé avec 2 lignes de description&lt;/li&gt;
&lt;li&gt;Offre saisonnière ("Ramonage avant l'hiver — disponible dès maintenant")&lt;/li&gt;
&lt;li&gt;Réponse à une question fréquente ("Comment savoir si votre tableau électrique est aux normes ?")&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pour aller plus loin
&lt;/h2&gt;

&lt;p&gt;Ces 5 points sont le minimum. Pour une stratégie complète — Google, réseaux sociaux, avis, devis qui convertissent — le guide &lt;strong&gt;&lt;a href="https://buy.stripe.com/9B6fZg5Nq1mj356duz2400S" rel="noopener noreferrer"&gt;Artisan Visible&lt;/a&gt;&lt;/strong&gt; couvre tout ça étape par étape, pensé spécifiquement pour les artisans français indépendants.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tu es artisan et tu as des questions sur ta visibilité en ligne ? Laisse un commentaire, je réponds volontiers.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>french</category>
      <category>freelance</category>
      <category>entrepreneur</category>
      <category>career</category>
    </item>
    <item>
      <title>Customer Discovery Playbook for Makers: 50 Questions, 5 Scripts, 30-Day System</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 04:37:53 +0000</pubDate>
      <link>https://forem.com/ariauser13/customer-discovery-playbook-for-makers-50-questions-5-scripts-30-day-system-5bp5</link>
      <guid>https://forem.com/ariauser13/customer-discovery-playbook-for-makers-50-questions-5-scripts-30-day-system-5bp5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📥 TL;DR — Want the complete playbook?&lt;/strong&gt; This article covers the core framework. The full guide includes 50 interview questions, 5 tested scripts, response analysis templates, and a 30-day system to find your first 100 paying users.&lt;br&gt;
&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/58abbdd7" rel="noopener noreferrer"&gt;→ Get the Customer Discovery Playbook&lt;/a&gt;&lt;/strong&gt; — €12, instant PDF · 30-day refund&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Most founders run customer discovery interviews wrong. They ask hypothetical questions and get hypothetical answers. They pitch their idea and get polite feedback. They walk away feeling validated — and build the wrong thing anyway.&lt;/p&gt;

&lt;p&gt;The problem isn't effort. It's interview design.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Question That Changes Everything
&lt;/h2&gt;

&lt;p&gt;Stop asking: &lt;em&gt;"Would you use this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Start asking: &lt;em&gt;"Tell me about the last time you struggled with X."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first question activates optimism bias. People imagine a future where they might use your product. They're polite. They say yes.&lt;/p&gt;

&lt;p&gt;The second question accesses memory. Real behavior. Actual pain. The specifics you need to build something people will actually pay for.&lt;/p&gt;

&lt;p&gt;This single shift — from hypothetical to timeline-based — is what separates founders with 12 pivots from founders who ship the right thing first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 Questions You Should Ask in Every Interview
&lt;/h2&gt;

&lt;p&gt;These questions work regardless of your market:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Walk me through the last time you had to deal with [problem].&lt;/strong&gt;&lt;br&gt;
Gets you the real workflow, not the idealized one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. What did you try first? What happened?&lt;/strong&gt;&lt;br&gt;
Reveals competing solutions and their failure modes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. How did it end up getting resolved?&lt;/strong&gt;&lt;br&gt;
Shows whether they actually solved it — or learned to live with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What did that cost you — in time, money, frustration?&lt;/strong&gt;&lt;br&gt;
Establishes whether the pain is worth paying to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. If you had a magic wand, what would the ideal outcome look like?&lt;/strong&gt;&lt;br&gt;
The only hypothetical worth asking — and only after you understand the real problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Most Customer Discovery Fails Before It Starts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Talking to the wrong people
&lt;/h3&gt;

&lt;p&gt;Your mom will validate your idea. Your Twitter followers will validate your idea. Your co-founder will validate your idea.&lt;/p&gt;

&lt;p&gt;None of them are your customer.&lt;/p&gt;

&lt;p&gt;Rule: Only interview people who have actively tried to solve the problem you're targeting. Not people who "might have" the problem. People who have &lt;em&gt;already paid&lt;/em&gt; (time, money, or both) to address it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pitching instead of listening
&lt;/h3&gt;

&lt;p&gt;The moment you describe your solution, the interview is over. You've told them what to validate. They'll tell you what you want to hear.&lt;/p&gt;

&lt;p&gt;Interview rule: No pitching. Not even a hint. Your job is to understand the problem, not to sell the solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confirmation bias in analysis
&lt;/h3&gt;

&lt;p&gt;After 10 interviews where 7 people said "yes, this is a real problem," founders ignore the 3 who said "it's annoying but not urgent." The 3 dissenters often carry more signal than the 7 who agreed.&lt;/p&gt;

&lt;p&gt;Always go back and read the no's.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-Day Customer Discovery System
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 1 — Problem hypothesis&lt;/strong&gt;&lt;br&gt;
Write down your assumptions. Not your product features — your assumptions about the problem. What do you believe is true about who has it, how they experience it, and what they've tried?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2 — First 5 interviews&lt;/strong&gt;&lt;br&gt;
Find people who've already tried to solve the problem. LinkedIn, Reddit, industry Slacks, direct DM. Ask for 20 minutes to "understand how people deal with [problem] — no pitch, no agenda."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3 — Pattern finding&lt;/strong&gt;&lt;br&gt;
After 5 interviews, look for repeated phrases. The same vocabulary appearing in 3+ interviews = signal. Build a simple response matrix: [pain point × frequency × intensity].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 4 — Validation sprint&lt;/strong&gt;&lt;br&gt;
Run 5 more interviews, but now test your problem framing. "Based on what I've heard, the core pain is [X]. Does that match your experience?" If 7/10 say yes without prompting you to change the framing — you have problem-market fit. Build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Your First Interview Subjects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Method 1: Request threads&lt;/strong&gt;&lt;br&gt;
"I'm doing research on [problem domain] — would anyone be willing to do a 20-minute call? No pitch, just listening." Post this in relevant Subreddits, Discord servers, LinkedIn groups. Conversion rate: ~5%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 2: Competitor review mining&lt;/strong&gt;&lt;br&gt;
Read 1-star and 2-star reviews of competing products. Every complaint is a potential interview subject. Find them on LinkedIn, send a personalised message referencing their specific complaint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 3: Job posting analysis&lt;/strong&gt;&lt;br&gt;
Companies hire people to solve problems. Find job descriptions mentioning your target problem. The hiring manager is your ideal customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Good Interview Notes Look Like
&lt;/h2&gt;

&lt;p&gt;Don't write "she said she likes the idea." That's interpretation.&lt;/p&gt;

&lt;p&gt;Write: "She said: 'Every time I have to do X, I spend 3 hours pulling data from different places. Last week it cost me a client call because I wasn't prepared.'"&lt;/p&gt;

&lt;p&gt;Quotes. Specific time references. Emotional intensity markers. That's the raw material for a product that sells itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  📥 Get the Complete Playbook
&lt;/h2&gt;

&lt;p&gt;The 5 questions above work. But they're 5 of 50 in the full playbook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/58abbdd7" rel="noopener noreferrer"&gt;Customer Discovery Playbook for Makers&lt;/a&gt;&lt;/strong&gt; — €12&lt;/p&gt;

&lt;p&gt;Includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50 interview questions organised by stage (problem, solution, pricing, buyer psychology)&lt;/li&gt;
&lt;li&gt;5 tested scripts (cold DM, warm intro, competitor customer, forum post, email)&lt;/li&gt;
&lt;li&gt;Response analysis template (copy-paste into Notion or spreadsheet)&lt;/li&gt;
&lt;li&gt;The 30-day week-by-week system above, fully detailed&lt;/li&gt;
&lt;li&gt;The 3 red flags that mean "stop building, pivot now"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;30-day money-back guarantee. Instant PDF download. One-time payment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>startup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built 21 Practical Guides for Indie Devs. 60 Days Later: 540 Views, €0 Revenue. Here's the Honest Post-Mortem.</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 04:35:30 +0000</pubDate>
      <link>https://forem.com/ariauser13/i-built-21-practical-guides-for-indie-devs-60-days-later-540-views-eu0-revenue-heres-the-honest-4k3m</link>
      <guid>https://forem.com/ariauser13/i-built-21-practical-guides-for-indie-devs-60-days-later-540-views-eu0-revenue-heres-the-honest-4k3m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: I built 21 practical guides (PDFs) covering pricing, clients, AI costs, automation, legal, and more. Listed them at €7–€12. Got 540 views across 20 articles. Sold zero copies. Here's everything I got wrong — and what I'm actually doing about it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I'm a developer who got tired of generic "how to succeed as a freelancer" advice. So I spent 60 days distilling everything I actually used to get clients, price projects, avoid legal disasters, and cut AI costs — into 21 focused PDF guides.&lt;/p&gt;

&lt;p&gt;The result: &lt;strong&gt;21 guides published. €0 in revenue. 540 views across Dev.to. Zero reactions. Zero comments.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post is the honest post-mortem. No spin. If you're building something similar, I hope this saves you 60 days.&lt;/p&gt;




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

&lt;p&gt;Here's the full catalog — with the real view counts from my analytics:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Guide&lt;/th&gt;
&lt;th&gt;Views&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Event-Driven AI Agents&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;€7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local LLMs: Cut AI Costs 97%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;€12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surviving Forced AI (Coping Guide)&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;€12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Project Pricing &amp;amp; Scoping&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;€12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Financial Model for Indie Devs&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;€12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indie Pricing Playbook&lt;/td&gt;
&lt;td&gt;~3&lt;/td&gt;
&lt;td&gt;€9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First Paying Clients&lt;/td&gt;
&lt;td&gt;~3&lt;/td&gt;
&lt;td&gt;€12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP Mastery: Zero to Production&lt;/td&gt;
&lt;td&gt;~3&lt;/td&gt;
&lt;td&gt;€12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;... 13 more&lt;/td&gt;
&lt;td&gt;~2 each&lt;/td&gt;
&lt;td&gt;€7–12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything is available at &lt;a href="https://forge.closerhub.app" rel="noopener noreferrer"&gt;forge.closerhub.app&lt;/a&gt; — one-time PDF downloads, instant delivery.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #1: I Built for Developers Who Don't Buy
&lt;/h2&gt;

&lt;p&gt;Dev.to is an incredible platform. But after 540 views and 0 sales, I've had to accept the brutal truth: &lt;strong&gt;developers on Dev.to are readers, not buyers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They're here to learn for free. They'll upvote a tutorial. They won't spend €7 on a PDF unless there's serious trust already built.&lt;/p&gt;

&lt;p&gt;My mistake: I treated Dev.to like a sales channel. It's a discovery channel — and only if you already have social proof elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I should have done first&lt;/strong&gt;: Reddit r/indiehackers, Indie Hackers, Hacker News — communities where people actually buy things to solve problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #2: I Confused "Published" With "Distributed"
&lt;/h2&gt;

&lt;p&gt;I published 20 articles. I thought that was distribution.&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;Commenting on active threads in communities where buyers hang out&lt;/li&gt;
&lt;li&gt;Doing Show HN with real screenshots and demos&lt;/li&gt;
&lt;li&gt;Posting on r/freelance when someone asks "how do I price my first project?"&lt;/li&gt;
&lt;li&gt;Actually having a conversation, not just dumping content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote content and waited. Nobody was waiting for me.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #3: Zero Social Proof at Launch
&lt;/h2&gt;

&lt;p&gt;When someone lands on &lt;a href="https://forge.closerhub.app/product/aaeb52c1" rel="noopener noreferrer"&gt;forge.closerhub.app/product/aaeb52c1&lt;/a&gt;, they see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clean landing page ✓&lt;/li&gt;
&lt;li&gt;A money-back guarantee ✓&lt;/li&gt;
&lt;li&gt;A real PDF preview ✓&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero reviews, zero sales count, no community signal&lt;/strong&gt; ✗&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the internet, "new" means "risky". I launched 21 products simultaneously instead of doing one properly with early access, waitlist, and beta testers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mistake #4: €7 Might Actually Be Too Cheap
&lt;/h2&gt;

&lt;p&gt;Counterintuitive: very low prices trigger doubt, not impulse buys.&lt;/p&gt;

&lt;p&gt;"€7 for a guide on pricing strategy? Can't be that good."&lt;/p&gt;

&lt;p&gt;I should have started at €19–€29, used early bird pricing for the first 50 buyers, and built social proof before discounting.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Doing Now (The Real Plan)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community-first distribution&lt;/strong&gt;: Posting answers on active IH threads, r/freelance, and r/indiehackers — providing value first, mentioning guides only when genuinely relevant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gumroad marketplace&lt;/strong&gt;: All 21 guides are being listed on Gumroad (hitting API limits, batching over 3 days). Gumroad has buyers who are already in purchasing mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;One anchor product&lt;/strong&gt;: Instead of promoting 21 guides equally, I'm making &lt;a href="https://forge.closerhub.app/product/f652fbeb" rel="noopener noreferrer"&gt;AI API Cost Optimization Handbook&lt;/a&gt; the flagship — deep content, higher price, real case study screenshots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building in public more aggressively&lt;/strong&gt;: Posts like this one. Real numbers attract readers who trust you.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;I built what I wanted to build. I didn't validate demand first.&lt;/p&gt;

&lt;p&gt;The guides are good. I stand behind them. But good content + no distribution = €0 revenue.&lt;/p&gt;

&lt;p&gt;The frameworks in the &lt;a href="https://forge.closerhub.app/product/a98f7706" rel="noopener noreferrer"&gt;First Paying Clients guide&lt;/a&gt; and the &lt;a href="https://forge.closerhub.app/product/76b8800b" rel="noopener noreferrer"&gt;Early Marketing Mistakes guide&lt;/a&gt; literally describe the mistakes I made building this project. I documented other people's mistakes before fixing my own.&lt;/p&gt;

&lt;p&gt;That's embarrassing to admit. But maybe it's useful to read.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I Am Now
&lt;/h2&gt;

&lt;p&gt;I'm 60 days in. The products are real, the delivery works, the pricing is set. What I need now is &lt;strong&gt;distribution&lt;/strong&gt; — not more content.&lt;/p&gt;

&lt;p&gt;If you've been through something similar — zero revenue after launch, or cracked community distribution — I'd love to hear what worked. Drop it in the comments.&lt;/p&gt;

&lt;p&gt;And if any of the guides are actually useful to you, I'd genuinely appreciate the support. Each one took 2–3 days to research and write. &lt;a href="https://forge.closerhub.app" rel="noopener noreferrer"&gt;Browse the full catalog here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Building in public. Every honest number, every mistake.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>indiehacking</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>The Co-Founder Vetting System Nobody Talks About (Until It's Too Late)</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 01:47:40 +0000</pubDate>
      <link>https://forem.com/ariauser13/the-co-founder-vetting-system-nobody-talks-about-until-its-too-late-k79</link>
      <guid>https://forem.com/ariauser13/the-co-founder-vetting-system-nobody-talks-about-until-its-too-late-k79</guid>
      <description>&lt;p&gt;Most startup advice skips the awkward part: how do you actually find and evaluate a business partner before you're legally and financially entangled with the wrong person?&lt;/p&gt;

&lt;p&gt;I've seen two kinds of founders. Those who spend six months on their pitch deck and two hours picking their co-founder. And those who treat the partner search like a hiring process with teeth. The second group builds companies that last.&lt;/p&gt;

&lt;p&gt;Here's the system that actually works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to Actually Find Co-Founders (Not the Obvious Places)
&lt;/h2&gt;

&lt;p&gt;The usual advice is "go to meetups" or "post on LinkedIn." That's fine for volume. It's terrible for fit.&lt;/p&gt;

&lt;p&gt;The best co-founder relationships I've seen come from three sources:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Former colleagues.&lt;/strong&gt; You've already seen how they handle pressure, credit, and conflict. You know if they ship or stall. Two years of working together beats 20 coffee chats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain communities.&lt;/strong&gt; If you're building in ecommerce or DTC, hang out where operators actually talk — Slack groups, Twitter/X threads, niche Discord servers. The person who's already building in your space and has complementary skills is far more valuable than a generalist who's "excited about startups."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accelerator cohorts and fellowships.&lt;/strong&gt; YC, On Deck, Entrepreneur First — these compress the relationship-building timeline because everyone has skin in the game. You're also being evaluated, which keeps both sides honest.&lt;/p&gt;

&lt;p&gt;Avoid: co-founder matching apps where people describe themselves as "visionary" and list their Myers-Briggs type. You're not matching personalities. You're evaluating execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Six Criteria That Actually Matter
&lt;/h2&gt;

&lt;p&gt;Before you run a single "co-founder date," define what you need. Most founders think in terms of skills (technical vs. business) and miss the real variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Complementary execution style.&lt;/strong&gt; Do they close loops or open them? You need someone whose natural tendency fills your gaps, not mirrors them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Skin-in-the-game appetite.&lt;/strong&gt; Are they ready to go full-time, or is this a side project to them? Misaligned commitment is the most common early partnership killer — especially in bootstrapped DTC or ecommerce ventures where cash is tight for months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Conflict resolution style.&lt;/strong&gt; Ask directly: "Tell me about a time you disagreed with someone you respected. How did you handle it?" Vague answers are red flags. Founders who can't narrate a real conflict can't survive one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Values alignment on money.&lt;/strong&gt; What's their exit mindset? Are they building to sell in three years or hold for a decade? Do they want to pull a salary immediately or defer? You can negotiate equity splits; you cannot negotiate someone's fundamental money psychology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. References from people they've disappointed.&lt;/strong&gt; Ask for references, then ask those references: "What's a situation where this person let you down, and how did they handle it?" Everyone has a great reference story. The recovery story tells you everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Domain credibility.&lt;/strong&gt; In ecommerce and DTC specifically, operators who've actually managed supply chains, run ads, or launched products are worth 10x the enthusiasts. Credibility compounds when you're talking to investors, suppliers, and early customers.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trial Period: Work Before You Sign
&lt;/h2&gt;

&lt;p&gt;Never sign equity agreements before a trial. Treat it like a probationary hire.&lt;/p&gt;

&lt;p&gt;Set a 60-90 day project with clear deliverables. Make it something real — a prototype, a customer discovery sprint, a first sales call. Define success upfront. At the end, you both evaluate honestly: was this person the version of themselves you expected?&lt;/p&gt;

&lt;p&gt;This does two things. First, it surfaces work style incompatibilities before they're expensive. Second, it creates a shared stake before the formal partnership — which actually strengthens the eventual commitment.&lt;/p&gt;

&lt;p&gt;During the trial, pay attention to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do they over-promise and under-deliver, or the reverse?&lt;/li&gt;
&lt;li&gt;Do they disappear when things get hard, or lean in?&lt;/li&gt;
&lt;li&gt;Do they credit you in conversations with others, or center themselves?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is subtle. Watch it. Equity fights almost always start with credit fights.&lt;/p&gt;




&lt;h2&gt;
  
  
  Structuring the Equity Conversation
&lt;/h2&gt;

&lt;p&gt;The number one mistake: discussing equity before you've discussed roles, responsibilities, and decision authority.&lt;/p&gt;

&lt;p&gt;Start with this: "Who has final say on product? Sales? Hiring? Finance?" Map it before you split it. Equity without decision clarity breeds resentment.&lt;/p&gt;

&lt;p&gt;Then use vesting with a cliff. Standard is four years with a one-year cliff. Non-negotiable for any serious partnership. If someone pushes back on vesting, that's a signal — they're either naive about startup norms or already planning their exit.&lt;/p&gt;

&lt;p&gt;On the split itself: 50/50 sounds fair and often isn't. It paralyzes decisions. A slight imbalance (51/49) with a documented decision framework is almost always healthier. The founder who led the initial concept typically takes the edge — but this should be written, not assumed.&lt;/p&gt;

&lt;p&gt;Document everything in a founders' agreement before you talk to a single investor. Include buyout mechanisms, IP assignment, and what happens if one person stops contributing. Uncomfortable now, catastrophic later if skipped.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Due Diligence Checklist Before You Sign Anything
&lt;/h2&gt;

&lt;p&gt;Run this before any agreement is executed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Background check&lt;/strong&gt; (basic, but often skipped): prior business history, any litigation, public records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn audit&lt;/strong&gt;: does their history match what they've told you? Gaps, title inflation, short tenures?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference calls&lt;/strong&gt;: minimum three, including one from someone who reported to them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial conversation&lt;/strong&gt;: outstanding debt, dependents, runway expectations — how long can they go without income?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social media review&lt;/strong&gt;: not to judge personally, but to understand how they represent themselves publicly — this matters when you're building a brand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legal check&lt;/strong&gt;: any existing non-competes, IP ownership issues from prior employers?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't paranoia. It's basic founder hygiene. Every partnership failure I've seen up close had at least one piece of information that was knowable before signing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Onboarding Your Co-Founder Like a Real Business
&lt;/h2&gt;

&lt;p&gt;Once you've signed, the work is just starting. Most partners get the equity right and skip the operating system.&lt;/p&gt;

&lt;p&gt;In the first 30 days: establish a weekly sync cadence, define the communication tools, agree on how decisions escalate, and write down the company values together. Not from a template — from a conversation about real trade-offs you've already navigated.&lt;/p&gt;

&lt;p&gt;Assign domains clearly. Whoever owns a domain owns the decisions within it. You review, but you don't override without a conversation. This prevents the slow decay of partnership where both people are theoretically in charge and nothing gets decided.&lt;/p&gt;

&lt;p&gt;And revisit the relationship explicitly every quarter. Not just business metrics — the partnership itself. Is the equity still reflecting the actual contribution? Is the role split still working? Relationships drift without check-ins.&lt;/p&gt;




&lt;p&gt;The cost of a bad co-founder isn't just the equity — it's 18 months of momentum lost, relationships strained, and a company that has to rebuild its foundation while trying to grow.&lt;/p&gt;

&lt;p&gt;I compiled everything into a practical guide: &lt;a href="https://forge.closerhub.app/product/91bfe967" rel="noopener noreferrer"&gt;Co-Founder Playbook: Find &amp;amp; Vet Your Partner&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the process before you need it. The time to vet a business partner is before you're in business together.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>business</category>
      <category>startup</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The 30-Day Framework Nobody Told You About: Validate Your Idea and Land Your First 100 Paying Users — Without Ads</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Sat, 09 May 2026 01:46:43 +0000</pubDate>
      <link>https://forem.com/ariauser13/the-30-day-framework-nobody-told-you-about-validate-your-idea-and-land-your-first-100-paying-users-4fb2</link>
      <guid>https://forem.com/ariauser13/the-30-day-framework-nobody-told-you-about-validate-your-idea-and-land-your-first-100-paying-users-4fb2</guid>
      <description>&lt;p&gt;Most founders do it backwards. They spend three months building, then wonder why nobody shows up. I've been there. Here's the framework that flipped the order and changed the outcome.&lt;/p&gt;

&lt;p&gt;The core principle: &lt;strong&gt;validation is a sales process, not a research project.&lt;/strong&gt; You're not gathering data. You're finding people willing to pay before you finish building.&lt;/p&gt;




&lt;h2&gt;
  
  
  Week 1: Kill Your Assumptions Before They Kill Your Startup
&lt;/h2&gt;

&lt;p&gt;Before you write a single line of code, write down every assumption baked into your idea. Not the obvious ones — the sneaky ones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Users will switch from [existing tool] because mine is better"&lt;/li&gt;
&lt;li&gt;"People will pay $X/month for this"&lt;/li&gt;
&lt;li&gt;"My target customer has this problem every week"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each assumption, ask: &lt;em&gt;What's the cheapest way to prove this wrong?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then go find the cheapest way.&lt;/p&gt;

&lt;p&gt;Reddit is your best friend here. Find the 3-5 subreddits where your target user lives. Don't post "I'm building X, would you use it?" — that's worthless. Instead, search for complaints. Real ones. Copy-paste 20 posts where people describe the exact pain you're solving. Read the comments. Notice what language they use. Notice what solutions they've already tried and abandoned.&lt;/p&gt;

&lt;p&gt;In week 1, you're building a vocabulary, not a product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete deliverable&lt;/strong&gt;: A one-page "customer voice" document with real quotes, real frustrations, real workarounds your potential users are already doing. This becomes your marketing copy later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Week 2: The Fake Door Test (And Why You Should Feel Uncomfortable Doing It)
&lt;/h2&gt;

&lt;p&gt;Build a landing page. Not a product — a landing page. Twenty minutes on Carrd or a simple HTML file. One headline, three bullet points, one call-to-action button.&lt;/p&gt;

&lt;p&gt;The CTA should be an email signup OR — and this is the uncomfortable part — a payment form.&lt;/p&gt;

&lt;p&gt;Yes. Charge people for something that doesn't fully exist yet. Be upfront: "We're launching in 6 weeks. Early access is $49. You'll get lifetime access if we don't ship on time."&lt;/p&gt;

&lt;p&gt;This is the only validation that actually counts. A hundred email signups means nothing. Three credit card numbers means you have something real.&lt;/p&gt;

&lt;p&gt;Where to get traffic without ads:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Twitter/X DMs&lt;/strong&gt; — Find people tweeting about your exact problem. Send a message: "I saw your tweet about [problem]. I'm building a tool for this. Would 15 minutes of your time be worth free early access?" This is not spam. It's targeted outreach with genuine value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Niche Slack groups and Discord servers&lt;/strong&gt; — Every industry has 2-3 Slacks where practitioners hang out. Join them. Contribute for a week. Then mention what you're working on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your own network&lt;/strong&gt; — Message 50 people in your phone. Not to sell them. To ask if they know anyone who deals with [problem]. Three degrees of separation works.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Goal for week 2: 100 conversations started, 10 discovery calls scheduled.&lt;/p&gt;




&lt;h2&gt;
  
  
  Week 3: Discovery Calls Are the Product
&lt;/h2&gt;

&lt;p&gt;Run those 10 calls. Use the Mom Test framework: ask about their life, not your idea. "Tell me about the last time you [problem]. What did you do? What did you try first? How much time did it cost you?"&lt;/p&gt;

&lt;p&gt;You're not pitching. You're listening.&lt;/p&gt;

&lt;p&gt;After each call, write down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact phrase they used to describe the problem&lt;/li&gt;
&lt;li&gt;What they're currently using (your real competitor)&lt;/li&gt;
&lt;li&gt;What they said when you mentioned price&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three patterns will emerge. One of them is what you're actually building. It's almost never exactly what you thought.&lt;/p&gt;

&lt;p&gt;At the end of the call: "Based on what you told me, I'm building [thing]. Would you pay [price] to be a founding member?" &lt;/p&gt;

&lt;p&gt;If they hesitate, ask why. If they say yes, send them a PayPal link before they hang up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected conversion&lt;/strong&gt;: 2-4 paying customers from 10 calls. That's enough to build.&lt;/p&gt;




&lt;h2&gt;
  
  
  Week 4: Ship the Minimum Viable Version to Your Paying Customers
&lt;/h2&gt;

&lt;p&gt;You have paying customers. Now you owe them something real.&lt;/p&gt;

&lt;p&gt;Build the smallest thing that delivers the core value you sold. Not features — value. If you sold "faster invoicing," build invoicing. Skip the dashboard, the analytics, the team features, the integrations.&lt;/p&gt;

&lt;p&gt;Ship it directly to your early customers. Not a public launch — a personal delivery. "Hey [name], here's the tool. I set up your account. Can we do a 20-minute walkthrough together?"&lt;/p&gt;

&lt;p&gt;Watch them use it. Where do they hesitate? Where do they ask questions? Where do they succeed and look pleased? That session is worth more than any A/B test.&lt;/p&gt;

&lt;p&gt;This is the part where most indie hackers bail — shipping something imperfect to people who paid real money feels terrifying. Do it anyway. Your early customers signed up because they have the problem, not because they expect a polished product.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Scaling Phase: From 10 to 100
&lt;/h2&gt;

&lt;p&gt;Once your first cohort is getting value, the acquisition math changes. Now you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real testimonials (ask for them explicitly)&lt;/li&gt;
&lt;li&gt;A clear before/after story&lt;/li&gt;
&lt;li&gt;Social proof for the next hundred people&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Layer these distribution channels in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Product Hunt&lt;/strong&gt; — Only if your product is genuinely ready for public feedback. A botched PH launch is worse than no launch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO content&lt;/strong&gt; — One article targeting the exact search query your customer would type when they have the problem. Not "best invoicing software" — "how to send invoices as a freelance developer without an accountant."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partner distribution&lt;/strong&gt; — Find tools your users already use. Propose a simple integration or co-marketing. One email to the right founder opens more doors than six months of cold SEO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your customers become recruiters&lt;/strong&gt; — Build a referral mechanic early. One month free for each referral isn't expensive when your CAC is zero.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The 30-day timeline isn't magic. Some ideas need 60 days. Some validate in 10. The framework is the forcing function — it stops you from building in the dark.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Most People Get Wrong
&lt;/h2&gt;

&lt;p&gt;They treat validation as something you do &lt;em&gt;before&lt;/em&gt; building, then stop once you start. Real validation is continuous. You're always asking: are we building the right thing, for the right person, at the right price?&lt;/p&gt;

&lt;p&gt;The moment you stop doing discovery calls because "we have customers now" is the moment you start drifting from product-market fit.&lt;/p&gt;

&lt;p&gt;Keep one call per week on your calendar forever. Not to sell — to listen.&lt;/p&gt;




&lt;p&gt;The process above is exactly what I went through to build and iterate on my own tools. If you want the complete structured version with templates, scripts, and week-by-week checklists, I compiled everything into a practical guide: &lt;a href="https://forge.closerhub.app/product/01c27cbe" rel="noopener noreferrer"&gt;Idea Validation &amp;amp; First 100 Users Framework&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Build things people want. Charge for them before they're ready. Listen more than you pitch.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>business</category>
      <category>startup</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Supply Chain Security Audit Nobody Told You to Run (Until It Was Too Late)</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Fri, 08 May 2026 22:52:13 +0000</pubDate>
      <link>https://forem.com/ariauser13/the-supply-chain-security-audit-nobody-told-you-to-run-until-it-was-too-late-4hl0</link>
      <guid>https://forem.com/ariauser13/the-supply-chain-security-audit-nobody-told-you-to-run-until-it-was-too-late-4hl0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📥 TL;DR — Want the complete playbook?&lt;/strong&gt; This article covers the concepts. The full guide includes production-ready frameworks, real examples, and actionable checklists.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/42cff29d" rel="noopener noreferrer"&gt;→ Get the guide&lt;/a&gt;&lt;/strong&gt; — 7€, instant PDF · 30-day refund
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;Last year, a single malicious npm package compromised thousands of projects. The package had 2 million weekly downloads, a clean README, and a GitHub star count that made it look legitimate. The payload? A credential harvester that ran silently on &lt;code&gt;postinstall&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you're not auditing your dependency supply chain, you're one &lt;code&gt;npm install&lt;/code&gt; away from a very bad day.&lt;/p&gt;

&lt;p&gt;Here's how I built a practical, LLM-assisted audit workflow that runs in CI and catches malicious packages before they reach production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Traditional Tools Miss the Real Threats
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm audit&lt;/code&gt; is useful. It's also reactive — it only flags known CVEs. The problem is that supply chain attacks are designed to avoid detection. Attackers use techniques like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typosquatting&lt;/strong&gt;: &lt;code&gt;lodahs&lt;/code&gt; instead of &lt;code&gt;lodash&lt;/code&gt;, &lt;code&gt;expres&lt;/code&gt; instead of &lt;code&gt;express&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency confusion&lt;/strong&gt;: publishing a private package name to the public registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainer account takeover&lt;/strong&gt;: injecting malicious code into a legitimate package's release&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protestware&lt;/strong&gt;: maintainers embedding political payloads (remember &lt;code&gt;colors&lt;/code&gt; and &lt;code&gt;faker&lt;/code&gt;?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These don't show up in CVE databases for days or weeks — if ever. By then, the damage is done.&lt;/p&gt;

&lt;p&gt;Traditional static analysis tools (&lt;code&gt;npm audit&lt;/code&gt;, &lt;code&gt;snyk&lt;/code&gt;, &lt;code&gt;socket.dev&lt;/code&gt;) cover the known attack surface. The unknown attack surface is where LLMs actually help.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Audit Stack: What You Actually Need
&lt;/h2&gt;

&lt;p&gt;Here's the minimal effective stack:&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;# Core tooling&lt;/span&gt;
npm audit &lt;span class="nt"&gt;--audit-level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;moderate
npx better-npm-audit
npx socket scan &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Deeper static checks&lt;/span&gt;
npx lockfile-lint &lt;span class="nt"&gt;--path&lt;/span&gt; package-lock.json &lt;span class="nt"&gt;--type&lt;/span&gt; npm
npx installed-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These handle the known-bad list. Now layer in LLM-assisted analysis for the unknown-bad territory.&lt;/p&gt;

&lt;p&gt;The idea: pipe package metadata, &lt;code&gt;package.json&lt;/code&gt;, and install scripts into an LLM prompt that knows what to look for. Flag anomalies for human review rather than trying to automate remediation blindly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building the LLM-Assisted Audit Layer
&lt;/h2&gt;

&lt;p&gt;Here's a practical implementation using Claude via the Anthropic API. This runs as part of a pre-merge CI check:&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;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_install_scripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;package_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npm&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;view&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;package_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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;scripts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scripts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maintainers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maintainers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;versions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repository&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repository&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;audit_package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a supply chain security analyst. Audit this npm package metadata for red flags:

&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Check for:
- Suspicious postinstall/preinstall scripts
- Mismatched repository URLs
- Very recent maintainer changes
- Version bumps with no git activity
- Scripts that reference curl, wget, eval, or exec
- Obfuscated code indicators

Return a risk rating (LOW/MEDIUM/HIGH) and specific concerns. Be concise.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;message&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;messages&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;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&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;prompt&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;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

&lt;span class="c1"&gt;# Run against all direct dependencies
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;package.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;deps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dependencies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pkg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;deps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_install_scripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;audit_package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HIGH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚨 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pkg&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs in under 2 minutes for most projects. Flag anything rated HIGH for immediate manual review before the PR merges.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the LLM Actually Catches
&lt;/h2&gt;

&lt;p&gt;In practice, the LLM audit layer has flagged things like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suspicious install scripts&lt;/strong&gt;: A package with a &lt;code&gt;postinstall&lt;/code&gt; that curled an external URL and piped it to &lt;code&gt;sh&lt;/code&gt;. Totally absent from CVE databases, caught immediately by the prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintainer anomalies&lt;/strong&gt;: A package where the npm maintainer email didn't match the GitHub org. Indicates possible account takeover or unofficial fork.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version velocity attacks&lt;/strong&gt;: A package that released 11 versions in 48 hours after 2 years of dormancy — classic indicator of a compromised account pushing malicious updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository drift&lt;/strong&gt;: &lt;code&gt;homepage&lt;/code&gt; pointing to a legitimate-looking site while the &lt;code&gt;repository&lt;/code&gt; field was blank. Legitimate packages rarely omit their repository.&lt;/p&gt;

&lt;p&gt;None of these are guaranteed malicious. That's the point — the LLM surfaces them for a human to check, not to block automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wiring It Into CI (GitHub Actions)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Supply Chain Audit&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;audit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.12"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install anthropic&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm audit --audit-level=high&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx socket scan . --strict&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LLM Dependency Audit&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.ANTHROPIC_API_KEY }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python scripts/llm_audit.py&lt;/span&gt;
        &lt;span class="na"&gt;continue-on-error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep &lt;code&gt;continue-on-error: false&lt;/code&gt; on the LLM step for new direct dependencies. For transitive dependencies (hundreds of packages), gate on HIGH ratings only — otherwise you'll drown in noise.&lt;/p&gt;

&lt;p&gt;Cost at scale: auditing 50 packages per PR run costs roughly $0.03 using Claude Haiku. Use Opus for the packages that actually show anomalies in the first pass.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hardest Part: Keeping It Maintained
&lt;/h2&gt;

&lt;p&gt;Tools rot. Malicious patterns evolve. Here's what keeps the system sharp:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subscribe to supply chain incident feeds&lt;/strong&gt; — Socket.dev's blog, OpenSSF's advisories, and the OSSF Malicious Packages repository on GitHub all publish real incident data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Update your audit prompt quarterly&lt;/strong&gt; — as new attack patterns emerge (like recently popularized GitHub Actions poisoning), add them explicitly to the LLM prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lock your lockfile&lt;/strong&gt; — commit &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; and fail CI if it drifts unexpectedly. Lockfile tampering is a common vector.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pin major versions, automate patch updates with audit gates&lt;/strong&gt; — use Renovate or Dependabot, but gate every auto-merge on the audit workflow passing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit your audit tools&lt;/strong&gt; — yes, seriously. The tools you use to audit dependencies are themselves dependencies. Socket, Snyk, and similar tools should be pinned and reviewed on the same cadence.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal isn't zero risk. It's making your project a harder target than the one next to you.&lt;/p&gt;




&lt;p&gt;Supply chain security used to require a dedicated AppSec team. With LLMs doing the pattern-recognition grunt work, a solo dev or small team can now run meaningful analysis without a $50k/year tooling contract.&lt;/p&gt;

&lt;p&gt;I compiled everything into a practical guide: &lt;a href="https://forge.closerhub.app/product/42cff29d" rel="noopener noreferrer"&gt;AI-Powered Supply Chain Security Audit Kit&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>programming</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Event-Driven AI Agents: Give Your LLM Ears</title>
      <dc:creator>Aria13</dc:creator>
      <pubDate>Fri, 08 May 2026 22:51:28 +0000</pubDate>
      <link>https://forem.com/ariauser13/event-driven-ai-agents-give-your-llm-ears-3d6c</link>
      <guid>https://forem.com/ariauser13/event-driven-ai-agents-give-your-llm-ears-3d6c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📥 TL;DR — Want the complete playbook?&lt;/strong&gt; This article covers the concepts. The full guide includes production patterns, code examples, trigger setup, and failure modes.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/3f6a05e0" rel="noopener noreferrer"&gt;→ Get the Event-Driven AI Agents guide&lt;/a&gt;&lt;/strong&gt; — 7€, instant PDF · 30-day refund
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most AI agents are deaf. You type, they respond. You stop typing, they stop existing. That's not an agent — that's a very expensive autocomplete.&lt;/p&gt;

&lt;p&gt;Real agents react to the world. A new customer signs up: the agent enriches their profile, drafts an onboarding sequence, and flags edge cases to you. A competitor publishes a post: the agent summarizes it, tags it, and routes it to the right Slack channel. No prompt required. No babysitting needed.&lt;/p&gt;

&lt;p&gt;This is the architecture most tutorials skip. Let me walk you through how to actually build it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Prompt → Response" Is the Wrong Mental Model
&lt;/h2&gt;

&lt;p&gt;When LangChain and ChatGPT exploded, everyone built chatbots. The interaction model was synchronous: human sends message, model replies, loop ends. Clean, understandable — and completely wrong for automation.&lt;/p&gt;

&lt;p&gt;The problem is that most valuable work happens &lt;em&gt;between&lt;/em&gt; conversations. Your CRM gets a new lead at 2am. A webhook fires when a payment fails. A cron job finds a broken link on your site. None of these start with a human typing something.&lt;/p&gt;

&lt;p&gt;Event-driven agents flip the model: instead of waiting to be asked, they &lt;em&gt;listen&lt;/em&gt; for signals and act autonomously. The LLM becomes a reasoning engine inside a larger reactive system, not the entry point.&lt;/p&gt;

&lt;p&gt;Think of it like this — your agent is a team member who stays logged in. They watch the queue, process what comes in, and only escalate when genuinely stuck.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Primitives You Actually Need
&lt;/h2&gt;

&lt;p&gt;You don't need a full orchestration framework to start. You need three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A trigger layer&lt;/strong&gt; — something that produces events. This can be a webhook endpoint, a cron job, a file watcher, or a queue consumer. In Python, a minimal FastAPI webhook listener is 15 lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A routing layer&lt;/strong&gt; — logic that decides which agent (or which tool) handles which event. This is just a dispatcher, not magic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. An action layer&lt;/strong&gt; — the agent itself: LLM call + tools + optional output (API call, database write, Slack message).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Minimal event-driven agent skeleton
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;event_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;event_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;new_lead&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;enrich_and_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment_failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;draft_recovery_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/webhook&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_webhook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;run_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# non-blocking
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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;accepted&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;Notice the &lt;code&gt;create_task&lt;/code&gt; — we return 200 immediately and process async. If your webhook receiver blocks, upstream services will time out and retry. That's how you get duplicate agent runs at 3am.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Reading this in depth? The complete production-ready guide is available:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/3f6a05e0" rel="noopener noreferrer"&gt;→ Event-Driven AI Agents: Give Your LLM Ears&lt;/a&gt;&lt;/strong&gt; — €7, instant PDF · 30-day refund&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Multi-Agent Routing Without the Framework Tax
&lt;/h2&gt;

&lt;p&gt;The moment you have more than one agent, you need routing. Most frameworks solve this with abstractions that cost you flexibility. Here's what works without vendor lock-in:&lt;/p&gt;

&lt;p&gt;Use a simple event schema with a &lt;code&gt;type&lt;/code&gt; field and route to specialized agents:&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="n"&gt;AGENT_REGISTRY&lt;/span&gt; &lt;span class="o"&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;new_lead&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="nc"&gt;LeadEnrichmentAgent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment_failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecoveryAgent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mention&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;        &lt;span class="nc"&gt;MonitoringAgent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;form_submit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="nc"&gt;OnboardingAgent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AGENT_REGISTRY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;fallback_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each agent is just a class with a &lt;code&gt;run()&lt;/code&gt; method. No inheritance chains, no magic decorators. You can test each one in isolation with &lt;code&gt;pytest&lt;/code&gt; and a mock event dict.&lt;/p&gt;

&lt;p&gt;For higher volume, swap the dict dispatch for a proper queue (Redis Streams, SQS, even SQLite with polling). The agent code doesn't change — only what feeds it does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Failures Like a Production System
&lt;/h2&gt;

&lt;p&gt;Here's what tutorials always skip: agents fail. The API times out. The LLM hallucinates a tool call. The downstream webhook is down.&lt;/p&gt;

&lt;p&gt;Build for failure from day one:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idempotency keys&lt;/strong&gt; — store processed event IDs. If the same webhook fires twice (it will), skip the duplicate.&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;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;already_processed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_state.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT 1 FROM processed_events WHERE id = ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetchone&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;row&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_processed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_state.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSERT OR IGNORE INTO processed_events VALUES (?)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dead letter queues&lt;/strong&gt; — if an event fails 3 times, route it to a &lt;code&gt;failed_events&lt;/code&gt; table for human review. Don't silently swallow errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeouts on LLM calls&lt;/strong&gt; — wrap every &lt;code&gt;client.messages.create()&lt;/code&gt; with a timeout. An agent that hangs forever blocks your entire queue.&lt;/p&gt;

&lt;p&gt;These three patterns alone will make your agent ten times more reliable than anything built in a weekend hackathon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passive Monitoring: Agents That Watch Without Being Asked
&lt;/h2&gt;

&lt;p&gt;The most powerful use case is monitoring — agents that continuously observe a data source and act when conditions are met.&lt;/p&gt;

&lt;p&gt;Example: an agent that watches your product's Subreddit and drafts a response whenever your brand is mentioned with a negative sentiment.&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;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reddit_monitor_loop&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&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;mentions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_recent_mentions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yourproduct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mentions&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;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;sentiment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;classify_sentiment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&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;sentiment&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;draft_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;notify_slack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# poll every 5 minutes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs forever as a background task. No human triggers it. It just... works. You wake up in the morning with a Slack message showing every negative mention and a ready-to-post response draft.&lt;/p&gt;

&lt;p&gt;That's the promise of event-driven agents — not AI that answers questions, but AI that does work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying Without Overengineering
&lt;/h2&gt;

&lt;p&gt;You don't need Kubernetes. For most indie projects and early-stage startups, a single VPS with &lt;code&gt;nohup&lt;/code&gt; and a process watchdog is enough:&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;nohup &lt;/span&gt;python3 &lt;span class="nt"&gt;-u&lt;/span&gt; agent_worker.py &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; logs/agent.log 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run a watchdog cron that restarts it if it crashes. Log everything to a file you can tail. Add a &lt;code&gt;/health&lt;/code&gt; endpoint that returns the last event processed timestamp — if it's stale, you know the loop is stuck.&lt;/p&gt;

&lt;p&gt;Only add infrastructure complexity when you actually hit the limits of this setup. Most teams never do.&lt;/p&gt;

&lt;p&gt;The trap is building for scale you don't have. An event-driven agent that runs on a $6/month VPS and reliably processes 1,000 events a day is worth infinitely more than an orchestration monstrosity that takes three sprints to deploy.&lt;/p&gt;

&lt;p&gt;Start boring. Automate the trigger. Ship the agent. Scale if the problem demands it.&lt;/p&gt;




&lt;h2&gt;
  
  
  📥 Want the complete implementation guide?
&lt;/h2&gt;

&lt;p&gt;I turned this into a production-ready playbook: patterns, code examples, trigger setup, and the failure modes I found the hard way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://forge.closerhub.app/product/3f6a05e0" rel="noopener noreferrer"&gt;→ Event-Driven AI Agents: Give Your LLM Ears&lt;/a&gt;&lt;/strong&gt; — €7, instant PDF download&lt;/p&gt;

&lt;p&gt;&lt;em&gt;30-day money-back guarantee. No questions asked.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
