<?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: Zeljko Vranjes</title>
    <description>The latest articles on DEV Community by Zeljko Vranjes (@zeljkovranjes).</description>
    <link>https://dev.to/zeljkovranjes</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%2F3879510%2F139fdfbd-ff97-4251-bd74-5c96f8f49c16.png</url>
      <title>DEV Community: Zeljko Vranjes</title>
      <link>https://dev.to/zeljkovranjes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zeljkovranjes"/>
    <language>en</language>
    <item>
      <title>Why I built my true-crime database entirely on Cloudflare</title>
      <dc:creator>Zeljko Vranjes</dc:creator>
      <pubDate>Wed, 15 Apr 2026 03:03:11 +0000</pubDate>
      <link>https://dev.to/zeljkovranjes/why-i-built-my-true-crime-database-entirely-on-cloudflare-333e</link>
      <guid>https://dev.to/zeljkovranjes/why-i-built-my-true-crime-database-entirely-on-cloudflare-333e</guid>
      <description>&lt;p&gt;I built &lt;a href="https://bleedingmap.com" rel="noopener noreferrer"&gt;BleedingMap&lt;/a&gt;, a public true-crime research database, with one rule: no servers. Everything runs on Cloudflare.&lt;/p&gt;

&lt;p&gt;Here's why, and what it looks like in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Cloudflare
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's close to the user by default.&lt;/strong&gt; Someone in Berlin hits a server in Frankfurt. Someone in Tokyo hits a server in Tokyo. I didn't configure any of that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I only pay for the work I do.&lt;/strong&gt; My ingest pipeline sits around waiting on AI calls for a minute at a time. On most platforms I'd pay for that whole minute. On Cloudflare I pay for the few milliseconds of actual computing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything is one system.&lt;/strong&gt; The database, the file storage, the sessions, the background jobs, the AI routing - all plug into the same worker the same way. No glue, no extra auth between pieces.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'm running
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One Rust app compiled down to a tiny binary. That single thing handles every page and every API call.&lt;/li&gt;
&lt;li&gt;Four separate databases split by what they do: users and tokens, the main killer data, article text, and logs.&lt;/li&gt;
&lt;li&gt;A file bucket for mugshots and photos.&lt;/li&gt;
&lt;li&gt;A key-value store for login sessions.&lt;/li&gt;
&lt;li&gt;A background workflow that handles the AI ingest pipeline step by step.&lt;/li&gt;
&lt;li&gt;An AI gateway that lets me swap Claude Sonnet for Claude Haiku on individual steps without redeploying anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The downsides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The databases don't talk to each other cleanly.&lt;/strong&gt; If I need to change two databases at once and one fails, I have to handle that mess myself. No automatic rollback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's not Node.&lt;/strong&gt; A lot of popular libraries just don't run here. The ecosystem is smaller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging is bring-your-own.&lt;/strong&gt; Good tools exist for watching it live, but if I want real dashboards I build them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries cost me real money.&lt;/strong&gt; If the AI step fails, the workflow quietly retries it, and every retry is another full AI bill. One stubborn article can cost me 80 cents to ingest before it finally works. That one hurts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Would I do it again
&lt;/h2&gt;

&lt;p&gt;For this kind of site - mostly reading, some AI, one person running it - yeah. No regrets.&lt;/p&gt;

&lt;p&gt;For something more traditional, like a store or a booking app, I'd probably pick something else.&lt;/p&gt;

&lt;p&gt;The tools should fit the job. This one fits.&lt;/p&gt;

&lt;p&gt;BleedingMap is live at &lt;a href="https://bleedingmap.com" rel="noopener noreferrer"&gt;bleedingmap.com&lt;/a&gt;.&lt;/p&gt;

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