Internal research · noindex · checked on the dates shown

How to host Lightfall, and never think about SSL again

Where to put the site, the map tiles and the domain, what it costs each month, how HTTPS certificates get handled, and what has to be true before launch. Every fact has a numbered source you can open. Anything that is arithmetic or my judgement is labelled that way. Nothing here has been set up: no account was created, no money spent, nothing deployed.

The answer, first

Put everything in one Cloudflare account: the site on Cloudflare Workers (its static-file hosting), the four map tile files on Cloudflare R2 (its file storage), and the domain on Cloudflare too. That is already the plan in SPEC §4, and the research backs it. Cloudflare's own docs say "Start new projects with Workers" [1], and Astro's guide agrees [2]. Once the domain is on Cloudflare, SSL is not a job you do: Cloudflare "handles issuance, renewal, and deployment automatically", free on every plan [24].

Why not the usual alternatives: Vercel's free Hobby plan is "restricted to non-commercial personal use only", and processing payment or advertising a product for sale counts as commercial [48]. GitHub Pages is not allowed to run "your online business, e-commerce site" [57]. On Netlify's free plan, running out of credits pauses every site on the account [54].

The easiest path, step by step

  1. Pick and buy a domain. Easiest: Cloudflare Registrar, so DNS is already in the right place [32]. If you buy elsewhere, onboard it: Domains, Onboard a domain, enter the root domain, pick a plan, review DNS records, then paste Cloudflare's nameservers at the registrar [22]. Turn DNSSEC off at the registrar first, and allow up to 24 hours [23].
  2. Create an R2 bucket and upload the four tile files. Connect tiles.your-domain as the bucket's Custom Domain (R2, bucket, Settings, Custom Domains, Add) [39], and add a CORS policy so the site may read it [40][41]. Details in the tiles section.
  3. Add one config file, wrangler.jsonc, pointing at ./dist [2]. (A repo change, so it is a suggestion; not made.)
  4. Connect the GitHub repo. Workers & Pages, select the Worker, Settings, Builds, Connect, then push a commit [10]. Set the tile address as a Build variable, because Astro bakes it in at build time [11][18].
  5. Attach the domain to the Worker. Settings, Domains & Routes, Add, Custom Domain [21]. Add a www redirect rule [29].
  6. Switch on Always Use HTTPS [26], and consider HSTS with a short max-age [27]. The certificate itself needs nothing from you [24].
  7. Run the launch checklist: security headers, the tile range test, the card-data question, the real domain in astro.config.mjs.

What it costs each month

