A photographer's site and its own fast little CMS.
Monolizovna.ru is the portfolio of a Saint Petersburg photographer, and the custom CMS behind it. The public side is an editorial, image-heavy showcase — a works archive, client reviews kept exactly as they arrived, pricing formats and a hand-curated 'where to shoot in the city' guide — and it loads fast: server-rendered Astro with lazy Preact islands, inlined critical CSS and a tuned image pipeline. The private side is a full admin I built from scratch, where she edits works, reviews, pricing, locations and even the site's own copy, with drag-to-reorder and instant publishing. I built all of it solo, end to end, and ship it on Docker with GitLab CI.

Sole engineer: the public site, the admin, the data model, the deploy — all of it. Astro 5 in SSR mode with islands of Preact (compat) hydrated only where the page is actually interactive.
Nine Prisma models (works and photos, reviews, formats, FAQ, locations, editable site texts, leads, the admin user) back a CMS small enough to run from a single SQLite file, with no SaaS in the loop.
A signed-JWT session in an httpOnly cookie via jose, bcrypt-hashed credentials, a rate-limited login, and a middleware guard over every /admin and /api/admin route. No auth library, no third party.
Critical CSS is inlined to kill the render-blocking request, so the whole document arrives in roughly 28KB gzipped and paints without waiting on a stylesheet round-trip.
Disabled the modulepreload hints that chained Base → preload-helper → Lenis, and load the smooth-scroll library on first interaction instead, so nothing non-essential blocks the critical path.
sharp generates responsive AVIF/WebP variants with blur-up placeholders, and the LCP hero image is preloaded over HTTP headers so it starts downloading before the HTML is even parsed.
The public site reads SQLite on every request, so an edit in the admin is live instantly with no ISR cache to bust, while lazy-hydrated islands keep the JS that ships tiny.
Works, reviews, FAQ, pricing formats, locations, the site's own texts, leads and the account — a full dashboard, not a developer's escape hatch.
Reorder works and reviews by dragging (sortablejs), toggle what shows on the home page, and upload photos that are processed server-side through sharp on the way in.
The marketing text on the public site is stored as editable site-text keys, so she can rewrite her own headlines without a deploy.
GitLab CI runs lint → typecheck → build → image → smoke → deploy, and the prod server is Express with gzip and year-long cache headers for assets, behind Caddy.
A Telegram bot (grammy) drives the PDF-freebie funnel and notifies on new leads, with a VK integration (vk-io) on top for outreach.
Built for Photography, Personal brand & portfolio.
A works archive with filtering and a full-screen lightbox, tuned to stay fast even though it is all photographs.
Real messenger screenshots, unedited, in a carousel and a full archive — proof over polish.
Three shooting packages, each one editable from the admin without touching code.
A curated, categorized guide to Saint Petersburg shooting locations, each with its own page.
She edits every section herself: works, reviews, FAQ, pricing, locations and the site's own marketing copy.
A PDF freebie funnel wired to a Telegram bot, plus a VK integration for reaching clients.






Live client site. The admin screenshots run on seeded demo content — no real leads or personal data are shown.