<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ansari Mohammed Bilal</title>
    <description>The latest articles on DEV Community by Ansari Mohammed Bilal (@ansari_bilal).</description>
    <link>https://dev.to/ansari_bilal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3994780%2F0597f791-6ed0-4482-af06-40590e3f474a.png</url>
      <title>DEV Community: Ansari Mohammed Bilal</title>
      <link>https://dev.to/ansari_bilal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ansari_bilal"/>
    <language>en</language>
    <item>
      <title>OSINT with Sploitas: What I Found About My Own Digital Footprint</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Sat, 08 Aug 2026 10:02:18 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/osint-with-sploitas-what-i-found-about-my-own-digital-footprint-49bd</link>
      <guid>https://dev.to/ansari_bilal/osint-with-sploitas-what-i-found-about-my-own-digital-footprint-49bd</guid>
      <description>&lt;p&gt;&lt;em&gt;Last updated: September 10, 2025 \u00b7 6-minute read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I always assumed my digital footprint was small. I don\u2019t overshare on social media, I use a password manager, and I\u2019ve been privacy-conscious for years. But last week I decided to stop assuming and start verifying \u2014 by running the same OSINT tools security researchers use on targets against myself.&lt;/p&gt;

&lt;p&gt;The results were humbling. &lt;strong&gt;14 tools, 30 minutes, and I found 9 email addresses I\u2019d forgotten about, 17 abandoned accounts, and my personal data on at least 6 data broker sites.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjq15udog9mehnhciod6c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjq15udog9mehnhciod6c.jpg" alt="OSINT digital footprint investigation" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Starting Point: Where I Looked
&lt;/h2&gt;

&lt;p&gt;I started with the &lt;a href="https://github.com/cipher387/osint_stuff_tool_collection" rel="noopener noreferrer"&gt;Cyber Detective\u2019s OSINT tools collection on GitHub&lt;/a&gt; \u2014 a repo that catalogs over 1,000 services for open-source intelligence gathering. The maintainer describes it as a \u201ccollection of different services, techniques, tricks and notes about OSINT.\u201d It\u2019s the kind of resource that makes you realize how much of your life is indexable.&lt;/p&gt;

&lt;p&gt;I also pulled evaluation criteria from Wiz\u2019s &lt;a href="https://www.wiz.io/academy/threat-intel/osint-tools" rel="noopener noreferrer"&gt;\u201c9 Top OSINT Tools &amp;amp; How to Evaluate Them\u201d&lt;/a&gt; article, which breaks down what actually makes an OSINT tool useful versus just noisy. Their framework: data breadth, freshness, and actionability.&lt;/p&gt;

&lt;p&gt;For the actual scanning, I used Sploitas and a handful of tools from the Cyber Detective collection \u2014 email lookup services, username enumeration tools, and data broker aggregators. The point wasn\u2019t to become a security researcher. The point was to see what a stranger with my email address could find in 30 minutes.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Emails I Forgot Existed
&lt;/h3&gt;

&lt;p&gt;Running my primary email through OSINT email lookup tools surfaced &lt;strong&gt;9 addresses&lt;/strong&gt; tied to my identity that I hadn\u2019t used in years. A university email. A throwaway from a 2019 hackathon. Three variations of my name with different providers. Two work emails from previous jobs I\u2019d assumed were deactivated.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Abandoned Accounts
&lt;/h3&gt;

&lt;p&gt;The username enumeration tools found &lt;strong&gt;17 accounts&lt;/strong&gt; across platforms I either barely used or completely forgot about. Old GitHub forks from 2021. A Medium account with one draft. A Fiverr profile. A Stack Overflow account with two answers from college. A Dribbble I signed up for and never touched.&lt;/p&gt;

&lt;p&gt;Each one is a potential vector. An abandoned account with a reused password is a foothold waiting to be exploited.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Data Brokers
&lt;/h3&gt;

&lt;p&gt;This was the uncomfortable part. Searching my name and email across data broker aggregator tools showed hits on at least &lt;strong&gt;6 different brokers&lt;/strong&gt; \u2014 sites that buy, compile, and resell personal information. Name, address history, phone number, associated emails, age. All publicly purchasable for anywhere from $2 to $30.&lt;/p&gt;

&lt;p&gt;A thread on r/cybersecurity was blunt about the reality: paying services like DeleteMe or Incogni only handle the request loop. They don\u2019t prevent your data from reappearing. One commenter put it well \u2014 \u201cit does not remove your info from the internet, all it does is request that the data brokers delete the copy they have.\u201d&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cleanup Process
&lt;/h2&gt;

&lt;p&gt;Here\u2019s exactly what I did, in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Delete abandoned accounts.&lt;/strong&gt; I went through all 17 accounts and either deleted them or updated the password to a unique 32-character string and removed all personal info. The latter is faster for platforms that make deletion intentionally difficult.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Opt out of data brokers.&lt;/strong&gt; I submitted removal requests to all 6 brokers manually. Most have an opt-out form buried in their footer. A few required email verification or a scan of my ID. The entire process took about 90 minutes spread across two evenings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Consolidate email addresses.&lt;/strong&gt; I set up forwarding on the forgotten emails to my primary address, then deactivated the ones I could. For the ones tied to accounts I still need (university alumni, bank), I updated the recovery info.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Run it again.&lt;/strong&gt; A week later, I re-ran the same tools. Two of the six data brokers had removed my listing. The rest were \u201cprocessing.\u201d Three abandoned accounts I thought I\u2019d deleted were still showing up in username searches \u2014 the platforms had a 30-day grace period.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for How I Build
&lt;/h2&gt;

&lt;p&gt;This experiment reinforced something I already believed but now feel more urgently about: &lt;strong&gt;privacy isn\u2019t a feature, it\u2019s an architecture decision.&lt;/strong&gt; Every app I build starts with the assumption that user data stays on the user\u2019s device. That\u2019s why I built &lt;a href="https://ansaribilal.com/blog/local-ai-is-the-future-of-privacy" rel="noopener noreferrer"&gt;PrivacyThink&lt;/a&gt; to run LLMs locally, and why every tool in the &lt;a href="https://ansaribilal.com/#lab" rel="noopener noreferrer"&gt;Lab&lt;/a&gt; is designed to minimize data leaving your machine.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a random person can reconstruct 80% of my digital identity using free tools in 30 minutes, then the tools I build have a responsibility to not add to that pile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OSINT tools found 9 forgotten emails, 17 abandoned accounts, and 6 data broker listings tied to my identity&lt;/li&gt;
&lt;li&gt;The Cyber Detective\u2019s GitHub collection (1,000+ services) and Sploitas were my starting points&lt;/li&gt;
&lt;li&gt;Cleanup: delete abandoned accounts, opt out of data brokers manually, consolidate emails&lt;/li&gt;
&lt;li&gt;Data broker removal is a recurring process, not a one-time fix&lt;/li&gt;
&lt;li&gt;This directly connects to why I build privacy-first tools like &lt;a href="https://ansaribilal.com/blog/local-ai-is-the-future-of-privacy" rel="noopener noreferrer"&gt;PrivacyThink&lt;/a&gt; and keep &lt;a href="https://ansaribilal.com/#lab" rel="noopener noreferrer"&gt;experiments&lt;/a&gt; local-first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://ansaribilal.com/#projects" rel="noopener noreferrer"&gt;Projects section&lt;/a&gt; has the tools I\u2019ve built with privacy in mind, and the &lt;a href="https://ansaribilal.com/#lab" rel="noopener noreferrer"&gt;Lab&lt;/a&gt; has the ones still in progress. If you haven\u2019t checked your own footprint, do it this week \u2014 not next month.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not affiliated with Sploitas, OSINT Industries, Epieos, or any data broker mentioned. Tools used: Sploitas, Epieos, OSINT Industries, Cyber Detective\u2019s OSINT collection on GitHub.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/sploitas-osint-digital-footprint-experiment-2025?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=sploitas-osint-digital-footprint-experiment-2025" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=sploitas-osint-digital-footprint-experiment-2025" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Superhero UI Review: The Boldest React Component Library of 2026?</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Fri, 07 Aug 2026 10:24:33 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/superhero-ui-review-the-boldest-react-component-library-of-2026-29ge</link>
      <guid>https://dev.to/ansari_bilal/superhero-ui-review-the-boldest-react-component-library-of-2026-29ge</guid>
      <description>&lt;p&gt;&lt;em&gt;7-minute read · October 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every React component library in 2026 looks the same: neutral gray, tiny radius, muted primary. Superhero UI shows up wearing a cape.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6pdj0t8nc9zx81ullyc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6pdj0t8nc9zx81ullyc.jpg" alt="Superhero UI React component cards — bold pop-art meets warm editorial" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I rebuilt a real internal dashboard with it over a weekend. Here's what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Superhero UI Actually Is
&lt;/h2&gt;

&lt;p&gt;A React + Tailwind component set with a distinctly comic-book aesthetic — thick borders, halftone patterns, bold shadows, dramatic hover states. Built on Radix primitives (like shadcn), themed as if Marvel designed a design system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Good
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Instant personality.&lt;/strong&gt; A landing page built with default Superhero components looks like &lt;em&gt;someone made it&lt;/em&gt;, not like a Vercel template.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radix underneath = accessibility comes free.&lt;/strong&gt; Focus rings, keyboard nav, ARIA — all handled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-install feel.&lt;/strong&gt; Copy-paste like shadcn. You own the code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Painful
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Not for enterprise dashboards.&lt;/strong&gt; Halftone patterns behind a data table make my product manager cry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Print / PDF export looks weird.&lt;/strong&gt; Bold shadows don't rasterize cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small community.&lt;/strong&gt; ~1.2k stars vs shadcn's 70k+. Fewer recipes on Stack Overflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Head to Head
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Vibe&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;shadcn/ui&lt;/td&gt;
&lt;td&gt;Neutral, minimal&lt;/td&gt;
&lt;td&gt;SaaS, admin, "safe" B2B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aceternity&lt;/td&gt;
&lt;td&gt;Cinematic, animated&lt;/td&gt;
&lt;td&gt;Marketing pages, hero moments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Magic UI&lt;/td&gt;
&lt;td&gt;Playful, motion-heavy&lt;/td&gt;
&lt;td&gt;Landing pages that need to feel alive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Superhero&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bold, pop-art&lt;/td&gt;
&lt;td&gt;Personal sites, indie SaaS, portfolios&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When I'd Reach For It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio sites&lt;/strong&gt; where you want to stand out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indie SaaS marketing pages&lt;/strong&gt; for a fun product category (games, kids, creators).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hackathon demos&lt;/strong&gt; where "distinctive" &amp;gt; "polished".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When I Wouldn't
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Anything B2B fintech, health, government. The visual language is wrong.&lt;/li&gt;
&lt;li&gt;Data-heavy apps. Chart libraries look strange next to halftone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Combine, Don't Commit
&lt;/h2&gt;

&lt;p&gt;The pattern that worked best in my rebuild: &lt;strong&gt;Superhero for marketing pages, shadcn for the app&lt;/strong&gt;. Same Tailwind theme tokens, two visual registers. Users get personality on the way in and clarity once they're inside.&lt;/p&gt;

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

&lt;p&gt;Superhero UI is the honest answer to "why does every React app look the same?" It won't win the enterprise, but for personal work and indie launches, it's the most fun I've had installing a component library in 2026.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Grab it from the docs, or read my &lt;a href="https://ansaribilal.com/blog/aceternity-ui-vs-magic-ui-vs-shadcn-comparison-2025" rel="noopener noreferrer"&gt;take on shadcn vs Aceternity vs Magic UI&lt;/a&gt; for the full field guide.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/superhero-ui-component-library-review-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=superhero-ui-component-library-review-2026" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=superhero-ui-component-library-review-2026" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI Testing That Actually Works: TestSprite Setup (After Trying Everything Else)</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Fri, 07 Aug 2026 10:24:28 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/ai-testing-that-actually-works-testsprite-setup-after-trying-everything-else-4c95</link>
      <guid>https://dev.to/ansari_bilal/ai-testing-that-actually-works-testsprite-setup-after-trying-everything-else-4c95</guid>
      <description>&lt;p&gt;&lt;em&gt;Last updated: August 27, 2025 · 8-minute read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wrote 47 Cypress tests for a SaaS dashboard in March. By June, 12 of them were broken — not because the app was buggy, but because a frontend dependency updated and three CSS class names changed. I spent a Saturday fixing selectors.&lt;/p&gt;

&lt;p&gt;That's the traditional testing trap. You don't maintain tests — you maintain selectors. And in the age of AI-generated code where your component structure changes every session, selector-based testing is a losing game.&lt;/p&gt;

&lt;p&gt;I tried every AI testing tool I could find. Most of them were exactly what a Reddit thread on r/QualityAssurance warned about: "I've tried a few of the newer AI tools, they can help with quick test generation, but often feel overhyped and not very cost effective."&lt;/p&gt;

&lt;p&gt;TestSprite is the exception. Here's why, and how to set it up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft45ny080y3x7b33ucfc1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft45ny080y3x7b33ucfc1.jpg" alt="AI testing agent scanning code for bugs and hallucinations" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Traditional Testing in 2025
&lt;/h2&gt;

&lt;p&gt;The top thread on r/QualityAssurance — "What AI QA testing tools/services are you actually using in 2025?" — had a telling response distribution. Most comments fell into two camps: "I use Playwright/Cypress with some AI-assisted test generation" or "AI testing tools aren't ready for production yet."&lt;/p&gt;

&lt;p&gt;A related thread titled "AI in QA/Automation — What tools are you actually using and for what?" was even more blunt. The consensus: AI can generate test &lt;em&gt;code&lt;/em&gt;, but the tools that claim to autonomously test your app end-to-end are still unreliable.&lt;/p&gt;

&lt;p&gt;The core issue is that vibe-coded apps — apps built primarily through AI coding agents — have a specific failure mode that traditional testing doesn't catch well. The AI doesn't write buggy code in the traditional sense. It writes code that &lt;em&gt;looks&lt;/em&gt; correct but makes architectural assumptions that don't hold. Intellyx's analysis of TestSprite called this out directly: it "protects against vibecoding and GenAI architectural hallucinations by orchestrating agents that generate and run end-to-end tests."&lt;/p&gt;

&lt;p&gt;That's the gap TestSprite targets — not "does this button work" but "does this AI-generated architecture actually hold together."&lt;/p&gt;

&lt;h2&gt;
  
  
  What TestSprite Actually Does
&lt;/h2&gt;

&lt;p&gt;TestSprite is an AI testing agent that takes a different approach from traditional test frameworks. Instead of writing selectors and assertions, you give it your app URL and a prompt. It:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigates your app and builds a structural understanding of the pages&lt;/li&gt;
&lt;li&gt;Generates a test plan based on what it finds&lt;/li&gt;
&lt;li&gt;Writes and executes tests — autonomously&lt;/li&gt;
&lt;li&gt;Debugs failures and retries&lt;/li&gt;
&lt;li&gt;Reports with screenshots, logs, and a summary&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It integrates as an MCP server in Cursor and other AI IDEs, which means your coding agent can trigger tests without leaving the editor. The YouTube video "TestSprite MCP Server + Cursor + Copilot = One Prompt to Test" demonstrates the workflow — you literally type "test the checkout flow" and it goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Walkthrough
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create a TestSprite Account
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://www.testsprite.com" rel="noopener noreferrer"&gt;testsprite.com&lt;/a&gt; and sign up. They have a free tier with limited runs — enough to evaluate whether it works for your use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Add the MCP Server to Cursor
&lt;/h3&gt;

