Skip to content

What you can publish

Static files. HTML, CSS, JavaScript that runs in the browser, images, fonts. Nothing runs on our machines.

How a request is answered

A request for a directory serves the index.html inside it. So /about/ serves /about/index.html, and the root of your site serves the index.html at its top level.

Anything that doesn’t match a real file is a 404.

The index.html rule differs by door, on purpose

A site is entered through index.html at its top level. Without one, the front door answers 404 — and the two ways in treat that differently.

From your browser, it publishes anyway. You get a warning before and after, and the dashboard tells you exactly what to re-upload. That is deliberate: the usual cause is a .zip with a wrapper folder inside it, which is worth diagnosing rather than rejecting, and it leaves room for a site published only to hand out a direct link to a single file.

From an agent, inline publishing is refused. There is no dashboard in that conversation to carry the advice, and the call would otherwise mint a site against your limit that nobody could ever enter.

The name is matched exactly. Index.html is not index.html.

No single-page-app fallback

There is no rewrite-everything-to-index.html. A client-side router that depends on unknown paths falling back to your index.html will 404 on every route except the one that happens to exist as a file.

If you are publishing a router-based app, build it to static paths — one real file per route — or use hash-based routing, which never leaves the root document.

Your own 404 page will not be used

A 404.html in your bundle is just a file. Unmatched requests get the platform’s branded error page, not yours.

File types

Common web types — HTML, CSS, JS, images, fonts, JSON, plain text — are served so browsers render them.

Anything outside that list is sent as a download instead of being displayed. This is the mechanism behind “my file downloads instead of opening”: the type isn’t on the allowlist, so it is delivered as an attachment. Rename to a known extension if the content really is one.

Compression is ours

Responses are compressed for you. Any .gz files in your upload are discarded and regenerated — shipping pre-compressed assets is wasted effort rather than an optimisation, and occasionally an actively wrong one if the .gz doesn’t match its source.

robots.txt is ours

The platform serves its own robots.txt, and it takes precedence over one in your bundle. Crawler behaviour is controlled by your visibility setting, not by a file you upload. A robots.txt in your site will not be the one in force.

Symbolic links

Refused. An archive containing them is rejected rather than silently flattened.

Structural limits

Paths can be at most 20 directories deep and 1024 bytes long in total. Both are far beyond what an ordinary site needs, and an archive that exceeds them is usually a packaging accident.