Static sites
Files served exactly as handed, over HTTPS. No build step and nothing to start.
Your files are served exactly as handed, over HTTPS. index.html at the project root is served at
/; other files are served at their paths. There is no build step and nothing to start — good for a
landing page, a docs site, or any pre-built single-page-app bundle.
index.html # served at /
styles.css
app.jsThe static runtime is inferred from an index.html at the project root, and it takes no version —
see Choosing a version.
Routing
| Request | Served |
|---|---|
/ | index.html at the root |
/styles.css | styles.css |
/docs/ | docs/index.html |
/about.html | about.html |
| A path with no matching file | 404 |
Single-page apps that route client-side
There is no fallback rewrite to index.html, so deep links into a client-routed SPA return 404 on
a hard refresh. Three ways round it: use hash routing, pre-render your routes to real files (most
frameworks can), or serve the bundle from a Node app that returns
index.html for unmatched paths.
Deploying a framework build
Frameworks like React, Vue, Svelte and Astro produce a folder of plain files. Build first, then
deploy the output folder — dist, build or out — not the project root. Deploying the source
of a framework project sends a package.json, which infers the Node runtime and looks for a start
script that isn't there.
Under the hood
Static sites are served by nginx from a container built with FROM nginx:1.27-alpine, with your
files copied to the web root. Nothing is compiled, nothing is executed, and no dependencies are
installed — which is why a static deploy is the fastest thing on the platform, and the cheapest. See
Plans & what counts.