How the ZIP is read
The ZIP is unpacked on our side and each file is served at its path inside the archive. The rules are short:
- An
index.htmlat the top becomes the home page. If the archive contains one wrapping folder (my-site/index.html), that folder is removed automatically. - No index.html? If there is exactly one HTML file, it becomes the home page.
- Clean URLs.
/aboutservesabout.htmland/blog/servesblog/index.html. - Single-page apps. Unknown paths fall back to
index.html, so React, Vue or Svelte builds with client-side routing work. - Junk is ignored.
__MACOSX/,.DS_StoreandThumbs.dbare skipped.
Preparing the ZIP
Windows: select the files inside your site folder → right-click → Send to → Compressed (zipped) folder. macOS: select them → right-click → Compress. Zipping the files rather than the folder avoids an extra level, though either works. For framework projects, zip the build output (dist/, build/ or out/), not the source.
Framework build settings that matter
| Tool | Folder to zip | Setting to check |
|---|---|---|
| Vite (React, Vue, Svelte) | dist/ | base: './' or leave the default / (the site is at the root of its subdomain) |
| Create React App | build/ | "homepage": "." is not needed at a subdomain root |
| Next.js | out/ | output: 'export' in next.config.js (static export only) |
| Astro, Eleventy, Hugo, Jekyll | dist/, _site/, public/ | Static output (default) |
Limits
Free: 2 MB per site (ZIP included). Starter 25 MB, Pro 50 MB, Business 75 MB per site, with ZIP uploads up to 25 MB on paid plans. Up to 1,000 files. Executables (.exe, .apk, .dmg…) are refused. If a site is just over the limit, compress images to WebP first — it usually halves the size.
Prefer not to zip?
Choose choose a folder in the upload tab and pick the site folder directly; the browser sends every file with its path. On phones, where folders cannot be picked, a ZIP is the way.