The recommended Cloudflare setup at launch-sized traffic. Tax is not stated on every pricing page (Cloudflare's Workers pricing page does not mention it), so treat prices as before any tax. "Free allowance" means the provider's included amount.
ItemPriceLightfall at launchSource
Domain (.com)$10.46/year register and renew at Cloudflare (third-party tracker, not an official price); Porkbun $11.08/yearAbout $0.87 a month spread over a year (arithmetic)[34][35] retrieved 2026-09-15
Site hosting (Workers static assets)Static asset requests free and unlimited; storing assets no extra cost. Workers Paid: $5/month minimum, 10 million requests included$0 on the Free allowance. $5 only if you choose Workers Paid[5][4] retrieved 2026-09-15
Builds from GitHubFree: 3,000 build minutes/month, 1 build at a time. Paid: 6,000 minutes, then $0.005/minute$0; the Free allowance is 3,000 minutes[12] retrieved 2026-09-15
HTTPS certificatesUniversal SSL: "free", on Free, Pro, Business and Enterprise$0[24] retrieved 2026-09-15
Tile storage (R2)$0.015/GB-month; 10 GB-month free$0: 362.2 MiB is inside the free 10 GB (arithmetic)[37] retrieved 2026-09-15
Tile reads (R2 Class B)10 million free per month, then $0.36 per million$0 until reads pass 10 million a month. Not measured; see the table in tiles[37] retrieved 2026-09-15
Data sent to visitors (egress)R2 egress "Free"$0[37] retrieved 2026-09-15
Email at the domain (forwarding only)Email Routing: "Available on Free and Paid plans" (no price stated)Forwarding to an existing inbox; cannot send as the domain[77][79] retrieved 2026-09-15
Email you can send from (optional)Fastmail Individual $5/month billed annually or $6 monthly; Google Workspace Business Starter $7/user/month regular price$5 to $7 a month if you want to reply as the domain[82][81] retrieved 2026-09-15

Bottom line (arithmetic on the rows above): about $10.46 a year for the domain, and $0 a month while traffic stays inside the free allowances. Realistic ceiling at launch: $5 a month if you take Workers Paid, plus $5 to $7 for email you can send from. One honest gap: no fetched page literally states "the Cloudflare Free plan costs $0"; the docs call it the Free plan and the terms call it "Free Services" [19].

Words used here

Static site
Plain files (HTML, CSS, JavaScript, images) built ahead of time. No server program runs when someone visits. Lightfall's build is static.
Host
The company whose computers hand those files to visitors.
CDN (content delivery network)
Copies of your files kept in data centres around the world, so each visitor gets them from somewhere nearby.
Cloudflare Workers / static assets
Cloudflare's app platform. "Static assets" is its feature for serving plain files like Lightfall's.
Cloudflare R2
Cloudflare's file storage (a "bucket" of files), used here for the big map tile archives.
Domain / registrar
Your address on the web (like lightfall.com). A registrar is the shop you rent it from, yearly.
DNS
The internet's phone book. It turns a name into the address of the computer that answers for it.
Nameservers
The company whose phone book is in charge of your domain. Pointing nameservers at Cloudflare hands it that job.
Zone
Cloudflare's word for one domain added to your account, with all its DNS records.
Apex (root) domain
The bare name, your-domain.com, with nothing in front.
Subdomain
A name in front of the apex: www.your-domain.com, tiles.your-domain.com.
CNAME record
A DNS record that says "this name is an alias of that other name".
SSL / TLS certificate
TLS is the encryption behind the padlock and https. The certificate proves the site is really yours. SSL is the old name people still use.
Certificate authority (CA)
The organisation that issues certificates, such as Let's Encrypt.
HSTS
A header telling browsers "only ever use https for this site", remembered for a set time.
DNSSEC
A signature on DNS answers. It must be off while you move nameservers, or the domain can go dark.
Egress
Data sent out of a provider to visitors. Many storage services charge for it; R2 does not.
Byte-range request
Asking for part of a file ("bytes 1,000 to 5,000") instead of all of it. The map reads small pieces of a 91 MiB archive this way.
PMTiles
One big file holding every map tile, read by byte-range requests instead of millions of small files.
CORS
A browser rule: a page may only read data from another address if that address says it is allowed. The tiles subdomain counts as another address.
Preview deploy
A private test copy of the site at its own URL, built from a branch, that does not change the live site.
Build variable
A setting read while the site is being built, then baked into the files. Different from a runtime variable, which a server reads on each visit.
CSP (Content Security Policy)
A header listing where a page may load scripts, images and data from, which blunts injected code.
Headless Shopify
Lightfall's own pages are the shop front; Shopify runs only the cart, checkout and orders behind them.

Hosting platforms compared

The questions that matter for Lightfall: may a site that sells prints use the cheap tier, where can a 91 MiB tile file live, is HTTPS automatic, and do pushes to GitHub deploy with previews. "Not verified" means the fact-checker did not find it on a fetched page, not that the answer is no.

Static hosting for a site that sells prints. Prices in USD; whether tax is included is not stated on every page fetched.
PlatformSelling prints on the cheapest tierPrice and allowanceFile size / the 91 MiB tileHTTPSGit deploys and previewsOver the limitSource
Cloudflare Workers (recommended)No general commercial ban found. Free Services may not process or collect card information (§2.2.1(h))Static asset requests free and unlimited; Paid $5/month25 MiB per file; tile goes to R2. Range on static assets not documentedAutomatic, free (Universal SSL) with a Custom DomainWorkers Builds: 3,000 min/month free; non-production branches get preview URLsLimits table: Free 100,000 requests/day. Billing page: static asset requests free and unlimited (so the daily cap reads as applying to Worker code; that link is drawn from the two pages together)[19][5][3][12][13] retrieved 2026-09-15
Cloudflare PagesSame account terms as aboveFree: 500 builds/month25 MiB per file; 20,000 files on FreeAutomatic (Cloudflare)"unlimited number of preview deployments"; Cloudflare now says start new projects on WorkersBuilds time out after 20 minutes[14][1] retrieved 2026-09-15
VercelNo: Hobby is "non-commercial personal use only"; payment or advertising a sale needs ProPro $20/month with $20 usage credit; Pro 1 TB transfer included, then from $0.15/GBNo per-file limit or Range behaviour documentedAutomatic Let's Encrypt, renewed 14 to 30 days before expiryGit deploys; Hobby cannot connect repos owned by a Git organizationHobby 100 GB/month included[48][49][50][51][52] retrieved 2026-09-15
NetlifyTerms not fetched (AUP and subscription agreement not checked)Free $0 with 300 credits; Personal $9 (1,000); Pro $20 (3,000). Bandwidth 20 credits/GB; each production deploy 15 creditsNo per-file limit found; sets Accept-Ranges itself, Range handling not documentedFree automatic HTTPS (Let's Encrypt)Unlimited deploy previews on FreeAll sites on the account paused; Free cannot buy more credits[53][54][55][56] retrieved 2026-09-15
GitHub PagesNo: not allowed for "your online business, e-commerce site"Soft 100 GB/month bandwidthSite max 1 GB. GitHub blocks files over 100 MiB and warns over 50 MiBLet's Encrypt; "Enforce HTTPS" in Settings, PagesDeploys time out after 10 minutes; no previews foundSoft limits[57][58][47] retrieved 2026-09-15
AWS Amplify HostingNot verifiedFree up to 1,000 build minutes, 5 GB stored, 15 GB served a month; then $0.15/GB servedNo per-file limit listed (5 GB build artifact); Range not verifiedACM certificate, 13 months, auto-renewsPR previews; each counts toward 50 branches per appPay as you go[59][60][61][62] retrieved 2026-09-15
AWS S3 + CloudFrontNot verifiedCloudFront flat-rate Free $0 (1M requests, 100 GB), Pro $15/month; S3 $0.023/GBS3 website endpoints have no HTTPS, so CloudFront is required. CloudFront serves and caches Range requests from S3Flat-rate plans include a TLS certificateNot researchedFlat-rate: "no additional overage charges"[63][64][65][67] retrieved 2026-09-15
Firebase HostingNot verified10 GB storage and 10 GB/month transfer free; then $0.026/GB stored, $0.15/GB sent2 GB per file; Range not verifiedCertificate within 24 hours of pointing A records, usually a few hoursGitHub action creates a preview channel per PR and comments the URLFree (Spark) sites over transfer are disabled until next month[68][69][70] retrieved 2026-09-15
RenderNot verifiedStatic sites "free to deploy"; bandwidth Hobby 5 GB, Pro 25 GB, then $0.15/GBNot retrievedFree automatic TLS (Let's Encrypt, Google Trust Services)PR previews with their own URLHobby with no card: services spun down until next month[72][71] retrieved 2026-09-15
DigitalOcean App PlatformNot verified3 static-site apps free, 1 GiB transfer each, then $0.02/GiB; more apps $3/monthNot documented; serves via Spaces CDN, which Protomaps lists as HTTP/1.1 onlyIssuer not stated on pages fetchedNot documented on pages fetchedOverage billed[73][74][41] retrieved 2026-09-15

Why Cloudflare wins for Lightfall (judgement): it is the only option where the site, the tiles, the domain, DNS and certificates sit in one account with free egress, and the plan SPEC §4 already chose. AWS S3 plus CloudFront is the credible runner-up for tiles (documented Range caching), at the price of a second vendor and more moving parts.

Domain, DNS and SSL, in plain English

When someone types your address, their browser asks DNS where it lives. Your domain's nameservers answer. If those nameservers are Cloudflare's, Cloudflare answers with its own servers, shows the browser a certificate proving the site is yours, and hands over the page over an encrypted connection. So the one decision that makes SSL effortless is letting Cloudflare run the domain's DNS.

Buying the domain

Two registrars checked. Sale prices change often; renewal is the number that lasts.
RegistrarPricing modelExample prices (register / renew per year)Worth knowingSource
Cloudflare Registrar"No markup. No surprise fees." Renews "at the list price set by the registry". Free WHOIS redaction; over 430 extensionsThird-party tracker: .com $10.46 / $10.46; .gallery $22.20; .photography $28.20; .co $30.00; .shop $30.20; .studio $31.20Must use Cloudflare nameservers while registered there. Auto-renew on by default. No unicode (IDN) names. Registration can take up to 30 seconds[31][33][32][34] retrieved 2026-09-15
PorkbunRetail registrar; free WHOIS privacy and free auto-renewed Let's Encrypt certificates.com $11.08 / $11.08; .gallery $23.17; .photo $26.26; .nyc $26.26; .photography $29.35; .studio $32.44; .shop sale $2.06, renews $31.41You would then onboard the domain to Cloudflare by changing nameservers (below). .nyc eligibility rules not verified[35] retrieved 2026-09-15
Google DomainsGone"As of 10 July 2024, all domains have migrated to Squarespace."[36] retrieved 2026-09-15

If the domain is bought somewhere else

  1. In Cloudflare: Domains, Onboard a domain, enter the apex domain (for example example.com), choose how to add DNS records, Continue, select a plan [22].
  2. Review the DNS records Cloudflare found [22].
  3. At your registrar, turn DNSSEC off first: "Changing nameservers while DNSSEC is active can cause your domain to become unreachable" [23].
  4. Replace the registrar's nameservers with Cloudflare's, copied exactly: "If their names are not copied exactly, your DNS will not resolve correctly." Then "Wait up to 24 hours" [23]. Full setup is the only option on the Free plan [23].
  5. Complete the SSL/TLS setup step [22]. Certificates are "issued after your domain is active on Cloudflare"; no issuance time is given [24].

Pointing the domain at the site

SSL: what Cloudflare does, and the two switches you own

The map tiles: R2, and the alternatives

Sizes measured on disk (ls, 2026-09-15) against Workers' 25 MiB per-file cap.
FileWhat it holdsSizeUnder 25 MiB?
nyc-region-z15.pmtilesThe city and the region round it, zooms 0 to 15326.4 MiB (342,263,784 bytes)No
world-z5.pmtilesThe planet, zooms 0 to 514.3 MiB (15,007,228 bytes)Yes, but Range support is not documented
marble-z5.pmtilesNASA relief and ocean imagery10.3 MiB (10,805,021 bytes)Yes, but Range support is not documented
clouds-z4.pmtilesNASA cloud layer11.2 MiB (11,761,758 bytes)Yes, but Range support is not documented
TotalAll four move together (tile-url.ts)362.2 MiB

Why all four go to R2, not just the big one. The only mention of Range in the Workers static-assets headers doc is a cache-control condition [6], and the one match in the asset-worker source is that same condition (utils/headers.ts:60) [9]. No doc says a partial response (206) comes back. R2's GetObject lists "Range" as supported [38]. The code already treats the tile location as one base address for all four files (src/lib/map/tile-url.ts), so splitting them would mean two settings.

Setting up the bucket

  1. Upload the four files without Content-Encoding. If Cloudflare has to decompress an encoded response "it ignores Range" and sends the whole body as 200 OK [44]. Protomaps suggests rclone for files over 300 MB [42]; these are all under.
  2. Custom domain: R2, bucket, Settings, Custom Domains, Add, enter the domain, Continue, review the DNS record, Connect Domain, wait for Initializing to become Active. The domain must be a zone "in the same account as the R2 bucket" [39].
  3. Leave the r2.dev address off: it is "rate-limited and should only be used for development purposes". Disable under Settings, Public Development URL (type "disallow"). Do not point a CNAME at r2.dev: "an unsupported access path" [39].
  4. CORS policy: R2, bucket, Settings, CORS Policy, Add CORS policy, JSON tab, Save [40]. Protomaps' recommended values are GET and HEAD, headers range and if-match, expose etag, max age 3000 [41]. Origins are scheme://host with no path; changes can take up to 30 seconds, and cached files on a custom domain keep old headers until the cache is purged [40].
  5. Cache Rule for .pmtiles. Free plans cache files up to 512 MB, but PMTILES is not on the default cached-extension list, so it needs a Cache Rule (Free allows 10) [43][45]. The exact rule settings were not researched. Cloudflare aligns range fetches to 1 MiB cache blocks, and "On a cold cache miss, the first origin request also omits Range" [44].
[
  {
    "AllowedOrigins": ["https://your-domain.com"],
    "AllowedMethods": ["GET", "HEAD"],
    "AllowedHeaders": ["range", "if-match"],
    "ExposeHeaders": ["etag"],
    "MaxAgeSeconds": 3000
  }
]

Draft, untested: Cloudflare's dashboard JSON shape [40] filled with Protomaps' values [41]. The Wrangler command-line format is different (it wraps rules in {"rules":[...]}) [40]. Add every origin that must show the map (see preview deploys in risks).

What the reads could cost

Protomaps says "each Range tile request will count as a GET" [41]; GetObject is a Class B operation [37]. Nobody has measured how many range requests a Lightfall visit makes, so the numbers below are assumptions, for scale only.

Arithmetic: 10 million free Class B reads a month, then $0.36 per million. Ignores any reads the cache might absorb (whether cache hits are billed is not stated).
Assumed range requests per visitVisits a month inside the free readsRead cost at 100,000 visits/monthRead cost at 1,000,000 visits/month
25400,000$0.00$5.40
50200,000$0.00$14.40
100100,000$0.00$32.40
20050,000$3.60$68.40

Latency, a third-party claim: Protomaps writes that R2 "is known to have higher latency (500ms or higher) than other Cloud Storage products, but lower storage and no egress costs" [42]. That is not a Cloudflare measurement. Protomaps' optional Worker in front of R2 serves individual tiles and needs to sit on your own domain for caching [42]; Lightfall reads whole archives, so a plain R2 custom domain matches today's code.

Alternatives for the tiles

Where else the archives could live.
OptionPriceRange / HTTPCatchSource
Cloudflare R2 (recommended)$0.015/GB-month, 10 GB free; Class B $0.36/M after 10M free; egress freeRange supported; Protomaps lists R2 as HTTP/2Latency claim above; cache rule needed[37][38][41] retrieved 2026-09-15
Backblaze B2 behind Cloudflare$6.95/TB/month, first 10 GB free; Class A, B and C calls free; egress through Cloudflare free and unlimitedProtomaps lists B2 as HTTP/1.1 onlyA second vendor account[46][41] retrieved 2026-09-15
AWS S3 + CloudFrontS3 $0.023/GB, GET $0.0004 per 1,000; S3 to CloudFront free; CloudFront Free plan $0 for 1M requests and 100 GBCloudFront "serves the requested range and also caches it"; S3 is HTTP/1.1 only (Protomaps)Second vendor; more parts to wire[67][65][64][41] retrieved 2026-09-15
Inside the Workers siteFreeRange not documentedImpossible for nyc-region-z15: 25 MiB per-file cap[3][6] retrieved 2026-09-15
In the Git repoGit warns over 50 MiB, GitHub blocks over 100 MiB; nyc-region-z15 (326.4 MiB) would be blocked. Still hits the Workers cap[47][3] retrieved 2026-09-15

Deploys from GitHub, and preview links

The goal: push to main and the live site updates; push any other branch and you get a private preview link. Cloudflare's version of this is Workers Builds.

{
  "name": "lightfall",
  "compatibility_date": "YYYY-MM-DD",
  "assets": { "directory": "./dist" }
}

Astro's example uses the name my-astro-app; "lightfall" is my suggestion. Astro also shows "not_found_handling": "404-page" for a custom 404 [2]; Lightfall has no 404 page today (checked: no src/pages/404.astro). This file is not in the repo; adding it is a suggestion.

  1. Connect: Workers & Pages, select the Worker, Settings, Builds, Connect, follow the prompts, push a commit [10].
  2. Settings: Git branch defaults to main; build command optional (Astro's guide: npx astro build; Lightfall's npm run build is astro build); deploy command defaults to npx wrangler deploy [11][2].
  3. Previews: non-production branches run npx wrangler versions upload by default, which makes a preview version without promoting it [11]. "Every time you create a new version of your Worker, a unique static version preview URL is generated automatically" [13].
  4. Limits: Free 3,000 build minutes/month, 1 build at a time; Paid 6,000 minutes then $0.005/minute, 6 at a time; builds time out at 20 minutes on both [12].

Honest comparison: Cloudflare rates Workers' branch deploy controls as partial next to Pages, saying Workers Builds "does not yet have the same level of configurability as Pages does" [8]. The configuration page says nothing about PR comments or GitHub checks [11]. If an automatic comment with the preview link on every pull request matters, Firebase documents exactly that [69]; for Lightfall I would still take Workers (judgement).

Analytics: Cloudflare Web Analytics is "Available on all plans" [16], but the one-click setup documented is for a Pages project (Metrics, Enable) [15]; setup for Workers static assets is not documented on the page fetched. No limit on sites proxied through Cloudflare [17].

Security headers, and keeping /admin out

Headers are instructions sent along with each file. On Workers static assets you set them in a plain-text _headers file in public/: up to 100 rules, 2,000 characters per line; they do not apply to responses generated by Worker code [6]. A _redirects file works the same way (2,000 static plus 100 dynamic redirects) [7]. Lightfall has neither file today (checked with ls).

/*
  X-Content-Type-Options: nosniff
  X-Frame-Options: DENY
  Referrer-Policy: no-referrer
  Permissions-Policy: document-domain=()
  Content-Security-Policy-Report-Only: default-src 'self'; worker-src 'self'; img-src 'self' data: blob:; connect-src 'self' https://tiles.your-domain.com; frame-ancestors 'none'

The draft above is a starting point assembled from the cited docs, not a tested policy. Adding public/_headers is a repo change and is not made.

/admin never ships

Environment variables

An environment variable is a setting kept outside the code, so the same code can point at localhost on your laptop and at R2 in production.

What Lightfall has, and where each value goes on Cloudflare.
VariableLocal value (on disk)Production valueWhere to set itSource
PUBLIC_TILE_URLhttp://localhost:4322/tiles in .env; .env.example and the comment in tile-url.ts say port 4321https://tiles.your-domain.com, no trailing slash (tile-url.ts)Workers Builds Build variable (Settings, Build). Build variables "will not be accessible at runtime", which is fine: Astro replaces it at build time[11][18] retrieved 2026-09-15
Shopify Storefront public token (when the shop is built)Public token: "visible to buyers" by design, sent as X-Shopify-Storefront-Access-TokenMay be a PUBLIC_ build variable[83][18] retrieved 2026-09-15
Shopify private token (only if a server is ever added)Never in the browser; header Shopify-Storefront-Private-TokenNever a PUBLIC_ variable; a static site has nowhere private to keep it[83][18] retrieved 2026-09-15

Does the print shop change hosting? And email

Launch checklist

Suggestions, in order. Items marked (repo) change files the site's engineers own; none were made. Account creation and spending are Jake's call.

  1. Decide the card-data question: confirm with Cloudflare that a Free-plan site sending buyers to Shopify's checkout is fine under §2.2.1(h) [19]. Whether paying for Workers alone changes it is also unverified, since DNS, SSL and CDN would still be Free Services.
  2. Domain bought, zone active on Cloudflare, DNSSEC handled [32][23].
  3. R2: bucket, four files uploaded without Content-Encoding, tiles. custom domain Active, r2.dev disabled, CORS saved, Cache Rule for .pmtiles [39][40][44][43].
  4. Test a range request against R2 before wiring the site: curl -I -H "Range: bytes=0-99" https://tiles.your-domain.com/world-z5.pmtiles should return only the requested bytes (status 206 Partial Content is the HTTP standard's answer; not taken from a fetched page). Look for Cf-Cache-Status: HIT on a repeat [42]. (A test to run; not run.)
  5. Measure range requests per map visit in the browser's Network tab, then redo the cost table with the real number.
  6. (repo) wrangler.jsonc with assets.directory ./dist [2].
  7. (repo) astro.config.mjs: change site from https://lightfall.example (checked, line 27) to the real domain.
  8. Workers Builds connected to the private repo; PUBLIC_TILE_URL set as a Build variable [10][11]. Check the first build log for the Node version (see risks).
  9. Custom Domain on the Worker for the apex; proxied www record plus the 301 redirect rule [21][29][30].
  10. HTTPS: certificate shows Active, Always Use HTTPS on, HSTS at a short max-age with preload off [24][26][27].
  11. (repo) public/_headers with the draft above, CSP in Report-Only; watch the console, then enforce [6][75].
  12. Confirm /admin is absent on the live site (expect a 404) and that the build log shows no admin guard error.
  13. Preview branch test: push a branch, open its preview URL, confirm the map loads (the CORS origins must include the preview host) [13][40].
  14. Email: Email Routing for forwarding, or Fastmail/Workspace to send [77][82].

Risks, gaps and things not verified

How this was researched

Verified finding records
69
Claims rejected
18
Sources cited
85
Research areas
2

Two research areas (hosting platforms; domain, DNS, SSL, tiles, email, security and shop) each had a researcher and then an adversarial fact-checker who re-fetched every page, corrected wrong figures and sources, and dropped anything not on the page. 18 claims were rejected and none appear here. Some of the 69 records are the same page checked by both areas.

Official docs and pricing pages were preferred. Third-party pages are labelled: cfdomainpricing.com (prices) and Protomaps (a map-tile project whose docs make claims about providers). Facts about the Lightfall repo (tile sizes, file counts, admin guard, headers files, env files, ports) were read on disk on the same day, not fetched. Retrieval dates are recorded as 2026-09-15 as instructed; one researcher's system clock read 2026-09-14.

Sources

Cloudflare: hosting the site

  1. Cloudflare Pages docs (banner recommending Workers) · retrieved 2026-09-15
  2. Astro docs — Deploy your Astro site to Cloudflare · retrieved 2026-09-15
  3. Cloudflare Workers — Limits · retrieved 2026-09-15
  4. Cloudflare Workers — Pricing · retrieved 2026-09-15
  5. Cloudflare Workers static assets — Billing and limitations · retrieved 2026-09-15
  6. Cloudflare Workers static assets — Headers · retrieved 2026-09-15
  7. Cloudflare Workers static assets — Redirects · retrieved 2026-09-15
  8. Cloudflare — Migrate from Pages to Workers · retrieved 2026-09-15
  9. cloudflare/workers-sdk source — asset-worker utils/headers.ts (read via GitHub API) · retrieved 2026-09-15
  10. Cloudflare Workers Builds · retrieved 2026-09-15
  11. Cloudflare Workers Builds — Configuration · retrieved 2026-09-15
  12. Cloudflare Workers Builds — Limits and pricing · retrieved 2026-09-15
  13. Cloudflare Workers — Preview URLs · retrieved 2026-09-15
  14. Cloudflare Pages — Limits · retrieved 2026-09-15
  15. Cloudflare Web Analytics — Get started · retrieved 2026-09-15
  16. Cloudflare Web Analytics — Overview · retrieved 2026-09-15
  17. Cloudflare Web Analytics — Limits · retrieved 2026-09-15
  18. Astro docs — Using environment variables · retrieved 2026-09-15
  19. Cloudflare Self-Serve Subscription Agreement (updated 12 Sept 2025) · retrieved 2026-09-15
  20. Cloudflare Service-Specific Terms — Application Services (CDN) · retrieved 2026-09-15

Domain, DNS and SSL

  1. Cloudflare Workers — Custom Domains · retrieved 2026-09-15
  2. Cloudflare — Onboard a domain · retrieved 2026-09-15
  3. Cloudflare DNS — Full setup · retrieved 2026-09-15
  4. Cloudflare SSL — Universal SSL · retrieved 2026-09-15
  5. Cloudflare SSL — Certificate validity periods · retrieved 2026-09-15
  6. Cloudflare SSL — Always Use HTTPS · retrieved 2026-09-15
  7. Cloudflare SSL — HTTP Strict Transport Security (HSTS) · retrieved 2026-09-15
  8. Let's Encrypt — From 90 to 45 days · retrieved 2026-09-15
  9. Cloudflare Rules — Redirect www to root · retrieved 2026-09-15
  10. Cloudflare Rules — Create a Single Redirect in the dashboard · retrieved 2026-09-15
  11. Cloudflare Registrar docs — Overview · retrieved 2026-09-15
  12. Cloudflare Registrar docs — Register a domain · retrieved 2026-09-15
  13. Cloudflare — Registrar product page · retrieved 2026-09-15
  14. cfdomainpricing.com by NameBeta (third party, not Cloudflare; updated 2026-09-14) · retrieved 2026-09-15
  15. Porkbun — Domains · retrieved 2026-09-15
  16. Google Domains (moved to Squarespace) · retrieved 2026-09-15

Map tiles and storage

  1. Cloudflare R2 — Pricing · retrieved 2026-09-15
  2. Cloudflare R2 — S3 API compatibility · retrieved 2026-09-15
  3. Cloudflare R2 — Public buckets · retrieved 2026-09-15
  4. Cloudflare R2 — Configure CORS · retrieved 2026-09-15
  5. Protomaps — PMTiles on cloud storage · retrieved 2026-09-15
  6. Protomaps — Deploy on Cloudflare (third-party claims labelled) · retrieved 2026-09-15
  7. Cloudflare Cache — Default cache behavior · retrieved 2026-09-15
  8. Cloudflare Cache — Range requests · retrieved 2026-09-15
  9. Cloudflare Cache — Cache Rules · retrieved 2026-09-15
  10. Backblaze B2 — Pricing · retrieved 2026-09-15
  11. GitHub Docs — About large files on GitHub · retrieved 2026-09-15

Other hosts compared

  1. Vercel — Fair use guidelines (updated 2026-07-29) · retrieved 2026-09-15
  2. Vercel — Pro plan · retrieved 2026-09-15
  3. Vercel — Pricing · retrieved 2026-09-15
  4. Vercel — Limits · retrieved 2026-09-15
  5. Vercel — Working with SSL · retrieved 2026-09-15
  6. Netlify — Pricing · retrieved 2026-09-15
  7. Netlify — Billing FAQ for credit-based plans · retrieved 2026-09-15
  8. Netlify — HTTPS (SSL) · retrieved 2026-09-15
  9. Netlify — Custom headers · retrieved 2026-09-15
  10. GitHub Docs — GitHub Pages limits · retrieved 2026-09-15
  11. GitHub Docs — Securing your GitHub Pages site with HTTPS · retrieved 2026-09-15
  12. AWS Amplify — Pricing · retrieved 2026-09-15
  13. AWS Amplify — Quotas · retrieved 2026-09-15
  14. AWS Amplify — Using SSL/TLS certificates · retrieved 2026-09-15
  15. AWS Amplify — Web previews for pull requests · retrieved 2026-09-15
  16. Amazon S3 — Website endpoints · retrieved 2026-09-15
  17. Amazon CloudFront — Range GETs · retrieved 2026-09-15
  18. Amazon CloudFront — Pricing (flat-rate plans) · retrieved 2026-09-15
  19. Amazon CloudFront — Pay-as-you-go pricing · retrieved 2026-09-15
  20. Amazon S3 — Pricing · retrieved 2026-09-15
  21. Firebase Hosting — Usage, quotas and pricing · retrieved 2026-09-15
  22. Firebase Hosting — GitHub integration · retrieved 2026-09-15
  23. Firebase Hosting — Connect a custom domain · retrieved 2026-09-15
  24. Render — Outbound bandwidth · retrieved 2026-09-15
  25. Render — Static sites · retrieved 2026-09-15
  26. DigitalOcean — App Platform pricing · retrieved 2026-09-15
  27. DigitalOcean — App Platform limits · retrieved 2026-09-15

Security, email and the shop

  1. MDN — Content Security Policy (CSP) · retrieved 2026-09-15
  2. MapLibre GL JS docs (CSP directives) · retrieved 2026-09-15
  3. Cloudflare Email Routing — Overview · retrieved 2026-09-15
  4. Cloudflare Email Routing — Enable Email Routing · retrieved 2026-09-15
  5. Cloudflare Email Routing — Postmaster · retrieved 2026-09-15
  6. Cloudflare Email Routing — Limits · retrieved 2026-09-15
  7. Google Workspace — Pricing · retrieved 2026-09-15
  8. Fastmail — Pricing · retrieved 2026-09-15
  9. Shopify dev — Storefront API (includes cart and checkoutUrl) · retrieved 2026-09-15
  10. Shopify dev — Headless storefronts · retrieved 2026-09-15
  11. Shopify App Store — Headless · retrieved 2026-09-15