You built a React app and now you want to share it with a real link, not a localhost URL. The good news: a finished React app is just static files, so hosting it is much simpler than most guides make it sound. This walkthrough covers the build for both Vite and Create React App, the zip-and-upload step, the routing gotcha that causes 404s, and how Snapy compares to the usual hosts.
Why React hosting is simpler than it looks
When you run a production build, React (whether you use Vite or Create React App) turns your project into a small set of static files: an index.html plus bundled JavaScript and CSS. There is no server to run. Any host that serves static files can serve your app, which is why you do not need a Git repo, a CLI, or a deploy pipeline.
Step 1: build your app
Run your build:
npm run build
Vite puts the result in a dist folder. Create React App puts it in a build folder. Either way, that folder is your whole app, ready to ship, with index.html at the root and hashed assets alongside it.
Two settings decide whether assets load after upload:
- Vite uses a
baseoption (default/). Leave it as/when the app lives at the root of its link, which is the normal case. - Create React App uses a
homepagefield inpackage.json. If assets fail to load, set"homepage": "."to make paths relative, then rebuild.
A wrong base or homepage is the single most common reason a freshly uploaded app shows a blank page, so it is worth checking before you upload.
Step 2: zip the output
Zip the contents of the dist (or build) folder so index.html sits at the root of the zip, not nested inside an extra folder. Upload the build output, not your src code. Snapy serves the finished files and does not run npm or build for you, which is what keeps it instant and free.
Step 3: get your link
Open the tool for free React app hosting, drop the zip in, and click Get my link. Your app is live on a clean link like my-app.snapy.page, ready to share. No account, files up to 100MB each, links persist, with optional password, expiry, and analytics.
The routing gotcha: refresh 404s and the fix
This is the part that catches most people, so here is exactly what happens.
A standard React Router setup (BrowserRouter) uses clean paths like /dashboard. On a server host, the server is told to send every path back to index.html so React Router can take over. A pure static host serves files exactly as they are, with no such rewrite. The result: the app works and in-app links work, but if someone reloads on /dashboard or opens that deep link directly, the host looks for a /dashboard file, does not find one, and returns a 404.
The reliable fix on static hosting is HashRouter. Routes live after a #, like my-app.snapy.page/#/dashboard, so every path loads through index.html and refresh never 404s.
import { HashRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<HashRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/dashboard" element={<Dashboard />} />
</Routes>
</HashRouter>
);
}
If your app is a single page with no routes, BrowserRouter is fine. For any multi-route app on static hosting, switch to HashRouter before you build.
Troubleshooting
- Blank page after upload: usually a wrong asset path. Fix Vite
base(/) or CRAhomepage(.) and rebuild. - 404 on refresh of a sub-route: switch to HashRouter.
- Nothing loads at all: the zip likely has an extra wrapping folder, so
index.htmlis not at the root. Re-zip the contents directly. - 404 with no
index.html: you uploadedsrcinstead of the build output.
How to update later
Change the app, rebuild locally with npm run build, zip the new output, and upload it again to replace the old version. No Git push, no remote build.
How Snapy compares
Netlify and Vercel connect to a repo and run a build on their servers, which means an account and a pipeline. GitHub Pages needs a repo, a push, and often base-path tweaks. Snapy skips all of it: no repo, no CLI, no remote build, no account. You upload the build output you already have and get an instant link. The trade-off is that Snapy is static only, so a React app that needs server features should run those elsewhere and host the static front end here.
That is the whole process. Try free React app hosting now, or for raw HTML files see free HTML hosting. If you use Next.js, read how to deploy a Next.js site free.
