The infrastructure problem nobody talks about

A significant portion of the most interesting things on the internet — personal sites, independent journals, experimental portfolios, single-serving tools — are built as static HTML. No database, no server-side rendering, no CMS. Just files that a browser can read directly.

The problem is not building them. The problem is keeping them online without paying monthly fees to hosting providers whose pricing assumes you want a WordPress installation and a control panel full of upsells. Static sites do not need any of that. They need a CDN that can serve files — and several platforms now offer this at zero cost, with no meaningful limitations for most independent projects.

This guide covers the practical process of getting a static site live using Cloudflare Pages — from uploading files to connecting a custom domain. It assumes you have HTML, CSS and JavaScript files and want them on the internet. Nothing else is assumed.

Why Cloudflare Pages specifically

There are several serious options in this space. Netlify and Vercel are the most commonly recommended, and both are genuinely good. The case for Cloudflare Pages comes down to a few things that matter for the kind of sites the MU0ZVV readership tends to build.

Platform Free bandwidth Custom domain Deploy from folder Analytics
Cloudflare Pages Unlimited Free Yes Built-in
Netlify 100GB/month Free Yes Paid add-on
Vercel 100GB/month Free Git only Paid add-on
GitHub Pages 100GB/month Free Yes None

Unlimited bandwidth on the free tier is the differentiator. If a piece gets shared widely — Reddit, Hacker News, a newsletter — Cloudflare Pages will not serve you a bill the next morning. That removes the one anxiety that follows every independent web project that gets any traction.

The built-in analytics are also worth mentioning. They are privacy-respecting by default — no cookies, no fingerprinting — and they show you the numbers that matter: page views, top pages, countries, referrers. For a site like this one, that is sufficient without adding a third-party script.

Deploying without Git

Most deployment guides assume you use Git and have your project in a repository. Many people building personal sites do not work this way, and Cloudflare Pages supports direct uploads without requiring any version control setup.

Step 01
Create a Cloudflare account

Go to cloudflare.com and create a free account. No credit card required for the free plan. Verify your email address.

Step 02
Open Pages and create a project

In the Cloudflare dashboard, navigate to Workers & Pages in the left sidebar. Click Create, then select the Pages tab. Choose Upload assets — this is the direct upload path, no Git required.

Step 03
Name your project

Give the project a name. This becomes your default subdomain: yourname.pages.dev. You can change this later, and you can connect a custom domain at any point. The name is lowercase, hyphens only.

Step 04
Upload your files

Drag your site folder into the upload area, or click to browse. Cloudflare Pages accepts a folder or a ZIP archive. The entire folder is uploaded — all HTML, CSS, JS, images and assets. If your index.html is at the root of the folder, it will be served at the root of your domain.

Step 05
Deploy

Click Deploy site. Cloudflare processes the upload and deploys to its global CDN. This takes between 30 seconds and two minutes. When done, your site is live at yourname.pages.dev — accessible from anywhere, immediately.

Connecting a custom domain

The .pages.dev subdomain works fine for testing and for projects where the URL does not matter. For anything public-facing, a custom domain is worth setting up. The process differs slightly depending on whether your domain is registered through Cloudflare or elsewhere.

If your domain registrar is not Cloudflare: in the Pages project dashboard, go to Custom domains and add your domain. Cloudflare will give you either a CNAME record or nameserver instructions to add at your registrar. CNAME propagation typically takes a few minutes; nameserver changes can take up to 24 hours but are usually faster.

If your domain is registered through Cloudflare: the process is one click. Add the domain in the Pages custom domains section, and Cloudflare configures the DNS automatically.

SSL is automatic in both cases. Cloudflare issues and renews certificates without any configuration required.

Updating the site

To push an update, go back to the Pages project, click Create new deployment, and upload the updated folder or ZIP. Each deployment creates a versioned snapshot — you can roll back to any previous deployment from the dashboard if something goes wrong.

If you want to move to a Git-based workflow later, Cloudflare Pages supports connecting a GitHub or GitLab repository. From that point, every push to the main branch triggers an automatic deployment. The direct upload route is a perfectly valid way to work indefinitely, but the Git integration is there when the project grows to a point where manual uploads become inconvenient.

What the free tier actually includes

The free plan on Cloudflare Pages includes: unlimited bandwidth, up to 500 deployments per month, up to 100 custom domains per project, Web Analytics (privacy-preserving, no cookies), global CDN distribution across Cloudflare's network, and automatic HTTPS. For most independent web projects, this is everything needed, indefinitely.

The paid plans add features relevant to larger-scale deployments: more concurrent builds, server-side rendering via Workers, and advanced redirect rules. None of these are relevant for a straightforward static site.

The era of paying monthly fees to host a static HTML file is over. The infrastructure exists; using it is a matter of knowing which five buttons to click.

Søren Villads, MU0ZVV

A note on performance

One underappreciated benefit of Cloudflare Pages is what you get for free on the network side. Cloudflare operates one of the largest CDN networks in the world — over 300 data centres globally. A static site deployed on Pages is served from whichever of those is geographically closest to the visitor. For a small independent publication, this means performance comparable to enterprise hosting, at no cost.

Combined with a well-built static site — no JavaScript frameworks, no external tracking scripts, properly sized images — the result is a site that scores well on Core Web Vitals without any optimisation effort beyond writing clean HTML and CSS. This matters for search visibility, and it matters for the reading experience.