$ cat papers/website-without-a-subscription.md
pathpapers/website-without-a-subscription.md
size12458 bytes
modified2026-09-14
licenseCC-BY-SA-4.0
sha25689848f51c087077d9f58e6f87b01606433b1cd05fdf2d502ac37b55269b77bf1
rawup
# Your Website Does Not Need a Subscription

**Publishing a small organization's site on a Worker and a domain**

Point Arena Cyber Security
Version 1.0

---

## Summary

If your organization's website is mostly words, pictures, hours and a phone
number, you are probably paying a monthly subscription for something you could
run for the cost of a domain name.

This guide shows how to put a real website on your own domain using one HTML
file and a Cloudflare Worker. It takes about twenty minutes. There is no
subdomain with someone else's brand in it, no ads on your page, and no monthly
bill.

It also says clearly where this is the wrong choice, because it often is.

A ready-to-edit starter page is published alongside this guide at
`templates/starter-site.html`. It is CC0, public domain, no conditions. You can
use it, change it, and remove every trace of us from it.

---

## 1. Who this is for

**A good fit if your site is:**

- Who we are, what we do, where we are, when we are open
- A contact phone number and email
- A few pages of information that change a handful of times a year
- Documents, reports, meeting minutes, a newsletter archive

That describes the majority of small nonprofit, school, church, clinic and
community organization websites.

**A bad fit if you need:**

- Online payments, a shop, ticketing
- Appointment booking or class registration
- A volunteer with no technical background updating content weekly
- User logins, member areas, anything private
- A blog with dozens of posts a year

Some of those can be added. Most are the reason website builders exist, and
paying for one is a reasonable decision. This guide is not an argument that
platforms are bad. It is an argument that many organizations are paying for a
platform to serve a page of opening hours.

---

## 2. What you are currently paying for

As of late 2026, Wix's entry paid tier runs about seventeen dollars a month on
annual billing and about twenty-four billed monthly, with a custom domain only
becoming available at that tier. Squarespace starts near sixteen. WordPress.org
is free software, but you pay for hosting, and realistically for a theme, a few
plugins, and eventually someone to fix it.

The free tiers are what push people to pay. A free Wix site lives on a
`wixsite.com` subdomain and carries Wix's own ad on your page. For a community
organization asking for donations, an ad you did not choose sitting above your
appeal is a real cost, not a cosmetic one.

Call it two hundred dollars a year at the entry tier. That is not a catastrophe.
It is also a week of groceries for a family your food program serves, and it is
recurring forever.

**What you get for it:** a visual editor, hosting, templates, forms, and
somebody else's responsibility when it breaks. Those are genuine. The visual
editor in particular is worth real money if the person updating the site cannot
edit HTML.

**What you also get:** your content in a format you cannot straightforwardly
take with you. This is the part organizations discover at renewal time.

---

## 3. What you will pay instead

| Item | Cost |
|---|---|
| Domain name | Roughly $10 to $15 a year |
| Cloudflare account | Free |
| Worker hosting at small-org traffic | Free tier |
| TLS certificate | Included |
| **Total** | **The domain, and nothing else** |

Cloudflare's free Workers tier covers a daily request allowance far above what a
small organization's site generates. A local nonprofit getting a few hundred
visitors a day is not close to it.

---

## 4. The security argument

We are a security organization, so this section is the one we care most about.

A WordPress site is an application. It has an administrator login, a database,
a PHP runtime, a theme, and typically somewhere between five and thirty plugins,
each written by a different person, each with its own update schedule and its
own vulnerability history. WordPress powers a very large share of the web,
which makes it the single most attacked application on it. The overwhelming
majority of WordPress compromises come through outdated plugins rather than
WordPress itself.

The practical result for a small organization is a website that requires
ongoing attention from someone who understands what a plugin update might break,
and which does not get that attention, and which is eventually found by an
automated scanner.

**A static page has no admin login to brute force, no database to inject into,
no plugins to fall behind, and no PHP to execute.** There is nothing to patch
because there is nothing running. An automated scanner sweeping for WordPress
paths finds nothing, because nothing is there.

Hosted builders like Wix and Squarespace are meaningfully better than
self-hosted WordPress on this point, because the platform handles patching. The
tradeoff you accept there is different: you are trusting a company with your
content and your availability, and you have no ability to inspect or move
quickly if something goes wrong.

Being honest about the residual risk on the static approach: whoever controls
your Cloudflare account controls your website. Put multi-factor authentication
on it, ideally a hardware key. That is the whole of your security maintenance
burden, and it is a one-time task.

---

## 5. Doing it

Twenty minutes, start to finish. You need a credit card for the domain and
nothing else.

### Step 1. Get a domain

Register through any registrar. Cloudflare's own registrar sells at cost with
no markup and no first-year-discount-then-renewal-spike pattern, which makes it
a reasonable default if you are starting fresh. If you already own a domain,
you can move its DNS to Cloudflare without transferring the registration.

Do not skip to a subdomain of someone else's site. Owning the name is the entire
point, and it is the part you cannot retrofit later without losing your search
ranking and every printed business card.

### Step 2. Write your page

Download `templates/starter-site.html` from this site. Open it in Notepad,
TextEdit, or any text editor. Do not use Word.

Search the file for `EDIT`. There are fifteen of them, each with a comment
explaining what to change. Work top to bottom. Change the colors by editing the
five lines at the top of the style block.

Save it. Open it by double-clicking. That is your website, running on your own
computer, before you have paid anyone anything.

### Step 3. Create the Worker

