Portfolio CMS — Full Stack Developer Portfolio Platform
A production-grade portfolio platform with a full CMS backend, 100 section designs across 3 themes, Cloudflare R2 storage, analytics, and a resume generator — built entirely from scratch.

Overview
This is the platform you're looking at right now. Built from scratch as a full-stack portfolio CMS — not a static site, but a living system with a complete admin panel, dynamic content management, and a design system with 100 interchangeable section layouts.
The Problem
Most developer portfolios are either static files that require code changes to update, or they rely on third-party CMS platforms that add unnecessary complexity and cost. I wanted full ownership — a system I could update from a browser, deploy on my own infrastructure, and extend without limits.
What I Built
Admin CMS
A complete content management system at /admin covering every section of the portfolio. Projects, blog posts, skills, experience, services, testimonials, and site settings are all managed through a clean admin interface with real-time feedback.
Experience manager with drag-to-reorder, published toggle, and sort order control
Rich text editor (Tiptap v3) for blog posts and project content
Image upload with automatic WebP conversion via sharp — stored on Cloudflare R2
Accent color picker with 8 presets + custom hex — stored in DB, injected as CSS variable
Resume module: summary, education, certifications, PDF upload or auto-generation
Design System — 100 Section Variants
Every section of the portfolio has 10 interchangeable designs grouped into 3 themes:
Dark Pro (1–5): Sharp, minimal, developer-focused with electric accent
Glassmorphism (6–8): Frosted glass cards, blur effects, gradient borders
Brutalist (9–10): Bold typography, raw borders, high contrast editorial style
A live preview panel at /admin/preview lets you browse all variants with real data, then apply them with one click. A theme selector applies all sections at once; individual dropdowns allow per-section overrides. Changes reflect on the public site on next page load — no rebuild required.
Analytics
Privacy-respecting visitor analytics built without any third-party tools. Every page view is tracked with IP hashing (SHA-256 + secret salt — irreversible), geolocation via offline geoip-lite, device and browser detection, and bot filtering. The admin dashboard shows total views, unique visitors, top pages, countries, devices, and browsers.
Resume Module
A complete resume management system. Fill in summary, education entries, and certifications through the admin panel. Either upload a custom PDF or click "Generate PDF" to auto-generate an ATS-friendly single-column PDF from your live portfolio data (skills, experience, featured projects) using @react-pdf/renderer server-side. The generated PDF is uploaded to Cloudflare R2 and served from there. A publish toggle gates the public /resume page.
Infrastructure
Deployed on a self-hosted Coolify instance using Docker multi-stage builds. The entrypoint script runs Prisma migrations and seeds the admin user automatically on every container startup — zero manual steps after deploy. All file storage (images, PDFs) goes to Cloudflare R2 with zero egress fees.
Technical Highlights
Next.js 16 App Router with all async APIs (
cookies(),headers(),params)Prisma 7 with custom output path and
@prisma/adapter-pgfor direct PostgreSQL connectionJWT authentication via
josein httpOnly cookies — no sessions, no external auth serviceRate limiting on login endpoint (in-memory, 5 attempts per 15 minutes)
All images converted to WebP on upload (max 1920px, 85% quality) before R2 upload
IP hashing with SHA-256 + JWT_SECRET salt — raw IPs never stored
Server-side PDF generation with
@react-pdf/renderer— no client-side PDF libraries100 React components across 10 sections × 10 variants, all receiving real DB data
Zod v4 validation on every API route, both client and server side
Git branching discipline — feature branches, never direct commits to deployment branch
Key Decisions
Why self-hosted over Vercel? Full control over infrastructure, no cold starts, no function timeout limits for PDF generation, and no per-seat pricing for the CMS.
Why Cloudflare R2 over S3? Zero egress fees. Images and PDFs are served directly from R2's CDN with no bandwidth cost.
Why 100 section variants? The portfolio itself demonstrates the ability to build scalable, configurable UI systems — the variant architecture is a feature, not just aesthetics.