Pulled ALL skills from 15 source repositories: - anthropics/skills: 16 (docs, design, MCP, testing) - obra/superpowers: 14 (TDD, debugging, agents, planning) - coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth) - better-auth/skills: 5 (auth patterns) - vercel-labs/agent-skills: 5 (React, design, Vercel) - antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo) - Plus 13 individual skills from various repos Mosaic Stack is not limited to coding — the Orchestrator and subagents serve coding, business, design, marketing, writing, logistics, analysis, and more. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
241 lines
4.2 KiB
Markdown
241 lines
4.2 KiB
Markdown
---
|
|
name: vitepress-deployment
|
|
description: Deploying VitePress sites to various platforms including GitHub Pages, Netlify, Vercel, and more
|
|
---
|
|
|
|
# Deployment
|
|
|
|
Deploy VitePress static sites to various hosting platforms.
|
|
|
|
## Build and Preview
|
|
|
|
```bash
|
|
# Build production files
|
|
npm run docs:build
|
|
|
|
# Preview locally
|
|
npm run docs:preview
|
|
```
|
|
|
|
Output is in `.vitepress/dist` by default.
|
|
|
|
## Setting Base Path
|
|
|
|
For sub-path deployment (e.g., `https://user.github.io/repo/`):
|
|
|
|
```ts
|
|
// .vitepress/config.ts
|
|
export default {
|
|
base: '/repo/'
|
|
}
|
|
```
|
|
|
|
## GitHub Pages
|
|
|
|
Create `.github/workflows/deploy.yml`:
|
|
|
|
```yaml
|
|
name: Deploy VitePress
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
pages: write
|
|
id-token: write
|
|
|
|
concurrency:
|
|
group: pages
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
fetch-depth: 0
|
|
- uses: actions/setup-node@v6
|
|
with:
|
|
node-version: 24
|
|
cache: npm
|
|
- run: npm ci
|
|
- run: npm run docs:build
|
|
- uses: actions/upload-pages-artifact@v3
|
|
with:
|
|
path: docs/.vitepress/dist
|
|
|
|
deploy:
|
|
environment:
|
|
name: github-pages
|
|
url: ${{ steps.deployment.outputs.page_url }}
|
|
needs: build
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/deploy-pages@v4
|
|
id: deployment
|
|
```
|
|
|
|
Enable GitHub Pages in repository settings → Pages → Source: "GitHub Actions".
|
|
|
|
For pnpm, add before setup-node:
|
|
|
|
```yaml
|
|
- uses: pnpm/action-setup@v4
|
|
with:
|
|
version: 9
|
|
```
|
|
|
|
## Netlify / Vercel / Cloudflare Pages
|
|
|
|
Configure in dashboard:
|
|
|
|
| Setting | Value |
|
|
|---------|-------|
|
|
| Build Command | `npm run docs:build` |
|
|
| Output Directory | `docs/.vitepress/dist` |
|
|
| Node Version | `20` (or above) |
|
|
|
|
**Warning:** Don't enable "Auto Minify" for HTML - it removes Vue hydration comments.
|
|
|
|
### Vercel Configuration
|
|
|
|
For clean URLs, add `vercel.json`:
|
|
|
|
```json
|
|
{
|
|
"cleanUrls": true
|
|
}
|
|
```
|
|
|
|
## GitLab Pages
|
|
|
|
Create `.gitlab-ci.yml`:
|
|
|
|
```yaml
|
|
image: node:18
|
|
|
|
pages:
|
|
cache:
|
|
paths:
|
|
- node_modules/
|
|
script:
|
|
- npm install
|
|
- npm run docs:build
|
|
artifacts:
|
|
paths:
|
|
- public
|
|
only:
|
|
- main
|
|
```
|
|
|
|
Set `outDir: '../public'` in config if needed.
|
|
|
|
## Firebase
|
|
|
|
```json
|
|
// firebase.json
|
|
{
|
|
"hosting": {
|
|
"public": "docs/.vitepress/dist",
|
|
"ignore": []
|
|
}
|
|
}
|
|
```
|
|
|
|
```bash
|
|
npm run docs:build
|
|
firebase deploy
|
|
```
|
|
|
|
## Nginx
|
|
|
|
```nginx
|
|
server {
|
|
gzip on;
|
|
gzip_types text/plain text/css application/json application/javascript text/xml;
|
|
|
|
listen 80;
|
|
server_name _;
|
|
index index.html;
|
|
|
|
location / {
|
|
root /app;
|
|
try_files $uri $uri.html $uri/ =404;
|
|
error_page 404 /404.html;
|
|
error_page 403 /404.html;
|
|
}
|
|
|
|
# Cache hashed assets
|
|
location ~* ^/assets/ {
|
|
expires 1y;
|
|
add_header Cache-Control "public, immutable";
|
|
}
|
|
}
|
|
```
|
|
|
|
**Important:** Don't default to `index.html` like SPAs - use `$uri.html` for clean URLs.
|
|
|
|
## HTTP Cache Headers
|
|
|
|
For hashed assets (immutable):
|
|
|
|
```
|
|
Cache-Control: max-age=31536000, immutable
|
|
```
|
|
|
|
### Netlify `_headers`
|
|
|
|
Place in `docs/public/_headers`:
|
|
|
|
```
|
|
/assets/*
|
|
cache-control: max-age=31536000
|
|
cache-control: immutable
|
|
```
|
|
|
|
### Vercel `vercel.json`
|
|
|
|
```json
|
|
{
|
|
"headers": [
|
|
{
|
|
"source": "/assets/(.*)",
|
|
"headers": [
|
|
{
|
|
"key": "Cache-Control",
|
|
"value": "max-age=31536000, immutable"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Other Platforms
|
|
|
|
| Platform | Guide |
|
|
|----------|-------|
|
|
| Azure Static Web Apps | Set `app_location: /`, `output_location: docs/.vitepress/dist` |
|
|
| Surge | `npx surge docs/.vitepress/dist` |
|
|
| Heroku | Use `heroku-buildpack-static` |
|
|
| Render | Build: `npm run docs:build`, Publish: `docs/.vitepress/dist` |
|
|
| Kinsta | Follow [Kinsta docs](https://kinsta.com/docs/vitepress-static-site-example/) |
|
|
|
|
## Key Points
|
|
|
|
- Set `base` for sub-path deployments
|
|
- GitHub Pages requires workflow file and enabling Pages in settings
|
|
- Most platforms: Build `npm run docs:build`, output `docs/.vitepress/dist`
|
|
- Don't enable HTML minification (breaks hydration)
|
|
- Cache `/assets/*` with immutable headers
|
|
- For clean URLs on Nginx, use `try_files $uri $uri.html $uri/ =404`
|
|
|
|
<!--
|
|
Source references:
|
|
- https://vitepress.dev/guide/deploy
|
|
-->
|