In the Cloudflare dashboard: **Workers & Pages** → **Create** → the **Workers**
tab → **Start with Hello World!** Give it a name and deploy.

Then **Edit code**. You will see a small JavaScript file. Replace all of it
with this, pasting your finished HTML where marked:

```js
const PAGE = `
PASTE YOUR HTML HERE
`;

export default {
  fetch() {
    return new Response(PAGE, {
      headers: { 'content-type': 'text/html; charset=utf-8' }
    });
  }
};
```

Deploy.

**One thing that will bite you.** The backtick characters around `PAGE` mark
where your HTML starts and ends. If your HTML contains a backtick, or the two
characters `${` together, the page will break. Plain text and normal HTML do
not contain either. If you paste in something copied from elsewhere and the
deploy fails, that is why.

### Step 4. Point your domain at it

On the Worker's page: **Settings** → **Domains & Routes** → **Add** → **Custom
domain** → type your domain.

Cloudflare creates the DNS record and issues the TLS certificate. Wait a minute,
then load your domain.

That is the whole thing. You are live, on your own name, over HTTPS.

### Step 5. Updating it later

Edit code, change the HTML, deploy. Changes are live in seconds.

Cloudflare keeps previous versions, so a bad edit is recoverable from the
**Deployments** tab.

---

## 6. Adding more pages

Beyond one page, check the URL and return different HTML:

```js
const HOME = `...`;
const ABOUT = `...`;

export default {
  fetch(request) {
    const path = new URL(request.url).pathname;
    const body = path === '/about' ? ABOUT : HOME;
    return new Response(body, {
      headers: { 'content-type': 'text/html; charset=utf-8' }
    });
  }
};
```

This stays comfortable up to perhaps five or six pages. Past that, put the files
in an R2 bucket and serve from there instead, which is the approach documented
in our companion paper *Publishing Without a Platform*.

---

## 7. The honest hard part: forms

This is where "just use a static page" gets glib, so here it is straight.

A static page cannot process a contact form. Something has to receive the
submission, and that something is a server. You have three real options.

**Use `mailto:` and a phone number.** Not a form. A clickable email address and
a clickable phone number. For most small organizations this is genuinely
sufficient, and it has the advantage of working forever with no dependency. The
starter template does this.

**Use a form service.** Formspree, Basin and similar accept a form post and
email you the result, with free tiers adequate for low volume. You are adding a
third-party dependency and their JavaScript, so read their privacy policy before
putting it on a page where people disclose need.

**Write a handler in the Worker.** Accept a POST and send mail through an email
API. Perhaps thirty lines. But you have now introduced a write path, which means
you need spam protection, rate limiting and input validation, and you have
reintroduced most of the attack surface section 4 was about removing. Do this
only if you will maintain it.

If you need a form badly enough that none of these work, a hosted builder is
the right answer and you should use one without guilt.

---

## 8. What you give up

Stated plainly.

**The visual editor.** This is the real one. If the person who updates your site
cannot comfortably edit an HTML file, this approach will fail, not technically
but organizationally. The site will go stale because updating it requires the
one volunteer who moved away.

Be honest about who maintains it before you choose. A subscription that keeps
your hours accurate beats free hosting that shows last year's.

**Built-in features.** No galleries, no booking, no newsletter signup, no
analytics dashboard, no e-commerce. Each is addable and each is work.

**Somebody to call.** Nobody is on the hook when it breaks. In practice a static
page breaks approximately never, but when you need a change at 9pm before a
grant deadline, there is no support line.

**Templates.** You get one starter page from us. A builder gives you hundreds of
professionally designed options, and design matters for credibility when you are
asking people for money.

---

## 9. When to pay for a platform instead

Do not take the cheap option if any of these are true:

- You sell things or take payments on the site
- You need bookings, registrations or scheduling
- Content changes weekly and non-technical staff make the changes
- You need member logins or anything private
- Nobody in your organization is comfortable editing a text file
- Design quality matters more to your fundraising than two hundred dollars a
  year does

Any one of those and a subscription is money well spent. The waste is paying a
platform rent for a page of opening hours that changes twice a year.

---

## 10. Why we published this

Our organization exists because security knowledge sits behind paywalls that do
not need to exist. The same pattern shows up one layer down, in basic web
publishing, and it hits the same organizations hardest: the food bank, the
volunteer fire department, the after-school program.

The technique in this guide is not clever. Any web developer knows it. That is
exactly the problem. It is not written down anywhere the person running a
community center would find it, so they pay a subscription instead, and nobody
in a position to tell them otherwise has any reason to.

So here it is written down. The template is public domain. Take it.

---

## Licensing

Copyright (C) 2026 Point Arena Cyber Security.

This guide is licensed under the Creative Commons Attribution-ShareAlike 4.0
International License.
https://creativecommons.org/licenses/by-sa/4.0/

SPDX-License-Identifier: CC-BY-SA-4.0

**The starter template is not.** `templates/starter-site.html` is released
under CC0 1.0, public domain. A starting point for your work must not impose
conditions on your work. Use it with no attribution and no share-alike
obligation.

Corrections: hello@pointarenacybersecurity.dev

License. Code and detection content is AGPL-3.0-or-later. If you modify it and run it for others over a network, including as a hosted or managed service, section 13 requires you to offer those users your source. Papers and written guidance are CC BY-SA 4.0.

Verify what you got. curl -sO https://open.pointarenacybersecurity.dev/SHA256SUMS && sha256sum -c SHA256SUMS

Source of this site. This index is itself AGPL. Read it here.

Patches and questions. hello@pointarenacybersecurity.dev