# Where to host a React single-page app in Europe in 2026

Last updated: 2026-11-10

A React single-page app is a folder of files after `npm run build`, so what decides the host is who runs the build, what a reload of `/settings` returns, and where the API behind it lives. **Eurobase** builds Vite apps from Git, sends unknown paths to `index.html` and can run the API in the same workspace, on plans of €10 or €20 a month with no usage billing. **statichost.eu** is a good pick for a purely static app on an all-European stack, **Bunny.net** for audiences spread across continents, and **Clever Cloud** or **Scalingo** when your backend already lives there.

## React SPA hosts in Europe at a glance

| Platform | Company | Deep links to index.html | Free option | Paid from | Your API on the same platform |
|---|---|---|---|---|---|
| Eurobase | Warsaw, Poland | Built in for Vite apps | Free plan, 2 projects | €10 a month + VAT | Yes: functions, V8 isolates or containers |
| statichost.eu | Stockholm, Sweden | One `_redirects` line | 1 site, 10 GB traffic | €9 a month | No, static files only |
| Bunny.net | Ljubljana, Slovenia | `spa` setting in the CLI, or a 404 rewrite | 14-day trial | $1 monthly minimum, $0.01 per GB in Europe | Edge Scripting, a separate product |
| Clever Cloud | France | Your own Caddyfile rule | Free credits | Billed by instance size | Yes, any of its runtimes |
| Scalingo | Strasbourg, France | NGINX `try_files` rule | 30-day trial | €7.20 a month for 256 MB, excl. VAT | Yes, as another app |

Each price comes from the provider's own pricing page as of 10 November 2026. Bunny.net quotes US dollars.

## Questions to settle before you pick a host

- **The refresh test.** React Router, TanStack Router and similar libraries change the URL in the browser. When someone reloads `/orders/42`, the server has to answer with `index.html`, or the visitor gets a 404. Every host here can do it, but on some you write the rule yourself.
- **Who runs the build.** Vite's docs describe the build as `npm run build` writing to `dist`, and its preview server isn't meant for production. A Git-connected host runs that build on every push. A CDN or bucket expects you to upload the output from your own pipeline.
- **Where the API lives.** Most SPAs call a backend. If it sits on another continent, the page is European but the data isn't. Put the API, the database and the logs on European infrastructure too.
- **Build-time variables.** Vite inlines `VITE_` variables into the JavaScript at build time. Anything in them is public, so keep secrets in the API, never in the bundle.
- **What happens at a limit.** Some plans stop serving when an allowance runs out, others bill overage. Know which one you're on before a launch.
- **The company, not just the region.** A European data center owned by a US group sits under different law than a European company does, as the [EU region vs EU company](/i/eu-region-vs-eu-company-cloud-act) article lays out.

## 1. Eurobase

Connect a repository on GitHub, GitLab, Codeberg, Forgejo or Gitea, and Eurobase builds and serves the app on European infrastructure run by Scaleway, a French provider. A React app built with Vite 6.1.0 or later runs on V8 isolates, and unknown paths already fall back to `index.html` there, so React Router needs no rewrite file. Any extra redirects or headers go in `_redirects` and `_headers` files inside the `public` folder, which Vite copies into the build.

A Create React App project, or any React build you'd rather keep off isolates, takes the other route: in a project that doesn't run on isolates, choose **Static site**. Eurobase runs your build script, serves `dist` or `build` with NGINX in a container, and answers unknown paths with `index.html` too. The API can sit in the same workspace as TypeScript Functions, a Hono app on isolates, or a Node.js, Python or Go container, and coding agents can create and deploy all of it through the MCP server and CLI.

- **Best for:** a React front end and the backend it calls, deployed together on European infrastructure for a fixed monthly fee.
- **Price:** the Free plan includes 2 projects and 25 GiB of file transfer each month. Paid plans cost €10 or €20 a month + VAT per workspace, and members don't add to the bill. You won't see usage charges today: past a limit, new work is refused, isolate apps and Functions stay stopped until the month resets, and containers and static sites carry on.
- **Company:** registered in Warsaw, Poland. GitHub and GitLab Inc. are US companies and count as subprocessors only once you connect one of them.
- **What it lacks:** preview deployments for pull requests, serving locations outside Europe, and managed Postgres, MySQL or Redis. It doesn't hold ISO 27001 or SOC 2 yet; both audits are in progress.

Start with [Deploy a static site](/docs/guides/static-site), or read how [containers and static sites](/docs/containers) run.

## 2. statichost.eu

statichost.eu, from Stockholm, builds a site in any Docker image you name, then publishes the output folder on its Europe-wide CDN. For a Vite app that means a `statichost.yml` with a Node image, `npm install && npm run build` and `dist` as the public folder. Its routing docs give the SPA rule directly: a `_redirects` file containing `/* /index.html 200`, which only applies when no real file matches. Its pricing page says no layer of its stack depends on AWS, Cloudflare or another US cloud.

- **Best for:** a static React app with its API hosted somewhere else, where an all-European supply chain matters.
- **Price:** the free Hobby plan gives you 1 site with 10 GB of bandwidth and 100 build minutes. For €9 a month, Starter allows any number of sites with 500 GB, then charges €1 per extra 10 GB, and includes 5,000 build minutes. Professional costs €49 a month.
- **What it lacks:** server code. Its guides say server rendering isn't supported, and automatic preview links for branches are on its roadmap rather than available.

## 3. Bunny.net

