Deploying Quarto Websites to the Cloud: A Practical Guide
Why Quarto for Technical Websites
Quarto has emerged as the go-to publishing system for data scientists and technical teams. It renders R, Python, Julia, and Observable code into beautiful websites, documents, and presentations — all from plain text source files. But once you’ve built your Quarto site locally, you need to get it online.
This guide covers the major deployment options, from zero-config platforms to enterprise cloud infrastructure.
Understanding Quarto Outputs
Before choosing a platform, understand what you’re deploying:
- Static websites (HTML/CSS/JS) — the most common output. These are just files that any web server can host.
- Interactive documents — Quarto docs with embedded Shiny components require a server-side R process. These need specialised hosting.
- Non-web outputs — PDFs, Word documents, and presentations are generated locally and don’t need hosting.
Most Quarto projects produce static websites, which gives you the widest range of hosting options.
Quick Start Platforms
GitHub Pages — Free and Simple
The most straightforward option for open-source projects and personal sites. GitHub Pages serves static files directly from your repository.
Setup with GitHub Actions:
# .github/workflows/publish.yml
name: Render and Deploy Quarto
on:
push:
branches: [main]
jobs:
build-deploy:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: quarto-dev/quarto-actions/setup@v2
- name: Render
run: quarto render
- name: Deploy
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./_sitePros: Completely free, unlimited bandwidth, integrated with your repo. Cons: Public repos only (for free tier), no server-side processing.
Netlify — Developer-Friendly
Netlify offers a generous free tier (100 GB bandwidth/month) with excellent developer experience. Connect your repository and Netlify builds and deploys automatically on every push.
Setup:
- Connect your GitHub/GitLab repository to Netlify
- Set build command:
quarto render - Set publish directory:
_site
Netlify also supports deploy previews for pull requests — invaluable for team collaboration.
Cloudflare Pages — Unlimited Bandwidth
Cloudflare Pages offers unlimited bandwidth on its free tier, making it an attractive option for high-traffic sites. Setup is similar to Netlify.
Enterprise Cloud Deployments
AWS: S3 + CloudFront
For production deployments requiring maximum control, AWS’s combination of S3 (storage) and CloudFront (CDN) is the industry standard.
# Render and sync to S3
quarto render
aws s3 sync _site/ s3://your-bucket-name --delete
# Invalidate CloudFront cache
aws cloudfront create-invalidation \
--distribution-id YOUR_DIST_ID \
--paths "/*"Cost: Typically under $5/month for moderate-traffic sites. S3 storage is pennies; CloudFront charges per request.
Google Cloud: Firebase Hosting
Firebase Hosting is Google’s easiest path for static sites. It provides a global CDN, automatic SSL, and simple CLI deployment.
firebase init hosting
# Set public directory to _site
quarto render
firebase deployAzure: Static Web Apps
Azure Static Web Apps provides free hosting with GitHub Actions integration, custom domains, and authentication support.
CI/CD Best Practices
Automate your deployment pipeline from day one. Manual deployment introduces human error and slows iteration.
Key principles:
- Render on CI, not locally. This ensures your site builds from a clean environment, catching dependency issues early.
- Pin your Quarto version. Use
quarto-dev/quarto-actions/setup@v2with a specific version to avoid surprise breaking changes. - Cache dependencies. R and Python package installation is the slowest part of most builds. Cache aggressively.
- Deploy previews for PRs. Netlify and Cloudflare Pages offer this out of the box. For other platforms, deploy to a staging URL on pull requests.
Performance Optimisation
Once deployed, optimise for speed:
- Image optimisation — Use modern formats (WebP, AVIF) and appropriate dimensions. Tools like
sharporimagemagickcan automate this in your build pipeline. - Asset minification — Quarto handles CSS/JS minification by default, but verify this in your
_quarto.ymlconfiguration. - Caching headers — Configure your CDN to cache static assets aggressively (e.g., 1 year for hashed filenames).
- Compression — Enable gzip or Brotli compression at the server/CDN level.
Choosing the Right Platform
| Need | Platform |
|---|---|
| Simplest setup, open source | GitHub Pages |
| Best developer experience | Netlify |
| Unlimited free bandwidth | Cloudflare Pages |
| Maximum control, enterprise | AWS S3 + CloudFront |
| Google ecosystem | Firebase Hosting |
| Microsoft ecosystem | Azure Static Web Apps |
Our Approach
At Kwiz Computing, we use GitHub Pages for our public-facing Quarto sites (including this one) and AWS infrastructure for client projects requiring custom domains, access control, or integration with existing cloud environments.
The fundamental recommendation: deploy early, automate immediately. Getting your content online and iterating in production is more valuable than perfecting your local build. Start with a free tier platform, add CI/CD automation, and only move to enterprise infrastructure when you have a concrete reason.