<?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: Gabriel Bachmann</title>
    <description>The latest articles on DEV Community by Gabriel Bachmann (@gitgem).</description>
    <link>https://dev.to/gitgem</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%2F3968353%2Ff53bae7b-3627-4a53-b54e-62f21d312072.png</url>
      <title>DEV Community: Gabriel Bachmann</title>
      <link>https://dev.to/gitgem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gitgem"/>
    <language>en</language>
    <item>
      <title>I built a place to find open source that actually deserves attention</title>
      <dc:creator>Gabriel Bachmann</dc:creator>
      <pubDate>Thu, 04 Jun 2026 13:31:13 +0000</pubDate>
      <link>https://dev.to/gitgem/i-built-a-place-to-find-open-source-that-actually-deserves-attention-54ja</link>
      <guid>https://dev.to/gitgem/i-built-a-place-to-find-open-source-that-actually-deserves-attention-54ja</guid>
      <description>&lt;p&gt;GitHub stars are a terrible way to &lt;em&gt;discover&lt;/em&gt; anything.&lt;/p&gt;

&lt;p&gt;By the time a repo has 20k stars, it's not a discovery, it's a press release. Stars pile onto whatever already trended, and the genuinely interesting stuff, the weird little library someone's polished for six months, sits at 40 stars because nobody's pointed a flashlight at it.&lt;/p&gt;

&lt;p&gt;I kept finding those projects accidentally and thinking there should be a better front door for them. So I built one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://gitgem.org" rel="noopener noreferrer"&gt;GitGem&lt;/a&gt;&lt;/strong&gt; surfaces open source that's gaining real momentum, not just stuff that's already huge. There's a trending feed you can filter by language and time, daily charts with rank movement, topic pages, and a curated layer for things that are great but will never trend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpedqvcafb5sal5pjr6bi.png" class="article-body-image-wrapper"&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.amazonaws.com%2Fuploads%2Farticles%2Fpedqvcafb5sal5pjr6bi.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk95c12u375l8b6t96718.png" class="article-body-image-wrapper"&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.amazonaws.com%2Fuploads%2Farticles%2Fk95c12u375l8b6t96718.png" alt=" " width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's in beta, so I'd genuinely love feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the feed surface stuff you find interesting, or the same repos you'd see everywhere?&lt;/li&gt;
&lt;li&gt;Anything slow, broken, or confusing?&lt;/li&gt;
&lt;li&gt;Could you generate a badge for your repo? &lt;a href="https://gitgem.org/badge" rel="noopener noreferrer"&gt;https://gitgem.org/badge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you maintain a repo you're proud of, you can add it to the showcase.. It's exactly the kind of project the site exists to put in front of people.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://gitgem.org" rel="noopener noreferrer"&gt;gitgem.org&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tear it apart in the comments. 🙏&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>github</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My cron job was silently failing on Cloudflare. The bug wasn't where I looked.</title>
      <dc:creator>Gabriel Bachmann</dc:creator>
      <pubDate>Thu, 04 Jun 2026 13:09:13 +0000</pubDate>
      <link>https://dev.to/gitgem/my-cron-job-was-silently-failing-on-cloudflare-the-bug-wasnt-where-i-looked-31ko</link>
      <guid>https://dev.to/gitgem/my-cron-job-was-silently-failing-on-cloudflare-the-bug-wasnt-where-i-looked-31ko</guid>
      <description>&lt;p&gt;The deploy was green. The build passed. And my data just... stopped updating. No crash. No red. No alert. Just a table that quietly stopped getting new rows, which is the worst kind of bug, because nothing tells you it's happening. You find out when you notice the numbers look stale and think "huh, that's weird," three days later.&lt;br&gt;
Here's the trap I fell into, and the debugging lesson I wish I'd had tattooed on my arm before I started.&lt;/p&gt;
&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I had a small cron Worker running on Cloudflare. Every few hours it pulled a list of items from an external API and upserted them into Postgres. Boring. Reliable. Ran fine for weeks.&lt;br&gt;
Then I shipped one new feature: for each item, fetch an extra bit of metadata from a second endpoint before saving. One more fetch() per item. Felt harmless.&lt;/p&gt;

&lt;p&gt;The next run, my upserts returned 0 rows. Every batch. Silently.&lt;/p&gt;
&lt;h2&gt;
  
  
  The actual error
&lt;/h2&gt;

&lt;p&gt;It took digging into the logs to find the real message, because the failure never bubbled up to anything I was watching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Too many subrequests by single Worker invocation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A subrequest is any outbound fetch() from your Worker.. every API call, every database round-trip, all of it. And on Cloudflare's free plan, you get 50 external subrequests per invocation. That's it. Cross the line and every subsequent fetch() throws, including the ones writing to your database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why my first fix was wrong (and it'll be yours too)
&lt;/h2&gt;

&lt;p&gt;Here's the part I'm a little embarrassed about.&lt;br&gt;
I already had batching logic. My upserts went out in groups of 25.. I'd written that ages ago, felt clever about it. So when I saw "too many subrequests," my brain went straight there: the batches are too big, lower the batch size.&lt;/p&gt;

&lt;p&gt;I spent a solid hour tuning batch sizes. 25 to 15. 15 to 10. Still failing.&lt;/p&gt;

&lt;p&gt;Because the batches were never the problem.&lt;/p&gt;

&lt;p&gt;The new metadata feature fired one fetch per item—100 items, 100 subrequests.. and it did all of them before a single upsert ran. I'd blown the entire 50-request budget during the enrichment loop. By the time the (carefully batched, very clever) database writes started, the Worker was already over its cap. Every write failed.&lt;/p&gt;

&lt;p&gt;I was optimizing the visible, satisfying-to-tune loop. The real cost was a quiet for loop in a different file that I'd added without thinking of it as "network" at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson that outlived the bug
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;When you hit a resource cap, count the resource. Not the thing that looks expensive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Subrequests" doesn't feel like a thing you count. It feels like infrastructure. But the limit is a literal integer, and the fix started the moment I stopped guessing and actually tallied every fetch() across the whole invocation-DB calls and the new loop.. Instead of staring at the one piece of code that looked heavy.&lt;/p&gt;

&lt;p&gt;The expensive looking code and the code that's actually blowing your budget are seldom the same code. The batching was a red herring precisely because it looked like the optimization-worthy part.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I actually fixed it
&lt;/h2&gt;

&lt;p&gt;A few options, depending on your situation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cut the subrequests. Did I need that metadata for every item on every run? No. I dropped the per-item enrichment way down and the budget problem evaporated.&lt;/li&gt;
&lt;li&gt;Move the heavy fetching off the Worker. A CI runner (GitHub Actions, etc.) has no subrequest cap. Enrichment that doesn't have to live in the request path doesn't need to be in the Worker.&lt;/li&gt;
&lt;li&gt;Pay. Cloudflare's paid plan ($5/mo) bumps the limit to 10,000 subrequests per invocation, and as of early 2026 you can configure it up to 10 million. For a lot of side projects that one line is the cheapest fix you'll ever buy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I went with the first option, because the honest answer was that I didn't need most of those calls in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Two things to steal from my afternoon:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Serverless platforms cap outbound requests, and the failure can be completely silent. If you're on Cloudflare Workers free tier, that number is 50 external subrequests per invocation. Know your platform's number before you add a loop of fetch() calls.&lt;/li&gt;
&lt;li&gt;When you're over a limit, don't optimize what looks expensive..  count the actual resource. The bug is usually hiding in the code you didn't think of as "that kind of code."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most dangerous loop in your project is the one you didn't notice you wrote.&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>webdev</category>
      <category>serverless</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
