About this site
This portfolio is built as a windowed interface: folders on the desk, cases opening in windows, the address bar updating without page reloads. Windows can be dragged, minimized into the dock, maximized and cascaded from the keyboard.
How it is built
Astro serves static files, the window manager is a single Preact island. All page scripts fit in 20 kilobytes, the first screen in 100. Cases and folders are markdown files and yaml descriptions validated against schemas at build time: a missing field breaks the build instead of showing up as a blank spot in production.
Without JavaScript the site stays a plain page with links: windows turn into text, folders into lists. Every window is a real address — share it and it opens as the same window. Moving a case between folders does not break old links: the previous addresses are stored in the case file itself and the redirects are generated from it at build time.
The theme switches from the menu and the choice is remembered. The Russian and English versions are symmetrical, and the language is picked from the browser header by weight rather than by taking whatever comes first.
The agent in the terminal
The entrance is a terminal window with a live agent. It knows my work from the inside: projects, numbers, decisions, pitfalls. It answers from a curated brief rather than from guesswork, and stays on topic: my work and how I approach it.
Under the hood it is Node with Fastify, the answer is streamed over SSE, and conversations are logged without raw IP addresses. The topic is constrained by the system prompt, and roles in the dialogue go through an allowlist so a visitor cannot pass their own message off as a system one. There are length caps, per-IP rate limiting and a hard spending ceiling: the gateway is prepaid, so the bill cannot grow past what was paid upfront. If a visitor wants to get in touch, the agent recognizes that from the meaning of the message and forwards the contact to my Telegram — no form, no buttons.
About the texts
The cases come from real work, not from job ads. Dates, shares and commit counts are checked against the projects’ git history. Where a client is under NDA the project is described without names or domains; where a skill is partial, it says so instead of being smoothed over.