Headless CMS for developer portfolios — an admin panel and public REST API that powers Devcase Web.
This repository is public and source available, not open source under OSI terms. You may view, learn from, and contribute to the code, but you may not offer a competing product or resell it as a service. See License.
Devcase CMS separates content management from presentation:
| Layer | Role |
|---|---|
Admin panel (admin/) | Nuxt 4 SPA for editors — manage pages, projects, solutions, technologies, media, and users |
Admin API (/api/v1/admin/*) | Authenticated CRUD, file uploads, cache revalidation |
Public API (/api/v1/*) | Headless content delivery for frontends — pages, projects, bootstrap data, sitemap |
Content is stored as structured JSON (blocks, metadata) in PostgreSQL and served to decoupled frontends.
This CMS and its APIs are ready to work withDevcase Web — a portfolio site for developers to showcase their projects, powered by the public headless API (/api/v1/*).
| Piece | Repository | Role |
|---|---|---|
| CMS & APIs | devcase-cms (this repo) | Admin panel, content storage, public & admin APIs |
| Frontend | devcase-web | Developer portfolio site — pages, projects, bootstrap data, sitemap |
Run the CMS locally (or point at production), configure the web app with your API base URL, and the two repos work together out of the box.
| Layer | Technology |
|---|---|
| Frontend | Nuxt 4, Vue 3, Nuxt UI, Tailwind CSS 4, Pinia, VueUse, i18n (pt-BR) |
| Backend | Express 5, Node.js, TypeScript, JWT auth |
| Database | PostgreSQL 17, Prisma ORM 7 |
| Dev Tools | Docker Compose, Makefile, Mailpit, ESLint, Prettier |
| Entity | Description |
|---|---|
| Pages | Site pages with slug, JSON content, and blocks |
| Projects | Portfolio entries with technologies and solutions |
| Solutions | Service/solution catalog items |
| Technologies | Tech stack tags linked to projects |
| Files | Media library (images served from /static) |
devcase-cms/
├── admin/ # Nuxt 4 admin panel (SPA)
├── server/ # Express API
│ ├── prisma/ # Schema & migrations
│ └── src/
│ ├── admin/ # Authenticated admin routes, controllers, services
│ ├── web/ # Public headless API (pages, projects, sitemap)
│ ├── errors/ # Custom HTTP errors
│ ├── generated/ # Prisma generated client
│ ├── types/ # Shared TypeScript types
│ └── utils/ # Helpers (pagination, tokens, logger, etc.)
├── docker-compose.yml # Postgres, Mailpit, Redis
├── server.Dockerfile # Multi-stage production build
└── Makefile # Dev & DB shortcuts
Base path: /api/v1 (configurable via API_BASE_PATH).
Public (headless)
| Method | Path | Description |
|---|---|---|
| GET | /bootstrap | Site menu / bootstrap data |
| GET | /pages/:slug | Page by slug |
| GET | /projects/:slug | Project by slug |
| GET | /sitemap | Sitemap entries |
| GET | /health | Health check |
| GET | /static/images/* | Uploaded media |
Admin (JWT required)
| Prefix | Resources |
|---|---|
/auth | Login, register, token refresh |
/admin/page | Pages CRUD |
/admin/project | Projects CRUD |
/admin/solution | Solutions CRUD |
/admin/technology | Technologies CRUD |
/admin/file | Media uploads |
/admin/user | User management |
/admin/revalidate | Trigger frontend ISR revalidation |
- Node.js 24+
- Docker & Docker Compose
- npm
# Clone the repo
git clone git@github.com:lucassimines/devcase-cms.git
# Start Postgres, Mailpit, Redis
make up
# Install dependencies
npm install
cd server && npm install &&cd ..
cd admin && npm install &&cd ..
# Copy env files and adjust as needed
cp server/.env.example server/.env
cp admin/.env.example admin/.env
# Run migrations & seedcd server
npx prisma migrate dev
npx prisma db seed
cd ..# Start everything (Docker + both dev servers)
make run
# Or individually
make dev-server # Express API only (port 8080)
make dev-admin # Nuxt admin panel only (port 3000)| Command | Description |
|---|---|
make run | Start Docker + both dev servers |
make up | Start Docker services |
make dev | Run both dev servers concurrently |
make dev-server | Run Express API only |
make dev-admin | Run Nuxt frontend only |
make down | Stop Docker services |
make clean | Stop Docker + remove volumes |
make prisma-studio | Open Prisma Studio |
make prisma-seed | Seed the database |
make prisma-migrate | Run Prisma migrations |
make prisma-reset | Wipe local public schema |
make db-import-prod | Import production data (schema from migrations) |
make db-dump | Dump local Postgres to backups/ |
| Service | Provider |
|---|---|
| Database | Prisma.io |
| API Server | Render |
| Frontend | devcase-web (Vercel) |
Copyright © 2025–2026 Lucas Simines. All rights reserved.
Licensed under the PolyForm Shield License 1.0.0.
- View, clone, and study the source code
- Run it locally for learning, evaluation, or contributing
- Submit pull requests and improvements
- Offer a product or service that competes with Devcase CMS
- Resell, white-label, or sublicense this software as a commercial product
For commercial use or a separate license agreement, open an issue on GitHub or contact the maintainer directly.
Full terms: LICENSE