Static Site Downloads

The download option packages the entire built site as a ZIP archive. It's the universal deploy escape hatch: if a host accepts a folder of static files, the download works. Cloudflare Pages, Vercel, AWS S3, GitHub Pages, Render, a server in your basement — they all serve a SleekCMS-built site without any platform-specific integration.

This page covers what's in the ZIP, how to deploy it, and a few common hosts with specific guidance.


What's in the ZIP

A download contains a complete static site:

my-site/
├── index.html              Homepage
├── about/index.html        Static page
├── blog/
│   ├── index.html          Collection index page (if defined)
│   ├── hello-world/index.html
│   └── nextjs-tips/index.html
├── css/
│   ├── tailwind.css        Compiled Tailwind (if enabled)
│   └── styles.css          Your own CSS files
├── js/
│   └── app.js
├── favicon.ico
├── fonts/
│   └── inter-var.woff2
└── rss.xml                 Any custom page outputs (RSS, sitemap, etc.)

Every URL on your deployed site corresponds to a file in the ZIP. Page paths follow the directory-with-index.html convention (/aboutabout/index.html) which is the universally supported way to serve clean URLs from static hosts.

Images are not in the ZIP. Image content is served from the SleekCMS image CDN — your deployed HTML references those CDN URLs directly. This keeps downloads small and preserves the on-the-fly transformation capability. The same is true for hosted videos and uploaded files: they stay on their respective CDNs.


Generating a Download

From the deploy section in the CMS:

  1. Click Download (or the equivalent download option).
  2. The CMS triggers a fresh build using the current content and templates.
  3. When the build completes, the ZIP is offered as a browser download.

You can download as often as you want. Each download is a fresh build with the current state of your content.


Deploying the ZIP

The deployment steps depend on your host. A few common patterns:

Cloudflare Pages

  1. From the Cloudflare dashboard, create a new Pages project.
  2. Choose the "Direct Upload" option (not the Git-connected option).
  3. Upload the contents of the ZIP (or upload the ZIP itself — Cloudflare extracts it).
  4. The site is served at <project>.pages.dev (or your custom domain).

Subsequent deploys: drag-and-drop a new ZIP into the same project, or use the wrangler CLI for scripted uploads.

Vercel

  1. Install Vercel CLI: npm i -g vercel.
  2. Extract the ZIP locally and cd into the folder.
  3. Run vercel. Follow the prompts; choose a project name; deploy.

Subsequent deploys: vercel --prod from the same folder.

AWS S3 + CloudFront

  1. Create an S3 bucket configured for static website hosting.
  2. Extract the ZIP and upload the contents to the bucket (e.g., aws s3 sync ./extracted-site s3://your-bucket --delete).
  3. Front the bucket with CloudFront for HTTPS and edge caching.
  4. Invalidate the CloudFront distribution on each deploy (aws cloudfront create-invalidation --distribution-id XXX --paths "/*").

GitHub Pages

  1. Extract the ZIP.
  2. Push the extracted folder's contents to the root of a gh-pages branch (or to the configured Pages source branch) in a GitHub repository.
  3. Enable Pages on the repo. The site is served at <user>.github.io/<repo>.

Your own server

Extract the ZIP and serve the folder from any static-file-capable web server — nginx, Caddy, Apache, even Python's http.server for testing. Configure the server to serve index.html for directory requests and handle 404s by serving your 404.html (if you've defined one).

A minimal nginx config:

server {
  listen 80;
  server_name example.com;
  root /var/www/my-site;
  index index.html;
  error_page 404 /404.html;

  location / {
    try_files $uri $uri/index.html =404;
  }
}

Setting the Site Origin

If your deployed URL differs from any defaults (e.g., you're deploying to a custom domain like https://docs.example.com), set the site origin in Site Configuration before downloading. The url() template helper uses the origin when constructing absolute URLs in your HTML — canonical links, OG image URLs, RSS feed URLs, and <base> tags. Setting it correctly before download ensures the deployed HTML references the right public URLs.


Automating ZIP-Based Deploys

For hosts that don't have first-class SleekCMS integration but where you want automated deploys, you have two paths:

  1. Manual download per release. Download, upload to the host. Works fine for low-frequency deploys.
  2. API-driven build trigger from your CI. Use the content API to fetch site content into your own build pipeline, run a Node-based EJS builder there, and deploy from CI. This is essentially "build outside SleekCMS using SleekCMS content" — see Automating using Triggers for how to wire publish events to a CI build.

For most use cases, the first path is sufficient. The download option is fast (typically seconds), and most static hosts accept drag-and-drop uploads.


What's Next