<?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: HowardZlh</title>
    <description>The latest articles on DEV Community by HowardZlh (@howardzlh).</description>
    <link>https://dev.to/howardzlh</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%2F4120707%2F25399bb1-b643-4752-b1d1-051e41453cc7.png</url>
      <title>DEV Community: HowardZlh</title>
      <link>https://dev.to/howardzlh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/howardzlh"/>
    <language>en</language>
    <item>
      <title>Why Cloudflare bills spike: 8 D1 and Durable Objects cases from 2026</title>
      <dc:creator>HowardZlh</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:24:44 +0000</pubDate>
      <link>https://dev.to/howardzlh/why-cloudflare-bills-spike-8-d1-and-durable-objects-cases-from-2026-288a</link>
      <guid>https://dev.to/howardzlh/why-cloudflare-bills-spike-8-d1-and-durable-objects-cases-from-2026-288a</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://guushu.com/notes/cloudflare-bill-incidents-2026/?utm_source=devto&amp;amp;utm_medium=canonical&amp;amp;utm_campaign=notes-cloudflare-bill-incidents-2026" rel="noopener noreferrer"&gt;guushu.com/notes&lt;/a&gt;. I keep the original updated, so this copy may lag.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eight public Cloudflare bill spikes turned up in 2026 threads on Cloudflare Community and Hacker News. Seven are D1 rows read. One is a Durable Objects alarm loop.&lt;/p&gt;

&lt;p&gt;Every fix was one index or one guard on a reschedule. The fix was never the hard part. Nobody saw the meter move for days.&lt;/p&gt;

&lt;p&gt;What goes in the table: thread title, date, product, amount. No usernames, no quotes, no links to the threads. Amounts are what the poster said, rounded. Where they didn't say, the table says so.&lt;/p&gt;

&lt;p&gt;Last checked 2026-09-15. I add rows when I find them and bump the updated date at the top.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 8 incidents, by product and amount
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;th&gt;What moved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;04-16&lt;/td&gt;
&lt;td&gt;HN&lt;/td&gt;
&lt;td&gt;Durable Objects&lt;/td&gt;
&lt;td&gt;about $34,895 over 8 days&lt;/td&gt;
&lt;td&gt;Alarm re-scheduled itself in a loop; zero users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;06-29&lt;/td&gt;
&lt;td&gt;CF Community&lt;/td&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;about $800&lt;/td&gt;
&lt;td&gt;Sitemap of 380,000 pages crawled; every page a full-table read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08-03&lt;/td&gt;
&lt;td&gt;CF Community&lt;/td&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;about $176&lt;/td&gt;
&lt;td&gt;Rows read overage on a small site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08-10&lt;/td&gt;
&lt;td&gt;CF Community&lt;/td&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;about $4,115&lt;/td&gt;
&lt;td&gt;$5 subscription; D1 rows read ran for a month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08-25&lt;/td&gt;
&lt;td&gt;CF Community&lt;/td&gt;
&lt;td&gt;Workers / D1&lt;/td&gt;
&lt;td&gt;not stated&lt;/td&gt;
&lt;td&gt;"Accidentally incurred a large billable usage"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;09-01&lt;/td&gt;
&lt;td&gt;CF Community&lt;/td&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;invoice about $1,481, credit asked about $976&lt;/td&gt;
&lt;td&gt;1.476 trillion rows read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;09-03&lt;/td&gt;
&lt;td&gt;CF Community&lt;/td&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;not stated&lt;/td&gt;
&lt;td&gt;Overage after a data migration; backfill loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;09-11&lt;/td&gt;
&lt;td&gt;CF Community&lt;/td&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;quota hit, no invoice yet&lt;/td&gt;
&lt;td&gt;Rows read shown as 235k in one view and 11.5M in another&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seven D1, one Durable Object. The smallest stated amount is $176. The largest is $34,895.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.cloudflare.com/d1/platform/pricing/" rel="noopener noreferrer"&gt;D1 pricing&lt;/a&gt; is $0.001 per million rows read. So the 09-01 invoice is just what 1.476 trillion rows cost per million rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does D1 bill rows read instead of requests?
&lt;/h2&gt;

&lt;p&gt;D1 meters rows scanned, not queries. A &lt;code&gt;SELECT ... WHERE slug = ?&lt;/code&gt; on a table with no index on &lt;code&gt;slug&lt;/code&gt; scans the whole table on every request. Take 10,000 rows and 100 requests a minute. After one day, that's 1.4 billion rows for one small site, and the query count never moved.&lt;/p&gt;

&lt;p&gt;Every D1 row in the table is that meter. The 09-03 migration is the same thing in a different shape: a backfill ran &lt;code&gt;SELECT&lt;/code&gt; inside a loop over a table that had just grown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Durable Objects alarm loops that never sleep
&lt;/h2&gt;

&lt;p&gt;The Durable Objects case is an alarm handler that sets the next alarm at the end of every run. Failed runs too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.cloudflare.com/durable-objects/platform/pricing/" rel="noopener noreferrer"&gt;Durable Objects requests&lt;/a&gt; are metered per million on Workers Paid. A loop with no sleep and nobody watching runs until the invoice shows up. Eight days, about $34,895, zero users.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 10,000x jump that nobody saw for days
&lt;/h2&gt;

&lt;p&gt;None of these are Cloudflare being expensive. In every thread the metric jumped 10,000x or more, and the first sign was the invoice or a quota email.&lt;/p&gt;