&lt;p&gt;Open Cursor Settings (Cmd+Shift+J on Mac), navigate to Tools &amp;amp; Integration, click "Add custom MCP," and add this configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"testsprite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"testsprite-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Cursor. The TestSprite tools should now appear in your MCP tool panel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Point It at Your App
&lt;/h3&gt;

&lt;p&gt;In a Cursor chat, type something like:&lt;/p&gt;

&lt;p&gt;"Run an end-to-end test on &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt;. Test the login flow, dashboard load, and task creation."&lt;/p&gt;

&lt;p&gt;TestSprite will navigate your app, build a test plan, execute it, and return results — all within the chat. No test files to maintain. No selectors to update.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Review Results
&lt;/h3&gt;

&lt;p&gt;TestSprite returns a report with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pass/fail status for each test case&lt;/li&gt;
&lt;li&gt;Screenshots at failure points&lt;/li&gt;
&lt;li&gt;Console errors and network logs&lt;/li&gt;
&lt;li&gt;A natural language summary of what broke and why&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something fails, you can ask it to debug: "The login test failed. Fix the issue and re-run." It'll investigate, propose a fix, and verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  TestSprite vs Cypress vs Playwright vs Raw AI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cypress:&lt;/strong&gt; Selector-based. You write tests that depend on DOM structure. When your AI agent changes a div to a section, your test breaks. Good for stable apps with slow-moving frontends. Bad for anything AI-generated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Playwright:&lt;/strong&gt; Better selectors (can use text, role, aria labels instead of CSS classes), better cross-browser support, and Microsoft's MCP server means you can now use it inside Claude Code directly. The command &lt;code&gt;claude mcp add playwright npx @playwright/mcp@latest&lt;/code&gt; adds browser automation to your agent. But you still write and maintain test code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raw AI (just asking Claude to test):&lt;/strong&gt; I've tried this. "Here's my codebase, write tests." It generates Jest or Playwright scripts that are reasonable but brittle. Same maintenance problem as Cypress — the tests are tied to implementation details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TestSprite:&lt;/strong&gt; Doesn't write persistent test files. It generates tests on-the-fly based on the current state of your app. This means no test rot. The tradeoff is that it's slower per-run (it has to rediscover your app each time) and you don't get CI/CD integration in the traditional sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  When AI Testing Makes Sense (And When It Doesn't)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use TestSprite when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're building with AI agents and your UI changes frequently&lt;/li&gt;
&lt;li&gt;You need quick validation that a feature works end-to-end before committing&lt;/li&gt;
&lt;li&gt;You're prototyping and don't want to invest in a test suite yet&lt;/li&gt;
&lt;li&gt;You want to catch architectural hallucinations, not just unit-level bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stick with Playwright/Cypress when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a stable, shipping product with a test suite you already maintain&lt;/li&gt;
&lt;li&gt;You need CI/CD pipelines with fast, deterministic test runs&lt;/li&gt;
&lt;li&gt;Your team writes tests as part of the development process&lt;/li&gt;
&lt;li&gt;Regulatory compliance requires auditable, version-controlled test files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use any AI testing tool when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your app has no users yet and you're still figuring out the product&lt;/li&gt;
&lt;li&gt;The cost of the tool exceeds the cost of the bugs it catches&lt;/li&gt;
&lt;li&gt;Your testing needs are simple enough that a 20-line Playwright script covers them&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Traditional test frameworks (Cypress, Playwright) break when AI agents frequently restructure your code.&lt;/li&gt;
&lt;li&gt;Most AI testing tools are overhyped — the r/QualityAssurance consensus is clear on this.&lt;/li&gt;
&lt;li&gt;TestSprite works because it doesn't maintain persistent test files — it generates and runs tests on-the-fly against your current app state.&lt;/li&gt;
&lt;li&gt;Setup takes under 5 minutes via MCP in Cursor or Claude Code.&lt;/li&gt;
&lt;li&gt;It's not a replacement for Playwright in a CI/CD pipeline — it's a different category of tool for a different stage of development.&lt;/li&gt;
&lt;li&gt;Best use case: validating AI-generated code before you ship it to users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is part of a broader toolkit I've been assembling for building with AI agents. The &lt;a href="https://ansaribilal.com/blog/google-antigravity-2-every-new-superpower-2026" rel="noopener noreferrer"&gt;Google Antigravity 2.0 writeup&lt;/a&gt; covers the orchestration layer, and the &lt;a href="https://ansaribilal.com/#projects" rel="noopener noreferrer"&gt;Builds section&lt;/a&gt; has the projects where these testing workflows run in production.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not affiliated with TestSprite. Setup tested with Cursor and Claude Code in August 2025. Tools used: TestSprite (free tier), Playwright MCP, Claude Code.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/testsprite-ai-testing-setup-vs-cypress-playwright-2025?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=testsprite-ai-testing-setup-vs-cypress-playwright-2025" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=testsprite-ai-testing-setup-vs-cypress-playwright-2025" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Datacenter IP Block: Building a Self-Healing YouTube Download System for AI Agents</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Wed, 05 Aug 2026 11:36:02 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/the-datacenter-ip-block-building-a-self-healing-youtube-download-system-for-ai-agents-52n0</link>
      <guid>https://dev.to/ansari_bilal/the-datacenter-ip-block-building-a-self-healing-youtube-download-system-for-ai-agents-52n0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs29gbpb1615nmax384bv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs29gbpb1615nmax384bv.jpg" alt="Datacenter IPs blocked at the gate while residential IPs pass freely" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A research document on the architecture, failures, and breakthroughs of building a cloud-native video acquisition system that defeats modern anti-bot infrastructure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;This document chronicles the design, implementation, and iterative breakthroughs of a YouTube video acquisition system built specifically for cloud-based AI agents. The project began with a straightforward goal — enable an AI agent running in a headless cloud environment to download public YouTube videos without a browser, without cookies, and without human intervention. What began as a simple wrapper around existing tooling evolved into a multi-layered bypass architecture that defeats one of the most sophisticated anti-bot systems on the internet: YouTube's datacenter IP detection and Proof-of-Origin token enforcement.&lt;/p&gt;

&lt;p&gt;The research reveals a critical truth about modern web infrastructure: the internet is splitting into two tiers. Residential IPs can access content freely. Datacenter IPs are increasingly walled off behind behavioral analysis, attestation challenges, and IP reputation scoring. For AI agents that operate exclusively from cloud environments, this split represents an existential threat to their ability to interact with the web. This document describes how that threat was identified, analyzed, and ultimately routed around — not by breaking the security measures, but by composing multiple legitimate access paths into a resilient fallback chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The Problem: Why AI Agents Can't Download Videos&lt;/li&gt;
&lt;li&gt;Initial Research: Mapping the Landscape&lt;/li&gt;
&lt;li&gt;First Approach: The Naive Wrapper&lt;/li&gt;
&lt;li&gt;The Wall: Datacenter IP Detection&lt;/li&gt;
&lt;li&gt;Understanding the Block: Technical Deep Dive&lt;/li&gt;
&lt;li&gt;Second Approach: The PO Token Era&lt;/li&gt;
&lt;li&gt;Third Approach: The Bypass Architecture&lt;/li&gt;
&lt;li&gt;The Breakthrough: Compositional Bypass&lt;/li&gt;
&lt;li&gt;Final Architecture: The 13-Method Fallback Chain&lt;/li&gt;
&lt;li&gt;Key Learnings and Takeaways&lt;/li&gt;
&lt;li&gt;Future Implications&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. The Problem: Why AI Agents Can't Download Videos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The use case
&lt;/h3&gt;

&lt;p&gt;AI agents are increasingly deployed in cloud environments to perform research, content analysis, and data gathering. A common requirement is the ability to acquire video content from public sources for processing — transcription, summarization, frame extraction, or archival. The dominant video platform, YouTube, presents a unique challenge because it has evolved one of the most aggressive anti-automation systems on the public web.&lt;/p&gt;

&lt;p&gt;The constraints under which a cloud-based AI agent operates are fundamentally different from those of a human user:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No browser.&lt;/strong&gt; The agent runs in a headless container or VM. There is no Chrome, no Firefox, no cookie jar, no session persistence across requests in the way a browser provides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No credentials.&lt;/strong&gt; The agent has no Google account, no OAuth token, no logged-in session. It cannot "sign in to confirm you're not a bot" because it has nothing to sign in with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datacenter IP.&lt;/strong&gt; The agent's network traffic originates from a cloud provider's IP range (AWS, GCP, Azure, Alibaba, etc.). These ranges are publicly known and aggressively flagged by anti-bot systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-interactive.&lt;/strong&gt; The agent cannot solve CAPTCHAs, click "I'm not a robot," or wait for a human to solve a browser challenge. Every operation must be fully autonomous.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic.&lt;/strong&gt; The same input must produce the same output. Introducing an LLM into the runtime download path would make the system unpredictable and untestable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why existing tools fail
&lt;/h3&gt;

&lt;p&gt;The dominant YouTube download tool, &lt;code&gt;yt-dlp&lt;/code&gt;, is an exceptionally well-maintained project that has kept up with YouTube's anti-bot changes for over five years. However, &lt;code&gt;yt-dlp&lt;/code&gt; was designed for a human-run use case: a person on a residential IP, possibly with a browser session, running the tool from their personal machine. When deployed in a cloud environment, &lt;code&gt;yt-dlp&lt;/code&gt; encounters a wall that it was never designed to climb:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;YouTube returns &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; at the player API level for datacenter IPs, before any video stream URLs are returned.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--cookies-from-browser&lt;/code&gt; flag is useless because there is no browser.&lt;/li&gt;
&lt;li&gt;OAuth login was deprecated and removed from &lt;code&gt;yt-dlp&lt;/code&gt; entirely.&lt;/li&gt;
&lt;li&gt;The BGutil POT (Proof-of-Origin Token) provider, which generates attestation tokens to satisfy YouTube's bot detection, requires a Node.js runtime and a server process — setup that a cloud agent cannot easily perform.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is yt-dlp?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yt-dlp&lt;/code&gt; is a command-line tool (and Python library) that downloads videos from YouTube and hundreds of other platforms. It works by: (1) fetching the video's watch page, (2) extracting configuration data embedded in the HTML, (3) calling YouTube's internal "Innertube" API to get stream URLs, (4) deciphering any signature or throttling parameters using a built-in JavaScript interpreter, and (5) downloading the video and audio streams and merging them with &lt;code&gt;ffmpeg&lt;/code&gt;. It is the spiritual successor to &lt;code&gt;youtube-dl&lt;/code&gt; and is actively maintained by a community of contributors who reverse-engineer YouTube's changes within hours of detection.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem, then, was not to build a better downloader — &lt;code&gt;yt-dlp&lt;/code&gt; already is the best downloader. The problem was to build a &lt;strong&gt;system&lt;/strong&gt; that makes &lt;code&gt;yt-dlp&lt;/code&gt; (and other methods) work reliably in an environment they were never designed for, with zero human intervention.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Initial Research: Mapping the Landscape
&lt;/h2&gt;

&lt;p&gt;Before writing any code, a thorough research phase was conducted to map every known method for acquiring YouTube video content from a headless environment. This research was structured around a single question: &lt;strong&gt;"Given a video URL and a cloud environment with no cookies and no browser, what are all the ways to get a verified video file on disk?"&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The methods surveyed
&lt;/h3&gt;

&lt;p&gt;The research identified eleven distinct approaches, each with different reliability profiles, dependencies, and failure modes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 1 — yt-dlp with various innertube clients.&lt;/strong&gt; YouTube's internal API (&lt;code&gt;/youtubei/v1/player&lt;/code&gt;) accepts a "client context" that identifies the type of application making the request. Different clients have different security requirements: the &lt;code&gt;web&lt;/code&gt; client requires a PO Token and JavaScript signature deciphering; the &lt;code&gt;android_vr&lt;/code&gt; and &lt;code&gt;visionos&lt;/code&gt; clients are "JS-less" (no signature deciphering needed) and historically did not require PO Tokens; the &lt;code&gt;ios&lt;/code&gt; client returns HLS streams; the &lt;code&gt;mweb&lt;/code&gt; client mimics a mobile browser. &lt;code&gt;yt-dlp&lt;/code&gt;'s default client chain tries &lt;code&gt;visionos → android_vr → web&lt;/code&gt; in sequence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is an "Innertube Client"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you open the YouTube app on your phone, or YouTube in a browser, the app identifies itself to YouTube's servers with a "client context" — a bundle of metadata that says "I am the Android app version X" or "I am the web browser version Y." YouTube's servers use this context to decide what format to return the video in, what ads to show, and — critically — what security checks to enforce. By crafting custom client contexts (like pretending to be a VR headset app), developers can sometimes access video streams with fewer security requirements. YouTube periodically closes these loopholes, and the cat-and-mouse game continues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Tier 2 — Direct Innertube API calls.&lt;/strong&gt; Instead of using &lt;code&gt;yt-dlp&lt;/code&gt;, one can POST directly to &lt;code&gt;https://www.youtube.com/youtubei/v1/player&lt;/code&gt; with a hand-crafted client context and parse the JSON response for stream URLs. This gives maximum control but requires manually handling signature deciphering and PO tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 3 — Cobalt.&lt;/strong&gt; An open-source project that provides a simple HTTP API: POST a YouTube URL, receive a redirect URL or tunneled stream. Cobalt handles PO tokens internally. Can be self-hosted or used via community-run public instances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 4 — Piped.&lt;/strong&gt; A federated, community-run YouTube frontend with a public API. Each instance operator runs their own server (typically on a residential or VPS IP), and the API exposes stream URLs. Multiple instances can be rotated for resilience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 5 — Invidious.&lt;/strong&gt; Another federated YouTube frontend. The key feature is the &lt;code&gt;local=true&lt;/code&gt; parameter on its &lt;code&gt;/latest_version&lt;/code&gt; endpoint, which tells the Invidious server to proxy the video stream through its own IP rather than redirecting to googlevideo.com.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 6 — Transcript API.&lt;/strong&gt; YouTube's transcript/subtitle endpoint runs on a separate rate-limit bucket from the video player API. It can be used as a preflight reachability check — if the transcript endpoint returns 429 (rate limited), the video is unreachable from this IP and no video download method will succeed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 7 — PO Token providers.&lt;/strong&gt; The BGutil POT provider runs Google's BotGuard attestation in Node.js to generate Proof-of-Origin tokens. These tokens prove to YouTube that the request comes from a "real" client, which can lift the &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; block for certain clients.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is a PO Token?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A PO Token (Proof-of-Origin Token) is a cryptographic attestation that YouTube requires for certain API calls. It is generated by running Google's BotGuard challenge — a piece of JavaScript that performs computations to prove the client is a real browser/app, not a bot. The token is bound to a specific video ID and expires after hours. YouTube introduced PO Tokens in 2024 to combat automated downloading. The &lt;code&gt;bgutil-ytdlp-pot-provider&lt;/code&gt; project runs the BotGuard challenge in Node.js (simulating a browser environment) to generate valid tokens without needing an actual browser.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Tier 8 — Free SOCKS5 proxies.&lt;/strong&gt; Public proxy lists contain thousands of SOCKS5 proxies run by volunteers, businesses, and (sometimes) botnets. Testing them in parallel against YouTube can find proxies whose IPs are not flagged, allowing the download to be routed through them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 9 — GitHub Actions.&lt;/strong&gt; GitHub's CI/CD runners run on Microsoft Azure IPs, which have a different reputation profile than typical cloud provider IPs. A workflow can be triggered via API to download a video on the runner and upload it as an artifact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 10 — Cloudflare Workers.&lt;/strong&gt; Edge functions run on Cloudflare's network, which has residential-like IP reputation. A Worker can proxy the YouTube request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 11 — Cloudflare WARP.&lt;/strong&gt; A VPN-like service that routes traffic through Cloudflare's network, masking the origin IP. Typically installed as a Docker container or system package.&lt;/p&gt;

