Static sites
Serve HTML, CSS, and JavaScript from a URL without running a container.
A static site serves files straight from object storage. There is no container, so nothing to size, nothing to keep warm, and no cold start. You are billed on the data stored and served, not on CPU or memory.
Use it for marketing sites, documentation, single-page apps, and the built output of tools like Vite, Next.js (static export), Astro, or Hugo.
Creating a site
- Click + Add and choose Static Site.
- Enter a name.
- Click Apply in the Apply Changes bar.
The site gets a Site URL immediately. Until you publish files, it has nothing to serve and shows as not being served.
Publishing files
Open the service panel to the Files tab. You can publish a whole site from a zip in one step, or upload individual files.
Published files are live straight away. There is nothing to deploy and no restart — the next request gets the new file.
Publishing from a zip
This is the quickest way to put a built site online, and the one to use for a site of any size.
- Build your site.
- Zip the output — your
dist,build,out, orpublicfolder. - Drag the zip onto the Files tab, or click Publish zip and choose it.
- Check what the dialog says it will do, then click Publish.
Folders inside the zip come across as they are, so an assets/ folder keeps working without you recreating it by hand.
It does not matter whether you zipped the folder or its contents. If the whole site sits inside a single folder, and your index document is inside that folder, the folder is removed on the way in — so zipping dist itself still puts index.html at the root of your site rather than at dist/index.html.
Replace the site's current files is on by default: the site ends up as exactly what is in the zip, and anything the zip does not contain is deleted. This is what you want when publishing a fresh build. Uncheck it to add the zip's files to what is already there, leaving the rest untouched.
Extras that Mac and Windows add to a zip — __MACOSX, .DS_Store, Thumbs.db — are left out rather than published.
| Limit | Size |
|---|---|
| Zip file | 256 MB |
| Contents once unpacked | 1 GB |
| Files in one zip | 20,000 |
| Any single file | 128 MB |
For a site larger than that, publish it as more than one zip: send the first with Replace the site's current files checked, and the rest with it unchecked.
Uploading individual files
Drag files onto the Files tab, or use Upload, to add or overwrite them one at a time. This is the quicker route for correcting a typo on a page or swapping an image; it never deletes anything you do not name.
The file count and last published time in the panel tell you what is currently live.
Files can also be published through an AI agent — the site accepts file contents directly, so you do not need Docker to deploy one.
Index and error documents
Two settings control how paths are resolved:
| Setting | Default | What it does |
|---|---|---|
| Index document | index.html | Served when a request lands on a directory, including the site root. |
| Error document | 404.html | Served when the requested path does not exist. |
For a single-page app that does its own routing, set the error document to index.html too. Any unknown path then loads your app, which reads the URL and renders the right view.
Custom domain
- Open the service panel → Custom domain.
- Enter your domain, for example
www.example.com. - Copy the CNAME target shown under Point your DNS here.
- Create that CNAME record at your DNS provider.
Once the record is visible, the domain goes live and HTTPS is set up automatically. You do not upload a certificate, and renewals are handled for you.
Most DNS providers do not allow a CNAME on a root domain such as example.com. Use a subdomain like www, and redirect the root to it using your registrar's redirect feature.
To remove the domain, click Delete Domain, then delete the CNAME record at your provider.
Deleting a site
Open the service panel → Delete Site, then apply the change. All published files are deleted with it.