Portfolio Website
This site — a full-stack personal CMS built with a modular Express/MongoDB API and a Next.js frontend, so every word on it is editable from a real admin panel instead of hardcoded JSON.
Overview
Rather than ship a static template, I built this portfolio as a real full-stack application: a modular Express + MongoDB API underneath, and a Next.js App Router frontend on top — with a JWT-protected admin CMS so every section of the site (profile, experience, projects, skills, education, blog) is editable without touching code or redeploying.
It's deliberately built with the same architecture patterns I use in production: a modular backend (model / service / controller / routes / validation per domain), a typed validation layer at every API boundary, and a frontend that separates server-rendered public pages from a client-heavy admin interface.
Key Features
- Full admin CMS — CRUD screens for profile, work experience, projects, skills, education, and blog posts, plus a contact-message inbox and a lightweight analytics dashboard.
- JWT authentication with short-lived access tokens and an httpOnly-cookie refresh token, including silent session restoration on page reload.
- Blog engine with search, tag/category filtering, pagination, view counts, and automatic read-time calculation.
- Image and PDF uploads to Cloudinary directly from the admin forms, used for project covers, blog cover images, and the downloadable resume.
- SEO by default — per-page metadata, Open Graph tags, JSON-LD structured data, a generated sitemap, and robots.txt.
Technical Highlights
- Server Components fetch directly from the Express API for every public page, so content is server-rendered and indexable without a client-side loading state.
- The admin panel runs on TanStack Query for cache-aware CRUD, with a generic
useAdminResourcehook layer shared across every module instead of duplicating fetch/mutate logic per screen. - Every write endpoint on the API is validated with Zod before it touches Mongoose, so bad input never reaches the database layer.
Impact
The result is a portfolio that's also a working demonstration of the stack it's advertising — the admin panel you'd use to edit this exact page is live at /admin, protected by the same JWT auth pattern described above.


