<?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: Abdelrahman Ragab</title>
    <description>The latest articles on DEV Community by Abdelrahman Ragab (@abdelrahman_ragab_20).</description>
    <link>https://dev.to/abdelrahman_ragab_20</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%2F4118299%2F23c64756-972e-4b8b-9b90-5d79d05b8fbe.png</url>
      <title>DEV Community: Abdelrahman Ragab</title>
      <link>https://dev.to/abdelrahman_ragab_20</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdelrahman_ragab_20"/>
    <language>en</language>
    <item>
      <title>I Built a Website Crawler Because “It Works in the Browser” Isn’t Enough</title>
      <dc:creator>Abdelrahman Ragab</dc:creator>
      <pubDate>Wed, 09 Sep 2026 23:48:49 +0000</pubDate>
      <link>https://dev.to/abdelrahman_ragab_20/i-built-a-website-crawler-because-it-works-in-the-browser-isnt-enough-54ji</link>
      <guid>https://dev.to/abdelrahman_ragab_20/i-built-a-website-crawler-because-it-works-in-the-browser-isnt-enough-54ji</guid>
      <description>&lt;p&gt;When you build a website, one of the easiest things to assume is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the page looks fine in the browser, the website is fine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But a browser session only shows you one path through the application.&lt;/p&gt;

&lt;p&gt;A website can look completely normal while still having broken links, missing metadata, invalid structured data, crawlability problems, or performance issues across pages you never opened.&lt;/p&gt;

&lt;p&gt;That was the idea behind a project I’ve been building called sitebot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;As a frontend developer, I spend a lot of time checking websites from the browser.&lt;/p&gt;

&lt;p&gt;I usually have several things to verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the page render correctly?&lt;/li&gt;
&lt;li&gt;Are the SEO tags there?&lt;/li&gt;
&lt;li&gt;Is the canonical correct?&lt;/li&gt;
&lt;li&gt;Are Open Graph tags present?&lt;/li&gt;
&lt;li&gt;Are there broken links?&lt;/li&gt;
&lt;li&gt;Is structured data available?&lt;/li&gt;
&lt;li&gt;Are important pages actually discoverable?&lt;/li&gt;
&lt;li&gt;How does performance look?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is that doing this manually doesn't scale very well.&lt;/p&gt;

&lt;p&gt;Checking one page is easy.&lt;/p&gt;

&lt;p&gt;Checking hundreds of pages is a different story.&lt;/p&gt;

&lt;p&gt;And that's where crawling becomes useful.&lt;/p&gt;

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

&lt;p&gt;sitebot is a CLI website crawler and technical auditing tool.&lt;/p&gt;

&lt;p&gt;Instead of opening a website and manually inspecting pages, you can run an audit from the terminal.&lt;/p&gt;

&lt;p&gt;The basic idea is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sitebot https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The crawler discovers pages and resources, then runs different checks against what it finds.&lt;/p&gt;

&lt;p&gt;The goal isn't to replace every specialized SEO or performance platform.&lt;/p&gt;

&lt;p&gt;It's to make technical website checks accessible from a developer-friendly CLI.&lt;/p&gt;

&lt;p&gt;What does it check?&lt;/p&gt;

&lt;p&gt;The project currently focuses on several areas.&lt;/p&gt;

&lt;p&gt;SEO metadata&lt;/p&gt;

&lt;p&gt;It can inspect important metadata such as:&lt;/p&gt;


&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;meta descriptions&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;canonical URLs&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;robots-related metadata&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Open Graph metadata&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;These are small pieces of HTML, but missing or incorrect values can have a noticeable impact on how pages are interpreted and shared.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Broken links&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;A website can accumulate broken links over time.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;This becomes particularly difficult to notice on larger websites where some pages may rarely be visited.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;A crawler can follow links across the site and identify URLs that don't return the expected response.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Structured data&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Structured data is another area where manually checking every page becomes tedious.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;sitebot can inspect structured data found in pages and help surface pages where it is missing or potentially problematic.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Crawling and page discovery&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;One of the interesting parts of building a crawler is realizing that the list of URLs you think a website has isn't necessarily the list a crawler can actually discover.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The crawler follows links and builds a picture of the site's reachable pages.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;This can reveal pages that behave differently from what you expected.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Core Web Vitals&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Performance is also part of the audit.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Core Web Vitals provide useful signals around the actual user experience of a page, so I wanted performance to be part of the same developer-oriented workflow rather than something completely disconnected from the rest of the audit.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Why a CLI?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;There are already many excellent website auditing tools.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;So why build another one?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;For me, the interesting part was the developer workflow.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;I wanted something that could fit naturally into the terminal.&amp;lt;/p&amp;gt;

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

&amp;lt;p&amp;gt;sitebot &amp;lt;a href="https://mywebsite.com"&amp;gt;https://mywebsite.com&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;And eventually:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Crawling website...&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Pages discovered: 142&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;SEO&amp;lt;br&amp;gt;
✓ 138 pages have titles&amp;lt;br&amp;gt;
⚠ 4 pages have missing descriptions&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Links&amp;lt;br&amp;gt;
✓ 136 pages checked&amp;lt;br&amp;gt;
⚠ 6 broken links found&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Structured Data&amp;lt;br&amp;gt;
✓ 120 pages checked&amp;lt;br&amp;gt;
⚠ 8 pages with issues&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Performance&amp;lt;br&amp;gt;
✓ Core Web Vitals collected&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The exact output is still evolving, but the idea is to make the result easy to understand and useful enough to act on.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Building a crawler is more interesting than I expected&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The auditing rules themselves are only part of the problem.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Once you start crawling real websites, you quickly run into questions like:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How should duplicate URLs be handled?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What happens with URL fragments?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How should redirects be treated?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How do you avoid crawling the same page repeatedly?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What should happen with external links?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How should query parameters be handled?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How do you deal with pages that are generated dynamically?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How much concurrency is reasonable?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How should failures and timeouts be represented?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;A simple crawler can start with:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;URL → request → parse links → repeat&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;But making it reliable requires much more thought.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;That's one of the parts I've enjoyed most about working on this project.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What I want to improve&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;There are still plenty of things I want to explore.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Some of the areas I'm interested in are:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Better crawl reports&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;More SEO checks&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Better structured-data validation&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Improved performance reporting&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;More useful error classification&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Smarter crawling&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;CI/CD integration&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Machine-readable output for automation&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Better support for JavaScript-heavy websites&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The last point is particularly interesting.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Traditional crawling and modern frontend applications don't always see the web in the same way.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;A page that depends heavily on client-side rendering can behave very differently depending on how it is accessed.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;That's something I want to explore further.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What I learned&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The biggest lesson so far isn't about crawling.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;It's about building developer tools.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;A tool can technically detect hundreds of problems and still be frustrating to use.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The hard part is turning raw technical information into something that answers:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What is wrong?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Where is it wrong?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Why does it matter?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What should I check next?&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;That's the direction I want to keep pushing sitebot toward.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Not just more checks.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Better diagnostics.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Try it&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The project is open source and still under active development.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;If you're interested in website crawling, SEO, frontend performance, or developer tooling, I'd genuinely appreciate feedback.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;GitHub: &amp;lt;a href="https://github.com/Abdelrahman5243/sitebot-cli"&amp;gt;https://github.com/Abdelrahman5243/sitebot-cli&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;If you build websites yourself, I'm especially interested in one question:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What is something you regularly check manually that you wish you could just run from the terminal?&amp;lt;/p&amp;gt;


</description>
      <category>seo</category>
      <category>typescript</category>
      <category>npm</category>
      <category>node</category>
    </item>
  </channel>
</rss>
