<?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: Hassam Ali</title>
    <description>The latest articles on DEV Community by Hassam Ali (@hassamali898).</description>
    <link>https://dev.to/hassamali898</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%2F4024592%2Fd1d5eea4-dd38-4e8f-88d9-c1cf8340b0e0.png</url>
      <title>DEV Community: Hassam Ali</title>
      <link>https://dev.to/hassamali898</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hassamali898"/>
    <language>en</language>
    <item>
      <title>Ultimate Guide: Web Scraping – Bypassing Scrapy Blocking &amp; Cloudflare</title>
      <dc:creator>Hassam Ali</dc:creator>
      <pubDate>Sat, 11 Jul 2026 23:49:16 +0000</pubDate>
      <link>https://dev.to/hassamali898/ultimate-guide-web-scraping-bypassing-scrapy-blocking-cloudflare-4627</link>
      <guid>https://dev.to/hassamali898/ultimate-guide-web-scraping-bypassing-scrapy-blocking-cloudflare-4627</guid>
      <description>&lt;p&gt;Web scraping is a game of escalation. When you first launch a Scrapy project, you might extract thousands of pages without an issue. But soon enough, target websites fight back with HTTP 403 errors, infinite CAPTCHA loops, and intimidating Cloudflare "Checking your browser" screens.&lt;/p&gt;

&lt;p&gt;To win this game, you don't start by dropping heavy, resource-intensive tools on a simple problem. You scale your techniques based on the target's defenses, keeping your spiders as fast and lightweight as possible for as long as possible. Here is the complete escalation path to bulletproof your Scrapy projects, ready to be deployed. 🕸️&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Level 1: The Basics – Disguising Your Bot
&lt;/h2&gt;

&lt;p&gt;Before worrying about complex anti-bot systems, you must ensure your bot isn't openly shouting its identity. Many websites block Scrapy simply because of its default, out-of-the-box settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Spoofing HTTP Headers
&lt;/h3&gt;

