From “files on my laptop” to a URL you can send
Getting a static website online is logistics. You already have HTML (or can export it). You need a host that answers with those bytes over HTTPS. StaticHost is that host for finished trees: zip or GitHub of files, HTTPS preview before DNS, certificate after DNS verifies. It does not run npm or Hugo. nginx is try_files $uri $uri/ =404—no SPA fallback to index.html. No email, no CDN SKU, no forever-free tier. Plans: $9, $30, $65, $130.
Personal and simple HTML guides sit beside this procedure: where to host a personal html website, hosting for a simple html website. If your “static site” is really a JS app export, also read static website hosting for javascript applications.
The mental model to keep: the internet will not invent missing files. Whatever directory you treat as the site root must contain every CSS file, image, and script your HTML references. Hosting amplifies structure; it does not repair a messy desktop folder.
Numbered procedure
- Collect the site root. One directory. Top-level
index.html. Images and CSS inside it with working relative paths. If a builder emitteddist/, use that directory—not the repo root.
- Drop what the public should not see. Notes,
.env,node_modules, raw PSD files, private pricing spreadsheets that somehow landed beside the HTML.
- Zip the contents—not the parent. Select the files inside the site folder so the archive opens with
index.htmlimmediately visible. GitHub users: connect the folder that already has that shape. Open the zip listing once before upload and confirm there is no extra top-level folder name wrapping everything.
- Create a StaticHost site. Starter ($9, 1×2 GB) fits most one-pagers. Pro ($30) if you already need staging or a second property. Deploy the zip or sync the repo.
- Open the HTTPS preview. This step is mandatory, not optional polish. Confirm hours, address, and phone on the page if those matter. Hard-refresh. Use the Network panel once.
- Fix and redeploy until the preview is boring. Case-sensitive filenames bite here (macOS authors, Linux hosts). Use deploy history if a new zip is worse.
- Point DNS only after preview approval. Add records from the dashboard. Wait for verification. Wait for the certificate on the custom hostname. Share that hostname when the padlock is real.
Skip: nesting the zip, remote builds, mailbox hunting, SPA rewrite hopes, and announcing the domain in stories before gate five is green.
What to skip
Skip object-storage tutorials for a bakery page. Skip installing nginx on a VPS “for practice” unless learning ops is the actual goal. Skip forever-free hosts if you need commercial staging and clear quotas—and skip StaticHost if you need $0 indefinitely. Skip uploading framework source instead of the built folder. Skip asking support to “enable clean URLs” for a client-side router; the answer is files on disk or hash routes, not a hidden rewrite.
Skip email setup screens that do not exist on this product. MX belongs with a mail provider. The website host’s job ends at files and TLS for those files.
Worked example: bakery one-pager with opening hours
crust.example needs a single page: hero photo, weekday hours, weekend hours, map link, and allergen note. The baker edits HTML in a text editor once a season.
bakery/
index.html
styles.css
croissant.webp
storefront.webp
index.html links styles.css as href="styles.css". You zip the four items so they sit at the archive root. Deploy. Preview shows hours correctly. You notice the croissant image 404s—filename was Croissant.webp on disk with different case; Linux hosting is case-sensitive. Rename, re-zip, redeploy. Only then create DNS for crust.example.
When autumn hours change, edit the HTML locally, zip again, deploy again. No SSH. No plugin updates. Starter ($9) remains enough unless they add a second location site (then Pro at $30 starts to make sense).
Done for the baker: anyone with the link sees hours over HTTPS. Updates are a new zip. Nobody expected the host to send catering quotes by email.
Failure: zipping the parent folder so index.html is nested
The baker’s Downloads folder contains bakery/. They right-click in a way that the archive root becomes bakery/index.html instead of index.html. Deploy “succeeds.” Visiting / returns 404 or a directory listing void because the host’s site root has a single subdirectory and no top-level index.html.
Panic looks like DNS debugging or “is SSL broken?” Reality is archive shape. Fix: unzip locally, confirm index.html is at the first level of what you upload, re-zip from inside the site folder, redeploy. Some tools make “compress bakery” include the folder name as a prefix—always inspect the zip listing before upload.
This failure wastes more first-time launches than certificate timing. Preview would have caught it in thirty seconds if someone opened / before touching DNS. Teach everyone on the launch thread one sentence: “If preview / is wrong, do not touch the registrar.”
A cousin mistake is zipping from inside bakery/ but accidentally including a nested bakery/bakery/ after an earlier extract. Same symptom. Same fix: flatten until index.html is at the upload root.
What done looks like
/shows the bakery page with styles and images.- Hours text matches the paper sign on the door.
- Optional custom domain has verified DNS and a certificate.
- You can replace the zip next month without SSH.
- You did not expect the host to send email or run PHP.
- Deploy history shows at least the current good release.
That is a static website online. Everything after is iteration on copy and photos.
Extra checks that save weekends
Open the preview on a phone using cellular data once—cache and Wi-Fi DNS tricks hide issues. Validate that https:// assets are not mixed with http:// images after the custom cert exists. Confirm the map link points at the right pin. If you add a second page later (catering.html), link it with a real href to a real file; invented paths 404 under StaticHost’s nginx rule.
If you outgrow one page into a small marketing site with staging, upgrade rather than inventing fragile subdirectory schemes for unrelated brands. Storage beyond 2 GB means Pro (10 GB), Scale (30 GB), or Business (100 GB)—usually image weight, not HTML size.
Questions people actually ask
Why is my homepage 404 after a successful upload?
Usually index.html is nested one directory too deep in the zip. Rebuild the archive so index.html is at the root of the upload.
Can I use GitHub instead of zip for a one-pager?
Yes, if the repository (or branch) contains the HTML files to serve. StaticHost will not compile Markdown or run generators for you.
Do I need a CDN for a small bakery site?
No CDN product is included, and most one-pagers do not need a separate CDN project. Keep images modest; serve the files.
Is there a free forever option?
No. Short trial, then paid plans from $9/mo. Choose a forever-free host elsewhere if price must stay zero indefinitely.