&lt;p&gt;Cloudflare's &lt;a href="https://developers.cloudflare.com/billing/manage/budget-alerts/" rel="noopener noreferrer"&gt;Budget alerts&lt;/a&gt; arrived in 2026-04 and have been on by default for pay-as-you-go accounts since 2026-07. They send one email at the threshold. The docs call them informational only. They don't pause or cap anything, so someone still has to log in and act.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to see D1 rows read and DO requests before the invoice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard: Workers &amp;amp; Pages → D1 → your database → Metrics. "Rows read" is per database, per day. You're looking for a flat line that suddenly isn't.&lt;/li&gt;
&lt;li&gt;GraphQL Analytics: dataset &lt;code&gt;d1AnalyticsAdaptiveGroups&lt;/code&gt;, dimension &lt;code&gt;databaseId&lt;/code&gt;, sum of &lt;code&gt;readQueries&lt;/code&gt; and &lt;code&gt;rowsRead&lt;/code&gt; over a date range. Same numbers as the dashboard, but you can script it.&lt;/li&gt;
&lt;li&gt;Durable Objects: Workers &amp;amp; Pages → Durable Objects → Metrics. Requests and alarm invocations per namespace. One namespace climbing on an otherwise flat account is the loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The total doesn't tell you much. The check worth automating is whether today is more than 10x the last seven days.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I now guard my own D1 and Durable Objects usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every D1 table I query by a non-primary-key column gets an index on that column. New queries go through &lt;code&gt;EXPLAIN QUERY PLAN&lt;/code&gt; first, and anything that says &lt;code&gt;SCAN&lt;/code&gt; gets an index or a rewrite. My own D1 is about 15,000 rows, so this is prevention, not a war story. The smallest example is the &lt;code&gt;received_at&lt;/code&gt; index in my &lt;a href="https://guushu.com/notes/cloudflare-email-worker-inbox-d1/?utm_source=devto&amp;amp;utm_medium=canonical&amp;amp;utm_campaign=notes-cloudflare-bill-incidents-2026" rel="noopener noreferrer"&gt;Cloudflare Email Worker inbox&lt;/a&gt;, 30 lines that store mail in D1.&lt;/li&gt;
&lt;li&gt;I don't run Durable Objects yet. When I do, the re-schedule goes in the success path only, with a retry counter on the object.&lt;/li&gt;
&lt;li&gt;Since 2026-09-15 the "10x the last seven days" check has run on my own account as a small read-only Worker, &lt;a href="https://github.com/HowardZlh/usage-guard-collector" rel="noopener noreferrer"&gt;usage-guard-collector&lt;/a&gt; (MIT). Every 6 hours it reads the GraphQL Analytics API into a D1 table and flags any meter that's 10x its 7-day median. The hosted version linked below is still a waitlist page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What this page can't tell you: eight rows isn't a dataset, the amounts are self-reported, and I only read English-language threads. If you know a public thread that belongs here, the address in the footer works.&lt;/p&gt;

&lt;p&gt;I'm building a small watcher for exactly this gap. If a bill has surprised you, the one-question form is at &lt;a href="https://guard.guushu.com/?utm_source=devto&amp;amp;utm_medium=canonical&amp;amp;utm_campaign=notes-cloudflare-bill-incidents-2026" rel="noopener noreferrer"&gt;guard.guushu.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Original, with any later corrections: &lt;a href="https://guushu.com/notes/cloudflare-bill-incidents-2026/?utm_source=devto&amp;amp;utm_medium=canonical&amp;amp;utm_campaign=notes-cloudflare-bill-incidents-2026" rel="noopener noreferrer"&gt;guushu.com/notes/cloudflare-bill-incidents-2026/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloudflarechallenge</category>
      <category>serverless</category>
      <category>database</category>
      <category>devops</category>
    </item>
    <item>
      <title>AI is good! Me, using AI, am good! others, no!!!😅</title>
      <dc:creator>HowardZlh</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:22:02 +0000</pubDate>
      <link>https://dev.to/howardzlh/ai-is-good-me-using-ai-good-others-no-2c2d</link>
      <guid>https://dev.to/howardzlh/ai-is-good-me-using-ai-good-others-no-2c2d</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/infoinlet1/i-interviewed-the-people-who-rejected-me-heres-what-their-hiring-process-is-actually-optimizing-i9f" class="crayons-story__hidden-navigation-link"&gt;I interviewed the people who rejected me. Here's what their hiring process is actually optimizing for.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/infoinlet1" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3941862%2Fcec34100-b85a-4c9e-8061-55c585109946.jpeg" alt="infoinlet1 profile" class="crayons-avatar__image" width="447" height="447"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/infoinlet1" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Info Inlet
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Info Inlet
                
                
              
              &lt;div id="story-author-preview-content-4712097" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/infoinlet1" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3941862%2Fcec34100-b85a-4c9e-8061-55c585109946.jpeg" class="crayons-avatar__image" alt="" width="447" height="447"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Info Inlet&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/infoinlet1/i-interviewed-the-people-who-rejected-me-heres-what-their-hiring-process-is-actually-optimizing-i9f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 22&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/infoinlet1/i-interviewed-the-people-who-rejected-me-heres-what-their-hiring-process-is-actually-optimizing-i9f" id="article-link-4712097"&gt;
          I interviewed the people who rejected me. Here's what their hiring process is actually optimizing for.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hiring"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hiring&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/infoinlet1/i-interviewed-the-people-who-rejected-me-heres-what-their-hiring-process-is-actually-optimizing-i9f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;14&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/infoinlet1/i-interviewed-the-people-who-rejected-me-heres-what-their-hiring-process-is-actually-optimizing-i9f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
