Сайт фотографа и собственная быстрая CMS.
Monolizovna.ru: портфолио петербургского фотографа и самописная CMS за ним. На публичной стороне насыщенная фотографиями редакционная витрина: архив работ, отзывы клиентов ровно в том виде, в каком пришли, форматы съёмки и тщательно подобранный гид «где снимать в городе». Загружается быстро: серверный Astro с ленивыми Preact-островами, инлайновый критический CSS и настроенный пайплайн изображений. Закрытая часть: полноценный админ, который я написал с нуля, где она редактирует работы, отзывы, цены, локации и даже тексты самого сайта, с перетаскиванием для сортировки и мгновенной публикацией. Всё сделал я один, от начала до конца, деплой на Docker с GitLab CI.

Единственный разработчик: публичный сайт, админка, модель данных, деплой, всё моё. Astro 5 в режиме SSR с островами Preact (compat), которые гидратируются только там, где страница действительно интерактивна.
Девять Prisma-моделей (работы и фотографии, отзывы, форматы, FAQ, локации, редактируемые тексты сайта, лиды, пользователь-администратор) обеспечивают CMS, достаточно маленькую, чтобы работать из одного SQLite-файла без какого-либо SaaS.
Подписанная JWT-сессия в httpOnly cookie через jose, хэшированные bcrypt-пароли, защита от брутфорса на логине и middleware-охрана каждого маршрута /admin и /api/admin. Без библиотек авторизации, без сторонних сервисов.
Критический CSS инлайнится, чтобы устранить блокирующий запрос: весь документ приходит примерно в 28KB gzipped и рисуется без ожидания дополнительного round-trip за стилями.
Отключил modulepreload-подсказки, которые выстраивали цепочку Base → preload-helper → Lenis, и загружаю библиотеку плавного скролла по первому взаимодействию, так что ничто незначительное не блокирует критический путь.
sharp генерирует адаптивные AVIF/WebP-варианты с blur-up-плейсхолдерами, а LCP hero-изображение предзагружается через HTTP-заголовки, так что начинает скачиваться ещё до парсинга HTML.
Публичный сайт читает SQLite на каждый запрос, поэтому правка в админке публикуется мгновенно без инвалидации ISR-кеша, а ленивая гидратация островов держит отправляемый JS небольшим.
Работы, отзывы, FAQ, форматы съёмки, локации, тексты сайта, лиды и аккаунт: полноценный дашборд, а не лазейка для разработчика.
Работы и отзывы можно переупорядочивать перетаскиванием (sortablejs), переключать видимость на главной и загружать фотографии, которые обрабатываются на сервере через sharp.
Маркетинговые тексты на публичном сайте хранятся как редактируемые ключи site-text, поэтому она может переписать свои заголовки без деплоя.
GitLab CI прогоняет lint → typecheck → build → image → smoke → deploy, продакшн-сервер Express с gzip и годовыми cache-заголовками для ассетов, за Caddy.
Telegram-бот (grammy) ведёт воронку с PDF-подарком и присылает уведомления о новых лидах, с VK-интеграцией (vk-io) для аутрича.
Используют Фотография, Личный бренд и портфолио.
Архив работ с фильтрацией и полноэкранным лайтбоксом, настроенный на скорость, несмотря на то что это сплошные фотографии.
Настоящие скриншоты из мессенджеров, без правок, в карусели и полном архиве.
Три пакета съёмки, каждый редактируется из админки без правки кода.
Подборка и каталогизация локаций для съёмки в Санкт-Петербурге, у каждой своя страница.
Она сама редактирует каждый раздел: работы, отзывы, FAQ, цены, локации и маркетинговые тексты сайта.
Воронка с PDF-подарком, привязанная к Telegram-боту, и VK-интеграция для работы с клиентами.






Живой клиентский сайт. Скриншоты админки работают на демо-контенте; настоящие лиды и личные данные не показаны.