Why You Should Just Use Cloudflare: Moving My Portfolio from Vercel
Exploring the philosophy behind 'Just Fucking Use Cloudflare', the pitfalls of platform vendor lock-in, and a technical guide on moving a Next.js 15 app to Cloudflare Workers.

In the modern web development landscape, we are spoiled for choice. We have Vercel, Netlify, AWS, GCP, and a dozen other "Serverless" platforms promising us the world. But as 2026 unfolds, a growing sentiment is taking over the indie maker and developer community: just fucking use Cloudflare.
This isn't just a meme from justfuckingusecloudflare.com; it's a rational response to the increasing complexity and "hidden taxes" of premium hosting platforms.
Today, I want to talk about why I moved this very portfolio from Vercel to Cloudflare, the technical hurdles I faced, and why you should probably consider doing the same. This migration represents more than just a technical decision—it's part of my journey toward building things intentionally and sustainably, something I've been reflecting on recently.
The Vercel Paradox
Let's get one thing straight: Vercel is incredible. Their developer experience (DX) is the gold standard. You push to Git, and seconds later, your site is live with a global CDN, preview deployments, and seamless integration for Next.js.
However, Vercel is a business that sells convenience. And convenience has a price tag—one that grows exponentially as your traffic increases.
The Cost Combat: Vercel vs. Cloudflare
To understand why developers are moving, we need to look at the numbers. As of early 2026, the gap between "Convenience" and "Scale" has never been wider.
| Feature | Vercel (Pro) | Cloudflare (Paid) |
|---|---|---|
| Base Price | $20/month | $5/month (Workers Paid) |
| Bandwidth (Fast Data Transfer) | 100GB included, then charged | $0 (No egress fees) |
| Function Execution | Active CPU time-based | $0.30/million requests + $0.02/million CPU-ms |
| Storage (Object) | 1GB included Blob | $0.015/GB-month (R2) |
| Compute Limits | Varies by tier | Up to 5 min CPU per invocation (default: 30s) |
The Bandwidth Trap
The most significant difference is Bandwidth. Vercel's Pro plan includes 100GB of "Fast Data Transfer" per month, after which additional usage incurs charges. If you have a media-heavy site or a popular application with significant traffic, costs can scale quickly.
Cloudflare, owning a significant portion of the internet's infrastructure, doesn't charge for egress bandwidth. When you use Cloudflare R2 (object storage) instead of Vercel Blob, you're not just saving on storage costs ($0.015/GB-month vs Vercel's Blob pricing); you're eliminating the egress fees entirely—a massive advantage for data-intensive applications.
Compute: Active CPU Time vs. Wall-Clock Time
Vercel's new "Fluid Compute" pricing is based on Active CPU time—you only pay when your code is actually executing, not when waiting for I/O operations. Cloudflare Workers charge per request ($0.30 per million) plus CPU time ($0.02 per million CPU milliseconds). The key difference: Cloudflare's model is more predictable for high-traffic, low-compute applications, while Vercel's Active CPU pricing benefits I/O-heavy workloads. For typical web apps with moderate compute, Cloudflare's pricing structure often results in lower costs at scale.
The Free Tier Battle: Where Cloudflare Shines
If you're starting out or running a side project, the free tier comparison is even more striking. Here's what you get:
| Feature | Vercel (Hobby) | Cloudflare (Free) |
|---|---|---|
| Base Cost | $0 | $0 |
| Request Limit | 100K/day (functions) | 100K/day (Workers) |
| Bandwidth | 100GB/month | Unlimited (no egress charges) |
| Compute CPU Time | 4 hours Active CPU/month | 10ms per invocation (generous for most apps) |
| Storage | 1GB Blob | 1GB KV + 5GB D1 SQL Database |
| Database | 512 MB Postgres | 5M reads + 100K writes per day (D1) |
| Image Optimization | 5,000 transforms/month | Not included (use R2 + custom) |
The real game-changer here is bandwidth and database access. On Vercel's free tier, you get 100GB of bandwidth per month—which sounds like a lot until your blog post goes viral or you're serving images. On Cloudflare, bandwidth is unlimited and free, always.
Even more impressive: Cloudflare's free tier includes D1, a full SQL database with 5 million row reads per day. That's enough to run a real application, not just a static site. While Vercel's Hobby plan includes 512 MB of Postgres storage, Cloudflare's D1 offers significantly higher limits and better scalability for growing applications.
For indie makers and developers building in public, Cloudflare's free tier isn't just "good enough"—it's production-ready for many use cases. You can build and deploy a full-stack application with a database, handle significant traffic, and never worry about bandwidth costs eating into your (non-existent) budget.
1. The "Vercel Tax"
If you've ever looked at Vercel's bandwidth pricing or their Pro plan limitations, you know it can get expensive fast. While the free tier is generous for a personal blog, the jump to "Pro" and "Enterprise" is where they make their money. Bandwidth on Vercel is significantly more expensive than raw bandwidth on a provider like Cloudflare.
2. The Vendor Lock-in
Because Vercel is the creator of Next.js, the framework is optimized for their platform. Features like Middleware, ISR (Incremental Static Regeneration), and Server Actions are "baked in" to work perfectly on Vercel. But when you try to host Next.js elsewhere, you often realize just how much heavy lifting Vercel was doing behind the scenes.
This creates a subtle but powerful lock-in. You start using Vercel Analytics, Vercel Speed Insights, and Vercel Blob because "it just works." Before you know it, moving your site anywhere else feels like a monumental task.
Why Cloudflare?
Cloudflare isn't just a CDN anymore. With Cloudflare Workers, R2 (Object Storage), D1 (SQL Database), and KV (Key-Value storage), it has become a full-fledged cloud provider that operates directly on the edge.
The beauty of Cloudflare is its pricing and scale. Workers don't run in a single data center; they run in hundreds of locations simultaneously. Your code is executed as close to the user as physically possible.
And most importantly: Cloudflare doesn't charge for egress bandwidth. This alone can save you thousands of dollars if you host a lot of images or large assets.
The Technical Leap: Moving Next.js 15 to Cloudflare
For a long time, running Next.js on Cloudflare Workers was a nightmare. The environments were too different. But thanks to the OpenNext project and the official @opennextjs/cloudflare adapter, it's now viable even for Next.js 15.
Here is how I moved this portfolio.
1. The Configuration
I used OpenNext to bridge the gap between Next.js and the Cloudflare Workers runtime. First, I needed an open-next.config.ts:
import { defineCloudflareConfig } from "@opennextjs/cloudflare";
export default defineCloudflareConfig();
Simple enough. The magic happens during the build process where OpenNext transforms the Next.js output into a Worker-compatible format.
2. The Wrangler Setup
Cloudflare uses wrangler.toml for configuration. Here's a simplified version of what this portfolio uses:
main = ".open-next/worker.js"
name = "portfolio"
compatibility_date = "2026-01-02"
compatibility_flags = ["nodejs_compat"]
[build]
command = "node scripts/generate-blog-data.js && bun run cf-build"
[assets]
directory = ".open-next/assets"
binding = "ASSETS"
The nodejs_compat flag is crucial here. It allows the Worker to use Node.js APIs that many Next.js libraries depend on.
Important Note: The build command runs the blog data generation script followed by opennextjs-cloudflare build. Since opennextjs-cloudflare build internally handles the Next.js build process, there's no need to run next build separately—doing so would result in building twice unnecessarily.
3. The Build Chain
In my package.json, I updated the scripts to handle the dual-build process:
{
"scripts": {
"build": "node scripts/generate-blog-data.js && next build",
"cf-build": "opennextjs-cloudflare build",
"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy"
}
}
Now, when I deploy, it generates the blog metadata, builds the Next.js app, and then "wraps" it for Cloudflare using OpenNext.
Challenges Faced
It wasn't all sunshine and rainbows. Moving away from Vercel meant I had to manually handle things Vercel does automatically:
- Image Optimization: While the
next/imagecomponent works on Cloudflare via OpenNext, it requires configuration. Vercel provides automatic image optimization with their managed service. On Cloudflare, you have options: use the built-in WASM-based image optimizer in OpenNext, or integrate Cloudflare Images for production-grade optimization with transformations on-the-fly. The latter provides better performance and more features, but requires setup and potentially additional cost. - Node.js Compatibility: While Cloudflare Workers now supports Node.js APIs with the
nodejs_compatflag, some packages that rely on native modules or specific Node.js internals may still require workarounds. Most modern packages work fine, but it's something to test during migration. - Caching Strategy: You need to be explicit about your caching strategy with Cache-Control headers. Cloudflare's CDN is powerful, but unlike Vercel's automatic optimizations, you need to configure it properly to get the best performance.
Conclusion
Vercel is a fantastic platform for startups that need to move fast and don't care about the bill yet. But for those of us who want to build sustainable, high-performance, and cost-effective applications, the "Just Fucking Use Cloudflare" philosophy is hard to beat.
By moving to Cloudflare Workers, I've secured a globally distributed, incredibly fast, and practically free (for my current scale) hosting environment. This aligns perfectly with my philosophy of building sustainable, profitable SaaS products that can scale without exponential cost increases. I still love Vercel for quick prototypes, but for anything I intend to keep running—whether it's this portfolio or the course platform I'm planning to build—my home is now at the edge.
What do you think? Are you ready to leave the comfort of the "Vercel Cocoon" and embrace the raw power of the edge?
If you have questions about the migration or want to share your experience, feel free to reach out via my Contact Page.