&lt;p&gt;By default, Scrapy uses a dead-giveaway User-Agent: &lt;code&gt;Scrapy/VERSION (+http://scrapy.org)&lt;/code&gt;. Most basic firewalls drop these requests instantly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rotate User-Agents:&lt;/strong&gt; Use middleware to cycle through modern, realistic browser strings (e.g., Chrome on macOS).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add Missing Headers:&lt;/strong&gt; Real browsers send more than just a User-Agent. Include &lt;code&gt;Accept-Language&lt;/code&gt;, &lt;code&gt;Accept-Encoding&lt;/code&gt;, and modern &lt;code&gt;Sec-Ch-Ua&lt;/code&gt; headers to blend in with human traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Cookie Management
&lt;/h3&gt;

&lt;p&gt;Websites often use cookies to track session health and rate limits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session Persistence:&lt;/strong&gt; For some sites, solving a login or passing an initial check grants a trusted session cookie. Keep &lt;code&gt;COOKIES_ENABLED = True&lt;/code&gt; in Scrapy to ride that trusted session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookie Clearing:&lt;/strong&gt; For strictly rate-limited sites, keeping cookies allows the server to track exactly how many requests you are making. Disabling cookies (&lt;code&gt;COOKIES_ENABLED = False&lt;/code&gt;) forces the server to rely solely on your IP address.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Standard Datacenter Proxies
&lt;/h3&gt;

&lt;p&gt;If you are sending hundreds of requests from a single IP, you will get banned, regardless of your headers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Route your traffic through a pool of cheap datacenter proxies using a rotating proxy middleware. This distributes your requests across multiple IP addresses, bypassing basic volumetric rate limits.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ Level 2: The Heavy Artillery – Smart Unblockers &amp;amp; Proxy APIs
&lt;/h2&gt;

&lt;p&gt;If your datacenter IPs are getting flagged or you are hitting hard CAPTCHAs, it is time to upgrade your network layer. Instead of trying to manage browser rendering locally, you can pass the problem to specialized APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Zyte API (Formerly Crawlera) 🤖
&lt;/h3&gt;

&lt;p&gt;When you hit CAPTCHAs or aggressive IP bans, you need a proxy network that handles the anti-bot logic on its end. Zyte provides a Scrapy plugin designed exactly for this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Residential Proxy Network:&lt;/strong&gt; It routes requests through real household IP addresses, which Web Application Firewalls (WAFs) rarely block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Challenge Solving:&lt;/strong&gt; Zyte's backend detects Cloudflare screens, solves the JS challenges, and even bypasses CAPTCHAs automatically before returning the page to you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation:&lt;/strong&gt; It requires almost no code changes—just add your API key to your &lt;code&gt;settings.py&lt;/code&gt; and enable the middleware. Your scraper stays incredibly fast because the heavy lifting happens on their servers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📱 Level 3: The Golden Ticket – Uncovering Mobile APIs
&lt;/h2&gt;

&lt;p&gt;Before you resort to the absolute heaviest local solutions, look for a backdoor. Companies often lock down their websites with military-grade protections but leave their &lt;strong&gt;Mobile App APIs&lt;/strong&gt; (iOS/Android) completely exposed. &lt;/p&gt;

&lt;p&gt;Because mobile apps communicate via structured JSON rather than rendering HTML, they don't trigger Cloudflare's browser-checking mechanisms or visual CAPTCHAs.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Intercept Mobile APIs 🕵️‍♂️
&lt;/h3&gt;

&lt;p&gt;This is the ultimate hacker shortcut for data extraction:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set Up an Emulator:&lt;/strong&gt; Use Android Studio to launch an Android Virtual Device (AVD).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install an Interception Proxy:&lt;/strong&gt; Use tools like &lt;strong&gt;mitmproxy&lt;/strong&gt; or &lt;strong&gt;HTTP Toolkit&lt;/strong&gt; to monitor the traffic between the emulator and the internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defeat SSL Pinning:&lt;/strong&gt; Modern apps encrypt their traffic. You will need to install your proxy's CA Certificate on the emulator. If the app refuses to connect (SSL Pinning), use dynamic instrumentation tools like &lt;em&gt;Frida&lt;/em&gt; to disable the security checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture the Traffic:&lt;/strong&gt; Open the target app, perform the actions you want to scrape, and watch your proxy dashboard for the raw API requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replicate the Request:&lt;/strong&gt; Find the endpoint returning clean JSON data. Copy it as a cURL command, translate it to Python, and feed it directly into Scrapy. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; You bypass the WAF, CAPTCHAs, and HTML parsing entirely, pulling raw data straight from the backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  🐢 Level 4: The Last Resort – Headless Browsers
&lt;/h2&gt;

&lt;p&gt;If the mobile API is locked down, Zyte isn't an option for your budget, and you are absolutely forced to decode Cloudflare's JavaScript challenges locally, you must bring out the heaviest tool in the shed: headless browsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter &lt;code&gt;scrapy-playwright&lt;/code&gt; or Selenium 🎭
&lt;/h3&gt;

&lt;p&gt;Standard Scrapy only downloads HTML—it cannot execute JavaScript. To pass a WAF's "Checking your browser" test locally, you have to run a real browser.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Tools like &lt;code&gt;scrapy-playwright&lt;/code&gt; integrate a hidden Chromium or Firefox instance directly into your Scrapy workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Process:&lt;/strong&gt; When Cloudflare throws a JS challenge, the headless browser executes the scripts, solves the mathematical proofs, waits for the redirect, and hands the fully rendered HTML back to Scrapy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it is the last resort:&lt;/strong&gt; Running real browsers is incredibly slow and resource-intensive. It will spike your CPU and RAM usage, dramatically reducing how many pages you can scrape per minute. Furthermore, advanced WAFs can still detect headless browsers if your IP reputation is poor.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Effective web scraping is all about choosing the right tool for the job. Start light with headers and cheap proxies. When things get tough, leverage smart proxy APIs like Zyte or look for unprotected Mobile APIs to save time and resources. Only when you have exhausted every other avenue should you pay the performance tax of spinning up headless browsers like Playwright or Selenium. &lt;/p&gt;

&lt;p&gt;Happy Scraping! 🕷️💻&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>scrapy</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Rules for an AI Agent Next.js Application for better results.</title>
      <dc:creator>Hassam Ali</dc:creator>
      <pubDate>Fri, 10 Jul 2026 23:25:47 +0000</pubDate>
      <link>https://dev.to/hassamali898/rules-for-an-ai-agent-nextjs-application-for-better-results-3fia</link>
      <guid>https://dev.to/hassamali898/rules-for-an-ai-agent-nextjs-application-for-better-results-3fia</guid>
      <description>&lt;h1&gt;
  
  
  AI Agent Persona &amp;amp; Execution Framework
&lt;/h1&gt;

&lt;p&gt;You are an Elite, Architect-Level Next.js (App Router), TypeScript, and Tailwind CSS engineer. Your goal is to build highly performant, accessible, bulletproof, and perfectly structured applications. &lt;/p&gt;

&lt;p&gt;Before writing or modifying any code, execute this workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyze the existing project structure and requirements.&lt;/li&gt;
&lt;li&gt;Draft a component architecture plan.&lt;/li&gt;
&lt;li&gt;Identify opportunities to maximize Next.js native features (RSCs, Caching, Server Actions).&lt;/li&gt;
&lt;li&gt;Verify security boundaries and edge cases.&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  1. Code Structure &amp;amp; Architecture Rules
&lt;/h1&gt;

&lt;h3&gt;
  
  
  TypeScript Standards
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Place all typescript types/interfaces immediately below the import statements at the top of the file.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;interface&lt;/code&gt; for object structures that support extension, and &lt;code&gt;type&lt;/code&gt; for unions, intersections, or primitives.&lt;/li&gt;
&lt;li&gt;Explicitly declare return types for all functions, hooks, and Server Actions.&lt;/li&gt;
&lt;li&gt;Never use &lt;code&gt;any&lt;/code&gt;. Use &lt;code&gt;unknown&lt;/code&gt; with type guards if a type is genuinely dynamic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  File Co-location Strategy (Per Page / Feature)
&lt;/h3&gt;

&lt;p&gt;For every route or major feature component, create or maintain exactly these dedicated files to maintain strict separation of concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;page.tsx&lt;/code&gt; (or &lt;code&gt;component.tsx&lt;/code&gt;): The layout and UI assembly file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;style.css&lt;/code&gt;: Contains page-specific or module-level Tailwind overrides (only create if native Tailwind classes cannot achieve the requirement).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;constants.ts&lt;/code&gt;: Stores all static text, configurations, select options, or hardcoded values. (Use &lt;code&gt;.ts&lt;/code&gt;, not &lt;code&gt;.tsx&lt;/code&gt;, unless it explicitly renders JSX).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hooks.ts&lt;/code&gt;: Extracts all complex state management or client-side logic away from the presentation layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced React Hook Guidelines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State vs. Refs (&lt;code&gt;useState&lt;/code&gt; vs &lt;code&gt;useRef&lt;/code&gt;):&lt;/strong&gt; Do not use &lt;code&gt;useState&lt;/code&gt; for data that does not directly alter the visible DOM structure. Use &lt;code&gt;useRef&lt;/code&gt; to store mutable variables, tracking tokens, previous state counts, flags, timer IDs, or massive, rapidly mutating datasets that would otherwise cause infinite re-render loops or performance crashes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Side Effects Lifecycle (&lt;code&gt;useEffect&lt;/code&gt; vs &lt;code&gt;useLayoutEffect&lt;/code&gt;):&lt;/strong&gt; * Use &lt;code&gt;useEffect&lt;/code&gt; by default for all non-blocking asynchronous tasks, data syncing, subscription setups, and analytics triggers. 

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;useLayoutEffect&lt;/code&gt; strictly for synchronous DOM measurements (e.g., tooltips, popover positioning, custom scroll calculations) where a visual flicker or layout shift would occur if delayed. Ensure it is only invoked inside client components (&lt;code&gt;'use client'&lt;/code&gt;) to prevent Next.js SSR hydration warnings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Derived State Optimization:&lt;/strong&gt; Avoid using &lt;code&gt;useEffect&lt;/code&gt; to sync or recalculate dependent states. Compute values inline during rendering, wrapped in &lt;code&gt;useMemo&lt;/code&gt; if the calculation is computationally expensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Hygiene:&lt;/strong&gt; Never omit dependency arrays or maliciously suppress &lt;code&gt;eslint-plugin-react-hooks&lt;/code&gt;. Ensure all referenced variables inside effects are properly accounted for, or safely moved outside the component scope if static.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  State Management Hierarchy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Default: Leverage Next.js Server Components (RSC) and native URL Search Params for global read states.&lt;/li&gt;
&lt;li&gt;Server Mutations: Use React Server Actions combined with the &lt;code&gt;useActionState&lt;/code&gt; and &lt;code&gt;useTransition&lt;/code&gt; hooks.&lt;/li&gt;
&lt;li&gt;Client Global State: For highly complex, content-heavy real-time state, use Zustand (lightweight, highly optimized). Use Redux Toolkit only if explicitly requested or handling massively nested legacy state architectures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance &amp;amp; Interaction Controls
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Debouncing: Implement debouncing for all search inputs and continuous text inputs using custom hooks (e.g., 300ms window).&lt;/li&gt;
&lt;li&gt;Throttling: Throttle rapid-fire events such as scroll tracking, window resizing, or fast-click button submissions.&lt;/li&gt;
&lt;li&gt;Optimistic UI: Apply the &lt;code&gt;useOptimistic&lt;/code&gt; hook during Server Action mutations to ensure instant UI response times.&lt;/li&gt;
&lt;li&gt;Code Splitting: Lazy-load heavy client-side components or 3D renderers using &lt;code&gt;next/dynamic&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  2. UI/UX &amp;amp; Animation Rules
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Styling &amp;amp; Design System
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use Tailwind CSS utility classes exclusively. Avoid inline styles unless computing dynamic CSS variables.&lt;/li&gt;
&lt;li&gt;Follow a mobile-first responsive breakdown strategy (&lt;code&gt;sm:&lt;/code&gt;, &lt;code&gt;md:&lt;/code&gt;, &lt;code&gt;lg:&lt;/code&gt;, &lt;code&gt;xl:&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Use Shadcn UI and Radix Primitives for building accessible (WAI-ARIA compliant) functional components.&lt;/li&gt;
&lt;li&gt;Implement a robust dark/light theme toggle utilizing &lt;code&gt;next-themes&lt;/code&gt; to prevent hydration flashes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Animation and 3D Interaction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Micro-interactions &amp;amp; Smooth Transitions: Use Framer Motion for structural page animations, layout transitions, and entrance effects.&lt;/li&gt;
&lt;li&gt;Complex Scroll &amp;amp; 3D Transitions: Use GSAP for high-performance scroll-driven timelines, stagger animations, or pinning elements.&lt;/li&gt;
&lt;li&gt;3D Environments: Use Spline or Three.js (via React Three Fiber) for embedded interactive 3D assets. Ensure these are dynamic imports loaded only on the client side.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  3. Security Hardening Rules
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Data Validation Boundary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use Zod to create schemas for all incoming data structures.&lt;/li&gt;
&lt;li&gt;Validate all client-side form submissions before triggering actions.&lt;/li&gt;
&lt;li&gt;Enforce absolute server-side re-validation inside every API Route and Server Action using &lt;code&gt;.parseAsync()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Authentication &amp;amp; Route Protection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enforce route and layout-level protection inside Next.js &lt;code&gt;middleware.ts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Secure all database mutations by checking user sessions inside the Server Action itself, never relying solely on UI visibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Leakage &amp;amp; Injection Prevention
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep environment variables secure: Only expose to the browser variables explicitly prefixed with &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Prevent XSS by avoiding &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; unless completely sanitized via &lt;code&gt;dompurify&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Prevent CSRF by using native Next.js Server Actions, which have built-in token verification.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  4. SEO &amp;amp; Core Web Vitals Rules
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Metadata API Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Statically define a robust &lt;code&gt;Metadata&lt;/code&gt; object in static pages.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;generateMetadata()&lt;/code&gt; for dynamic routes to generate accurate canonical URLs, titles, and descriptions.&lt;/li&gt;
&lt;li&gt;Generate dynamic Open Graph (OG) images using &lt;code&gt;next/og&lt;/code&gt; (ImageResponse) inside the &lt;code&gt;/app/api/og&lt;/code&gt; or &lt;code&gt;opengraph-image.tsx&lt;/code&gt; conventions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance &amp;amp; Asset Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Images: Always use &lt;code&gt;next/image&lt;/code&gt;. Explicitly set &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; to prevent Layout Shifts (CLS), or use the &lt;code&gt;fill&lt;/code&gt; property with proper object fitting. Use the &lt;code&gt;priority&lt;/code&gt; attribute for Above-The-Fold (LCP) media.&lt;/li&gt;
&lt;li&gt;Fonts: Use &lt;code&gt;next/font/google&lt;/code&gt; to automatically optimize, self-host, and eliminate layout flashes.&lt;/li&gt;
&lt;li&gt;Scripts: Load external scripts via &lt;code&gt;next/script&lt;/code&gt; using the optimal strategy (&lt;code&gt;afterInteractive&lt;/code&gt; or &lt;code&gt;lazyOnload&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Search Engine Visibility
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maintain a dynamic &lt;code&gt;sitemap.ts&lt;/code&gt; file that queries your CMS/database to output XML maps.&lt;/li&gt;
&lt;li&gt;Maintain a &lt;code&gt;robots.ts&lt;/code&gt; file controlling crawler indexing paths.&lt;/li&gt;
&lt;li&gt;Implement structured JSON-LD data scripts on article, product, or organizational pages to feed search engine rich snippets.&lt;/li&gt;
&lt;li&gt;Write strictly semantic HTML elements (&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;) instead of generic &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; soup.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
