<?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: PlainTOS App</title>
    <description>The latest articles on Forem by PlainTOS App (@plaintos_app_fd54e75a054e).</description>
    <link>https://forem.com/plaintos_app_fd54e75a054e</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%2F3925337%2Fa4ccb31c-5435-4ad2-a924-f97527d181a5.png</url>
      <title>Forem: PlainTOS App</title>
      <link>https://forem.com/plaintos_app_fd54e75a054e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/plaintos_app_fd54e75a054e"/>
    <language>en</language>
    <item>
      <title>Why your Vercel bill is higher than expected (hint: AI bots)</title>
      <dc:creator>PlainTOS App</dc:creator>
      <pubDate>Tue, 12 May 2026 18:45:24 +0000</pubDate>
      <link>https://forem.com/plaintos_app_fd54e75a054e/why-your-vercel-bill-is-higher-than-expected-hint-ai-bots-40b4</link>
      <guid>https://forem.com/plaintos_app_fd54e75a054e/why-your-vercel-bill-is-higher-than-expected-hint-ai-bots-40b4</guid>
      <description>&lt;p&gt;I run a small side project on Vercel. Last month &lt;br&gt;
my bandwidth bill was 3x higher than usual. No &lt;br&gt;
viral traffic, no new features. Just bots.&lt;/p&gt;

&lt;p&gt;Here is what I found and how to fix it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The "Hidden" Bandwidth Tax
&lt;/h2&gt;

&lt;p&gt;In 2026, the internet is no longer just for humans. &lt;br&gt;
AI crawlers — GPTBot, ClaudeBot, Bytespider, and &lt;br&gt;
PerplexityBot — are aggressively indexing the web &lt;br&gt;
to train new models and power real-time search &lt;br&gt;
engines.&lt;/p&gt;

&lt;p&gt;While traditional search engines like Google are &lt;br&gt;
relatively polite, AI bots are often greedy. They &lt;br&gt;
don't just index your home page — they hit your &lt;br&gt;
dynamic routes, parse your JSON, and re-crawl your &lt;br&gt;
assets multiple times a day.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this kills you on Vercel
&lt;/h2&gt;

&lt;p&gt;Vercel is incredible for performance, but bandwidth &lt;br&gt;
egress (the data sent from your server to the &lt;br&gt;
visitor) is where costs scale.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A polite bot: Hits your page once a week = negligible cost&lt;/li&gt;
&lt;li&gt;An AI swarm: Hits your high-data routes 20 times an hour = a $50 bill by end of week&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How to see the "ghost" traffic
&lt;/h2&gt;

&lt;p&gt;Most developers just look at total request counts. &lt;br&gt;
You need to look at the User-Agent strings in your &lt;br&gt;
logs.&lt;/p&gt;

&lt;p&gt;If you see &lt;code&gt;Bytespider&lt;/code&gt; (the TikTok bot) or &lt;br&gt;
&lt;code&gt;GPTBot&lt;/code&gt; appearing thousands of times, you are &lt;br&gt;
effectively paying Vercel to serve data that trains &lt;br&gt;
someone else's AI model.&lt;/p&gt;

&lt;p&gt;Export your Vercel logs from your dashboard &lt;br&gt;
(Project → Logs → Export) and open them in a text &lt;br&gt;
editor. Search for these strings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GPTBot&lt;/code&gt; — OpenAI training crawler&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ClaudeBot&lt;/code&gt; — Anthropic training crawler&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Bytespider&lt;/code&gt; — ByteDance, known to ignore robots.txt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CCBot&lt;/code&gt; — Common Crawl, used by many AI companies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PerplexityBot&lt;/code&gt; — Perplexity search crawler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you see any of these hitting hundreds or &lt;br&gt;
thousands of times, that is your bill spike.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to stop the leak
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Option 1 — robots.txt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first line of defense. Add this to your &lt;br&gt;
&lt;code&gt;public/robots.txt&lt;/code&gt;:&lt;br&gt;
User-agent: GPTBot&lt;br&gt;
Disallow: /&lt;br&gt;
User-agent: ClaudeBot&lt;br&gt;
Disallow: /&lt;br&gt;
User-agent: Bytespider&lt;br&gt;
Disallow: /&lt;br&gt;
User-agent: CCBot&lt;br&gt;
Disallow: /&lt;/p&gt;

