Skip to content
Olimjon Akhmadjonov

Colophon

How this site is built.

This site is its own case study — the same architecture, discipline and defaults I bring to client work. Here is what is under the hood.

Rendering
React Router in SPA mode with build-time prerendering: every page in every language ships as static HTML (instant first paint, full SEO), then hydrates into a client-side app. No Node server in production — static files behind Caddy, and a FastAPI backend for the contact form and the assistant.
Three languages, enforced by types
Every piece of text exists in Russian, Uzbek and English. This is not a convention but a compile-time rule: content fields are typed Localized<T>, so a missing translation is a build error, and tests check quality on top.
Design system
Design tokens drive everything — colours, type, spacing, radii. Two palettes ("Paper & Teal" and the dark "Graphite Paper") switch with your system preference in a 220 ms fade. All motion respects prefers-reduced-motion.
The assistant
The chat streams answers over SSE from an LLM that is grounded only in this site's content. It never draws data itself: it can request typed cards (case study, metrics, next step) that the backend fills from the real content files — so numbers cannot be invented. Rate limits, a daily token budget and a kill switch keep it honest in production.
Security
Strict CSP, HSTS and security headers at the edge; per-IP rate limiting, an HMAC-signed maths challenge and honeypot on the form; IP addresses stored only as salted hashes; RFC 7807 errors; read-only, non-root containers.
Quality
Typed content validated by zod, unit and end-to-end tests including accessibility scans in both themes, strict ruff/mypy on the backend — all enforced in CI on every change. The CV PDF on this site is generated from the same content files, so it never drifts.

Built with React, FastAPI, Tailwind and Caddy · Type set in Geist · No trackers.

Start a project

Tell me about it — a few sentences is enough.

I reply within 1–2 business days. Prefer email? oakhmadjonov.uz@gmail.com