Deploy Slidev presentations to the web. Use this skill for GitHub Pages, Netlify, Vercel, and Docker deployments.
Install
npx skillscat add yoanbernabeu/slidev-skills/slidev-deployment Install via the SkillsCat registry.
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 buildOr via npm script:
npm run buildOutput
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-notesGitHub 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@v4Push to trigger deployment
Access at:
https://<username>.github.io/<repo>/
Method 2: gh-pages Branch
npm install -D gh-pagesAdd to package.json:
{
"scripts": {
"deploy": "slidev build --base /repo-name/ && gh-pages -d dist"
}
}Then:
npm run deployNetlify
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 = 200Push 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
vercelMethod 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-presentationDocker Compose
version: '3.8'
services:
presentation:
build: .
ports:
- "8080:80"
restart: unless-stoppedSelf-Hosted (Static Server)
Using serve
npm install -g serve
npm run build
serve distUsing http-server
npm install -g http-server
npm run build
http-server distUsing Python
npm run build
cd dist
python -m http.server 8080Base 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-notesRemoves 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.comAccess 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 stepTroubleshooting
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 distUse 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