Host a single page app with working routes.
Zip your build and drop it here. Every route your app handles, like /about or /orders/1042, loads the app instead of a 404, and the site lives at its own address.
- 25MBa file on the free plan
- 10 linkslive at once, free
- No capon visitors, on any plan
What they see
Deep links open the right screen.
Send a link straight to a screen inside your app and it opens there. Refreshing the page keeps the person where they were. The site lives at its own nudgehost.site address, and a site uploaded without an account carries a small NudgeHost bar along the bottom until you claim it with a free account.
- Deep links and refreshes load the app
- Its own nudgehost.site address
- A missing file still returns a 404
How routing works
One HTML page, many screens.
A single page app loads one index.html, then its router swaps screens and updates the address bar without asking the server for a new page. The catch comes when someone opens a deep link or refreshes. The browser asks the server for /orders/1042, and a plain static host has no file there, so it answers with a 404. NudgeHost sends the app instead.
| The browser asks for | NudgeHost sends | Why |
|---|---|---|
| / | index.html | The front page of the app |
| /assets/index.js | That file | It's in the build |
| /help | help.html | A real page file wins over the app |
| /orders/1042 | index.html | No file and no extension, so the app loads and its router shows order 1042 |
| /images/old-logo.png | A 404 | It has an extension and isn't in the build |
Nothing to configure. There's no rewrite rule to write and no 404.html trick to copy into the build.
Before you upload
Zip the folder your build writes.
Upload the build output, not the project source. Zip the folder itself or what's inside it, and the site comes out the same.
A Vite app in React, Vue or Svelte
Vite writes the build to dist. Zip that folder. Its asset paths start from the root of the address, which is where a nudgehost.site site serves from.
A Create React App project
Create React App writes the build to a folder called build. Zip it and drop it in, and React Router's routes load the app at any depth.
An app with a few real pages
When the build includes a page file, such as help.html or help/index.html, that path serves the file. Only paths with no file of their own fall back to the app.
How it works
From build to live app in three steps.
Build the app
Run your build the usual way. It writes an index.html and the files it loads into one output folder.
Zip the output and drop it
Zip dist for Vite or build for Create React App, and drag the ZIP onto the uploader. Signed out, it can be up to 25MB, and you can keep 3 links live at a time.
Share any route
The app goes live at its own address. Send the front page, or add a route to the end and send someone straight to that screen.
After you ship it
New builds go to the same address.
Updating works on every account plan. Your own domain comes with Pro and Studio.
Upload the next build over the last
Zip the new build and upload it from your dashboard. The address, the view count and any password or end date stay the same, and every deep link you've sent keeps working.
Put it on your own domain
Pro attaches one domain you own and Studio five, on a subdomain such as app.yourcompany.com. Routes fall back to the app there too, except addresses starting /api/, which return a 404.
Publish from your build script
The API and the MCP server work on the free plan, so a script or an AI assistant can upload each build and hand back the address.
Plans
What your app gets on each plan.
| Without an account | Free | Pro | Studio | |
|---|---|---|---|---|
| Largest ZIP served as a site | 25MB | 25MB | 100MB | 100MB |
| Largest site once unpacked | 25MB | 25MB | 250MB | 1GB |
| Links live at once | 3 | 10 | Unlimited | Unlimited |
| How long a link lasts | 7 days | Until you delete it | Until you delete it | Until you delete it |
| Open tracking | Not included | Open counts | Time and country of each open, CSV export | Same as Pro |
| Password protection | Not included | Not included | Yes | Yes |
| Custom domains | Not included | Not included | 1 | 5 |
| Price | $0 | $0 | $12 a month | $29 a month |
QR codes, end dates and replacing a site work on every account plan. A site uploaded without an account shows a small NudgeHost bar until you claim it with a free account.
Compared
NudgeHost and Tiiny.host, for an app build.
The differences that matter when a built app has to reach the people testing it.
| NudgeHost | Tiiny.host | |
|---|---|---|
| Free plan | 25MB a file, 10 live links | 3MB a file, 1 project |
| Publishing without an account | Yes, up to 25MB | Account needed first |
| REST API | Free plan and up | Solo and above |
| Banner on a free site | None on a free account | Tiiny Host banner |
| Visits a month | No cap | 5,000 |
| Keeping the site online | Nothing to do | Sign in at least once every three months |
Figures last verified 9 October 2026, from each service’s published plans.
Read the full comparisonApps and hosting
Why a single page app needs the right host.
A single page app is a static site with one twist. Its addresses don't match files. A host that only serves files breaks every link past the front page, which is why so many guides end with a rewrite rule or a copied 404.html. NudgeHost checks for a real file first and sends the app for every other address without a file extension, so the router gets the address it expects.
The steps are the same whether you're shipping a React build or a Vue build, and the upload works like any other zipped site.
For a site made of separate pages instead of one app, free hosting for static sites covers it the same way. The free plan keeps 10 links live with no end date.
Frequently asked questions
What is a single page app?
A website that loads one HTML page and then draws every screen with JavaScript. Its router changes the address bar as you move around, without loading a new page from the server. Most React, Vue and Svelte apps work this way.
Will refreshing a page in my app work?
Yes. When someone refreshes /orders/1042, the browser asks for that address, NudgeHost finds no file there and sends index.html, and your router shows the same screen again.
Do I need hash routing?
No. Ordinary routes like /settings work, because any path with no file and no extension loads the app. Hash routes like /#/settings work too, if your app already uses them.
What happens to a missing image or script?
It returns a 404. Only paths with no file extension fall back to the app, so a broken asset link shows up as an error instead of loading your app where an image should be.
What about a route with a dot in it?
A path whose last part contains a dot, such as /users/jane.doe, is treated as a file, so it returns a 404 when no file matches. Keep dots out of the last part of a route, or use a hash route for those screens.
What if a route has its own page file?
That file wins. A path that matches a file in the build, such as help.html or help/index.html, serves that file, and only paths with nothing of their own load the app.
Do I need to set a base path?
No, as long as the build expects to sit at the root of its address, which is the default for Vite and Create React App. A nudgehost.site site serves from the root, so asset paths like /assets/index.js resolve where the build expects them.
Which folder do I zip?
The one your build writes, usually dist for Vite and build for Create React App. Zip the folder itself or the files inside it. NudgeHost strips a single wrapper folder, so both give the same site.
Can I use my own 404 page?
A 404.html in the ZIP isn't used. Any path with no file extension loads your app, so your router can show its own not-found screen. A path with an extension and no file returns a plain 404.
Does server-side rendering work?
No. NudgeHost serves the files in your ZIP and runs no code on the server, so API routes and server-side rendering need a different host. A framework's static export, such as a Next.js app built with output set to 'export', works.
How do I ship a new build?
Zip the new build and upload it over the old one from your dashboard, on any account plan. The address, the view count and any password or end date stay the same.
Can I upload it without making an account?
Yes. The app goes live straight away and lasts 7 days, and you can hold 3 links at once. Until you sign up and claim it, every page shows a small NudgeHost bar along the bottom.
Will search engines index my app?
Not at its nudgehost.site address. Those addresses ask search engines not to list them, so the app is for the people you send it to. Connect your own domain on Pro or Studio and the app on that domain can be indexed like any other website.
How big can the build be?
On the free plan, the ZIP and the unpacked site both have to fit in 25MB. On Pro and Studio the ZIP can be up to 100MB, and the site it unpacks into can grow to 250MB on Pro or 1GB on Studio.
Get file-sharing tips that actually help.
One email a month. No spam, no fluff.
Ready to share your file?
Free forever, no credit card needed. The whole thing takes a few seconds.