From Legacy CMS to Lightning-Fast Static

A Non-Developer's Guide to Migrating Your Website Using GitHub Desktop

"How I moved my 20-year-old websites off expensive hosting and onto a $5/month setup β€” and how you can too"

Successfully Migrated:
  • Hawaii-Guide.com β€” 20-year-old travel site with thousands of pages
  • GardenandBloom.com β€” Content and lifestyle destination
  • E-commerce store β€” Shopify to static with Cloudflare Workers

A Weekend Guide for Small Business Owners, Bloggers, and Solopreneurs

Introduction

Why Static Sites Are Worth Considering Now

Let me guess: You're paying somewhere between $20 and $400 a month for website hosting. Maybe you're on a managed WordPress plan, or you're still running that ExpressionEngine site from 2008, or you've got a Shopify store where you're watching fees eat into every sale. Every few weeks, there's another plugin update. Another security patch. Another moment of anxiety wondering if this is the update that breaks everything.

I've been there. For over two decades, I ran websites the "traditional" way β€” databases, content management systems, managed hosting, the whole stack. Hawaii-Guide.com, my travel content site, had thousands of pages built up over 20 years. GardenandBloom.com was another labor of love. And I had an e-commerce operation running on Shopify that was costing me more in platform fees than I wanted to think about.

Then I discovered something that changed everything: static site hosting. And before you click away thinking "that sounds like developer stuff" β€” stay with me. Because I'm going to show you how to do this using tools with friendly interfaces, no command line required, in a single weekend.

"The goal isn't to become a developer. The goal is to stop paying developer prices for simple website hosting."

What Exactly Is a Static Site?

Here's the simplest explanation: A static site is a website made up of files that are served exactly as they're stored. No database. No server-side processing. Just HTML, CSS, JavaScript, and images β€” the same files that ultimately get sent to every visitor's browser anyway.

When someone visits your WordPress site, here's what happens behind the scenes: Their request goes to your server, which wakes up PHP, which queries a MySQL database, which assembles the page from templates and content chunks, which finally sends HTML to the visitor. All of that happens on every single page load. It's like making a fresh pizza from scratch every time someone orders, even though everyone's getting the same pepperoni.

A static site? It's like having all the pizzas pre-made and ready to go. The visitor asks for a page, and the server just... hands it over. That's it. No processing, no database queries, no waiting.

Why This Matters Right Now

Several trends have converged to make this the perfect time to consider a migration:

Cost savings are dramatic. You can host a static site with free tiers from GitHub and Cloudflare. Even if you need premium features, we're talking $5/month versus $50-400/month. That's $500-5,000+ in annual savings.

Speed is transformative. Static sites served through a CDN (Content Delivery Network) load almost instantly. Your site gets served from the nearest data center to each visitor, not from a single server location.

Security becomes almost effortless. No database means no SQL injection attacks. No CMS means no vulnerable plugins. No server-side code means fewer attack vectors. You can essentially stop worrying about security patches.

Maintenance anxiety disappears. No more dreading plugin updates. No more compatibility nightmares. No more "update WordPress core and pray" moments.

AI tools have changed the game. This is the big one. Even if you need to make changes to your site, AI coding assistants can now help you edit HTML and implement features conversationally. You don't need to become a developer β€” you need to have a conversation.

Who This Guide Is For

This guide is specifically written for people who are comfortable managing their websites but have zero experience with Git, command lines, or modern deployment tools. If you can log into WordPress and update a page, you can do this. I'm assuming intelligence but not technical background.

You might be a small business owner whose "web guy" disappeared years ago. A blogger who's been meaning to simplify their setup. A solopreneur watching hosting costs eat into margins. Someone who's heard about static sites but assumed they were "not for people like me."

If that's you, welcome. Let's get your site migrated.

🎯 The Weekend Promise

This guide is designed to get you from "this sounds impossible" to "I actually did it" within a weekend. We're not aiming for perfection on day one β€” we're aiming for a working site that costs you almost nothing to host, loads lightning-fast, and frees you from maintenance anxiety. You can refine from there.

What You'll Need Before You Start

Before we dive in, let's make sure you have everything ready. This isn't a long list, and most of it you probably already have. Think of this as your pre-flight checklist.

Required Items

  • A computer (Mac or Windows) β€” This guide covers both. You'll need admin access to install software.
  • Your current website, still online β€” We'll be downloading a complete copy. If it's already offline, you'll need access to the files some other way.
  • An email address β€” For creating your free GitHub and Cloudflare accounts.
  • About $20-40 one-time β€” SiteSucker (Mac) costs about $5. HTTrack (Windows) is free. You may also want a custom domain if you don't already have one.
  • A weekend β€” Or a few evening sessions. The actual work takes 4-8 hours depending on site complexity, but budget time for learning and troubleshooting.

