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

  1. Open the live URL in a private/incognito window.
  2. Hard-reload it.
  3. Test a page other than the home page.
  4. Check Console for JavaScript errors and Network for failed files.
  5. 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.