A local preview is helpful, but it is not identical to a deployed static site. Your computer may quietly tolerate file-name casing, local absolute paths, and development-server behavior that a public server will not.
Start with the browser network panel
Open the live URL, press F12 (or Inspect), choose Network, then reload. Red entries tell you which request failed. A 404 on assets/app.js is more useful than guessing from a blank page.
Fix the three most common causes
1. Filename case mismatch
If the HTML asks for images/logo.png but the ZIP contains images/Logo.png, it may work locally and fail after deployment. Make every reference match the actual filename exactly.
2. Absolute local paths
Wrong: <img src="C:\Users\Ana\Desktop\site\hero.jpg">
Wrong: <link href="/Users/ana/site/style.css" rel="stylesheet">
Right: <img src="images/hero.jpg" alt="">
Right: <link href="assets/style.css" rel="stylesheet">
3. The wrong build folder
React, Vue, Astro, Hugo, and similar tools often publish a generated dist or build directory. Upload that generated directory’s contents, not the project root containing source code and configuration.
Single-page apps need special attention
If the homepage works but opening /pricing directly gives a 404, your app is using client-side routing. A static host looks for a real pricing file. The reliable fix is to build each route as a real HTML file, use hash routing where appropriate, or use a routing feature provided by the host. Do not assume a JavaScript router changes server routing.
Use a clean test
- Open the live URL in a private/incognito window.
- Hard-reload it.
- Test a page other than the home page.
- Check Console for JavaScript errors and Network for failed files.
- Correct the source, rebuild the publish folder, and deploy a new ZIP.
For changes to CSS or JavaScript, use a new asset filename such as app.20260921.js or a build tool’s hashed filename. This avoids a browser showing an old cached asset after your new ZIP is live.