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 --from=builder /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:
bashnpm 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