Humbat Jamalov
Projects

project · Feb 2026

This Site — Portfolio with its own Admin Panel

Status
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

Auth
scrypt password hash and an HMAC session cookie — no auth library
Ci cd
GitHub Actions to GHCR, pull-based deploy on the host
Hosting
Self-hosted behind Caddy, in a 192 MB container
Styling
Tailwind CSS
Database
PostgreSQL 18 (shared instance)
Language
TypeScript
Framework
Next.js 16 (App Router), React 19