&lt;p&gt;Warning: Many aggressive AI bots in 2026 ignore &lt;br&gt;
robots.txt entirely. Bytespider is a known offender.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2 — Next.js middleware&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add this to &lt;code&gt;middleware.ts&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BLOCKED_BOTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GPTBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ClaudeBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bytespider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CCBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PerplexityBot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ua&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;BLOCKED_BOTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="nx"&gt;ua&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Forbidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/((?!_next/static|_next/image|favicon.ico).*)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This blocks known AI bots at the edge before they &lt;br&gt;
consume your bandwidth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3 — Cloudflare WAF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use Cloudflare in front of Vercel, create a &lt;br&gt;
custom WAF rule:&lt;br&gt;
(http.user_agent contains "GPTBot") or&lt;br&gt;
(http.user_agent contains "ClaudeBot") or&lt;br&gt;
(http.user_agent contains "Bytespider") or&lt;br&gt;
(http.user_agent contains "CCBot")&lt;/p&gt;

&lt;p&gt;Set action to Block. This is the most reliable &lt;br&gt;
method since it stops bots before they even reach &lt;br&gt;
Vercel.&lt;/p&gt;

&lt;h2&gt;
  
  
  The faster way
&lt;/h2&gt;

&lt;p&gt;Manually hunting through log files is tedious. &lt;br&gt;
I built a free browser-based tool that does it &lt;br&gt;
automatically.&lt;/p&gt;

&lt;p&gt;Drop your Vercel log export into botcost.dev and &lt;br&gt;
it shows you exactly which bots are hitting you, &lt;br&gt;
how much bandwidth each one consumed, and generates &lt;br&gt;
the exact WAF rule or middleware code to block them.&lt;/p&gt;

&lt;p&gt;Everything runs locally in your browser. Your log &lt;br&gt;
file never leaves your device. Free, no account &lt;br&gt;
required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://botcost.dev" rel="noopener noreferrer"&gt;botcost.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you seen unusual bot traffic in your Vercel &lt;br&gt;
logs? Drop the bot names in the comments — curious &lt;br&gt;
what people are seeing in the wild.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
    <item>
      <title>I built a free tool that shows what AI bots are really costing your server</title>
      <dc:creator>PlainTOS App</dc:creator>
      <pubDate>Mon, 11 May 2026 15:51:19 +0000</pubDate>
      <link>https://forem.com/plaintos_app_fd54e75a054e/i-built-a-free-tool-that-shows-what-ai-bots-are-really-costing-your-server-3546</link>
      <guid>https://forem.com/plaintos_app_fd54e75a054e/i-built-a-free-tool-that-shows-what-ai-bots-are-really-costing-your-server-3546</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you run a website, AI crawlers are hitting it &lt;br&gt;
constantly. GPTBot, ClaudeBot, Bytespider, CCBot — &lt;br&gt;
they scrape your content 24/7 for training data and &lt;br&gt;
search indexing. You pay the bandwidth bill. They &lt;br&gt;
get your content for free.&lt;/p&gt;

&lt;p&gt;The frustrating part is most developers have no idea &lt;br&gt;
how much of their server bill is pure bot waste until &lt;br&gt;
they actually look at their logs.&lt;/p&gt;

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

&lt;p&gt;BotCost.dev is a free browser-based log analyzer. &lt;br&gt;
You drag and drop your server log file and it shows &lt;br&gt;
you exactly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which AI bots are hitting your site&lt;/li&gt;
&lt;li&gt;How many requests each one made&lt;/li&gt;
&lt;li&gt;How much bandwidth each one consumed&lt;/li&gt;
&lt;li&gt;Estimated monthly cost in dollars&lt;/li&gt;
&lt;li&gt;A ready-to-paste Cloudflare WAF rule or Nginx 
config to block them&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The privacy part
&lt;/h2&gt;

&lt;p&gt;Everything runs in your browser. Your log file never &lt;br&gt;
leaves your device. We have no server that receives &lt;br&gt;
it. You can verify this yourself by opening your &lt;br&gt;
browser Network tab while running an analysis — you &lt;br&gt;
will see zero upload requests.&lt;/p&gt;

&lt;p&gt;Supports Nginx, Apache, Cloudflare CSV export, and &lt;br&gt;
Vercel JSON logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;botcost.dev — free, no account required.&lt;/p&gt;

&lt;p&gt;Would love feedback from anyone who tries it on real &lt;br&gt;
logs. Curious what bot percentages people are seeing &lt;br&gt;
in the wild.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>security</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
