2026-06-14 · Rick Rohrig
You Can Take It With You
The app you're using is built on Cloudflare. It doesn't have to be — I can run the exact same app on a plain server I rent for a few euros a month. Here's how I know that's true, and why I still happily pay Cloudflare to run the important stuff anyway.
#The worry I want to put to rest
If you're going to rely on an app I built, it's fair to ask an uncomfortable question: what happens if the company underneath it disappears, doubles its prices, or changes the rules?
My apps run on something called Cloudflare. If that name means nothing to you, good — you're exactly who I'm writing this for. The short version: Cloudflare is a company that runs your code on computers all over the world, so your app loads fast wherever someone opens it and stays up under attack or heavy traffic. They also hand you ready-made building blocks — a place to store data, a place to keep files, and so on — so I don't have to assemble all of that myself.
It's a genuinely great service. But here's the catch you might be sensing: none of those building blocks is something you can simply download and run on your own. They're Cloudflare's, they live on Cloudflare's machines, and you reach them through Cloudflare's account. So a reasonable person looks at that and thinks: if this app is built out of Cloudflare's private Lego bricks, isn't it trapped there forever? Aren't we both locked in?
That's the worry. The rest of this is me showing you, step by step, that the answer is no — and then being honest about why I still choose to stay.
#What I actually did
I took my apps — I'll just call them worker-a and worker-b — and I ran them on a cheap Linux box with no Cloudflare account at all. Not a rewritten version. Not a "port." The same app, byte for byte, talking to its database and its files and serving real web pages, on a server anyone can rent.
If that sounds like it shouldn't be possible — that was my reaction too. The apps are built out of Cloudflare's bricks; you'd think you can't take the bricks with you. So let me build the explanation up the way I came to understand it, one layer at a time. You don't need to be technical. By the end you'll see why it works, and that it isn't a trick.
Layer 0
#The part that runs your code is already free
When people say "Cloudflare," they're usually picturing the big stuff: data centers in hundreds of cities, the website, the deploy button, the bill. That's the service. It's real and it's worth paying for.
But underneath all of that is one specific piece of software that actually runs your app — think of it as the engine. It's called workerd. And here's the part that surprised me: Cloudflare gave that engine away. It's open source, free, public on the internet. They wrote it, they run it in their data centers — and they also published it so anyone can run it on their own computer.
So the scary question quietly turns into a much smaller one. It was: "how do I escape Cloudflare?" It's really: "the engine is already mine to use — what little bit do I have to build around it?"
Layer 1
#The building blocks have free stand-ins too
"Fine," you might say, "but the app doesn't just run code — it uses Cloudflare's database and Cloudflare's file storage. Those are the bricks. Where do those come from off Cloudflare?"
This is the part I didn't expect. Cloudflare ships a free tool — it's called Miniflare — whose whole job is to stand in for those building blocks on your own machine. It's the same thing their own engineers use to build apps on their laptops before going live. When my app asks for "the database," Miniflare quietly answers with an ordinary database file on disk. When it asks for "file storage," Miniflare uses a plain folder. The app never notices the difference.
Read that again, because it's the crux: every storage brick my apps use has a free, local stand-in that Cloudflare themselves built and ship. This isn't something a clever hacker reverse-engineered. It's the official, supported path — it just happens to also be a completely real way to run the app for keeps.
Layer 2
#The little bit I had to write myself
So if the engine is free and the building blocks have free stand-ins, what was left for me to do? Surprisingly little — just some glue. I wrote a small harness, only a few files. Its entire job is:
- Read the app's own configuration file — the same one that already lists everything the app needs. (Cloudflare made every app declare this in plain text. That turned out to be the key.)
- Tell Miniflare "set up a database here, a file store there," based on what that file says.
- Start everything up and answer web requests on a port.
The nice property is that my harness doesn't know anything about worker-a or worker-b specifically. It reads whatever configuration file you point it at and wires up whatever that app asks for. I could point it at an app I'd never seen and it would just run.
Layer 3
#The honest part: a few things I haven't gotten to yet
If everything mapped over perfectly, I'd stop here. It doesn't, and the honest bit is the interesting bit.
A few of Cloudflare's services I simply haven't ported over yet — their artificial-intelligence features, some of their fancier behind-the-scenes orchestration, a couple of others. For now, my harness just leaves them switched off.
And I want to be precise about why, because it isn't that they can't be replaced. Take the AI features: there are perfectly good open-source models I could run myself. The only catch is that Cloudflare wraps them in a particular interface, and matching that interface takes some patient fiddling I haven't sat down to do yet. Nothing's actually missing that the open world doesn't already offer — it's just not hooked up.
So I won't pretend it's all finished. But in the end it's just code. The apps were built to carry on without these extras rather than fall over when they're absent, so nothing breaks while they're off — and I'll wire them up properly when there's a real need for it, or when I'm bored on a rainy Saturday again. The point was never that everything is done. It's that none of it is a locked door.
One thing I couldn't put off, though. worker-a processes uploaded video, and unlike the AI features, that's not something the app can quietly do without — I needed it working from day one. Happily, this is the opposite of exotic: the free, open tools for crunching video have been around for decades and run perfectly well in an ordinary container. So I built this replacement right away rather than later — a small separate program that does the same job, sitting next to the app and talking to it over a normal web connection. Same shape as before, just running on my box instead of Cloudflare's.
Layer 4
#The clever bit: two apps, one shared database
Here's a wrinkle that made this more than a toy. On Cloudflare, worker-a and worker-b share a single database — one writes something, the other reads it. That sharing is the whole point of how they work together.
The trouble: the free database stand-in normally gives each app its own private database file. Run them separately and you get two databases that never see each other — the sharing vanishes.
So how does Cloudflare itself avoid this? Its database isn't really "inside" each app. It's one service that owns the data, and the apps are just clients that ask it questions. I rebuilt exactly that shape out of free parts: a small database service that owns the one shared file, and a thin adapter that makes each app think it's holding its own normal database — while really it's chatting with that shared service. Both apps point at the same one, so the data is shared again.
Layer 5
#Putting it on a real server — with ordinary tools
The last step is turning all this into a normal, always-on website. I did it with nothing but standard, open tools that millions of people already use — the kind you can read about anywhere and aren't owned by any one company:
I package everything with Docker (a common way to bundle an app so it runs the same on any machine). I put Caddy in front — a small open web server that automatically gets and renews a real security certificate from Let's Encrypt, for free, so the site is properly encrypted (the little padlock in your browser). And a one-line push from my laptop rebuilds and redeploys the whole thing onto a Linux box that costs a few euros a month. No Cloudflare anywhere in that picture.
That's the proof. The exact same apps, on a rented box, no Cloudflare account, serving real encrypted traffic.
#So why do I still use Cloudflare?
Here's where I want to be straight with you, because the whole point would be lost if I pretended self-hosting is always the answer. For anything that really matters, I keep it on Cloudflare on purpose.
When I run an app on my own box, I become responsible for everything Cloudflare was quietly doing for me. If the box falls over at 3am, that's my problem. If a flood of traffic or an attack hits, there's no global network absorbing it — there's just my one server. Security patches, backups, scaling up when things get popular, staying online in every region of the world: all mine to handle, forever. Cloudflare does all of that automatically, across hundreds of cities, better than I realistically can alone. For an app people depend on, paying them to carry that load isn't lock-in — it's just a good deal.
So I think of self-hosting as a capability, not an obligation. It's there. It works. I've proven it to myself. But most of the time the smart move is to let Cloudflare do what it's great at and get on with my actual work.
#The point: you don't have to leave, and that's the good news
Put the two halves together and you get something better than either one alone.
You can self-host — I've shown you exactly how, and that it's real. And you don't have to — for important apps you probably shouldn't, and neither will I. The value isn't that you're about to walk out the door. It's that the door exists.
Because my apps are built on an open engine and wired together with standard, open tools, you're never trapped. If Cloudflare ever stopped being the right choice — a price you don't like, a policy that doesn't fit, a place it can't serve, or one day just disappearing — the app comes with you. It moves to a plain server, or to another provider, with the same code and ordinary tools you can hire anyone to maintain.
That's the kind of freedom you hope to never need, like a fire exit. You don't plan your life around it. But you sleep better knowing it's there — and it's the reason building on Cloudflare is a safe bet rather than a gamble. The convenience is something I rent. The app was always yours to take with you.
If you're technical and want to see the harness for yourself, ask — it's a few small files and a couple of standard config files, nothing more.