Helpful But Not Required

  • Access to your current hosting control panel (for checking domain settings later)
  • A basic text editor (Notepad on Windows, TextEdit on Mac works fine)
  • Your domain registrar login (if you want to point your domain to the new hosting)
  • A cup of coffee and some patience β€” you're learning new skills, and that takes time

A Word on Mindset

Here's what I want you to understand before we begin: You're going to see unfamiliar terminology. Words like "repository" and "commit" and "deploy" are going to show up. These words sound intimidating, but they represent simple concepts that I'll explain in plain English every time they appear.

The tools we're using β€” GitHub Desktop, Cloudflare Pages β€” were specifically designed with friendly interfaces. They exist because the people who built them wanted to make this accessible. We're going to take advantage of that.

πŸ’‘ A Helpful Tip

Keep a simple text file open as you work through this guide. Jot down your GitHub username, the names of repositories you create, and any settings you change. This becomes your personal reference sheet for later. Future you will thank present you.

Chapter 1: Downloading Your Existing Website

The first step in our migration is capturing a complete copy of your current website β€” every page, every image, every PDF, every stylesheet. We're essentially creating a snapshot of your entire site as it exists right now.

This is called "spidering" or "crawling" a website. A program visits your site, follows every link, and downloads everything it finds. The result is a folder on your computer containing your complete website, ready to be uploaded elsewhere.

For Mac Users: SiteSucker

SiteSucker is a Mac app that makes website downloading almost embarrassingly simple. It costs about $5 in the Mac App Store, and it's worth every penny. Here's how to use it:

  1. Download and install SiteSucker from the Mac App Store. Search for "SiteSucker" β€” it has a blue icon with a spider web.
  2. Open SiteSucker and you'll see a very simple interface: basically just a URL field and some buttons.
  3. Enter your website's URL in the field at the top. Use the full address including https:// β€” for example, https://yoursite.com
  4. Click the Settings gear icon and go to the "General" tab. Make sure "Save files in" points to a folder you can easily find, like your Desktop or Documents folder.
  5. In Settings, go to "File Types" and ensure HTML, images (JPG, PNG, GIF, WebP), CSS, and JavaScript are all selected. Also include PDF if you have downloadable documents.
  6. Click "Download" and watch the magic happen. SiteSucker will start crawling your site, following links, and downloading everything.
  7. Wait for completion. This can take anywhere from a few minutes to several hours depending on site size. A site with 100 pages might take 10-15 minutes. A site with thousands of pages could take an hour or more.
  8. Check your download folder. You should see a folder structure that mirrors your website. Open the main index.html file in a browser to verify it looks right.
SiteSucker Interface showing URL field, Download button, and Settings gear icon

For Windows Users: HTTrack

HTTrack is a free, open-source website copier for Windows. It's been around for over 20 years and is rock-solid reliable. It looks a bit dated, but it works beautifully.

  1. Download HTTrack from httrack.com. Click the "Download" link and get the Windows installer.
  2. Install HTTrack using the installer. Accept the defaults β€” they're fine for our purposes.
  3. Launch WinHTTrack (that's the Windows version's name). You'll see a wizard-style interface.
  4. Click "Next" to start a new project. Give your project a name (like "my-website-backup") and choose where to save it.
  5. Enter your website URL when prompted. Use the full address including https://
  6. On the options screen, you can usually accept defaults. However, check that "Save images/files" is enabled.
  7. Click "Finish" to start the download. HTTrack will show progress as it crawls your site.
  8. When complete, navigate to your project folder. Inside you'll find a folder matching your domain name containing all the files.
⚠️ What Can Go Wrong

The download seems stuck: Some sites have thousands of pages. Check the progress indicator β€” if the file count is still increasing, it's working. Be patient.

Some images are missing: The site might be loading images from a different domain (CDN). Check Settings and add that domain to the allowed list.

The site looks broken when opened locally: This is often due to links that start with "/" instead of relative paths. We'll address this in the next chapter β€” don't panic.

Pages seem to be missing entirely: Your site might have a robots.txt file that tells crawlers to stay away. In SiteSucker, go to Settings and check "Ignore robot exclusions." In HTTrack, look for Spider settings and enable the option to ignore robots.txt. This tells the crawler "I know I own this site, go ahead and download everything."

Login-protected pages weren't captured: Website crawlers can only download publicly accessible pages. Member-only content will need to be exported another way.

Verifying Your Download

Before moving on, let's make sure your download captured everything important. Open the downloaded folder and look for:

  • An index.html file in the main folder (your homepage)
  • Subfolders matching your site's structure (/about, /blog, /products, etc.)
  • An images folder (or similar) containing your photos and graphics
  • CSS files (these control how your site looks)
  • Any PDFs or downloadable files your site offered

Open the main index.html file in your web browser (double-click it, or drag it onto your browser window). Navigate around. Does it look mostly like your real site? Some things might be slightly broken β€” that's normal and fixable. The important thing is that the core content is there.

"You now have a complete copy of your website sitting on your computer. This alone is valuable β€” it's a backup that exists independently of your hosting provider."

