This Site — Portfolio with its own Admin Panel
- Live
Overview
The site you are reading. Content lives in PostgreSQL rather than in JSON files, and is edited through an admin panel written for it: items, tags, media, translations, site map and CV versions. It builds into a container image on push and deploys itself to a self-hosted server within five minutes.
Project context
Written to replace a file-based site that could not be updated without a commit.
Key features
- Admin panel for every piece of content — items, tags, media, EN/AZ translations, site map, CV versions
- CV generator: pick what goes in, freeze it as a version, print to PDF or download as Word
- Server-side language switching, so the Azerbaijani page is what a search engine sees
- Hand-written SQL and migrations — no ORM, one runtime dependency (pg)
- Push to main builds the image in GitHub Actions, publishes it to GHCR, and a five-minute timer on the host pulls it
Technical details
- scrypt password hash and an HMAC session cookie — no auth library
- GitHub Actions to GHCR, pull-based deploy on the host
- Self-hosted behind Caddy, in a 192 MB container
- Tailwind CSS
- PostgreSQL 18 (shared instance)
- TypeScript
- Next.js 16 (App Router), React 19