slidev-deployment
Deploying Slidev Presentations
This skill covers deploying Slidev presentations as static websites to various hosting platforms, making your presentations accessible online.
When to Use This Skill
- Sharing presentations via URL
- Hosting for conferences/events
- Creating permanent presentation archives
- Setting up CI/CD for presentations
- Embedding presentations in websites
Building for Production
Build Command
npx slidev build
Or via npm script:
npm run build
Output
Creates dist/ directory containing:
index.html- JavaScript bundles
- CSS files
- Asset files
Build Options
# Custom output directory
npx slidev build --out public
# With base path (for subdirectories)
npx slidev build --base /presentations/my-talk/
# Enable PDF download
npx slidev build --download
# Exclude presenter notes (security)
npx slidev build --without-notes
GitHub Pages
Method 1: GitHub Actions (Recommended)
-
Enable GitHub Pages:
- Go to Settings → Pages
- Source: GitHub Actions
-
Create workflow file
.github/workflows/deploy.yml:
name: Deploy Slidev
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build -- --base /${{ github.event.repository.name }}/
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: dist
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
-
Push to trigger deployment
-
Access at:
https://<username>.github.io/<repo>/
Method 2: gh-pages Branch
npm install -D gh-pages
Add to package.json:
{
"scripts": {
"deploy": "slidev build --base /repo-name/ && gh-pages -d dist"
}
}
Then:
npm run deploy
Netlify
Method 1: Netlify UI
- Push code to GitHub/GitLab
- Connect repo in Netlify dashboard
- Configure:
- Build command:
npm run build - Publish directory:
dist
- Build command:
Method 2: netlify.toml
Create netlify.toml:
[build]
command = "npm run build"
publish = "dist"
[build.environment]
NODE_VERSION = "20"
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
Push and Netlify auto-deploys.
Custom Domain
In Netlify dashboard:
- Domain settings
- Add custom domain
- Configure DNS
Vercel
Method 1: Vercel CLI
npm install -g vercel
vercel
Method 2: vercel.json
Create vercel.json:
{
"buildCommand": "npm run build",
"outputDirectory": "dist",
"framework": null,
"rewrites": [
{ "source": "/(.*)", "destination": "/index.html" }
]
}
Automatic Deployment
- Import project in Vercel dashboard
- Connect GitHub repo
- Vercel auto-detects and deploys
Cloudflare Pages
Setup
- Connect repo in Cloudflare Pages
- Configure:
- Build command:
npm run build - Output directory:
dist
- Build command:
- Deploy
wrangler.toml (Optional)
name = "my-presentation"
compatibility_date = "2024-01-01"
[site]
bucket = "./dist"
Docker
Dockerfile
FROM node:20-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
nginx.conf
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
}
Build and Run
docker build -t my-presentation .
docker run -p 8080:80 my-presentation
Docker Compose
version: '3.8'
services:
presentation:
build: .
ports:
- "8080:80"
restart: unless-stopped
Self-Hosted (Static Server)
Using serve
npm install -g serve
npm run build
serve dist
Using http-server
npm install -g http-server
npm run build
http-server dist
Using Python
npm run build
cd dist
python -m http.server 8080
Base Path Configuration
For Subdirectories
If hosting at https://example.com/slides/:
npx slidev build --base /slides/
Or in frontmatter:
---
base: /slides/
---
Root Path
If hosting at root https://example.com/:
npx slidev build --base /
Security Considerations
Excluding Presenter Notes
npx slidev build --without-notes
Removes speaker notes from built version.
Password Protection
For private presentations:
Netlify: Use Netlify Identity or password protection feature.
Vercel: Use Vercel Authentication.
Custom: Add basic auth in server config.
No Remote Control in Build
Built presentations don't include remote control by default.
Environment Variables
In Build
Create .env:
VITE_API_URL=https://api.example.com
Access in slides:
<script setup>
const apiUrl = import.meta.env.VITE_API_URL
</script>
Platform-Specific
Set in platform dashboards (Netlify, Vercel, etc.)
Custom Domain Setup
DNS Configuration
| Type | Name | Value |
|---|---|---|
| CNAME | www | platform-subdomain |
| A | @ | Platform IP |
SSL/HTTPS
Most platforms provide free SSL:
- Netlify: Automatic
- Vercel: Automatic
- Cloudflare: Automatic
- GitHub Pages: Automatic
CI/CD Workflows
GitHub Actions (Full Example)
name: Build and Deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install
run: npm ci
- name: Build
run: npm run build
- name: Export PDF
run: npm run export
- name: Upload Build
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
- name: Upload PDF
uses: actions/upload-artifact@v4
with:
name: pdf
path: '*.pdf'
deploy:
needs: build
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Download Build
uses: actions/download-artifact@v4
with:
name: dist
path: dist/
- name: Deploy to Production
# Add your deployment step
Troubleshooting
Build Fails
- Check Node version (≥18)
- Clear node_modules:
rm -rf node_modules && npm install - Check for syntax errors in slides
Assets Not Loading
- Verify base path configuration
- Check asset paths (use
/prefix for public/) - Rebuild with correct base
Fonts Missing
- Use web fonts
- Check font loading in styles
Blank Page After Deploy
- Check browser console for errors
- Verify SPA routing configuration
- Check base path matches URL
Best Practices
-
Test Build Locally:
npm run build && npx serve dist -
Use CI/CD: Automate deployments
-
Version Your Deployments: Use git tags
-
Monitor Performance: Check load times
-
Keep URLs Stable: Don't change paths frequently
Output Format
When deploying:
PLATFORM: [GitHub Pages | Netlify | Vercel | Docker]
BUILD COMMAND:
npm run build --base [path]
CONFIGURATION FILES:
- [config file name and content]
DEPLOYMENT URL:
https://[your-domain]/[path]/
CHECKLIST:
- [ ] Build succeeds locally
- [ ] Assets load correctly
- [ ] Base path configured
- [ ] SSL/HTTPS enabled
- [ ] (Optional) Custom domain
- [ ] (Optional) Password protection