&lt;h3&gt;
  
  
  The ranking
&lt;/h3&gt;

&lt;p&gt;Each method was scored on feasibility, cost, complexity, and reliability. The research concluded with a clear ranking and a recommended fallback chain. The key insight was that &lt;strong&gt;no single method is reliable enough to be the only method&lt;/strong&gt; — every approach has failure modes (rate limits, IP blocks, service outages, version breakages). The only path to reliability was composition: try multiple methods in sequence, and let the system learn which ones work best in the current environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. First Approach: The Naive Wrapper
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What we built
&lt;/h3&gt;

&lt;p&gt;The first iteration was a Python CLI tool with a clean architecture: an Orchestrator that walks a fallback chain of download methods, a Verifier that checks file integrity, a Truth Agent that learns which methods work best, and a Tester for end-to-end validation. The initial method chain had ten tiers, from transcript probing through yt-dlp with various clients to Cobalt, Piped, and Invidious.&lt;/p&gt;

&lt;p&gt;The system was designed around four principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Determinism.&lt;/strong&gt; No LLM at runtime. The Orchestrator is a state machine that makes decisions based on file existence and method results, not probabilistic reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification.&lt;/strong&gt; A download is not "done" until the Verifier confirms it: file exists, size ≥ 1MB, magic bytes match a known video container, ffprobe succeeds, duration &amp;gt; 0, and (for MP4) the moov atom is intact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback.&lt;/strong&gt; If a method fails, the next one is tried. The chain is exhaustive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning.&lt;/strong&gt; The Truth Agent tracks success/failure ratios and reorders the chain. After 3 consecutive failures, a method is demoted.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why it was supposed to work
&lt;/h3&gt;

&lt;p&gt;The research indicated that the &lt;code&gt;android_vr&lt;/code&gt; and &lt;code&gt;visionos&lt;/code&gt; innertube clients are "JS-less" — they do not require signature deciphering and historically did not require PO Tokens. The default &lt;code&gt;yt-dlp&lt;/code&gt; chain (&lt;code&gt;visionos → android_vr → web&lt;/code&gt;) was supposed to handle most public videos. For the remaining cases, the BGutil POT provider would generate tokens, and for everything else, the Cobalt/Piped/Invidious methods would serve as fallbacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  The initial success
&lt;/h3&gt;

&lt;p&gt;The first end-to-end test downloaded a very popular, very old video — a video so widely embedded and referenced that YouTube's caching and reputation systems treat it as permanently whitelisted. The download completed in under 5 seconds: a 243-megabyte, 213-second, AV1/Opus MP4 file. The Verifier confirmed all six integrity checks. The system worked.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is the moov atom?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An MP4 file is structured as a series of "boxes" (also called "atoms"). The &lt;code&gt;moov&lt;/code&gt; box contains all the metadata — the video and audio codecs, the duration, the frame timing, the sample tables that tell a player where each frame is. If the &lt;code&gt;moov&lt;/code&gt; box is missing or truncated, the file cannot be played even if the video data is intact. Some MP4 files put the &lt;code&gt;moov&lt;/code&gt; box at the end of the file (to allow streaming creation), which means a truncated download leaves an unplayable file. The &lt;code&gt;+faststart&lt;/code&gt; flag in ffmpeg moves the &lt;code&gt;moov&lt;/code&gt; box to the beginning, making the file playable even if truncated. Our Verifier walks the box structure to confirm &lt;code&gt;moov&lt;/code&gt; is present and well-formed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The first crack
&lt;/h3&gt;

&lt;p&gt;Emboldened by the initial success, a batch of ten public videos was queued for download. All ten failed. Every method in the chain returned &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; or produced no output. The system that had worked perfectly moments before was now completely non-functional. The Truth Agent dutifully recorded the failures and demoted every method to the bottom of the chain.&lt;/p&gt;

&lt;p&gt;The investigation began.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Wall: Datacenter IP Detection
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Diagnosing the block
&lt;/h3&gt;

&lt;p&gt;The first step was to determine whether the failure was on our end (a bug in the code) or on YouTube's end (a block). A simple &lt;code&gt;curl&lt;/code&gt; request to the watch page of a failing video revealed the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"playabilityStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LOGIN_REQUIRED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sign in to confirm you're not a bot"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The watch page itself returned HTTP 200, but the embedded player configuration contained &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; — YouTube had decided, based on our IP address alone, that we were a bot and refused to serve video streams.&lt;/p&gt;

&lt;p&gt;An IP geolocation check confirmed the root cause: the cloud environment runs on an IP belonging to a datacenter range. YouTube maintains reputation scores for IP ranges, and datacenter IPs — especially those from certain providers and regions — are flagged as high-risk for automated abuse.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is IP Reputation Scoring?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every IP address on the internet belongs to a block assigned to an ISP or cloud provider. These blocks are categorized: "residential" (assigned to home internet subscribers), "datacenter" (assigned to cloud servers), "mobile" (assigned to cell towers), "educational" (universities), etc. Anti-bot services maintain databases of these categorizations. When you make a request to a protected service, it looks up your IP's category. Datacenter IPs are treated with suspicion because real humans browse from residential IPs; a request from a datacenter IP is more likely to be a bot, a scraper, or an automated tool. This is why the same YouTube video loads fine on your home WiFi but shows "Sign in to confirm you're not a bot" when accessed from a cloud server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The critical discovery: per-video variation
&lt;/h3&gt;

&lt;p&gt;The most puzzling aspect was that one specific video downloaded successfully while ten others failed. The answer lay in YouTube's layered reputation system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;IP-level reputation.&lt;/strong&gt; Our datacenter IP was flagged, triggering heightened scrutiny for all requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video-level reputation.&lt;/strong&gt; Highly popular, old, widely-embedded videos have high reputation scores and are served from cache with relaxed security. Obscure or newer videos trigger stricter checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavioral analysis.&lt;/strong&gt; The pattern of requests (no prior watch history, no session cookies, direct API calls) further signaled automation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The successful video was so popular and so deeply cached that YouTube served it without applying the full anti-bot gauntlet. The ten failing videos were popular enough to be public but not popular enough to bypass the IP-level block.&lt;/p&gt;

&lt;h3&gt;
  
  
  What didn't work
&lt;/h3&gt;

&lt;p&gt;Every direct method was tried and failed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;yt-dlp with &lt;code&gt;android_vr&lt;/code&gt; client:&lt;/strong&gt; &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;yt-dlp with &lt;code&gt;web&lt;/code&gt; client:&lt;/strong&gt; &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; (also requires JS signature deciphering, which needs a JS runtime)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;yt-dlp with &lt;code&gt;mweb&lt;/code&gt; client + BGutil POT:&lt;/strong&gt; &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; (the PO token was generated but YouTube still rejected the request at the playability level)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;yt-dlp with &lt;code&gt;ios&lt;/code&gt; client:&lt;/strong&gt; &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;yt-dlp with &lt;code&gt;tv&lt;/code&gt; and &lt;code&gt;tv_downgraded&lt;/code&gt; clients:&lt;/strong&gt; &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Innertube API with all clients:&lt;/strong&gt; &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passing session PO tokens via &lt;code&gt;extractor_args&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; (the token was valid but the block happens before the token is checked)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The block was not at the token level — it was at the &lt;strong&gt;playability level&lt;/strong&gt;. YouTube's server decided, before even looking at our PO token, that this IP was not allowed to access this video's player API. The PO token was irrelevant.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Understanding the Block: Technical Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The playability gate
&lt;/h3&gt;

&lt;p&gt;YouTube's video access pipeline has multiple gates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request → IP Reputation Check → Playability Check → PO Token Check → Stream URL Generation → Video Delivery
           ↑                      ↑                    ↑
           Datacenter IPs         LOGIN_REQUIRED       Token validated
           flagged here           returned here        after playability passes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical insight is that the &lt;strong&gt;playability check happens before the PO token check&lt;/strong&gt;. If the IP reputation + behavioral analysis determines the request is suspicious, it returns &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; immediately. No PO token, however valid, can bypass this gate because the gate is evaluated before the token is even examined.&lt;/p&gt;