Chapter 2: Setting Up GitHub

(It's Easier Than You Think)

GitHub is going to be your new home for storing and managing your website files. I know the word "GitHub" sounds technical β€” it's where programmers store code. But here's the secret: it doesn't care that you're not a programmer. To GitHub, your website is just a collection of files, same as any coding project.

And the best part? GitHub is completely free for what we're doing. No credit card required, no trial period, no catches.

Creating Your GitHub Account

  1. Go to github.com in your web browser.
  2. Click "Sign up" in the top right corner.
  3. Enter your email address β€” use one you check regularly, as GitHub will send you a verification email.
  4. Create a password. Make it strong β€” this account will control your website.
  5. Choose a username. This will be visible in your repository URLs, so pick something professional. Your name or business name works well.
  6. Complete the verification puzzle (it helps prevent spam accounts).
  7. Click "Create account" and check your email for the verification code.
  8. Enter the verification code from the email to confirm your account.
  9. You'll be asked some questions about how you plan to use GitHub. You can skip these or answer honestly β€” it doesn't affect your access.
GitHub signup page showing email field and Sign up button

Installing GitHub Desktop

While GitHub's website lets you manage repositories, GitHub Desktop is a friendly app that makes everything easier. It's what we'll use for the rest of this guide. No command line required.

  1. Go to desktop.github.com in your web browser.
  2. Download the installer for your operating system (Mac or Windows). The website should automatically detect which one you need.
  3. Run the installer. On Mac, drag the app to your Applications folder. On Windows, run the .exe file and follow the prompts.
  4. Launch GitHub Desktop. You'll see a welcome screen.
  5. Click "Sign in to GitHub.com" and enter the username and password you just created.
  6. Authorize the connection when prompted. This lets the desktop app talk to your GitHub account.
  7. Configure Git β€” GitHub Desktop will ask for a name and email. Use your real name and the email associated with your GitHub account. This identifies who made changes to files.
  8. Click "Finish" and you're ready to go.
GitHub Desktop welcome screen with Sign in to GitHub.com button

Understanding the Core Concepts (in Plain English)

Before we go further, let's demystify some terminology. These words sound technical, but the concepts are actually intuitive once you understand them.

Repository (Repo)

A repository is just a folder with superpowers. It's where your website files live, but it also keeps track of every change ever made to those files. Think of it like a folder that has perfect memory.

Your website will live in one repository. If you have multiple websites, each one gets its own repository.

Commit

A commit is a snapshot β€” a save point for your files. When you make changes to your website and "commit" them, you're creating a permanent record of what the files looked like at that moment.

It's like saving a document, but better: you can always go back to any previous commit if something breaks. Made a mistake? Roll back to yesterday's commit.

Push

When you "push," you're uploading your commits from your computer to GitHub's servers. Your repository exists in two places: on your computer (local) and on GitHub (remote). Pushing syncs them up.

This is actually great for safety: your website is backed up automatically every time you push changes.

Clone

Cloning is the opposite of pushing β€” it's downloading a repository from GitHub to your computer. You "clone" when you want to work on something that exists on GitHub.

πŸ“‹ The Workflow in a Nutshell
  1. Repository: Your website's home base (the folder)
  2. Change files: Edit, add, or delete files in the repository
  3. Commit: Save a snapshot of your changes with a note
  4. Push: Upload those changes to GitHub

That's it. That's the entire workflow we'll use. Change, commit, push. Repeat.

Chapter 3: Your First Repository

Now comes the moment where we bring everything together: we're going to create a repository for your website and add all those files you downloaded in Chapter 1.

Creating a New Repository

  1. Open GitHub Desktop if it isn't already running.
  2. Click "Create a New Repository on your Hard Drive" (or go to File β†’ New Repository).
  3. Name your repository. Use something descriptive like "my-business-website" or "hawaii-travel-site". Keep it lowercase, use hyphens instead of spaces.
  4. Choose a location for the repository on your computer. Your Documents folder works well.
  5. Leave the other options as-is for now. You can skip the "Initialize with a README" checkbox.
  6. Click "Create Repository."
Create New Repository dialog showing Name field, Local Path, and Create Repository button

GitHub Desktop will create a new folder at the location you specified. Right now, it's empty (or nearly empty). Let's fix that.

Adding Your Website Files

Remember that folder full of website files you downloaded with SiteSucker or HTTrack? We're going to copy those files into your new repository folder.

  1. Click "Show in Finder" (Mac) or "Show in Explorer" (Windows) from GitHub Desktop. This opens the repository folder.
  2. Open another window showing your downloaded website files (from Chapter 1).
  3. Select all the files and folders in your downloaded website folder. Important: select the contents of the folder, not the folder itself. You want your index.html at the repository root, not inside another folder.
  4. Copy these files (Ctrl+C on Windows, Cmd+C on Mac).
  5. Paste them into your repository folder (Ctrl+V or Cmd+V).
  6. Switch back to GitHub Desktop. You should see a long list of files appear in the "Changes" panel on the left side.
GitHub Desktop showing file list with green plus icons indicating new files

Making Your First Commit

All those files are now in your repository folder, but they haven't been "committed" yet. GitHub Desktop shows them as "changes" β€” they exist but haven't been saved to the repository's history. Let's commit them.

  1. Look at the bottom-left of GitHub Desktop. You'll see a small text field labeled "Summary" and a larger one labeled "Description".
  2. In the Summary field, type something like: "Initial website upload" or "Add existing website files"
  3. The Description field is optional but you could add: "Complete download of website from [date]"
  4. Click the blue "Commit to main" button.
  5. Watch the magic happen. The Changes panel will empty out as all your files are committed.
GitHub Desktop commit interface showing Summary field and Commit to main button

Congratulations β€” you've just made your first commit! Your website files are now officially part of your repository's history.

Pushing to GitHub

Right now, your repository only exists on your computer. Let's push it to GitHub so it's backed up in the cloud and ready for the next step.

  1. Look for the "Publish repository" button in the top toolbar of GitHub Desktop.
  2. Click it. A dialog will appear.
  3. Uncheck "Keep this code private" if you want free Cloudflare Pages hosting (their free tier requires public repositories). Your website is public anyway, so this is fine.
  4. Click "Publish Repository."
  5. Wait for the upload to complete. Depending on your site size and internet speed, this could take a few minutes.
πŸŽ‰ You Did It!

Your website files are now safely stored on GitHub. You can see them by going to github.com, logging in, and clicking on your repository name. Every HTML file, every image, every stylesheet β€” it's all there, backed up and version-controlled. From now on, any changes you make can be tracked, and you can always roll back if something goes wrong.

🚨 Critical: File Naming Collisions

Here's a gotcha that trips up many people: Windows treats file names as case-insensitive, but Git (and web servers) do not. This means Windows sees "About.html" and "about.html" as the same file, but Git sees them as two different files.

If your downloaded site has inconsistent capitalization β€” maybe some links point to "About.html" and others to "about.html" β€” this can cause real headaches. Files might appear to vanish or get overwritten.

Before you commit: Scan your downloaded files for inconsistent naming. Pick one style (I recommend all lowercase like "about.html") and stick with it. A quick way to check: sort your files alphabetically and look for near-duplicates with different capitalization.

⚠️ What Can Go Wrong

Push failed - repository too large: GitHub has a 100MB file limit. If you have huge video files, you may need to host those elsewhere and link to them.

The file list seems endless: Some downloads create many small files. This is normal. Just wait for the commit to process.

I accidentally committed something wrong: Don't panic. GitHub Desktop has an "Undo" feature for the most recent commit. Go to Repository β†’ Undo Last Commit.

Chapter 4: Going Live with Cloudflare Pages

This is where everything comes together. Cloudflare Pages is a free hosting service that will take your GitHub repository and turn it into a live website. Better yet, every time you push changes to GitHub, Cloudflare automatically updates your site. It's like magic, except it's real.

Why Cloudflare Pages?

There are several static site hosts (Netlify, Vercel, GitHub Pages), but Cloudflare Pages has become my favorite for several reasons:

  • Generous free tier: Unlimited bandwidth, 500 deployments per month, custom domains included.
  • Global CDN: Your site gets served from data centers worldwide, making it fast everywhere.
  • Easy integration: Connect to GitHub in a few clicks.
  • Room to grow: If you later need dynamic features (forms, shopping carts), Cloudflare Workers integrates seamlessly.

Setting Up Cloudflare Pages

  1. Go to pages.cloudflare.com in your web browser.
  2. Click "Sign Up" to create a free Cloudflare account (or sign in if you already have one).
  3. Complete the account setup. You'll verify your email, similar to GitHub.
  4. Once logged into the dashboard, look for "Workers & Pages" in the left sidebar. Click it.
  5. Click "Create application" then choose "Pages" then "Connect to Git".
  6. You'll be asked to connect your GitHub account. Click the button to authorize Cloudflare to access your repositories.
  7. Select your website repository from the list that appears.
  8. Configure your build settings. For a simple static site (which is what we have), leave the build command empty and set the output directory to "/" (just a forward slash).
  9. Click "Save and Deploy."
Cloudflare Pages configuration showing repository selector and build settings

Your First Deployment

After clicking "Save and Deploy", Cloudflare will start processing your repository. You'll see a deployment progress screen. For a simple static site, this should only take a minute or two.

When it finishes, you'll see a green "Success" status and a URL that looks something like: your-repo-name.pages.dev

Click that URL. If everything worked correctly, you should see your website β€” live on the internet, hosted for free. Take a moment to click around. Check different pages. Feel the speed.

"You now have a live website that costs you nothing to host. Let that sink in for a moment."

Understanding Automatic Deployments

Here's where it gets really good: from now on, whenever you push changes to your GitHub repository, Cloudflare Pages will automatically detect those changes and deploy them. No manual uploading. No FTP. No logging into hosting control panels.

The workflow becomes: Make changes β†’ Commit in GitHub Desktop β†’ Push β†’ Wait 1-2 minutes β†’ Changes are live. That's it.

Adding a Custom Domain

Your site is live at the .pages.dev address, but you probably want to use your own domain (like www.yourbusiness.com). Here's how:

  1. In the Cloudflare dashboard, go to your Pages project.
  2. Click "Custom domains" in the tabs.
  3. Click "Set up a custom domain."
  4. Enter your domain (e.g., yourdomain.com or www.yourdomain.com).
  5. Cloudflare will give you DNS instructions. You'll need to update your domain's DNS settings to point to Cloudflare.
  6. If your domain is already on Cloudflare's DNS, this happens automatically. If not, you'll need to add a CNAME record at your domain registrar.
  7. Wait for DNS propagation. This can take anywhere from a few minutes to 48 hours (though usually it's quick).
  8. Cloudflare automatically provides SSL/HTTPS. Your site will be secure by default.
πŸ’‘ Domain Tip

If you're not sure how to update DNS settings, search for "[your registrar name] add CNAME record" β€” for example, "GoDaddy add CNAME record" or "Namecheap add CNAME record." Every registrar has guides for this. Alternatively, you can transfer your domain's DNS to Cloudflare entirely (it's free) and manage everything in one place.

⚠️ What Can Go Wrong

Site shows blank page or error: Make sure your index.html is in the root of your repository, not inside a subfolder.

Images/CSS not loading: Check that file paths in your HTML are relative (./images/photo.jpg) not absolute (/images/photo.jpg). This is a common issue with downloaded sites.

Custom domain shows security warning: SSL certificate provisioning can take up to 24 hours. Be patient.

Deployment failed: Check the deployment logs in Cloudflare Pages. The error message usually tells you what's wrong.

Chapter 5: Handling Forms Without a Backend

"But what about my contact form?" This is usually the first concern people have about static sites. Forms traditionally need a server to process submissions β€” to receive the data, maybe validate it, and email it to you or store it somewhere.

The good news: there are excellent services that handle this for you. They give you a form endpoint (a URL where your form sends data), handle the processing, and forward submissions to your email. Many have generous free tiers.

Recommended: Web3Forms

Web3Forms is my current favorite for simple contact forms. It's free for up to 250 submissions per month, requires no signup, and takes about 5 minutes to set up.

  1. Go to web3forms.com in your browser.
  2. Enter your email address where you want to receive form submissions.
  3. Click "Create your Access Key." They'll email you a unique key.
  4. Check your email and copy the access key (it looks like a long string of letters and numbers).
  5. Open your contact form's HTML file in a text editor.
  6. Find your form tag β€” it will look something like: <form action="..." method="POST">
  7. Change the action to: action="https://api.web3forms.com/submit"
  8. Add a hidden field right after the opening form tag: <input type="hidden" name="access_key" value="YOUR_KEY_HERE">
  9. Replace YOUR_KEY_HERE with the access key from your email.
  10. Save the file, commit the change in GitHub Desktop, and push to GitHub.

What Your Form Code Should Look Like

Here's a simple example of a working contact form after adding Web3Forms:

<form action="https://api.web3forms.com/submit" method="POST">
  <input type="hidden" name="access_key" value="your-key-here">
  <input type="text" name="name" placeholder="Your Name" required>
  <input type="email" name="email" placeholder="Email" required>
  <textarea name="message" placeholder="Your message"></textarea>
  <button type="submit">Send Message</button>
</form>

Alternative Form Services

  • Formspree (formspree.io) β€” Free for 50 submissions/month. Very similar setup to Web3Forms.
  • Basin (usebasin.com) β€” Free for 100 submissions/month. Nice dashboard for viewing submissions.
  • Netlify Forms (netlify.com) β€” If you use Netlify instead of Cloudflare, forms are built in.
  • Google Forms β€” You can embed a Google Form if design flexibility isn't critical. Completely free.

Testing Your Form

After deploying your updated form, always test it:

  • Fill out your form with test data
  • Submit it
  • Check your email β€” the submission should arrive within a minute
  • Check for spam folder just in case
  • Verify all fields came through correctly
πŸ’‘ About Spam Protection

Web3Forms includes basic spam protection (honeypot fields and bot detection). For most small sites, this is sufficient. If you start getting spam, you can add a CAPTCHA β€” Web3Forms supports hCaptcha and reCAPTCHA integrations. Check their documentation for details.

Bonus: Going Further with Cloudflare Workers

Most websites can be entirely static. But what if you need something dynamic? What if you want a newsletter signup that actually adds people to your email list? Or a simple shopping cart? Or to pull data from an API?

This is where Cloudflare Workers comes in. Workers are small programs that run on Cloudflare's servers β€” they can do things that static HTML can't. And they integrate perfectly with your Cloudflare Pages site.

Full disclosure: Workers do involve some code. But the good news is that AI tools (which we'll cover in the next section) can write that code for you. This section is about understanding what's possible.

What Workers Can Do

  • Process payments: Integrate with Stripe to accept credit cards. Your static site handles the product display; a Worker handles the checkout.
  • Connect to email services: When someone fills out a newsletter form, a Worker can add them directly to Mailchimp, ConvertKit, or any email platform.
  • Pull live data: Display current inventory from a supplier's API, show live pricing, or integrate with any service that has an API.
  • Handle user authentication: Create member-only areas with login functionality.
  • Run scheduled tasks: Automatically update content at certain times, send reminder emails, etc.

My E-commerce Migration: A Case Study

I migrated a Shopify store to static hosting using exactly this approach. Here's how it worked:

The product pages became static HTML β€” faster loading than Shopify ever was. The "Add to Cart" buttons trigger a Cloudflare Worker that manages a shopping cart stored in the user's browser (using localStorage). Checkout goes through a Worker that talks to Stripe for payment processing. Order fulfillment integrates with Printful's API for print-on-demand products.

The result? Hosting costs dropped from ~$80/month (Shopify plan + apps) to under $5/month (just the domain, really β€” Workers free tier covered everything else). And the site loads noticeably faster.

What Does Worker Code Actually Look Like?

I know "code" sounds scary, but Worker code is surprisingly readable. Here's literally everything you need to create a Worker that says "Hello" to anyone who visits it:

export default {
  async fetch(request) {
    return new Response('Hello from a Worker!', {
      headers: { 'content-type': 'text/plain' },
    });
  },
};

That's it. That simple snippet is a complete, working Worker. When someone visits the Worker's URL, they see "Hello from a Worker!" β€” and this code runs on Cloudflare's global network, lightning-fast, at the "edge" (close to wherever the visitor is).

You don't need to memorize this. The point is: it's not thousands of lines of incomprehensible code. It's a handful of lines, and AI tools can write variations of this for whatever you actually need.

Getting Started with Workers

  • In Cloudflare dashboard, go to "Workers & Pages"
  • Click "Create application" β†’ "Create Worker"
  • You'll see a code editor pre-filled with a simple example (similar to above)
  • Workers are written in JavaScript β€” but remember, AI can write this for you
  • Once deployed, your Worker gets a URL you can call from your site
  • Cloudflare Pages can also include Workers in the same project (called "Functions")
πŸ’‘ A Realistic Note

Workers are where we edge into genuine development territory. For simple sites, you may never need them. But it's empowering to know the option exists β€” and that AI tools can help you implement these features even without a programming background. More on that in the next section.

Bonus: Using AI Tools to Maintain Your Site

Here's where I tell you about the paradigm shift that made this entire migration practical for me β€” and will for you too.

Traditional web maintenance required knowing how to code, or paying someone who does. Need to update the copyright year in your footer across 200 pages? That's either tedious manual work or a developer task. Want to add a new section to your navigation? Better know HTML and CSS.

AI coding assistants have fundamentally changed this. Tools like Claude, ChatGPT, and GitHub Copilot can read your website files, understand what you're trying to accomplish, and write the code for you. It's not magic β€” it's a conversation.

"It's a conversation... to edit."

The New Workflow: Conversational Editing

Here's what maintaining your site can look like with AI assistance:

You: "I need to update the phone number in the footer of every page on my site. The old number is 555-1234 and the new one is 555-5678."

AI: "I can help you with that. You'll need to do a find-and-replace across your HTML files. Here's a simple approach: [provides step-by-step instructions or a script that does the replacement]"

Or more complex requests:

You: "My navigation menu is duplicated in every HTML file. I want to change it so I only have to edit it in one place."

AI: "You're describing a templating approach. There are a few ways to handle this: [explains options like Jekyll includes, JavaScript injection, or a build process, and helps you implement whichever you choose]"

Practical Examples

Here are real tasks I've completed using AI assistance:

  • Bulk updates: Changing branding elements across hundreds of pages
  • Adding features: "Add a 'Back to Top' button that appears when users scroll down"
  • Fixing issues: "These image links are broken on my static site β€” the paths seem wrong"
  • Implementing templates: Creating a header and footer system so changes only need to be made once
  • Optimizing images: "Help me set up a process to compress these images for faster loading"
  • Adding analytics: "I want to track page views without using Google Analytics"
  • Creating Workers: "I need a Cloudflare Worker that adds email addresses to my Mailchimp list"

Recommended Tools

  • Claude (claude.ai) β€” Anthropic's AI assistant. Excellent at understanding context and explaining its reasoning.
  • ChatGPT (chat.openai.com) β€” OpenAI's assistant. Very capable, especially the GPT-4 model.
  • GitHub Copilot β€” Integrated into code editors. More developer-focused, but powerful.
  • Cursor β€” A code editor built around AI assistance. Worth exploring if you find yourself editing files frequently.

Tips for Working with AI Assistants

  • Be specific: "Update the footer copyright year" is better than "fix my footer"
  • Provide context: Share relevant code snippets. The more the AI understands your setup, the better its suggestions.
  • Ask for explanations: Don't just accept code β€” ask the AI to explain what it does and why.
  • Test incrementally: Make one change at a time, test it, then move to the next.
  • Keep backups: Before major changes, commit your current state in GitHub Desktop. You can always roll back.
🧠 The Mindset Shift

You're not becoming a developer. You're becoming someone who can have productive conversations with AI tools about your website. The AI handles the technical implementation; you provide the direction and judgment. This is a genuine paradigm shift in who can maintain and evolve websites.

The Real Cost Comparison

Let's look at actual numbers. These are based on real pricing as of publication and my own experience running sites both ways.

Typical CMS/Managed Hosting Costs

Service Monthly Cost Annual Cost
Basic WordPress Hosting $15-30 $180-360
Managed WordPress (WP Engine, Kinsta) $30-100 $360-1,200
Shopify Basic $39 $468
Shopify (with apps) $80-200 $960-2,400
Squarespace Business $27 $324
Legacy CMS Hosting (EE, Drupal) $50-200 $600-2,400

Static Site Stack Costs

Service Monthly Cost Annual Cost
GitHub (public repos) Free Free
Cloudflare Pages (free tier) Free Free
Cloudflare Workers (free tier) Free Free
Domain renewal (typical) $1-2 $12-20
Form service (Web3Forms free tier) Free Free
Optional: Cloudflare Workers Paid $5 $60

The Bottom Line

Scenario Before After Annual Savings
Basic WordPress β†’ Static $25/mo $0-5/mo $240-300
Managed WordPress β†’ Static $75/mo $0-5/mo $840-900
Shopify Basic β†’ Static $80/mo $5/mo $900
Legacy CMS β†’ Static $100/mo $5/mo $1,140

And these savings compound over time. Over 5 years, migrating from a $75/month managed WordPress plan saves you over $4,000. That's real money that can go into your business, your marketing, or your pocket.

πŸ“ˆ Plus the Non-Monetary Benefits
  • Time saved: No more plugin updates, security patches, or CMS maintenance
  • Speed: Sites load nearly instantly, improving user experience and SEO
  • Security: No database = dramatically reduced attack surface
  • Peace of mind: Your site won't break because of a WordPress update
  • Version control: Complete history of every change, easy rollback

"But What About...?" β€” FAQ

Here are the questions and objections I hear most often, along with honest answers.

Q: What about SEO? Will my rankings suffer?

Static sites are often better for SEO. They load faster (a ranking factor), they're more reliable, and search engines can crawl them easily. The URL structure stays the same if you download your site properly, so existing rankings should be preserved. Just make sure to set up proper 301 redirects if any URLs change, and submit your sitemap to Google Search Console after migration.

Q: What if I need a blog with regular updates?

You can absolutely maintain a blog on a static site. Each post becomes an HTML file. For frequent posting, you might want a static site generator like Jekyll or Hugo that makes creating new posts easier. Or β€” and this is increasingly viable β€” you can use AI tools to help you create new post pages from a template. Many successful blogs run entirely static.

Q: How do I handle e-commerce?

It depends on scale. For digital products or simple physical goods, Stripe integration via Cloudflare Workers works well (this is what I did). For larger catalogs, you might use a headless commerce solution like Snipcart or Shopify's Buy Button, which add shopping cart functionality to any static site. The key insight: your product pages can be static even if checkout is dynamic.

Q: What about user comments?

Several options: Disqus (embedded comment widget), Utterances (GitHub-based comments), or Commento. All work with static sites by loading comments via JavaScript. Some people are also moving to community platforms like Discord or Circle and linking to those instead of on-page comments.

Q: Can I still have a search function?

Yes! Client-side search using JavaScript (like Lunr.js or Pagefind) works great for most static sites. It indexes your content and runs the search in the visitor's browser. For larger sites, you might use a third-party search service like Algolia. Google Custom Search is another free option.

Q: What about member-only or password-protected content?

This is where Cloudflare Workers really shine. You can implement authentication using Workers to check credentials before serving protected pages. There are also services like MemberSpace that add membership functionality to any website. It's more complex than simple static hosting but entirely doable.

Q: Is this right for every website?

No, honestly. If you have a highly dynamic site with user-generated content, real-time features, or complex database needs, a traditional backend might still make sense. But most business websites, blogs, portfolios, and content sites are excellent candidates for static hosting. If your site is mostly "read-only" from the visitor's perspective, static will likely work great.

Q: What if Cloudflare or GitHub goes away?

Because your site is just files, you're not locked in. You can move to Netlify, Vercel, or any other static host in an afternoon. Your content lives in your GitHub repository, which you can download anytime. This is actually much less lock-in than traditional CMS platforms.

Q: Do I need to learn to code?

Not really. For basic maintenance (updating text, changing images), you're editing HTML, which is readable even if you don't know it deeply. For anything complex, AI tools can write the code for you. The shift is from "knowing how to code" to "knowing how to describe what you want to an AI that can code."

Q: What about website analytics?

You can use Google Analytics, Plausible, Fathom, or any JavaScript-based analytics service. They all work fine with static sites β€” you just add their tracking snippet to your pages. Cloudflare also offers built-in analytics for sites on their platform.

Q: What if I need to use API keys or other secrets?

Great question β€” and an important safety tip. If you eventually use Cloudflare Workers to integrate with services like Stripe, Mailchimp, or any API that requires a secret key, never write the key directly in your code. Anyone can see public repository code, including your secrets.

Instead, go to your Cloudflare Pages project settings and look for "Environment variables." You can store your API keys there securely. Your Worker code then references them by name (like env.STRIPE_API_KEY) without the actual key ever appearing in your files. This keeps your secrets safe while still letting your code use them.

Glossary of Terms in Plain English

Quick reference for all the technical terms we've used in this guide.

CDN (Content Delivery Network)

A network of servers around the world that stores copies of your website. When someone visits, they get the copy from the nearest server, making the site load faster.

Clone

To download a copy of a repository from GitHub to your computer.

CMS (Content Management System)

Software like WordPress that lets you manage website content through an admin interface.

Commit

A saved snapshot of your files at a specific moment. Like a save point in a video game.

CSS (Cascading Style Sheets)

The code that controls how your website looks β€” colors, fonts, layouts.

Deployment

The process of taking your website files and making them live on the internet.

DNS (Domain Name System)

The system that translates domain names (like google.com) into IP addresses that computers use.

Git

A version control system that tracks changes to files. GitHub is built on top of Git.

HTML (HyperText Markup Language)

The code that structures your web pages β€” headings, paragraphs, links, images.

JavaScript

A programming language that makes websites interactive.

Push

To upload your committed changes from your computer to GitHub.

Repository (Repo)

A folder containing your project files, plus a hidden folder that tracks all changes.

SSL/HTTPS

Security protocols that encrypt data between your website and visitors. The padlock icon in browsers.

Static Site

A website made of fixed files (HTML, CSS, images) that don't change on the server.

Version Control

A system for tracking changes to files over time, allowing you to revert to previous versions.

Worker (Cloudflare Worker)

A small program that runs on Cloudflare's servers, enabling dynamic functionality.

About the Author

John C. Derrick is a serial entrepreneur and digital publisher who has been building on the web since 2001. Born and raised in South Carolina, John turned his early passions into thriving online businesses, including the massive travel resource Hawaii-Guide.com and the lifestyle destination GardenandBloom.com.

A geographer by training (University of South Carolina) and a problem-solver by nature (he reached Eagle Scout at 16), John spent two decades navigating the complexities of traditional content management systems. After years of battling plugin updates and server costs for his portfolio of high-traffic sites, he successfully migrated his entire digital empireβ€”from content portals to e-commerce storesβ€”to a static stack.

He now writes about the intersection of technology, business efficiency, and the freedom of owning your own platform at JohnCDerrick.com.

Websites successfully migrated using this approach:

  • Hawaii-Guide.com β€” 20-year-old travel content site with thousands of pages
  • GardenandBloom.com β€” Content and lifestyle destination
  • E-commerce operation β€” Shopify to static with Cloudflare Workers and Stripe

What's Next

Resources and Next Steps

You've made it to the end of this guide. If you've followed along, you now have:

  • A complete local copy of your website
  • A GitHub account and repository containing your site files
  • A live website on Cloudflare Pages that costs you nothing to host
  • Working contact forms via Web3Forms or similar
  • An understanding of how to maintain and update your site going forward

This is just the beginning. As you get comfortable with this workflow, you'll find yourself doing things that once seemed impossible β€” updating hundreds of pages at once, implementing new features conversationally with AI help, sleeping soundly knowing your site isn't going to break overnight from a plugin update.

A Note on the Journey

The shift to static hosting is as much mindset as technical skill. You're moving from "I need someone technical to handle this" to "I can figure this out, especially with AI help." That's a powerful transition.

There will be moments of frustration. Something won't work the way you expect. An error message will confuse you. This is normal. The beauty of version control is that you can always roll back. The beauty of AI assistants is that you can always ask for help understanding what went wrong.

"The goal was never to become a developer. It was to become free from developer-dependency for a website that's fundamentally simple."

πŸ”— Visit JohnCDerrick.com

Find more guides, tutorials, and resources for modern website management at johncderrick.com. I'm building a community of website owners who are taking control of their hosting, reducing costs, and discovering what's possible when you're not dependent on expensive platforms.

Thank you for reading. Now go build something fast.

From Legacy CMS to Lightning-Fast Static

A Non-Developer's Guide to Migrating Your Website

Stop paying developer prices for simple website hosting.
Start hosting for free (or nearly free) this weekend.

johncderrick.com