Перейти к содержимому
Олимжон Ахмаджонов

О сайте

Как устроен этот сайт.

Этот сайт — сам по себе кейс: та же архитектура, дисциплина и настройки по умолчанию, что и в работе для клиентов. Вот что под капотом.

Рендеринг
React Router в режиме SPA с пререндерингом на этапе сборки: каждая страница на каждом языке — это статический HTML (мгновенная первая отрисовка, полноценное SEO), который затем гидрируется в клиентское приложение. В продакшене нет Node-сервера — статика за Caddy и FastAPI-бэкенд для формы и ассистента.
Три языка под защитой типов
Каждый текст существует на русском, узбекском и английском. Это не договорённость, а правило компиляции: поля контента типизированы как Localized<T>, поэтому отсутствующий перевод — ошибка сборки, а качество дополнительно проверяют тесты.
Дизайн-система
Всем управляют дизайн-токены — цвета, типографика, отступы, радиусы. Две палитры («Paper & Teal» и тёмная «Graphite Paper») переключаются вслед за системной темой с фейдом 220 мс. Вся анимация уважает prefers-reduced-motion.
Ассистент
Чат стримит ответы по SSE от LLM, которая опирается только на материалы этого сайта. Данные модель не рисует сама: она может запросить типизированные карточки (кейс, метрики, следующий шаг), которые бэкенд заполняет из настоящих файлов контента — выдумать цифры невозможно. Лимиты по IP, дневной бюджет токенов и рубильник держат её в рамках.
Безопасность
Строгие CSP, HSTS и security-заголовки на входе; лимиты по IP, math-проверка с HMAC-подписью и honeypot в форме; IP-адреса хранятся только как солёные хэши; ошибки в формате RFC 7807; контейнеры read-only и не под root.
Качество
Типизированный контент с валидацией zod, юнит- и e2e-тесты, включая проверки доступности в обеих темах, строгие ruff/mypy на бэкенде — всё это выполняется в CI на каждое изменение. PDF-резюме на сайте генерируется из тех же файлов контента и не может разойтись с сайтом.

Собрано на React, FastAPI, Tailwind и Caddy · Шрифт Geist · Без трекеров.

Обсудить проект

Расскажите о задаче — достаточно нескольких предложений.

Отвечаю в течение 1–2 рабочих дней. Или напишите напрямую: oakhmadjonov.uz@gmail.com