A modular Next.js CMS starter with a polished admin workspace, PostgreSQL via Prisma, media management, blogging, portfolio content, and lightweight commerce.
- Site:
https://next-cms-demo-six.vercel.app - Admin:
https://next-cms-demo-six.vercel.app/admin/login - Email:
demo@next-cms.demo - Password:
next-cms.demoXu678!
next-cms is a production-oriented starter for studios, freelancers, and product teams that want a self-hosted CMS on a modern Next.js stack without adopting a larger framework.
It ships with a custom admin interface, role-based access, content modules for publishing and portfolio work, optional commerce primitives, email-based contact handling, and deploy-friendly infrastructure choices for Vercel.
- Posts and blog publishing with a focused editor experience
- Projects and work archive for case studies or portfolio content
- Shop module for digital products and service offers
- Media library backed by Vercel Blob
- Contact inbox and message management
- Analytics overview inside the admin workspace
- Multi-user admin with
OWNER,ADMIN, andEDITORroles - Per-post and per-product SEO fields
- Email-confirmed password changes for admin accounts
- Module toggles for blog, projects, shop, and analytics
- Next.js App Router
- React
- Tailwind CSS
- Prisma ORM
- PostgreSQL
- Vercel Blob for uploads
- Nodemailer for transactional email
- Novel editor for rich post editing
The admin supports three roles:
OWNER: protected bootstrap role with full controlADMIN: full operational access, including user managementEDITOR: content-focused access without user or operational controls
The first account created through /admin/login becomes the initial OWNER.
Install dependencies:
npm installCreate your local environment file:
cp .env.example .envApply database migrations:
npx prisma migrate dev --name initStart the development server:
npm run devLoad sample data:
npm run db:seed-dummyAt minimum, configure:
DATABASE_URLDIRECT_URLNEXT_PUBLIC_SITE_URL
Optional integrations:
SMTP_*,CONTACT_*, andAUTH_FROM_EMAILfor email deliveryBLOB_READ_WRITE_TOKENfor media uploadsPAYPAL_CLIENT_ID,PAYPAL_CLIENT_SECRET, andPAYPAL_ENVfor the shop checkout flow
Use the pooled database URL for DATABASE_URL in runtime environments and the direct database URL for DIRECT_URL in Prisma CLI operations.
This project is designed to deploy cleanly on Vercel with PostgreSQL and Blob storage.
Before the first production deployment, apply migrations:
npx prisma migrate deployRecommended production setup:
- Vercel for hosting
- Neon Postgres for the database
- Vercel Blob for media storage
- Disabled modules are hidden from public navigation and their public routes return
404 - Uploaded assets are tracked in the admin media library
- Password changes require email confirmation before the new password is applied
- If you use Neon, prefer the
-poolerhostname forDATABASE_URL
MIT
