How StaticBackend tests and scores static hosts
Every host is scored with the same 100-point rubric below, using vendor pricing and limits pages checked in November 2026. The rubric rewards getting a working link with no account, and both benchmarks use it: free HTML hosting with no signup and Netlify Drop alternatives.
Outbound links carry no affiliate or tracking parameters. When a fact cannot be confirmed on an official page, it stays off the site or is labelled as coming from the vendor's support forum.
Rubric for publishing without an account
Each host gets up to 100 points for how quickly and cheaply it turns a file into a working link with no signup.
| Criterion | Points | How points are given |
|---|---|---|
| Publish with no account | 30 | Yes 30; account created in the terminal 12; account in the browser first 10; Git repository 6 |
| Link lifetime with no account | 25 | No expiry 25; 30 days 20; 7 days 15; 1 hour 2; account required 0 |
| Steps to a live link | 15 | 1 step 15; 2 to 3 steps 10; 4 or more 5 |
| Free upload limit | 15 | 100 MB or more, or no published cap 15; 25 MB 12; 10 MB 9; under 10 MB 3 |
| Cost to keep the link online | 15 | $0 15; up to $5 a month 12; up to $10 a month 8; more 3 |
| Host | No account | Lifetime | Steps | Upload | Cost | Total |
|---|---|---|---|---|---|---|
| ship.page | 30 | 15 | 15 | 12 | 12 | 84 |
| Netlify Drop | 30 | 2 | 15 | 15 | 15 | 77 |
| Surge | 12 | 0 | 10 | 15 | 15 | 52 |
| Cloudflare Pages | 10 | 0 | 5 | 15 | 15 | 45 |
| GitHub Pages | 6 | 0 | 5 | 15 | 15 | 41 |
| Tiiny Host | 10 | 0 | 5 | 3 | 15 | 33 |
Steps count signing up as one step, then each action the host requires before a link exists: Cloudflare Pages is sign up, create a project, name it, upload; GitHub Pages is sign up, create a repository, add the file, enable Pages; Tiiny Host is sign up, drop the file, pick a name, publish; Surge is run the command, then create the account in the terminal.
Upload timing test, November 13, 2026
Runs were made from one server in Frankfurt (OVH network) between 02:09 and 02:28 UTC with netlify-cli 27.17.0, wrangler 4.161.0 and curl 8.14.1. A separate upload check measured 213 to 618 Mbit/s, so the client link was not the bottleneck. Payload A was a single 4,000,008-byte HTML file. Payload B was an 18,024,049-byte folder of 41 files: index.html, 19 PNG, 19 JPG, one CSS and one JS file, sent to ship.page as a 17.9 MB ZIP. Every file got a fresh random marker per run, and every run created a new site or project.
"Live" means the first HTTP 200 whose index.html matched the uploaded file byte for byte, polled every 250 ms from the moment the command started.
# ship.page: payload B sends site.zip with Content-Type: application/zip
curl -sS -X POST https://ship.page/deploy -H "Content-Type: text/html" --data-binary @site/index.html
# Netlify, no account
netlify deploy --allow-anonymous --no-build --dir site --created-via cli --json
# Cloudflare Pages, a new project per run
wrangler pages project create sb-bench-<id> --production-branch main
wrangler pages deploy site --project-name sb-bench-<id> --branch main --commit-dirty=true
| Host | Payload | Runs | Median until URL printed | Median until live |
|---|---|---|---|---|
| ship.page | A, 4.0 MB HTML | 3 | 1.45 s | 2.17 s |
| ship.page | B, 18 MB, 41 files | 3 | 5.63 s | 6.19 s |
| Netlify, anonymous CLI | A, 4.0 MB HTML | 2 | 5.41 s | 6.28 s |
| Netlify, anonymous CLI | B, 18 MB, 41 files | 1 | 6.58 s | 7.15 s |
| Cloudflare Pages, Wrangler | A, 4.0 MB HTML | 3 | 8.94 s | 9.87 s at the production URL |
| Cloudflare Pages, Wrangler | B, 18 MB, 41 files | 3 | 9.69 s | 9.94 s at the production URL |
Netlify refused our 4th anonymous deploy of the day with "You've reached the daily limit for anonymous deploys", so it has fewer runs. Cloudflare's numbers exclude wrangler pages project create, which took 3.0 to 3.9 seconds per new project and 8.8 seconds once. The per-deploy URL Wrangler printed failed its TLS handshake for about 2 minutes on new projects, so the table uses the production URL, which was live on the first poll every time. All test projects on Cloudflare were deleted afterwards.
What the scores leave out
Upload speed is reported but not scored, because three timed hosts are not enough to rank six. Uptime, support quality and the terms of service beyond published usage limits are not scored either. Permanence counts only through link lifetime with no account, so Cloudflare Pages, GitHub Pages and Surge lose points for requiring an account, not for how long they keep a site: all three keep sites up with no expiry once you have one. GitHub Pages' rule against online business use is stated on its pages instead of being folded into a number.
When scores change
Each page carries the month its limits and prices were last verified. When a vendor changes a limit, the page, the table above and the affected scores are updated together, and the verification month moves forward.