Here I document all updates and improvements to the site.
Update 2026-06-28 04:42 GMT+5
FixImprovementFeature
🎬 Procedural Animations Control
Procedural animations (Snake, Spider) now don't start automatically. The user decides whether to see them — this saves battery and resources on low-end devices.
What's new:
New AnimationPlayer component with performance warning
Play/Pause buttons for playback control
Choice saved in localStorage
Yellow «⚡ High CPU usage» indicator during animation
🛡️ Mobile Device Compatibility
Safe safeSessionStorage wrapper with try-catch — site works even in incognito mode
Fixed SecurityError: Failed to read the 'sessionStorage' error
⚡ React Code Optimization
Removed useEffect with synchronous setState in ProjectsClient — replaced with derived state
In ThemeSwitcher used useSyncExternalStore instead of useEffect for safe hydration
All ESLint errors fixed: 5 errors → 0
🎨 UI and Styles
Responsive main width via clamp(70%, calc(...), 100%)
Height 100dvh instead of 100% — works correctly on mobile browsers
New utility class .lh-100
Menu renamed: «Changes» → «Updates»
Update 2026-06-25 02:34 GMT+5
FeatureImprovement
🚀 New Changelog Page
Added the «Updates» page (/updates) — a history of all site updates. Now visitors can track how the portfolio evolves.
What's implemented:
Data structure lib/updates.json with localization support
Tags for categorization: Feature, Fix, Improvement
Automatic sorting by date (newest first)
Date formatting in Russian and English
HTML rendering of update content
This page is itself the first entry in the changelog — meta, but nice.
Update 2026-06-11 11:15 GMT+5
ImprovementFeature
🌐 Full Migration to next-intl
The translation system has been completely rewritten using the next-intl library — the industry standard for Next.js App Router.
What changed:
All texts moved from projects.json to messages/ru.json and messages/en.json
Removed the getLocalizedString helper — now using useTranslations and getTranslations hooks
Created i18n/navigation.ts config with defineRouting and createNavigation
Link and usePathname from @/i18n/navigation automatically work with language prefixes
Middleware now uses built-in createMiddleware from next-intl