<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Admir Šaheta</title>
    <description>The latest articles on Forem by Admir Šaheta (@admirsaheta).</description>
    <link>https://forem.com/admirsaheta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F930511%2F2b094bd0-e177-4c8e-8edc-6755da15a7af.jpeg</url>
      <title>Forem: Admir Šaheta</title>
      <link>https://forem.com/admirsaheta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/admirsaheta"/>
    <language>en</language>
    <item>
      <title>How I Built FlyScrape: A TypeScript Web Scraper That Actually Works on Modern Websites</title>
      <dc:creator>Admir Šaheta</dc:creator>
      <pubDate>Sun, 30 Nov 2025 09:16:57 +0000</pubDate>
      <link>https://forem.com/admirsaheta/how-i-built-flyscrape-a-typescript-web-scraper-that-actually-works-on-modern-websites-4d9g</link>
      <guid>https://forem.com/admirsaheta/how-i-built-flyscrape-a-typescript-web-scraper-that-actually-works-on-modern-websites-4d9g</guid>
      <description>&lt;p&gt;If you’ve ever tried scraping modern websites, you know the pain. SPAs that never fully load, lazy images hiding content, bot protections blocking your every request… I was losing hours, sometimes days, just trying to get usable data.&lt;/p&gt;

&lt;p&gt;One late night, fueled by coffee and frustration, I thought: &lt;strong&gt;There has to be a better way.&lt;/strong&gt; That’s how &lt;strong&gt;FlyScrape&lt;/strong&gt; was born — a &lt;strong&gt;TypeScript Node.js package&lt;/strong&gt; that makes scraping &lt;strong&gt;fast, reliable, and developer-friendly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Developer Nightmare&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple failed scrapers on SPAs
&lt;/li&gt;
&lt;li&gt;Infinite scroll pages that never end
&lt;/li&gt;
&lt;li&gt;Bot protections killing my requests
&lt;/li&gt;
&lt;li&gt;Messy, unstructured HTML that no AI model could digest
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sound familiar? I knew there had to be a smarter approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter FlyScrape&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FlyScrape is &lt;strong&gt;modular, typed, and production-ready&lt;/strong&gt;. It combines Playwright, stealth techniques, and AI-powered content cleaning to deliver &lt;strong&gt;structured, LLM-ready Markdown&lt;/strong&gt; from any web page.  &lt;/p&gt;

&lt;p&gt;I can now scrape &lt;strong&gt;dynamic content, handle infinite scrolls, and avoid bot detection&lt;/strong&gt; — all with minimal code and zero frustration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I Built It This Way&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript-first&lt;/strong&gt;: Strong types and autocomplete mean fewer bugs and faster development
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI integration&lt;/strong&gt;: Converts messy HTML to clean Markdown for RAG pipelines or content aggregation
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensible hooks&lt;/strong&gt;: Customize every stage of the crawl
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance-minded&lt;/strong&gt;: Caching, lazy load handling, and resource blocking keep things fast
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How It Changed My Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before FlyScrape, I’d spend hours debugging failed crawls. Now I can:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spin up a crawler in minutes
&lt;/li&gt;
&lt;li&gt;Extract content-ready Markdown in seconds
&lt;/li&gt;
&lt;li&gt;Integrate with AI pipelines effortlessly
&lt;/li&gt;
&lt;li&gt;Spend my time analyzing data, not wrestling websites
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’re a &lt;strong&gt;developer tired of fighting modern websites&lt;/strong&gt;, FlyScrape is here to save your sanity. Clean, modular, TypeScript-first, and AI-ready — built by a developer who’s been there.  &lt;/p&gt;

&lt;p&gt;Check it out on GitHub: &lt;strong&gt;FlyScrape&lt;/strong&gt; ( &lt;a href="https://github.com/flyrank-bih/flyscrape" rel="noopener noreferrer"&gt;https://github.com/flyrank-bih/flyscrape&lt;/a&gt; )￼ and star it ⭐ if you find it useful.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Sheetster - Custom Sheets</title>
      <dc:creator>Admir Šaheta</dc:creator>
      <pubDate>Thu, 22 Sep 2022 07:15:49 +0000</pubDate>
      <link>https://forem.com/admirsaheta/sheetster-custom-sheets-cjc</link>
      <guid>https://forem.com/admirsaheta/sheetster-custom-sheets-cjc</guid>
      <description>&lt;p&gt;The other day on a Swift discord I see people having a discussion how hard it is to set custom detents for sheets right now. And it inspired me to write a library that let's you automate and set custom detents for sheets, wether it'd be a bottom sheet like the one the maps use, or you just have a designer who places 30% 40% 70% height sheets into the UI Design.&lt;br&gt;
If you find it useful, make sure to star it :)&lt;br&gt;
&lt;a href="https://github.com/admirsaheta/Sheetster"&gt;https://github.com/admirsaheta/Sheetster&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>github</category>
      <category>opensource</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