&lt;p&gt;This is why the BGutil POT provider — which successfully generates valid Proof-of-Origin tokens — could not fix the problem. The tokens were correct, but they were being submitted to a gate that had already closed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is "Playability Status"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you request a YouTube video, the first thing YouTube's server does is check whether you're allowed to play it. It returns a "playability status" in the response: &lt;code&gt;OK&lt;/code&gt; (you can play it), &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; (sign in first), &lt;code&gt;UNPLAYABLE&lt;/code&gt; (the video is restricted), &lt;code&gt;LIVE_STREAM_OFFLINE&lt;/code&gt; (the live stream hasn't started), or &lt;code&gt;ERROR&lt;/code&gt; (something went wrong). For a cloud-based AI agent, the most common status is &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt; — YouTube has decided, based on your IP and request pattern, that you need to prove you're human by signing in. Since the agent has no account, this is a hard block.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Why the Cobalt and Piped approaches also failed
&lt;/h3&gt;

&lt;p&gt;Cobalt and Piped are proxy services — they make the YouTube request from their own IP and relay the response. The failure here was twofold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted Cobalt runs on the same blocked IP.&lt;/strong&gt; Running Cobalt locally doesn't help because Cobalt's requests to YouTube originate from the same datacenter IP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public Cobalt/Piped instances require authentication or are themselves blocked.&lt;/strong&gt; The Cobalt API now requires a JWT token (which requires solving a Cloudflare Turnstile challenge — a browser-only task). Piped instances are either down, behind Cloudflare browser verification, or return &lt;code&gt;SignInConfirmNotBotException&lt;/code&gt; because the instance operator's IP is also flagged.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why Invidious &lt;code&gt;local=true&lt;/code&gt; is different
&lt;/h3&gt;

&lt;p&gt;The Invidious &lt;code&gt;local=true&lt;/code&gt; parameter is a special case. Most Invidious endpoints return a redirect to &lt;code&gt;googlevideo.com&lt;/code&gt; (the actual video CDN). Following that redirect sends you directly to Google's servers, which apply the same IP reputation check — so you get blocked.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;local=true&lt;/code&gt; parameter tells the Invidious server: "Don't redirect me. Fetch the video from googlevideo.com yourself and stream it to me." The Invidious server acts as a middleman. Because the Invidious server (run by a volunteer on a residential or VPS IP) fetches from googlevideo.com, YouTube sees a request from a non-blocked IP. The video streams to the Invidious server, which re-streams it to you. Your blocked IP never touches googlevideo.com.&lt;/p&gt;

&lt;p&gt;This was the first bypass method that actually worked.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Second Approach: The PO Token Era
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The hypothesis
&lt;/h3&gt;

&lt;p&gt;After understanding that the block was at the playability level, the next hypothesis was that a valid "session PO token" — a token bound to a visitor session rather than a specific video — might satisfy the playability check. The BGutil server's &lt;code&gt;generate_once.js&lt;/code&gt; script can create a visitor_data + po_token pair without needing to fetch the video's watch page.&lt;/p&gt;

&lt;h3&gt;
  
  
  What was tried
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate a session token via BGutil script mode.&lt;/strong&gt; The script successfully produced a &lt;code&gt;contentBinding&lt;/code&gt; (visitor_data) and &lt;code&gt;poToken&lt;/code&gt; pair.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pass the token to yt-dlp via &lt;code&gt;extractor_args&lt;/code&gt;.&lt;/strong&gt; The token was injected as &lt;code&gt;youtube:visitor_data=&amp;lt;token&amp;gt;;po_token=mweb.player+&amp;lt;token&amp;gt;,mweb.gvs+&amp;lt;token&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with multiple clients&lt;/strong&gt; (&lt;code&gt;mweb&lt;/code&gt;, &lt;code&gt;web_embedded&lt;/code&gt;, &lt;code&gt;web&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why it failed
&lt;/h3&gt;

&lt;p&gt;The session token approach still resulted in &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt;. The reason, discovered through verbose yt-dlp logging, is that YouTube's playability check considers &lt;strong&gt;IP reputation first&lt;/strong&gt;. A request from a flagged datacenter IP is rejected at the playability level before the PO token is evaluated. The PO token is a necessary condition for video stream access, but it is not sufficient when the IP itself is blocked.&lt;/p&gt;

&lt;h3&gt;
  
  
  The key finding
&lt;/h3&gt;

&lt;p&gt;This was the pivotal discovery of the project: &lt;strong&gt;the datacenter IP block cannot be defeated from the datacenter.&lt;/strong&gt; No amount of token generation, client switching, or header spoofing can change the fact that the request originates from a flagged IP range. The only way to bypass the block is to make the request appear to come from a non-flagged IP.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is "Visitor Data"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you visit YouTube, the server assigns you a "visitor data" token — a unique identifier that tracks your session across requests. It's like a cookie, but embedded in the page's JavaScript. YouTube uses this to correlate your requests: "This visitor watched video A, then searched for B, then watched video C." For automated tools, providing a valid visitor_data token (generated fresh, not stolen) can make your requests look more like a real user's session. However, as we discovered, if your IP is flagged as a datacenter IP, even a perfect visitor_data token won't help — the block happens at the network level, not the session level.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This finding reframed the entire project. The question was no longer "how do we make yt-dlp work from this IP?" but "how do we route the request through a different IP?"&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu6kx4ecg1xavi1dug0sm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu6kx4ecg1xavi1dug0sm.jpg" alt="Composing legitimate access paths — proxies, attestation tokens and a headless agent runtime" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Third Approach: The Bypass Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The reframing
&lt;/h3&gt;

&lt;p&gt;With the understanding that the IP block is the root cause, the project shifted from "build a better downloader" to "build an IP-bypass system that happens to download videos." The fallback chain was redesigned to include methods that route requests through non-datacenter IPs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bypass method 1: Cobalt community relays
&lt;/h3&gt;

&lt;p&gt;The Cobalt project maintains a directory of community-run instances. Some of these instances do not require JWT authentication and will proxy YouTube downloads through their own servers. The key instance that worked was a "relay" — a server that forwards requests to multiple backend Cobalt instances, each potentially on a different IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; The agent POSTs the video URL to the relay. The relay forwards the request to a backend Cobalt instance (running on a residential or VPS IP). The backend fetches the video from YouTube (YouTube sees the backend's IP, not ours), and returns a "tunnel" URL. The agent then downloads from the tunnel URL, which streams the video through the relay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; The relay IP-blocks after approximately 2 successful calls per source IP. This is a rate limit imposed by the relay operator to prevent abuse. For batch downloads, this means only 2 videos can be downloaded before the relay stops working.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bypass method 2: Invidious &lt;code&gt;local=true&lt;/code&gt; proxy
&lt;/h3&gt;

&lt;p&gt;As described in Section 5, the &lt;code&gt;local=true&lt;/code&gt; parameter makes the Invidious server proxy the video stream through its own IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; A simple &lt;code&gt;curl&lt;/code&gt; command: &lt;code&gt;curl -L -o video.mp4 "https://&amp;lt;invidious-instance&amp;gt;/latest_version?id=&amp;lt;video_id&amp;gt;&amp;amp;itag=18&amp;amp;local=true"&lt;/code&gt;. The Invidious server fetches the video from googlevideo.com and streams it back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; Most Invidious instances have disabled the &lt;code&gt;local=true&lt;/code&gt; parameter (because it consumes their bandwidth). Only a small number of instances still support it, and they are unreliable — going up and down throughout the day. The quality is limited to 360p (itag=18, muxed H.264/AAC MP4).&lt;/p&gt;

&lt;h3&gt;
  
  
  Bypass method 3: SOCKS5 proxy farm
&lt;/h3&gt;

&lt;p&gt;This was the most reliable bypass method discovered. The approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fetch a list of free SOCKS5 proxies&lt;/strong&gt; from public proxy list repositories (community-maintained lists of thousands of proxies).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test proxies in parallel&lt;/strong&gt; (50 at a time) against the target video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-phase test:&lt;/strong&gt; Phase 1 fetches the watch page and checks that &lt;code&gt;playabilityStatus&lt;/code&gt; is &lt;code&gt;OK&lt;/code&gt; (not &lt;code&gt;LOGIN_REQUIRED&lt;/code&gt;). Phase 2 POSTs to the innertube player API and confirms &lt;code&gt;streamingData&lt;/code&gt; is present (stream URLs are returned).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download via the first working proxy&lt;/strong&gt; using yt-dlp's &lt;code&gt;--proxy&lt;/code&gt; flag.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why the two-phase test matters:&lt;/strong&gt; The initial implementation tested proxies by fetching only the watch page. This found proxies that could load the watch page but failed on the player API call (because YouTube applies different reputation logic to the player API). The two-phase test ensures the proxy can complete the full extraction pipeline, not just the first step.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is a SOCKS5 Proxy?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A SOCKS5 proxy is a server that relays your network traffic through its own IP address. When you connect to a SOCKS5 proxy and request a website, the proxy connects to the website on your behalf, receives the response, and forwards it to you. The website sees the proxy's IP, not yours. SOCKS5 is the "no-frills" version — it doesn't modify your traffic, just forwards it. Free SOCKS5 proxies are run by volunteers, businesses, and sometimes botnets; they're unreliable (many are dead at any given time) but there are thousands of them, so finding a few working ones by testing in parallel is feasible. The trade-off: free proxies are slow, may log your traffic, and should never be used for sensitive data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; Free proxies are ephemeral. A proxy that works now may be dead in 5 minutes. The success rate is approximately 0.5-2% of tested proxies passing both phases. Testing 200 proxies typically yields 1-4 working ones. Download speed through a free proxy is often 1-5 MB/s.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bypass method 4: GitHub Actions remote download farm
&lt;/h3&gt;

&lt;p&gt;GitHub Actions runners run on Microsoft Azure IPs, which have a different reputation profile than typical cloud provider IPs. Additionally, runners have &lt;code&gt;sudo&lt;/code&gt; access, allowing the installation of Cloudflare WARP (which routes traffic through Cloudflare's residential-like IP pool).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A GitHub Actions workflow is defined in &lt;code&gt;.github/workflows/yt-download-farm.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The agent triggers the workflow via the GitHub API (&lt;code&gt;POST /repos/{owner}/{repo}/actions/workflows/{id}/dispatches&lt;/code&gt;), passing the video URL as input.&lt;/li&gt;
&lt;li&gt;The workflow runs on an &lt;code&gt;ubuntu-latest&lt;/code&gt; runner: installs Cloudflare WARP, installs yt-dlp + BGutil, downloads the video, and uploads it as a workflow artifact.&lt;/li&gt;
&lt;li&gt;The agent polls the workflow status, then downloads the artifact via the GitHub API.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; GitHub Actions have a 6-hour job timeout and a 10 GB artifact size limit. The workflow takes 2-5 minutes to complete (runner startup + WARP install + download + artifact upload). The artifact is retained for 7 days. Rate limits: 15 workflow dispatches per minute, 100 artifact downloads per hour.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is Cloudflare WARP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cloudflare WARP is a free VPN-like service provided by Cloudflare. When installed on a machine, it routes all outgoing traffic through Cloudflare's global network. From the perspective of the website you're visiting, your request comes from a Cloudflare IP (which has good reputation because Cloudflare is a legitimate CDN provider) rather than your actual cloud provider's IP. WARP is not a full VPN — it doesn't hide your traffic from Cloudflare — but it effectively changes your IP reputation. For our use case, installing WARP on a GitHub Actions runner makes YouTube see a Cloudflare IP instead of an Azure IP, which is often enough to bypass the datacenter block.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. The Breakthrough: Compositional Bypass
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The key realization
&lt;/h3&gt;

&lt;p&gt;No single bypass method is reliable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cobalt relays rate-limit after 2 calls.&lt;/li&gt;
&lt;li&gt;Invidious instances go up and down.&lt;/li&gt;
&lt;li&gt;SOCKS5 proxies die within minutes.&lt;/li&gt;
&lt;li&gt;GitHub Actions has rate limits and latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But &lt;strong&gt;together&lt;/strong&gt;, they form a resilient system. If the Cobalt relay is rate-limited, the Invidious proxy might be up. If Invidious is down, the SOCKS5 farm can find a working proxy. If all else fails, the GitHub Actions farm provides a guaranteed (if slow) path.&lt;/p&gt;

&lt;h3&gt;
  
  
  The test that proved it
&lt;/h3&gt;

&lt;p&gt;A batch of ten public videos — all of which had been completely blocked (0/10 success rate) in the first approach — was re-tested with the bypass architecture. The results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;9 out of 10 videos downloaded successfully&lt;/strong&gt; (605 MB total data acquired).&lt;/li&gt;
&lt;li&gt;8 videos were downloaded via the SOCKS5 proxy farm method.&lt;/li&gt;
&lt;li&gt;1 video was downloaded via the Invidious &lt;code&gt;local=true&lt;/code&gt; method.&lt;/li&gt;
&lt;li&gt;1 video failed all methods (the specific video may have additional restrictions or the proxy pool was exhausted for that hour).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why composition works
&lt;/h3&gt;

&lt;p&gt;The key insight is that the bypass methods fail &lt;strong&gt;independently&lt;/strong&gt;. The Cobalt relay's rate limit has nothing to do with the Invidious instance's uptime, which has nothing to do with whether a SOCKS5 proxy is alive. By composing them into a fallback chain, the system achieves a success rate that no individual method can reach.&lt;/p&gt;

&lt;p&gt;This is a classic application of the &lt;strong&gt;diversity principle&lt;/strong&gt; from reliability engineering: a system composed of diverse components with independent failure modes is more reliable than any single component. Mathematically, if method A has a 30% success rate and method B has a 40% success rate, and their failures are independent, the combined success rate is 1 - (0.7 × 0.6) = 58% — higher than either alone.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is a "Fallback Chain"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A fallback chain is a list of methods to try in order. You try the first method; if it fails, you try the second; if that fails, you try the third; and so on until one succeeds or all fail. It's the same concept as having a spare tire and a can of fix-a-flat — if the spare is flat, you use the fix-a-flat; if both fail, you call a tow truck. The key design decision is the order: fast and reliable methods go first, slow and unreliable methods go last. In our system, the direct yt-dlp methods (which fail fast when blocked) are tried first, followed by the bypass methods (which are slower but can actually work).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnzrbvngiwky9dh2nsj8b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnzrbvngiwky9dh2nsj8b.jpg" alt="The 13-method fallback chain — every method fails until one succeeds" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Final Architecture: The 13-Method Fallback Chain
&lt;/h2&gt;

&lt;p&gt;The final system implements a 13-tier fallback chain, managed by an Orchestrator that walks the chain, hands each result to a Verifier, and records observations for the Truth Agent to learn from.&lt;/p&gt;

&lt;h3&gt;
  
  
  The complete chain
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Bypasses IP block?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Transcript probe&lt;/td&gt;
&lt;td&gt;Preflight reachability check (separate rate-limit bucket)&lt;/td&gt;
&lt;td&gt;N/A (fast fail)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;yt-dlp default&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;android_vr&lt;/code&gt; client + BGutil PO token&lt;/td&gt;
&lt;td&gt;No (needs whitelisted video)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;yt-dlp JS-less&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;visionos, android_vr&lt;/code&gt; clients + BGutil&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;yt-dlp IOS&lt;/td&gt;
&lt;td&gt;IOS client (HLS streams)&lt;/td&gt;
&lt;td&gt;Sometimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;yt-dlp single file&lt;/td&gt;
&lt;td&gt;Pre-muxed MP4 (no ffmpeg merge)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;yt-dlp audio only&lt;/td&gt;
&lt;td&gt;Audio-only salvage (last yt-dlp tier)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Innertube direct&lt;/td&gt;
&lt;td&gt;Hand-rolled POST to &lt;code&gt;/youtubei/v1/player&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Cobalt (self-hosted)&lt;/td&gt;
&lt;td&gt;Local Cobalt sidecar&lt;/td&gt;
&lt;td&gt;Yes (if Cobalt has good IP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Cobalt community&lt;/td&gt;
&lt;td&gt;Public Cobalt relay instances&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Piped&lt;/td&gt;
&lt;td&gt;Piped API with 4-instance rotation&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Invidious&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;local=true&lt;/code&gt; proxy (instance streams through its IP)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;SOCKS5 farm&lt;/td&gt;
&lt;td&gt;Free SOCKS5 proxy discovery (two-phase test)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;GitHub Actions farm&lt;/td&gt;
&lt;td&gt;Remote download on GitHub runners + WARP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The agents
&lt;/h3&gt;

&lt;p&gt;The system is built around four in-process agents (not LLM agents — deterministic Python modules with specific roles):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Orchestrator&lt;/strong&gt; receives a video URL, resolves it to an ID, asks the Truth Agent for the ranked method list, and walks the chain. For each method, it creates a fresh temp directory, runs the method with a timeout, and hands any successful result to the Verifier. If the Verifier passes, the file is atomically moved to the output directory. If the Verifier fails, the method's result is treated as a failure and the next method is tried.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Truth Agent&lt;/strong&gt; owns two state files: &lt;code&gt;truth.json&lt;/code&gt; (the ranked method list with success/failure counters) and &lt;code&gt;observations.jsonl&lt;/code&gt; (an append-only audit log of every method attempt). After every method attempt, the Orchestrator records an observation. After 3 consecutive failures of a method, the Truth Agent demotes it (rank += 1, capped at the bottom). After a success, the method may be promoted (rank -= 1, floored at the top). This means the system &lt;strong&gt;learns&lt;/strong&gt; which methods work best in the current environment and reorders the chain over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Verifier&lt;/strong&gt; runs 6 layered checks on any file a method claims to have downloaded: (1) file exists and size ≥ 1 MB, (2) magic bytes match a known video container, (3) ffprobe succeeds, (4) duration &amp;gt; 0, (5) at least one video or audio stream is present, (6) for MP4 files, the moov atom is present and well-formed. These checks catch truncated downloads, HTML error pages saved as &lt;code&gt;.mp4&lt;/code&gt;, and corrupted files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Tester&lt;/strong&gt; runs the full pipeline against a corpus of known-stable public videos, producing a markdown report of which methods succeeded for each video. This serves as both a health check and a regression test.&lt;/p&gt;

&lt;h3&gt;
  
  
  The auto-bootstrap
&lt;/h3&gt;

&lt;p&gt;A critical design decision was that the system should require &lt;strong&gt;zero manual setup&lt;/strong&gt;. If an AI agent runs &lt;code&gt;ytagent download &amp;lt;url&amp;gt;&lt;/code&gt; on a fresh machine, the system should auto-bootstrap everything it needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the BGutil POT provider is not installed, it is cloned from GitHub, npm dependencies are installed, TypeScript is compiled, and the HTTP server is started — all automatically, in about 15 seconds.&lt;/li&gt;
&lt;li&gt;If the BGutil server is not running, it is started.&lt;/li&gt;
&lt;li&gt;The download then proceeds through the 13-method chain.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is implemented in the &lt;code&gt;bootstrap.py&lt;/code&gt; module, which is called transparently by the yt-dlp methods when they detect that BGutil is not available.&lt;/p&gt;

&lt;h3&gt;
  
  
  The agent instructions
&lt;/h3&gt;

&lt;p&gt;The system includes a &lt;code&gt;ytagent agent-instructions&lt;/code&gt; command that prints a complete 10-step guide for AI agents. This covers installation, setup, downloading, JSON parsing, bypass methods, self-testing, truth inspection, and batch downloads. An AI agent reading only this output can use the system end-to-end without any human help.&lt;/p&gt;

&lt;p&gt;This was validated in a final test: an AI agent following the instructions downloaded a previously-blocked video with zero manual human intervention. The socks5_farm method found a working proxy in approximately 100 seconds and downloaded a 69-megabyte, 1080p video.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Key Learnings and Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Learning 1: The IP is the identity
&lt;/h3&gt;

&lt;p&gt;In modern web infrastructure, your IP address is your identity. More precisely, the &lt;strong&gt;reputation category&lt;/strong&gt; of your IP (residential vs. datacenter vs. mobile) determines what you can access. Cookies, tokens, and session identifiers are secondary — they are checked only after the IP reputation gate. For AI agents operating from cloud environments, this means that no amount of authentication or token generation can overcome a flagged IP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; When building systems that interact with anti-bot-protected services, the first question to ask is not "how do I authenticate?" but "what is the reputation of my IP, and how do I route through a better one?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning 2: Composition beats optimization
&lt;/h3&gt;

&lt;p&gt;The most reliable system was not the one with the best single method — it was the one with the most diverse set of methods. Each bypass method had a 30-60% success rate individually, but composed together, the chain achieved a 90% success rate. This is because the methods fail independently: the Cobalt relay's rate limit is unrelated to the Invidious instance's uptime, which is unrelated to whether a SOCKS5 proxy is alive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; In adversarial environments (anti-bot systems, rate limits, service outages), invest in breadth (many methods) over depth (one perfect method). The probability that all methods fail simultaneously is exponentially lower than the probability that any single method fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning 3: Verification is non-negotiable
&lt;/h3&gt;

&lt;p&gt;In the testing phase, it became clear that download methods frequently produce "successful" results that are actually broken: HTML error pages saved as &lt;code&gt;.mp4&lt;/code&gt;, truncated downloads missing the moov atom, 0-byte files from connection resets. Without a rigorous Verifier, these broken files would be silently passed to downstream agents, causing confusing failures later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Every automated pipeline needs a verification layer that checks the output is actually what it claims to be. For video files, this means magic bytes, ffprobe, duration, and moov atom checks. Trust no method's self-report; verify independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning 4: Free infrastructure is fragile but usable
&lt;/h3&gt;

&lt;p&gt;Every free bypass method (Cobalt relays, Invidious instances, SOCKS5 proxies) was unreliable when relied upon individually. But because they were free, they could be composed in parallel. A paid residential proxy service would have been more reliable, but the goal was to build a system that works with zero cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Free infrastructure is a viable component of a production system if (and only if) you compose enough of it to achieve the reliability you need. The cost of free infrastructure is engineering complexity (more methods, more failure handling), not money.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning 5: Determinism enables trust
&lt;/h3&gt;

&lt;p&gt;The system was designed from the start to be deterministic: no LLM at runtime, no probabilistic decisions, no "ask the AI what to do next." Every decision is made by a state machine with clear rules. This made the system testable, debuggable, and trustworthy. When a download failed, the audit trail in &lt;code&gt;observations.jsonl&lt;/code&gt; showed exactly which methods were tried and why they failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; AI agents that need to interact with external systems should use deterministic orchestration, not LLM-driven decision-making. The LLM should be used at design time (to research, plan, and write code), not at runtime (to decide what to do next). Determinism is what makes the system auditable and reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning 6: The two-phase test pattern
&lt;/h3&gt;

&lt;p&gt;The SOCKS5 proxy farm method initially failed because it tested proxies by fetching only the watch page. Many proxies could load the watch page but failed on the player API call. The fix was a two-phase test: check the watch page first, then check the player API. This pattern — test the full pipeline, not just the first step — generalized to other areas of the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; When testing whether a resource (proxy, API, service) is "working," test the entire operation you need it to perform, not just the first step. A proxy that can load a web page may not be able to stream a video. An API key that works for metadata may not work for downloads. Test the actual use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning 7: Documentation is part of the system
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;ytagent agent-instructions&lt;/code&gt; command was not an afterthought — it was a first-class feature. An AI agent that can read the instructions and use the system without human help is a more valuable system than one that requires a human to read the README and explain it. The instructions include exact commands, expected output, and failure troubleshooting for each step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; For systems designed to be used by AI agents, the documentation should be machine-readable and executable. Don't just describe what the system does — provide a step-by-step guide that an agent can follow mechanically.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Future Implications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The splintering of the internet
&lt;/h3&gt;

&lt;p&gt;The datacenter IP block is not unique to YouTube. It is a pattern being adopted by an increasing number of services: social media platforms, news sites, e-commerce, and even some APIs now apply differential access based on IP reputation. The internet is splintering into two tiers: a "residential tier" where content is freely accessible, and a "datacenter tier" where access is gated by CAPTCHAs, login requirements, and behavioral challenges.&lt;/p&gt;

&lt;p&gt;For AI agents — which necessarily operate from datacenter IPs — this splintering represents a fundamental access problem. An agent that cannot route its traffic through residential IPs will find itself increasingly locked out of the web.&lt;/p&gt;

&lt;h3&gt;
  
  
  The rise of proxy-as-a-service
&lt;/h3&gt;

&lt;p&gt;As datacenter IP blocks become more common, a market is emerging for "residential proxy" services that sell access to residential IP pools. These services (Bright Data, Smartproxy, etc.) charge per GB of traffic routed through their pools. For AI agent operators, this will become a line item in the infrastructure budget, much like compute and storage.&lt;/p&gt;

&lt;p&gt;The alternative — composing free bypass methods, as this project does — is viable for low-volume use but does not scale. A production system processing thousands of videos per day would need a paid proxy service or a self-hosted residential IP pool (e.g., Oracle Cloud Free Tier VMs with WARP installed).&lt;/p&gt;

&lt;h3&gt;
  
  
  The attestation arms race
&lt;/h3&gt;

&lt;p&gt;YouTube's PO Token system is part of a broader trend toward &lt;strong&gt;attestation-based access control&lt;/strong&gt;. Instead of (or in addition to) checking your IP, services increasingly require proof that your client is "real" — that it ran a specific piece of JavaScript, performed a specific computation, or holds a specific hardware attestation. Apple's App Attest, Google's Play Integrity, and Cloudflare's Turnstile are all examples of this trend.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech in a Minute: What is "Attestation"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Attestation is the process of proving that a piece of software is running in a trusted environment. When a website says "prove you're a real browser," it's asking for attestation. The website sends a challenge (usually a piece of JavaScript that performs computations), and your browser returns the result as "proof" that it executed the challenge. The challenge is designed to be hard to fake — a bot would need to run a full browser engine to solve it. Cloudflare Turnstile, Google reCAPTCHA, and YouTube's BotGuard are all attestation systems. They differ in how hard the challenge is and what they're trying to prove (real browser? real mobile device? not a bot?).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For AI agents, attestation is a double-edged sword. On one hand, projects like BGutil can run the attestation challenge in a simulated browser environment (Node.js with JSDOM), generating valid tokens without a real browser. On the other hand, the attestation systems are evolving to detect these simulations (checking for browser-specific APIs, timing characteristics, rendering quirks). The arms race will continue, with each side getting more sophisticated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implications for AI agent design
&lt;/h3&gt;

&lt;p&gt;This project suggests several principles for designing AI agents that interact with web services:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Assume IP blocks.&lt;/strong&gt; Any agent running in a cloud environment should have a strategy for dealing with IP-based access restrictions. This means having a pool of proxies or fallback methods, not relying on a single access path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build for diversity.&lt;/strong&gt; Don't depend on a single service, API, or method. The web is adversarial — services change their APIs, add new blocks, and rate-limit aggressively. A diverse set of fallback methods is the only defense.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Separate intelligence from access.&lt;/strong&gt; The LLM should be used for reasoning about what to download, not for the mechanics of downloading. The download itself should be handled by a deterministic, tested, verified pipeline. This separation allows the intelligence to be upgraded without breaking the access layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit everything.&lt;/strong&gt; Every request, every method attempt, every failure should be logged. When a download fails, the audit trail should show exactly what was tried and why it failed. This is essential for debugging and for building trust in the system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design for the agent, not the human.&lt;/strong&gt; The end user of an AI agent's download capability is another AI agent (or a pipeline), not a human. The output should be machine-readable (JSON), the instructions should be machine-followable (step-by-step), and the failure modes should be machine-recoverable (try the next method).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The broader security picture
&lt;/h3&gt;

&lt;p&gt;The fact that a cloud-based AI agent cannot download a public YouTube video without building a 13-method bypass chain reveals something important about the state of the internet: &lt;strong&gt;the security measures designed to stop bots are also stopping legitimate automated access.&lt;/strong&gt; The same IP reputation systems that block scrapers also block AI agents. The same attestation challenges that stop credential stuffing also stop automated research.&lt;/p&gt;

&lt;p&gt;This creates a paradox: as AI agents become more capable and more widely deployed, they will increasingly need to access web content that is protected by anti-bot systems. But those systems were designed to stop automated access. The result is a cat-and-mouse game where AI agents develop increasingly sophisticated bypass methods, and anti-bot systems develop increasingly sophisticated detection methods.&lt;/p&gt;

&lt;p&gt;The long-term resolution is likely a shift from &lt;strong&gt;IP-based&lt;/strong&gt; access control to &lt;strong&gt;identity-based&lt;/strong&gt; access control. Instead of blocking datacenter IPs, services may issue API keys or attestation tokens to verified AI agents, allowing them to access content programmatically without the overhead of bypassing anti-bot systems. YouTube's official Data API v3 is a step in this direction (though it does not allow video downloads). Until such APIs become comprehensive, the bypass architecture described in this document will remain necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This project began as a simple wrapper and evolved into a study of modern web access control. The journey from "just use yt-dlp" to "compose 13 methods including SOCKS5 proxy farms and GitHub Actions runners" reflects the reality of building automated systems for today's web.&lt;/p&gt;

&lt;p&gt;The key insight — that the datacenter IP is the root cause, not the download method — reframed the entire problem. Once the block was understood as an IP-level gate that runs before any token or authentication is checked, the solution became clear: route through a different IP. The implementation of that solution required composing multiple bypass methods into a resilient fallback chain, because no single bypass is reliable enough to stand alone.&lt;/p&gt;

&lt;p&gt;The resulting system — a 13-method, self-healing, auto-bootstrapping download pipeline with a learning Truth Agent and rigorous file verification — represents a practical answer to a problem that every cloud-based AI agent will face: &lt;strong&gt;how do you access a web that doesn't want you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer, as it turns out, is not to break the security measures. It is to find enough legitimate access paths that at least one of them works, and to compose them in a way that makes failure the exception rather than the rule.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This research document describes the architecture and findings of a real project. All technical details, failure modes, and success rates are based on actual testing conducted during the project's development. The system is open-source and available for review, modification, and extension.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Who is Ansari Bilal?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Who built it.&lt;/strong&gt; This project — &lt;a href="https://github.com/Bilal140202/ytagent" rel="noopener noreferrer"&gt;ytagent&lt;/a&gt; — was built by Ansari Bilal, a self-taught app builder from India.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Bilal140202/ytagent" rel="noopener noreferrer"&gt;https://github.com/Bilal140202/ytagent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ansari Bilal is a self-taught app builder. What started as late-night tinkering turned into a second life — shipping real products, building open-source tools, and solving problems through code. From privacy-first desktop apps built with &lt;strong&gt;Tauri &amp;amp; Rust&lt;/strong&gt; to developer tools used by thousands, every project is fueled by curiosity, not credentials. No CS degree, no bootcamp — just relentless building and a GitHub full of proof.&lt;/p&gt;

&lt;p&gt;The mission is simple: build things that are useful, open, and well-crafted — whether that's an AI-powered agent tool, a cross-platform note-taking app, or a curated directory of 30,000+ developer resources.&lt;/p&gt;

&lt;p&gt;Other things he has shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ansaribilal.com/projects/lord-of-the-skills" rel="noopener noreferrer"&gt;The Lord of the Skills&lt;/a&gt;&lt;/strong&gt; — 18,142+ AI agent skills across 14 frameworks, sorted into 10 LOTR-themed kingdoms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Bilal140202/linuxify" rel="noopener noreferrer"&gt;Linuxify&lt;/a&gt;&lt;/strong&gt; — run Linux developer CLIs and AI coding agents on Android, no root required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Bilal140202/snip" rel="noopener noreferrer"&gt;snip&lt;/a&gt;&lt;/strong&gt; — project-scoped command snippets in a committable &lt;code&gt;.snips&lt;/code&gt; file, with fuzzy and natural-language matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ansaribilal.com/projects/devatlas" rel="noopener noreferrer"&gt;DevAtlas&lt;/a&gt;&lt;/strong&gt; — a searchable index of 30,000+ developer tools, refreshed daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ansaribilal.com/projects/talkdrive" rel="noopener noreferrer"&gt;TalkDrive&lt;/a&gt;&lt;/strong&gt; — SoulX FlashHead 1.3B talking-head generation on a free Colab T4.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What ytagent was built with
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ytagent&lt;/code&gt; is a Python system that composes existing, legitimate tooling into a resilient chain rather than replacing any of it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3&lt;/strong&gt; — orchestration, method registry, deterministic fallback controller&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;yt-dlp&lt;/strong&gt; — the core extractor, driven through multiple client and transport configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ffmpeg&lt;/strong&gt; — stream merging and post-processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof-of-Origin token providers&lt;/strong&gt; — attestation where the player API demands it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public mirror / proxy front-ends&lt;/strong&gt; — alternate access paths when the direct player API refuses a datacenter IP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No LLM at runtime&lt;/strong&gt; — the download path stays deterministic and testable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/Bilal140202/ytagent" rel="noopener noreferrer"&gt;https://github.com/Bilal140202/ytagent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More work: &lt;a href="https://ansaribilal.com/projects" rel="noopener noreferrer"&gt;ansaribilal.com/projects&lt;/a&gt; · &lt;a href="https://github.com/Bilal140202" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://huggingface.co/Nick021402" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/ytagent-datacenter-ip-block-youtube-ai-agents-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=ytagent-datacenter-ip-block-youtube-ai-agents-2026" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=ytagent-datacenter-ip-block-youtube-ai-agents-2026" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI Search Is the New Front Page: llms.txt, Schema, and What Actually Got Me Cited</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Tue, 04 Aug 2026 11:37:53 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/ai-search-is-the-new-front-page-llmstxt-schema-and-what-actually-got-me-cited-c28</link>
      <guid>https://dev.to/ansari_bilal/ai-search-is-the-new-front-page-llmstxt-schema-and-what-actually-got-me-cited-c28</guid>
      <description>&lt;p&gt;&lt;em&gt;Last updated: August 3, 2026 · 9-minute read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Somewhere in the last year, "how do I rank" quietly became two questions: how do I rank in search, and how do I get &lt;em&gt;quoted&lt;/em&gt; by an assistant. They overlap, but not completely — and the second one has a much shorter list of requirements.&lt;/p&gt;

&lt;p&gt;This is everything I implemented on this site, in the order that mattered.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8wotttt6ems4e0p4mz1w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8wotttt6ems4e0p4mz1w.jpg" alt="Document being read and cited by an AI answer" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First: the boring foundation still decides everything
&lt;/h2&gt;

&lt;p&gt;No amount of AI-specific markup helps a page a crawler can't read. Before anything else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server-rendered or prerendered HTML.&lt;/strong&gt; A client-only React app hands most crawlers an empty &lt;code&gt;&amp;lt;div id="root"&amp;gt;&lt;/code&gt;. I generate a static HTML shell for every route at build time — 66 files, each with real title, description and body content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One canonical URL per page&lt;/strong&gt;, self-referencing, agreeing with the sitemap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;robots.txt&lt;/code&gt; that doesn't block the assistants.&lt;/strong&gt; &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;ClaudeBot&lt;/code&gt;, &lt;code&gt;PerplexityBot&lt;/code&gt;, &lt;code&gt;Google-Extended&lt;/code&gt; — decide deliberately. Blocking them is a valid choice; blocking them by accident is not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote about how the pipeline generates all of this in &lt;a href="https://ansaribilal.com/blog/automated-blog-pipeline-seo-web-stories-telegram-2026" rel="noopener noreferrer"&gt;the automated blog pipeline post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second: &lt;code&gt;llms.txt&lt;/code&gt; — a table of contents for models
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; is a plain markdown file at your root that tells a model what your site is and where the good stuff lives. It is not a magic ranking file; it is a cheap, high-signal summary that gets pulled into context when a model fetches your domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Ansari Bilal — builder, indie dev, AI agent tinkerer&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Sales agent by day, builder by night. Writes about AI agents, MCP,&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; indie builds and developer tooling.&lt;/span&gt;

&lt;span class="gu"&gt;## Core pages&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://ansaribilal.com/#projects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: shipped apps, notebooks, Hugging Face Spaces
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://ansaribilal.com/blog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: 50+ posts on agents, tooling and shipping
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Uses&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://ansaribilal.com/uses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: the actual stack

&lt;span class="gu"&gt;## Topic hubs&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;AI Agents&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://ansaribilal.com/topics/ai-agents&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="nv"&gt;UI &amp;amp; Components&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://ansaribilal.com/topics/ui-components&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep it under a page. Link, don't essay. Pair it with a machine-readable profile (&lt;code&gt;/me.json&lt;/code&gt;) if you want a single fetch to answer "who is this person".&lt;/p&gt;

&lt;h2&gt;
  
  
  Third: structured data that describes reality
&lt;/h2&gt;

&lt;p&gt;Three schema types cover almost every personal or product site:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Schema&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;What it buys you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Person&lt;/code&gt; or &lt;code&gt;Organization&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Sitewide&lt;/td&gt;
&lt;td&gt;Entity recognition — you become a &lt;em&gt;thing&lt;/em&gt;, not a string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Article&lt;/code&gt; / &lt;code&gt;BlogPosting&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Every post&lt;/td&gt;
&lt;td&gt;Author, date, publisher, image in the crawler's model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FAQPage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pages with real Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;Direct answer extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two mistakes I made and fixed: &lt;code&gt;publisher&lt;/code&gt; must be an &lt;code&gt;Organization&lt;/code&gt; (not a &lt;code&gt;Person&lt;/code&gt;), and &lt;code&gt;image&lt;/code&gt; should be an &lt;code&gt;ImageObject&lt;/code&gt; with dimensions, not a bare URL. Both silently invalidated the block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BlogPosting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Context Engineering Beat Prompt Engineering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"datePublished"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-03"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Person"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ansari Bilal"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publisher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Organization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ansaribilal.com"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ImageObject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://ansaribilal.com/og.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;630&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate every type you emit. An invalid block is worth exactly zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fourth: topic hubs instead of 50 orphan posts
&lt;/h2&gt;

&lt;p&gt;Fifty unlinked posts look like fifty unrelated documents. Fifty posts grouped into six hub pages, each with an editorial intro and links to its cluster, look like a site with expertise on six subjects.&lt;/p&gt;

&lt;p&gt;This is the change that moved the needle most for me — both for search and for assistants, which lean heavily on internal link structure to decide what a site is &lt;em&gt;about&lt;/em&gt;. Each hub gets its own title, description, and a paragraph a model can quote verbatim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fifth: write the paragraph you want quoted
&lt;/h2&gt;

&lt;p&gt;Assistants extract passages, not pages. The practical consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Answer in the first 60 words&lt;/strong&gt; under each heading, then elaborate. Inverted pyramid, every section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use real numbers and dates.&lt;/strong&gt; "LCP under 2.5s on mobile" gets quoted; "fast loading" doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make headings questions people ask.&lt;/strong&gt; &lt;code&gt;## Does llms.txt actually do anything?&lt;/code&gt; outperforms &lt;code&gt;## Considerations&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables get extracted disproportionately often.&lt;/strong&gt; If your content has a comparison in it, put it in a table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State your position.&lt;/strong&gt; Hedged content is unciteable — the model has nothing to attribute to you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sixth: feeds and freshness signals
&lt;/h2&gt;

&lt;p&gt;An RSS feed, a sitemap with honest &lt;code&gt;lastmod&lt;/code&gt; values on posts (and &lt;em&gt;no&lt;/em&gt; &lt;code&gt;lastmod&lt;/code&gt; on static pages you didn't change), and IndexNow submissions on publish. Note that Google's and Bing's old &lt;code&gt;/ping?sitemap=&lt;/code&gt; endpoints are retired — they return errors now. Use the Indexing API, Bing's Webmaster API, or IndexNow instead.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Cadence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Impressions &amp;amp; average position&lt;/td&gt;
&lt;td&gt;Search Console&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referrals from &lt;code&gt;chatgpt.com&lt;/code&gt;, &lt;code&gt;perplexity.ai&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Analytics referrers&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Cited by" spot-checks&lt;/td&gt;
&lt;td&gt;Ask the assistant a question you answered&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core Web Vitals&lt;/td&gt;
&lt;td&gt;PageSpeed API in CI&lt;/td&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last spot-check is unscientific and the most useful. Ask the question your post answers and see whether you're in the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest summary
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; is a nice-to-have. Prerendered HTML, valid schema, a coherent internal link graph, and passages written to be quoted are the actual work — and all four also happen to be plain good SEO. The tooling changed; the fundamentals didn't.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you're starting from zero, &lt;a href="https://ansaribilal.com/blog/12-weeks-blogging-builder-traffic-lessons-2025" rel="noopener noreferrer"&gt;12 weeks of blogging&lt;/a&gt; has the traffic numbers behind all of this.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/ai-search-optimization-llms-txt-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=ai-search-optimization-llms-txt-2026" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=ai-search-optimization-llms-txt-2026" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The 5 Sites I Actually Use for Design Inspiration (Not Dribbble)</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Tue, 04 Aug 2026 11:37:48 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/the-5-sites-i-actually-use-for-design-inspiration-not-dribbble-33o8</link>
      <guid>https://dev.to/ansari_bilal/the-5-sites-i-actually-use-for-design-inspiration-not-dribbble-33o8</guid>
      <description>&lt;p&gt;&lt;em&gt;Last updated: August 13, 2025 · 6-minute read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I open Dribbble roughly once a month. Every time I do, I close it within 90 seconds feeling worse about design than when I opened it.&lt;/p&gt;

&lt;p&gt;That's not a Dribbble problem — it's a category problem. Dribbble is a &lt;strong&gt;portfolio platform&lt;/strong&gt;. People upload work designed to impress other designers, not to be implemented. The medium article "Designing for Dribbble Killed Real Web Creativity" called it out directly: the platform incentivizes pretty pixels over functional interfaces, and the result is an entire ecosystem of work that was never meant to be built.&lt;/p&gt;

&lt;p&gt;A thread on r/UI_Design titled "Dribbble Quality Downhill" put it more bluntly — "about 95% of Dribbble nowadays are mockups created solely to look good and flashy on Dribbble and to share to other social media." A senior web designer in r/FigmaDesign was even more direct: "I'm a senior web designer and have never looked on Dribbble. I prefer live, real-world examples."&lt;/p&gt;

&lt;p&gt;If you're building things — not decorating portfolios — you need references from &lt;strong&gt;shipped products&lt;/strong&gt;, not concept art. Here's my actual rotation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuft5w9uja07jcsu6js43.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuft5w9uja07jcsu6js43.jpg" alt="Design inspiration sites — real references for real builders" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. godly.website — The Creative Edge
&lt;/h2&gt;

&lt;p&gt;Godly is a curated gallery of visually aggressive, often experimental web designs. Think parallax scrolling, 3D transforms, WebGL effects, the kind of stuff that wins Awwwards but would get you fired if you proposed it for a SaaS dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I use it for:&lt;/strong&gt; Landing page hero sections, scroll interactions, and "what's technically possible right now" research. When I need to see what the cutting edge looks like — not what I should copy, but what's pushing boundaries — this is where I go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Updated daily, zero signup required, the curation is sharp. Every site listed is live and production-built.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Practically useless for anything behind a login. The designs skew heavily toward creative agencies and portfolio sites. As one Hacker News commenter noted about Godly: "I find it a helpful resource, but I also agree too many of these are design studios and are of no interest to me." If you're building a B2B tool, 80% of what's here won't apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for front-end devs who want to see what CSS and WebGL can actually do. Not for anyone looking for a pricing page layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. mobbin.com — The Real-World Pattern Library
&lt;/h2&gt;

&lt;p&gt;Mobbin is a library of 400,000+ screenshots from real mobile and web apps. No mockups. No concepts. Actual screens from shipped products, organized by flow (onboarding, settings, checkout, search, empty states).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I use it for:&lt;/strong&gt; Any pattern that involves user interaction. Need to see how 50 different apps handle dark mode toggles? Mobbin. Need a reference for a notification center layout? Mobbin. This is the closest thing to "let me see how real products solved this" that exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; The search is genuinely good — you can filter by platform, flow, and even specific UI elements. Reddit threads on design inspiration consistently mention it as the go-to. One thread on r/web_design: "Good list, mobbin and godly are in my rotation too."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; The free tier is limited. You hit a paywall fast if you're browsing heavily. And since everything is real apps, you won't find anything experimental here — it's all safe, production-grade patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; The single most useful site on this list if you build apps. Worth the paid tier if you reference designs daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. land-book.com — Landing Page Dissection
&lt;/h2&gt;

&lt;p&gt;Land-book is a curated collection of landing pages from real SaaS products, startups, and agencies. Every entry is a live page you can click through, not a static screenshot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I use it for:&lt;/strong&gt; Landing page structure. Hero section hierarchy, CTA placement, social proof blocks, feature grid layouts. When I need to understand &lt;em&gt;how&lt;/em&gt; a page flows — not just what one screen looks like — this is better than Mobbin because you get the full scroll experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Every site is clickable. You can see hover states, scroll animations, responsive behavior. The curation skews toward products, not agencies, which means more practical reference material.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; The library is smaller than Mobbin's. Updates are less frequent. Search is basic — you're browsing, not querying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Best for "I need a landing page and I want to see 20 good ones before I start."&lt;/p&gt;

&lt;h2&gt;
  
  
  4. siteinspire.com — The Minimalist's Reference
&lt;/h2&gt;

&lt;p&gt;Siteinspire has been around since 2006. It's a straightforward gallery of well-designed websites, filterable by style, type, subject, and platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I use it for:&lt;/strong&gt; Clean, minimal designs. If Godly is the experimental wing, Siteinspire is the "this is tasteful and works" wing. Great for typography references, whitespace usage, and restrained color palettes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; 7,000+ sites, well-organized filters, no fluff. A Reddit thread on favorite inspiration sites listed it as a top pick alongside Mobbin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Feels slightly dated compared to newer entries. The visual style of what gets featured is very "design agency 2019." You won't find dark-mode SaaS dashboards here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Reliable for clean, corporate-grade web design. The kind of thing you'd show a client who says "make it look professional."&lt;/p&gt;

&lt;h2&gt;
  
  
  5. saaslandingpage.com — Niche and Useful
&lt;/h2&gt;

&lt;p&gt;A smaller site that does exactly what the URL says — it collects landing pages specifically from SaaS products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I use it for:&lt;/strong&gt; B2B-specific patterns. Pricing tables, feature comparison sections, integration grids, testimonial layouts. Things you won't find on Godly or Siteinspire because they're boring — but essential if you sell software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Highly relevant if you build SaaS. Every entry is a product landing page, not a portfolio or agency site. Quick to browse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; Small library. Not updated as frequently. The design is bare-bones — the site itself could use a designer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Niche, but if you're building a SaaS landing page, this should be your first stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The YouTube Reference Worth Mentioning
&lt;/h2&gt;

&lt;p&gt;Self-Made Web Designer put out a video called "38 Must-Visit Web Design Inspiration Resources" that covers everything from the well-known (Godly, Mobbin) to the obscure. Worth a watch if you want to go deeper than these five — but the video itself is 20+ minutes and most of the 38 are redundant. These five cover 90% of what I actually open.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Godly&lt;/strong&gt; — experimental, creative, award-worthy sites. Use for hero sections and scroll interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobbin&lt;/strong&gt; — 400k+ screenshots from real apps. Use for UI patterns and interaction flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Land-book&lt;/strong&gt; — clickable landing page gallery. Use for landing page structure and flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Siteinspire&lt;/strong&gt; — clean, minimal, corporate. Use for typography and whitespace reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SaaS Landing Page&lt;/strong&gt; — B2B-specific patterns. Use for pricing tables and feature sections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dribbble&lt;/strong&gt; — skip it if you build things. It's a portfolio platform, not a reference library.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're looking for design systems you can actually hand to an AI agent, the &lt;a href="https://ansaribilal.com/blog/lovable-replacement-stack-aura-aceternity-refero-2025" rel="noopener noreferrer"&gt;Refero Styles breakdown in the Post-Lovable stack post&lt;/a&gt; covers how I extract real design tokens from these references. And if you want to see what I've built using this approach, the &lt;a href="https://ansaribilal.com/#projects" rel="noopener noreferrer"&gt;Projects section&lt;/a&gt; has the output.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not affiliated with Godly, Mobbin, Land-book, Siteinspire, or SaaS Landing Page. Tools used for this site's design research: Refero Styles, Aceternity UI.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/design-inspiration-godly-mobbin-10x-alternatives-2025?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=design-inspiration-godly-mobbin-10x-alternatives-2025" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=design-inspiration-godly-mobbin-10x-alternatives-2025" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Built a Video Pipeline with 3 Open-Source Tools (No Editor Needed)</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Mon, 03 Aug 2026 12:42:36 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/i-built-a-video-pipeline-with-3-open-source-tools-no-editor-needed-539j</link>
      <guid>https://dev.to/ansari_bilal/i-built-a-video-pipeline-with-3-open-source-tools-no-editor-needed-539j</guid>
      <description>&lt;p&gt;&lt;em&gt;Last updated: September 17, 2025 \u00b7 7-minute read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eight weeks ago, I ran an experiment turning HTML into video using agents and browser automation. The output was rough \u2014 10-second clips with inconsistent timing and fonts that broke at different resolutions. But the core idea stuck: &lt;strong&gt;if I can define a video as HTML, I can version-control it, template it, and automate it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That early experiment is documented in &lt;a href="https://ansaribilal.com/blog/html-to-video-agents-hyperframes-nexu-2025" rel="noopener noreferrer"&gt;my Week 3 post&lt;/a&gt;. Now, eight weeks later, the pipeline is production-grade. Here\u2019s what it actually looks like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0p8gh5u1omqytjs2791y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0p8gh5u1omqytjs2791y.jpg" alt="Video pipeline architecture \u2014 HTML to MP4" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem I\u2019m Actually Solving
&lt;/h2&gt;

&lt;p&gt;Over on r/webdev, a post titled &lt;a href="https://www.reddit.com/r/webdev/comments/1kzy5wq/" rel="noopener noreferrer"&gt;\u201cI Couldn\u2019t Find a Good Open-Source Web Video Editor, So I Built One\u201d&lt;/a&gt; hit 139 upvotes. The author built a React-based video editor because every open-source option was either abandoned, Electron-bloated, or missing basic features.&lt;/p&gt;

&lt;p&gt;That post resonated because it described exactly the gap I\u2019d been feeling. But my approach was different. Instead of building a video editor, I &lt;strong&gt;eliminated the editor entirely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The use case: I needed to generate short, structured videos programmatically \u2014 launch announcements, feature walkthroughs, data visualizations. The content was templatable. The format was repeatable. Opening Premiere or DaVinci Resolve for each one was wasteful when 90% of the \u201cediting\u201d was placing text on a background with a fade transition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three-Tool Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stage 1: HTML Templates
&lt;/h3&gt;

&lt;p&gt;Every video starts as an HTML file. Not a mockup \u2014 the actual source of truth. I define layouts using plain HTML and CSS with a few conventions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;data-frame&lt;/code&gt; attributes mark animation keyframes&lt;/li&gt;
&lt;li&gt;CSS animations handle transitions between frames&lt;/li&gt;
&lt;li&gt;Media assets (images, audio) are referenced by relative path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means I can write a \u201cvideo\u201d the same way I write a webpage. I use Tailwind for styling. I use CSS &lt;code&gt;@keyframes&lt;/code&gt; for timing. The entire template is just a static HTML file that looks correct when opened in a browser.&lt;/p&gt;

&lt;p&gt;Why HTML? Because every developer already knows it. Because you can version-control it in git. Because you can generate it with any templating engine. Because a browser is the most reliable rendering engine on the planet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: HyperFrames
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/heygen-com/hyperframes" rel="noopener noreferrer"&gt;HyperFrames&lt;/a&gt; is an open-source framework from HeyGen that turns HTML, CSS, and seekable animations into deterministic MP4 videos. Apache 2.0 licensed. The pitch: \u201cWrite HTML. Render video. Built for agents.\u201d&lt;/p&gt;

&lt;p&gt;HyperFrames takes my HTML template and renders it frame-by-frame using a headless browser. It reads the &lt;code&gt;data-frame&lt;/code&gt; attributes to understand timing, captures each frame as an image, and pipes them to ffmpeg for encoding.&lt;/p&gt;

&lt;p&gt;The key feature that made HyperFrames the right choice is &lt;strong&gt;seekable animations&lt;/strong&gt;. It doesn\u2019t just record a playback \u2014 it can seek to any point in the animation timeline and render that specific frame. Same input, same output, every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: html-video + ffmpeg
&lt;/h3&gt;

&lt;p&gt;For the final encoding, I use html-video combined with ffmpeg for audio muxing and format optimization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-framerate&lt;/span&gt; 30 &lt;span class="nt"&gt;-i&lt;/span&gt; frames/%04d.png &lt;span class="nt"&gt;-i&lt;/span&gt; audio.mp3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:v libx264 &lt;span class="nt"&gt;-preset&lt;/span&gt; medium &lt;span class="nt"&gt;-crf&lt;/span&gt; 23 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;:a aac &lt;span class="nt"&gt;-b&lt;/span&gt;:a 128k &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-shortest&lt;/span&gt; output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What the Pipeline Looks Like in Practice
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;video-project/
\u251c\u2500\u2500 templates/
\u2502   \u251c\u2500\u2500 launch-announcement.html
\u2502   \u2514\u2500\u2500 feature-walkthrough.html
\u251c\u2500\u2500 assets/
\u2502   \u251c\u2500\u2500 logo.svg
\u2502   \u2514\u2500\u2500 background.mp3
\u251c\u2500\u2500 scripts/
\u2502   \u251c\u2500\u2500 render.sh
\u2502   \u2514\u2500\u2500 encode.sh
\u251c\u2500\u2500 output/
\u2514\u2500\u2500 config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create a new video, I either write the HTML template manually or generate it with an LLM agent. The agent gets the content brief and outputs a valid HTML file with the correct &lt;code&gt;data-frame&lt;/code&gt; attributes. Then I run two shell commands. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hard Parts
&lt;/h2&gt;

&lt;p&gt;Frame-perfect timing was the biggest challenge. CSS animations don\u2019t guarantee sub-frame accuracy \u2014 a 1-second animation might complete at 0.98s or 1.02s depending on the browser\u2019s rendering pipeline. I solved this by using discrete keyframe steps instead of smooth transitions for anything that needs to sync precisely.&lt;/p&gt;

&lt;p&gt;Font rendering was the second issue. Google Fonts load asynchronously, which means the first few frames might render in a fallback font. I embedded the fonts as base64 in the HTML template. Ugly in source code, but the output is consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Eight Weeks of Iteration Taught Me
&lt;/h2&gt;

&lt;p&gt;The Week 3 experiment produced janky 10-second clips. The Week 10 pipeline produces broadcastable short-form content. The difference wasn\u2019t any single breakthrough \u2014 it was 40+ iterations on templates, timing calibration, and understanding where the frame-level rendering breaks down.&lt;/p&gt;

&lt;p&gt;The biggest lesson: &lt;strong&gt;the tooling is finally good enough that the bottleneck is now content, not rendering.&lt;/strong&gt; HyperFrames handles the hard part. My job is writing good HTML templates and having something worth saying in them.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Three-tool pipeline: HTML templates \u2192 HyperFrames (renders frames) \u2192 ffmpeg (encodes MP4)&lt;/li&gt;
&lt;li&gt;No video editor needed. Code in, video out.&lt;/li&gt;
&lt;li&gt;Deterministic rendering: same HTML always produces the same video&lt;/li&gt;
&lt;li&gt;Hard parts: frame timing precision, font loading, audio sync&lt;/li&gt;
&lt;li&gt;40+ iterations from janky 10-second clips to production-grade output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you\u2019re generating video content programmatically \u2014 product demos, social posts, tutorial overlays \u2014 this pipeline eliminates the editor entirely. Check out the &lt;a href="https://ansaribilal.com/#lab" rel="noopener noreferrer"&gt;Lab&lt;/a&gt; for the templates I\u2019m open-sourcing, and the &lt;a href="https://ansaribilal.com/blog/talkdrive-soulx-flashhead-colab-talking-head-2026" rel="noopener noreferrer"&gt;TalkDrive&lt;/a&gt; post for how I handle the audio layer with AI-generated voiceovers.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Not affiliated with HeyGen or HyperFrames. Tools used: HyperFrames (Apache 2.0), html-video, ffmpeg, Tailwind CSS. Built on a Linux workstation.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/open-source-video-pipeline-hyperframes-html-video-build-2025?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=open-source-video-pipeline-hyperframes-html-video-build-2025" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=open-source-video-pipeline-hyperframes-html-video-build-2025" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>12 Weeks of Blogging as a Builder: What Actually Got Traffic</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Mon, 03 Aug 2026 12:42:32 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/12-weeks-of-blogging-as-a-builder-what-actually-got-traffic-2lej</link>
      <guid>https://dev.to/ansari_bilal/12-weeks-of-blogging-as-a-builder-what-actually-got-traffic-2lej</guid>
      <description>&lt;p&gt;&lt;em&gt;Last updated: September 24, 2025 \u00b7 9-minute read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I committed to writing one post per week for 12 weeks on this portfolio site \u2014 a React SPA with no CMS, no SSR, no Next.js metadata magic. Every post lives as a string in a TypeScript array. The entire blog is client-rendered. By conventional SEO wisdom, this should be a graveyard.&lt;/p&gt;

&lt;p&gt;It isn\u2019t. Here\u2019s what actually happened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxn8gjcazajvgbgrme5za.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxn8gjcazajvgbgrme5za.jpg" alt="12 weeks of blogging \u2014 traffic data and lessons" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Posts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Post&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/lovable-replacement-stack-aura-aceternity-refero-2025" rel="noopener noreferrer"&gt;I Replaced Lovable&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/claude-code-memory-mcp-codebase-setup-2025" rel="noopener noreferrer"&gt;Claude Code Memory MCP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tutorials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/html-to-video-agents-hyperframes-nexu-2025" rel="noopener noreferrer"&gt;HTML-to-Video Agents&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Experiments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/aceternity-ui-vs-magic-ui-vs-shadcn-comparison-2025" rel="noopener noreferrer"&gt;Aceternity vs Magic UI vs shadcn&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/trigger-dev-nextjs-background-jobs-vs-inngest-2025" rel="noopener noreferrer"&gt;Trigger.dev Background Jobs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tutorials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/design-inspiration-godly-mobbin-10x-alternatives-2025" rel="noopener noreferrer"&gt;5 Design Inspiration Sites&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/refero-styles-design-md-ai-agent-experiment-2025" rel="noopener noreferrer"&gt;Refero Styles Experiment&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Experiments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/testsprite-ai-testing-setup-vs-cypress-playwright-2025" rel="noopener noreferrer"&gt;TestSprite AI Testing&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Tutorials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/best-mcp-servers-claude-code-top-5-2025" rel="noopener noreferrer"&gt;Top 5 MCP Servers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/sploitas-osint-digital-footprint-experiment-2025" rel="noopener noreferrer"&gt;OSINT with Sploitas&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Experiments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ansaribilal.com/blog/open-source-video-pipeline-hyperframes-html-video-build-2025" rel="noopener noreferrer"&gt;Video Pipeline Build&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Builds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;This post&lt;/td&gt;
&lt;td&gt;Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Traffic by Post Type
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tutorials consistently outperformed everything else.&lt;/strong&gt; The CloudStream guide and the $300 AI Credits post each pulled 4-6x the traffic of the average insights or builds post. People bookmark these. They come back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;\u201cHonest review\u201d posts had the longest tail.&lt;/strong&gt; The &lt;a href="https://ansaribilal.com/blog/lovable-replacement-stack-aura-aceternity-refero-2025" rel="noopener noreferrer"&gt;Lovable replacement post&lt;/a&gt; started slow but kept getting traffic week after week. Posts that take a clear stance have legs because people reference them in conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Builds and experiments were the weakest performers for traffic \u2014 but strongest for credibility.&lt;/strong&gt; The &lt;a href="https://ansaribilal.com/blog/talkdrive-soulx-flashhead-colab-talking-head-2026" rel="noopener noreferrer"&gt;TalkDrive&lt;/a&gt; post didn\u2019t get huge traffic, but three people reached out directly about collaborating. The &lt;a href="https://ansaribilal.com/blog/how-i-shipped-14-hugging-face-spaces" rel="noopener noreferrer"&gt;Hugging Face Spaces post&lt;/a&gt; and &lt;a href="https://ansaribilal.com/blog/local-ai-is-the-future-of-privacy" rel="noopener noreferrer"&gt;PrivacyThink writeup&lt;/a&gt; function more as proof-of-work than traffic drivers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Social Distribution: Reddit vs X vs LinkedIn
&lt;/h2&gt;

&lt;p&gt;I cross-posted every article to three platforms. The results were not even close.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reddit: 8x the click-through of X/Twitter.&lt;/strong&gt; Tutorial posts on relevant subreddits (r/webdev, r/selfhosted, r/privacy, r/ChatGPT) consistently drove the most qualified traffic. A key insight from Ross Simmonds\u2019 talk on &lt;a href="https://ipullrank.com/seo-week-2025-ross-simmonds" rel="noopener noreferrer"&gt;Reddit\u2019s influence on search&lt;/a&gt; confirmed what I was seeing \u2014 Reddit is now a dominant force in how people discover content, especially for technical topics.&lt;/p&gt;

&lt;p&gt;The nuance: Reddit rewards specificity. A post titled \u201cHow I Replaced Lovable with Three Tools\u201d performs better than \u201cMy Design System Journey.\u201d&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;X/Twitter: high impressions, low clicks.&lt;/strong&gt; Thread summaries got 2,000-8,000 impressions per thread. But click-through hovered around 0.3-0.5%. X is a brand-building channel, not a traffic channel. As one Reddit thread on r/buildinpublic put it: \u201cYour customers are not scrolling Twitter looking for someone\u2019s revenue milestone. They\u2019re googling their problem.\u201d&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn: negligible for this audience.&lt;/strong&gt; Posted every article. Almost zero engagement for technical content. LinkedIn works for enterprise thought leadership. It doesn\u2019t work for \u201chere\u2019s how to pipe HTML through HyperFrames into an MP4.\u201d&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO Learnings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Internal Linking Is the Highest-ROI Move
&lt;/h3&gt;

&lt;p&gt;Every post on this site links to at least two other posts. The &lt;a href="https://ansaribilal.com/blog/lovable-replacement-stack-aura-aceternity-refero-2025" rel="noopener noreferrer"&gt;Lovable post&lt;/a&gt; links to the &lt;a href="https://ansaribilal.com/blog/google-antigravity-2-every-new-superpower-2026" rel="noopener noreferrer"&gt;Antigravity post&lt;/a&gt; and the &lt;a href="https://ansaribilal.com/blog/free-300-ai-credits-no-card-2026" rel="noopener noreferrer"&gt;AI Credits post&lt;/a&gt;. The &lt;a href="https://ansaribilal.com/blog/cloudstream-v4-7-0-download-best-repos-2025" rel="noopener noreferrer"&gt;CloudStream guide&lt;/a&gt; links to the &lt;a href="https://ansaribilal.com/blog/migrate-google-drive-without-downloading-rclone-2026" rel="noopener noreferrer"&gt;Drive migration post&lt;/a&gt;. And so on.&lt;/p&gt;

&lt;p&gt;Over on r/SEO, a thread confirmed this: \u201cInternal linking is one of the most underrated SEO tactics for new websites. It helps Google discover pages faster, understand topic authority, and distribute link equity.\u201d&lt;/p&gt;

&lt;p&gt;My site has no external backlinks worth mentioning. The only reason Google finds and ranks individual blog posts is internal linking. Every post is reachable from every other post within 1-2 clicks. This is especially critical for a client-rendered SPA where Googlebot has to work harder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sitemap Strategy for a SPA
&lt;/h3&gt;

&lt;p&gt;Since the blog is client-rendered, I generated a static sitemap.xml that lists every post slug. Google can\u2019t execute JavaScript to discover client-side routes \u2014 the sitemap is the only way crawlers find individual posts. Basic but essential.&lt;/p&gt;

&lt;h3&gt;
  
  
  Timing Doesn\u2019t Matter as Much as I Thought
&lt;/h3&gt;

&lt;p&gt;I published every post on Wednesday mornings (IST). The theory was that US readers would see it Tuesday evening, Indian readers Wednesday morning, European readers Wednesday midday. In practice, the day of publication had almost no correlation with traffic. What mattered was the subreddit I posted it to and whether the title was specific enough to stop someone scrolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Post Types Performed Best (Ranked)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tutorials with concrete steps&lt;/strong&gt; \u2014 CloudStream, AI Credits, Drive Migration. 4-6x average traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest tool reviews with real alternatives&lt;/strong&gt; \u2014 Lovable Replacement. Slow burn but consistent monthly traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiments with surprising findings&lt;/strong&gt; \u2014 OSINT footprint, Antigravity 2.0. Shareable because the results are interesting regardless of whether you\u2019re a developer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build stories&lt;/strong&gt; \u2014 TalkDrive, Video Pipeline. Low traffic, high credibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Philosophy/career posts&lt;/strong&gt; \u2014 Sales Agent, Why I Build. Lowest traffic but most personally satisfying.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I\u2019d Do Differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write more tutorials.&lt;/strong&gt; The traffic data is unambiguous. Tutorials with specific, copy-pasteable steps are what people search for and share.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post to Reddit more strategically.&lt;/strong&gt; Not every subreddit for every post. Match the post to the single best subreddit and write a Reddit-native title.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start building an email list from week 1.&lt;/strong&gt; I didn\u2019t, and now I\u2019m relying entirely on algorithmic discovery for return visitors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Double down on internal linking.&lt;/strong&gt; The best distribution strategy for a solo builder is writing useful things and linking them to each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Honest Takeaway
&lt;/h2&gt;

&lt;p&gt;Twelve weeks of consistent blogging taught me that the \u201cbuild in public\u201d meta-narrative \u2014 the revenue screenshots, the milestone threads, the \u201cday 47 of my startup\u201d posts \u2014 is mostly noise. What actually works is writing the thing someone is googling at 11pm when they\u2019re stuck on a problem.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ansaribilal.com/blog/cloudstream-v4-7-0-download-best-repos-2025" rel="noopener noreferrer"&gt;CloudStream guide&lt;/a&gt; works because someone is googling \u201cCloudStream repos not working.\u201d The &lt;a href="https://ansaribilal.com/blog/lovable-replacement-stack-aura-aceternity-refero-2025" rel="noopener noreferrer"&gt;Lovable replacement&lt;/a&gt; works because someone is googling \u201cLovable alternatives.\u201d The &lt;a href="https://ansaribilal.com/blog/sploitas-osint-digital-footprint-experiment-2025" rel="noopener noreferrer"&gt;OSINT experiment&lt;/a&gt; works because someone is googling \u201ccheck my digital footprint.\u201d&lt;/p&gt;

&lt;p&gt;Write the answer to the question. Link it to the other answers. Post it where people ask questions. That\u2019s the entire strategy.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://ansaribilal.com/blog" rel="noopener noreferrer"&gt;full post archive&lt;/a&gt; has everything, and the &lt;a href="https://ansaribilal.com/#projects" rel="noopener noreferrer"&gt;Projects section&lt;/a&gt; has the things I actually built instead of just wrote about. The &lt;a href="https://ansaribilal.com/#lab" rel="noopener noreferrer"&gt;Lab&lt;/a&gt; has the experiments that didn\u2019t make the cut but taught me something anyway.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;No tools were used to game traffic. Analytics from Cloudflare. Cross-posting done manually. Not affiliated with Reddit, X, or LinkedIn.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/12-weeks-blogging-builder-traffic-lessons-2025?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=12-weeks-blogging-builder-traffic-lessons-2025" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=12-weeks-blogging-builder-traffic-lessons-2025" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Graphify: Turning Your Notes Into a Knowledge Graph AI Agents Can Actually Query</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Mon, 03 Aug 2026 12:42:06 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/graphify-turning-your-notes-into-a-knowledge-graph-ai-agents-can-actually-query-6l4</link>
      <guid>https://dev.to/ansari_bilal/graphify-turning-your-notes-into-a-knowledge-graph-ai-agents-can-actually-query-6l4</guid>
      <description>&lt;p&gt;&lt;em&gt;7-minute read · October 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have ~1,400 Markdown notes accumulated over 6 years — Obsidian, then Notion, then back to plain files. RAG on top of them works, sort of. What actually works is &lt;strong&gt;Graphify&lt;/strong&gt;, an AI-agent skill that extracts entities and relationships from every note and hands the agent a real graph to traverse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F30v5ga2s9b75izyq2k17.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F30v5ga2s9b75izyq2k17.jpg" alt="Graphify knowledge graph — glowing amber nodes in an isometric cube" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG Isn't Enough (For Notes)
&lt;/h2&gt;

&lt;p&gt;Semantic search on notes gives you the &lt;em&gt;chunk that sounds most like the question&lt;/em&gt;. But my notes are dense with proper nouns — people, projects, tools, concepts. I don't want the chunk that sounds relevant; I want &lt;em&gt;"every note that mentions Sanjay AND the Refero project."&lt;/em&gt; That's a graph query, not a vector one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Graphify Does
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Walks a folder of Markdown.&lt;/li&gt;
&lt;li&gt;Runs each file through an extraction pass — entities (Person, Project, Tool, Concept) and relationships (&lt;code&gt;Sanjay WORKED_ON Refero&lt;/code&gt;, &lt;code&gt;Refero USES Tailwind&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Writes it all to a lightweight graph store (SQLite by default; Neo4j if you want).&lt;/li&gt;
&lt;li&gt;Exposes an MCP tool the agent can call: &lt;code&gt;graph.query({ entities, relationships })&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/... graphify
&lt;span class="nb"&gt;cd &lt;/span&gt;graphify &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run index &lt;span class="nt"&gt;--&lt;/span&gt; ~/notes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"graphify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/path/to/graphify/mcp.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--db"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/notes/graph.db"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ask Claude: &lt;em&gt;"Who has worked on projects using Tailwind, based on my notes?"&lt;/em&gt; — you'll get a real answer, not a hallucination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Shines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Research synthesis.&lt;/strong&gt; Ask "connect these three concepts" and the agent traverses actual edges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRM-lite.&lt;/strong&gt; Track people, projects, and last-touched dates without a real CRM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post ideas.&lt;/strong&gt; Ask "which topics have I mentioned &amp;gt;5 times and never blogged about?" — free content pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where It Struggles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entity resolution is noisy.&lt;/strong&gt; "Sanjay" and "S. Kumar" get treated as different people until you add aliases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraction cost.&lt;/strong&gt; First index of 1,400 notes cost me ~$3 in Claude tokens. Incremental updates are free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema drift.&lt;/strong&gt; If you rename an entity type mid-way, re-index the whole folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pair With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ansaribilal.com/blog/claude-code-memory-mcp-codebase-setup-2025" rel="noopener noreferrer"&gt;Codebase memory MCP&lt;/a&gt; for a similar effect on code, not notes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ansaribilal.com/blog/lord-of-the-skills-ai-agent-skills-catalog-lotr-cli-2025" rel="noopener noreferrer"&gt;Lord of the Skills catalog&lt;/a&gt; to discover more skills like Graphify.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;RAG is a hammer. Graphify gives your agent a screwdriver too. For anything where the &lt;em&gt;relationships&lt;/em&gt; matter more than the &lt;em&gt;text&lt;/em&gt; — research, second brains, personal CRM — this is the shape of AI-native tooling I want more of in 2026.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm building a variant that indexes Twitter bookmarks. Follow along on &lt;a href="https://twitter.com/ansaribilal140" rel="noopener noreferrer"&gt;X&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/graphify-ai-knowledge-graph-skill-2026?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=graphify-ai-knowledge-graph-skill-2026" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=graphify-ai-knowledge-graph-skill-2026" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Testing Telegram Notifications for Auto-Published Posts</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Mon, 03 Aug 2026 12:42:01 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/testing-telegram-notifications-for-auto-published-posts-595f</link>
      <guid>https://dev.to/ansari_bilal/testing-telegram-notifications-for-auto-published-posts-595f</guid>
      <description>&lt;p&gt;&lt;em&gt;1-minute read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a test post to verify that the Telegram notification pipeline works end-to-end.&lt;/p&gt;

&lt;p&gt;When the scheduled publisher flips this post from draft to published, the workflow should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Regenerate the sitemap and feed&lt;/li&gt;
&lt;li&gt;Commit and push the changes&lt;/li&gt;
&lt;li&gt;Send a Telegram message with the blog URL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're reading this on the blog, it worked.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with: GitHub Actions, Telegram Bot API, Node.js.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ansaribilal.com/blog/telegram-bot-test-notification-2025?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=telegram-bot-test-notification-2025" rel="noopener noreferrer"&gt;ansaribilal.com&lt;/a&gt;. I write about AI agents, indie builds and developer tooling — &lt;a href="https://ansaribilal.com/blog?utm_source=devto&amp;amp;utm_medium=syndication&amp;amp;utm_campaign=crosspost&amp;amp;utm_content=telegram-bot-test-notification-2025" rel="noopener noreferrer"&gt;more posts here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Ultimate Collection of 18K+ AI Agent Skills Across 14 Frameworks</title>
      <dc:creator>Ansari Mohammed Bilal</dc:creator>
      <pubDate>Thu, 02 Jul 2026 01:41:07 +0000</pubDate>
      <link>https://dev.to/ansari_bilal/the-ultimate-collection-of-18k-ai-agent-skills-across-14-frameworks-fbo</link>
      <guid>https://dev.to/ansari_bilal/the-ultimate-collection-of-18k-ai-agent-skills-across-14-frameworks-fbo</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9uo3clr1z5xe8mwvhkpt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9uo3clr1z5xe8mwvhkpt.png" alt="The Lord of the Skills banner" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AI agent landscape is currently in its "Wild West" phase. Every day, a new framework emerges — Claude Code, Cursor, Cline, OpenHands, AutoGen — and with each one comes a new way to define "skills" or "tools."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem?&lt;/strong&gt; Most developers are reinventing the wheel. We're all writing the same  or  tool for our specific framework, while a perfectly good version exists in another repo, formatted just a little differently. This fragmentation slows down progress and creates unnecessary silos in the AI development community.&lt;/p&gt;

&lt;p&gt;Today, we are launching &lt;strong&gt;The Lord of the Skills&lt;/strong&gt; to solve this.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Repo to Rule Them All 👑
&lt;/h2&gt;

&lt;p&gt;We have aggregated &lt;strong&gt;18,142 AI agent skills&lt;/strong&gt; from over 307 repositories into a single, searchable directory. This isn't just a list of links; it's a curated, deduplicated, and themed catalog designed to be the "central library" for the agentic era.&lt;/p&gt;

&lt;p&gt;When we started this project, we didn't realize how deep the rabbit hole went. We found skills buried in obscure Gists, hidden in the subdirectories of massive monorepos, and scattered across dozens of individual agent frameworks. By bringing them all into one place, we're enabling cross-framework discovery for the first time.&lt;/p&gt;

&lt;h3&gt;
  
  
  14 Frameworks Supported
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Skills Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;8,104&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;1,400+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline / Roo&lt;/td&gt;
&lt;td&gt;2,200+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Antigravity 🆕&lt;/td&gt;
&lt;td&gt;820&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;600+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenHands&lt;/td&gt;
&lt;td&gt;400+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AutoGen / CrewAI / LangGraph&lt;/td&gt;
&lt;td&gt;200+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continue, Goose, Copilot &amp;amp; more&lt;/td&gt;
&lt;td&gt;500+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Whether you are building local-first agents or massive cloud-based swarms, we've got you covered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mapping the Kingdoms 🗺️
&lt;/h2&gt;

&lt;p&gt;Managing 18,000+ skills is a daunting task. A simple list would be unusable. To make it manageable and — dare we say — fun, we've organized the entire library into &lt;strong&gt;10 LOTR-themed Kingdoms&lt;/strong&gt;. This provides a mental model for discovery that goes beyond simple keyword searching.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚔️ Gondor — Web &amp;amp; UI (10,141 skills)
&lt;/h3&gt;

&lt;p&gt;Browser automation, UI interaction, web scraping, frontend frameworks (React, Vue, Tailwind).&lt;/p&gt;

&lt;h3&gt;
  
  
  ⛏️ Moria — DevOps &amp;amp; Infrastructure (914 skills)
&lt;/h3&gt;

&lt;p&gt;Terminal management, cloud infrastructure (Terraform, AWS, K8s), kernel debugging, database administration.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌿 Lothlórien — Research &amp;amp; Analysis (496 skills)
&lt;/h3&gt;

&lt;p&gt;Data science (Pandas, NumPy), academic search (ArXiv, Google Scholar), vector databases (Pinecone, Milvus), RAG.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔥 Mordor — Security &amp;amp; Auditing (406 skills)
&lt;/h3&gt;

&lt;p&gt;Penetration testing, red-teaming, security auditing, vulnerability scanning.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧙 Isengard — Agents &amp;amp; Orchestration (1,630 skills)
&lt;/h3&gt;

&lt;p&gt;Multi-agent orchestration, high-level design, workflow automation, state machines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plus 5 more kingdoms:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✦ &lt;strong&gt;Rivendell&lt;/strong&gt; — Research &amp;amp; Knowledge (1,776 skills)&lt;/li&gt;
&lt;li&gt;✎ &lt;strong&gt;The Shire&lt;/strong&gt; — Writing &amp;amp; Content (1,272 skills)&lt;/li&gt;
&lt;li&gt;🐴 &lt;strong&gt;Rohan&lt;/strong&gt; — Testing &amp;amp; Verification (718 skills)&lt;/li&gt;
&lt;li&gt;🌳 &lt;strong&gt;Fangorn&lt;/strong&gt; — Documentation &amp;amp; Memory (708 skills)&lt;/li&gt;
&lt;li&gt;🕸 &lt;strong&gt;Mirkwood&lt;/strong&gt; — Specialized &amp;amp; Niche (81 skills)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quality Over Quantity: The 357 Canonical Skills ⭐
&lt;/h2&gt;

&lt;p&gt;With over 18k items, there is inevitably a lot of noise. That's why we've done the hard work of deduplication and curation. We have identified &lt;strong&gt;357 Canonical Skills&lt;/strong&gt; — the gold standard versions of the most common tools. If you need a "Google Search" skill, don't look through 50 different versions; just use the Canonical one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why it Matters: The End of Re-Invention 🎯
&lt;/h2&gt;

&lt;p&gt;As agents move from "cool toys" to "production employees," the ability to quickly equip them with specialized skills becomes a major bottleneck.&lt;/p&gt;

&lt;p&gt;Imagine you want to build a specialized agent for auditing cloud security. Instead of spending two weeks writing the AWS and security tool wrappers from scratch, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browse the &lt;strong&gt;Moria&lt;/strong&gt; kingdom for cloud tools&lt;/li&gt;
&lt;li&gt;Browse the &lt;strong&gt;Mordor&lt;/strong&gt; kingdom for security scripts&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;Canonical&lt;/strong&gt; versions of each&lt;/li&gt;
&lt;li&gt;Drop them into your framework of choice&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You've just saved 10 days of development time. This is the power of a centralized skill directory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Join the Fellowship 🤝
&lt;/h2&gt;

&lt;p&gt;The Lord of the Skills is brand new and we're building this for the community, by the community. We have &lt;strong&gt;5 good first issues&lt;/strong&gt; on GitHub waiting for contributors.&lt;/p&gt;

&lt;p&gt;Whether you're a Python expert, a prompt engineer, or just someone who loves Lord of the Rings, there's a place for you in the fellowship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://github.com/Bilal140202/the-lord-of-the-skills" rel="noopener noreferrer"&gt;Star the repo on GitHub&lt;/a&gt; — every star tells the compiler the kingdom was worth building.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;One Repo to Rule Them All.&lt;/em&gt; ⚔&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