Bunny.net, run by BunnyWay d.o.o. in Ljubljana, puts your files in a storage zone and serves them through a pull zone on its CDN, whose standard network has 119 locations. Its CLI can do the setup: `bunny sites deploy --build` finds the framework, builds with the package manager your lockfile names and uploads the output, though the command is a public preview that may change. A `spa: true` setting in `bunny.jsonc` serves `index.html` for unknown paths. Without the CLI, you set `/index.html` as the storage zone's 404 file and tick the option that turns that 404 into a 200.

- **Best for:** an SPA read on several continents, by a team that's fine wiring deploys into its own CI.
- **Price:** traffic served in Europe and North America costs $0.01 per GB, the monthly bill is at least $1, and the 14-day trial needs no card.
- **What it lacks:** a free plan. Builds run on your machine or in the GitHub Actions workflow that `bunny sites ci init` adds, not on Bunny's side.

## 4. Clever Cloud

Clever Cloud's Static runtime runs a build command you set in `CC_BUILD_COMMAND`, serves the folder in `CC_WEBROOT`, and runs on its smallest instance size, pico. By default it serves files with Static Web Server. If your repository has a valid Caddyfile, it uses Caddy instead, and there you can add a `try_files` rule that falls back to `/index.html`.

- **Best for:** a React front end whose backend is already deployed on Clever Cloud.
- **Price:** set by how many instances you run and how large they are; new accounts get free credits without a card.
- **What it lacks:** a documented SPA fallback for the Static runtime, so the rule lives in a Caddyfile you maintain.

## 5. Scalingo

Scalingo, based in Strasbourg, has no static runtime of its own; its static-files page has you bring a web server. One option is an Express `server.js`. The other is the NGINX buildpack, an `nginx.conf` with `try_files $uri $uri/ /index.html =404;` and a Procfile line `web: bin/run`, where that `try_files` line is the SPA fallback.

- **Best for:** teams moving a Heroku-style stack, with the API as a second Scalingo app.
- **Price:** the smallest container, 256 MB, costs €7.20 a month excl. VAT, rising to €8.64 excl. VAT in its SecNumCloud region. A 30-day free trial comes first.
- **What it lacks:** a ready-made way to serve a build folder. You add the buildpack and config yourself, and the front end is billed like any other container.

## How to choose

- Pick **Eurobase** if you want the SPA, its API and a coding agent's deploys in one European workspace at a flat price.
- Pick **statichost.eu** if the app is purely static and the API is already hosted.
- Pick **Bunny.net** if many users are outside Europe and you already run CI.
- Pick **Clever Cloud** or **Scalingo** if your backend is there and you'd rather not add a provider.

If your app renders on the server instead, see [React Router hosting in Europe](/i/react-router-hosting-europe) or [Next.js hosting in Europe](/i/nextjs-hosting-europe). For docs sites and landing pages, read [static site hosting in Europe](/i/static-site-hosting-europe).

## Frequently asked questions

### Why do I get a 404 when I reload a React Router page?

The browser asks the server for `/settings`, and there's no file with that name. The host has to answer unknown paths with `index.html` so React Router can take over. On Eurobase that's built in for Vite apps, on statichost.eu it's one `_redirects` line, and on Scalingo it's an NGINX rule.

### Can I host a React SPA in Europe for free?

Yes. Eurobase's Free plan covers 2 projects, and statichost.eu's Hobby plan covers 1 site with 10 GB of traffic. Bunny.net has a 14-day trial, then a $1 monthly minimum.

### Is Create React App still fine to deploy?

Its build output is static files, so any host here serves it. The React team deprecated Create React App for new apps in February 2025 and points to frameworks or build tools such as Vite, Parcel and Rsbuild.

### Does a React app in Europe need a global CDN?

Usually not when your visitors are mostly European and the files are served from European servers. If a large share of them sit in Asia or the Americas, a network with locations there, like Bunny.net's, shortens the first load. Eurobase has no serving locations outside Europe.

### Where should the API for my SPA run?

On the same side of the border as the page. Eurobase runs it as Functions, an isolate app or a container in the same workspace. With statichost.eu or Bunny.net, you host the API on a separate European platform, such as one from the [European PaaS comparison](/i/best-european-paas).

## Sources

- [Vite: deploying a static site](https://vite.dev/guide/static-deploy) and [Sunsetting Create React App](https://react.dev/blog/2025/02/14/sunsetting-create-react-app)
- [Eurobase static site guide](/docs/guides/static-site), [Eurobase containers](/docs/containers), [Migrate from Firebase Hosting](/docs/guides/migrate-from-firebase-hosting), [Eurobase plans](/docs/plans), [pricing](/pricing) and [subprocessors](/legal/subprocessors)
- [statichost.eu redirects and rewrites](https://www.statichost.eu/docs/routing/), [build configuration](https://www.statichost.eu/docs/build-config/), [SSG guides](https://www.statichost.eu/docs/ssg-guides/), [preview links](https://www.statichost.eu/docs/preview-links/) and [pricing](https://www.statichost.eu/pricing/)
- [Static site hosting on Bunny Storage](https://bunny.net/docs/storage/static-site-hosting) and [Bunny.net pricing](https://bunny.net/pricing/)
- [Clever Cloud Static runtime](https://www.clever.cloud/developers/doc/deploy/applications/static/), [Clever Cloud pricing](https://www.clever.cloud/pricing/) and [Caddy try_files](https://caddyserver.com/docs/caddyfile/directives/try_files)
- [Scalingo static files only application](https://doc.scalingo.com/platform/app/static-files-hosting) and [Scalingo pricing](https://scalingo.com/pricing)
