This is a monorepo containing a VitePress blog and a Nuxt admin dashboard.
.
├── apps/
│ ├── blog/ # VitePress blog (main website)
│ └── admin/ # Nuxt admin dashboard (content management)
├── packages/
│ └── shared/ # Shared utilities and types
└── pnpm-workspace.yaml
- Node.js 18+
- pnpm (for workspace management)
pnpm installRun both apps in parallel:
pnpm devRun individual apps:
# Blog only (http://localhost:5173)
pnpm dev:blog
# Admin only (http://localhost:3001)
pnpm dev:adminBuild blog for production:
pnpm buildBuild admin for production:
pnpm build:adminBuild all apps:
pnpm build:allPreview blog:
pnpm previewPreview admin:
pnpm preview:adminVitePress-based blog with:
- Newsletter integration
- Comments system
- Text-to-speech for articles
- RSS feed
- Sitemap generation
Nuxt-based admin dashboard for:
- Content management
- Newsletter management
- Authentication with Supabase
- Article editing and publishing
The blog is deployed to Vercel using the root vercel.json configuration.
vercel --prodThe admin dashboard should be deployed as a separate Vercel project:
- Create a new Vercel project
- Set the root directory to
apps/admin - Framework preset: Nuxt.js
- Build command:
cd ../.. && pnpm install && cd apps/admin && pnpm build - Output directory:
.output/public
Or use the apps/admin/vercel.json configuration.
Both apps require:
SUPABASE_URLSUPABASE_KEYRESEND_API_KEY(blog only)
Copy .env.example to .env in each app directory and fill in your values.
Available in apps/blog:
newsletter- Send newslettersync:articles- Sync articles from Supabaseimport:articles- Import articles to Supabasetts:generate- Generate text-to-speech audio
Run with:
pnpm --filter @blog/vitepress <script-name>