[{"data":1,"prerenderedAt":875},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:ru":3,"api:\u002Fapi\u002Fprofile:":8,"api:\u002Fapi\u002Fstats:":19,"api:\u002Fapi\u002Fabout:ru":151,"api:\u002Fapi\u002Fcategories:ru":193,"api:\u002Fapi\u002Fprojects:ru":331},{"email":4,"lang":5,"name":6,"role":7},"djrciv@gmail.com","ru","Ewsirdev","Веб-разработчик: сайты, лендинги и сервисы на Go",{"name":6,"handle":6,"contacts":9,"note":18},{"email":10,"github":12,"telegram":15},{"url":11,"label":4},"mailto:djrciv@gmail.com",{"url":13,"label":14},"https:\u002F\u002Fgithub.com\u002Fewsir247","github.com\u002Fewsir247",{"url":16,"label":17},"https:\u002F\u002Ft.me\u002FEwsirdev","@Ewsirdev","Contacts: Telegram, GitHub, email. This file is the single source of contacts for the site, the contact block, JSON-LD sameAs, security.txt and llms.txt.",{"generated_at":20,"tests_method":21,"note":22,"totals":23,"projects":33},"2026-10-22","go test -list","Lines are non-blank lines. Endpoints are HandleFunc\u002FHandle route patterns (without \u002Fdemo\u002F*). Tests are top-level Test* functions.",{"projects":24,"go_projects":25,"go_lines":26,"go_test_lines":27,"tests":28,"endpoints":29,"html":30,"css":31,"js":32},17,13,26503,12027,418,230,1973,3525,4815,[34,44,53,62,71,78,87,95,101,105,109,113,117,123,131,138,144],{"slug":35,"kind":36,"go_lines":37,"go_test_lines":38,"tests":39,"endpoints":40,"html":41,"css":42,"js":43},"api-gateway","go",2334,1179,48,11,115,139,163,{"slug":45,"kind":36,"go_lines":46,"go_test_lines":47,"tests":48,"endpoints":49,"html":50,"css":51,"js":52},"auth-service",2826,1393,50,35,23,166,500,{"slug":54,"kind":36,"go_lines":55,"go_test_lines":56,"tests":57,"endpoints":58,"html":59,"css":60,"js":61},"booking-slots",891,338,12,18,146,123,309,{"slug":63,"kind":36,"go_lines":64,"go_test_lines":65,"tests":66,"endpoints":67,"html":68,"css":69,"js":70},"finance-tracker",3741,1371,30,45,24,1148,72,{"slug":72,"kind":36,"go_lines":73,"go_test_lines":74,"tests":75,"endpoints":76,"html":77,"css":77,"js":77},"gitpulse",2133,735,32,3,0,{"slug":79,"kind":36,"go_lines":80,"go_test_lines":81,"tests":82,"endpoints":83,"html":84,"css":85,"js":86},"job-queue",2161,833,25,19,138,188,331,{"slug":88,"kind":36,"go_lines":89,"go_test_lines":90,"tests":91,"endpoints":58,"html":92,"css":93,"js":94},"kanban-tasks",871,272,7,102,156,328,{"slug":96,"kind":97,"go_lines":77,"go_test_lines":77,"tests":77,"endpoints":77,"html":98,"css":99,"js":100},"landing-3d","static",201,162,377,{"slug":102,"kind":97,"go_lines":77,"go_test_lines":77,"tests":77,"endpoints":77,"html":59,"css":103,"js":104},"landing-event",122,59,{"slug":106,"kind":97,"go_lines":77,"go_test_lines":77,"tests":77,"endpoints":77,"html":107,"css":108,"js":104},"landing-saas",172,136,{"slug":110,"kind":97,"go_lines":77,"go_test_lines":77,"tests":77,"endpoints":77,"html":111,"css":112,"js":104},"landing-studio",187,109,{"slug":114,"kind":36,"go_lines":55,"go_test_lines":94,"tests":57,"endpoints":40,"html":115,"css":99,"js":116},"link-shortener",119,317,{"slug":118,"kind":36,"go_lines":119,"go_test_lines":89,"tests":75,"endpoints":83,"html":120,"css":121,"js":122},"notes-search",2027,174,192,517,{"slug":124,"kind":36,"go_lines":125,"go_test_lines":126,"tests":127,"endpoints":128,"html":129,"css":121,"js":130},"pixel-wall",2715,1910,77,16,106,625,{"slug":132,"kind":36,"go_lines":133,"go_test_lines":134,"tests":135,"endpoints":25,"html":136,"css":120,"js":137},"raft-kv",2646,895,27,91,213,{"slug":139,"kind":36,"go_lines":140,"go_test_lines":141,"tests":39,"endpoints":91,"html":142,"css":143,"js":122},"realtime-rooms",1822,1313,103,184,{"slug":145,"kind":36,"go_lines":146,"go_test_lines":147,"tests":58,"endpoints":148,"html":149,"css":107,"js":150},"uptime-monitor",1445,589,15,126,369,{"honest":152,"how":158,"intro":174,"lang":5,"principles":177},[153,154,155,156,157],"Почти все проекты учебно-демонстрационные; один сайт — реализованный клиентский, имя клиента не называется. Отзывы и цифры по заказам здесь не заявляются.","Race-детектор (go test -race) на моей рабочей машине не запускается из-за отсутствия C-компилятора; он выполняется в CI.","Свой слой WebSocket не проходил Autobahn Test Suite: корректность проверена собственными тестами. В продакшене разумнее брать проверенную библиотеку.","Демо-данные в проектах (история мониторинга, ссылки, задачи) сгенерированы и помечены в интерфейсах как демо.","Контакты: Telegram, ссылка на GitHub и почта djrciv@gmail.com.",[159,162,165,168,171],{"title":160,"text":161},"Разговор","Выясняем задачу, аудиторию и ограничения. Если сайт не нужен, скажу об этом сразу.",{"title":163,"text":164},"Договорённости","Состав работ, сроки и что считается готовым. Письменно, без сюрпризов.",{"title":166,"text":167},"Сборка","Короткие итерации: промежуточный результат можно открыть и потрогать.",{"title":169,"text":170},"Проверка","Тесты, мобильные экраны, доступность, нагрузка на форму и API.",{"title":172,"text":173},"Запуск","Docker-образ или статика, инструкция по запуску, передача кода.",[175,176],"Я веб-разработчик: делаю лендинги, сайты, веб-приложения и бэкенды, чаще всего на Go. В каталоге 30 проектов: 6 лендингов, 4 многостраничных сайта, 3 веб-приложения, 14 бэкендов и 3 CLI-утилиты; 12 из них работают вживую на Cloudflare. Почти все проекты учебно-демонстрационные: бренды вымышленные, данные демо, код приватный и открывается по запросу. Исключение — один реализованный клиентский сайт (клиента не называю).","Здесь нет отзывов и цифр о заказах: показываю только то, что можно проверить, то есть работающий код, тесты и README с ограничениями. Безопасность проверяю отдельно: подход и таблица закрытых классов уязвимостей на странице «Инженерия».",[178,181,184,187,190],{"title":179,"text":180},"Просто и проверяемо","Стандартная библиотека Go, понятная структура пакетов, тесты на то, что действительно важно: конкурентный захват задач, двойная бронь, протокол WebSocket.",{"title":182,"text":183},"Честные ограничения","В каждом README есть раздел «Ограничения»: один токен вместо ролей, один процесс, at-least-once вместо exactly-once. Лучше сказать заранее, чем объяснять потом.",{"title":185,"text":186},"Доступность по умолчанию","Контраст по WCAG AA, видимый фокус, работа с клавиатуры, уважение к prefers-reduced-motion, mobile-first вёрстка.",{"title":188,"text":189},"Без секретов в коде","Настройки идут через переменные окружения, токены генерируются при старте, если не заданы.",{"title":191,"text":192},"Один бинарник","Фронтенд встроен в Go-сервис через embed, запуск не требует установки зависимостей; для SQLite используется драйвер без CGO.",[194,220,249,275,305],{"slug":195,"title":196,"blurb":197,"variant":198,"palette":199,"layout":200,"count":201,"preview":202,"stack":215},"landings","Лендинги","Одна страница, одна задача. Вёрстка без фреймворков, где это возможно, и один WebGL-эксперимент.","ink","cold","shots",6,[203,207,211],{"slug":110,"title":204,"shot":205,"hue":206},"Полутон: студия света","\u002Fshots\u002Flanding-studio-desktop-sm.webp",212,{"slug":106,"title":208,"shot":209,"hue":210},"Рубильник: трекер подписок","\u002Fshots\u002Flanding-saas-desktop-sm.webp",182,{"slug":102,"title":212,"shot":213,"hue":214},"Малый масштаб: конференция","\u002Fshots\u002Flanding-event-desktop-sm.webp",124,[216,217,218,219],"CSS","HTML","GitHub Actions","JS",{"slug":221,"title":222,"blurb":223,"variant":224,"palette":225,"layout":226,"count":227,"langs":228,"preview":232,"stack":246},"sites","Многостраничные сайты","Сайты со своей структурой, маршрутами и формами: от клиентского проекта до набора нишевых страниц.","honey","mono","frames",4,[229],{"lang":230,"count":231},"TypeScript",1,[233,238,242],{"slug":234,"title":235,"shot":236,"hue":237},"legal-multipage-site","Многостраничный сайт юридической компании","\u002Fshots\u002Flegal-multipage-site-desktop-sm.webp",250,{"slug":239,"title":240,"shot":241,"hue":75},"niche-landings","Каталог демо-лендингов под 10 ниш","\u002Fshots\u002Fniche-landings-desktop-sm.webp",{"slug":243,"title":244,"shot":245,"hue":82},"docs-engine","Сверло: генератор документации на Node.js","\u002Fshots\u002Fdocs-engine-desktop-sm.webp",[218,230,247,248],"Vue 3","Astro",{"slug":250,"title":251,"blurb":252,"variant":253,"palette":254,"layout":255,"count":76,"langs":256,"preview":258,"stack":272},"apps","Веб-приложения","Интерфейс плюс сервер: авторизация, данные, письма. Приложения, в которые входят.","beads","warm","phone",[257],{"lang":230,"count":231},[259,264,268],{"slug":260,"title":261,"shot":262,"hue":263},"bad-club-booking-app","Bad Club: бронирование мест в игровом коворкинге","\u002Fshots\u002Fbad-club-booking-app-desktop-sm.webp",150,{"slug":265,"title":266,"shot":267,"hue":67},"typing-lab","typing-lab: тренажёр слепой печати","\u002Fshots\u002Ftyping-lab-desktop-sm.webp",{"slug":269,"title":270,"shot":271,"hue":67},"budget-split","budget-split: «Поровну», учёт общих расходов","\u002Fshots\u002Fbudget-split-desktop-sm.webp",[230,273,247,274],"Vite","axe",{"slug":276,"title":277,"blurb":278,"variant":279,"palette":280,"layout":281,"count":282,"langs":283,"preview":289,"stack":302},"backend","Бэкенды","Сервисы с API, базой и тестами: в основном на Go, есть и на Python и TypeScript. Фильтр по языку внутри раздела.","ferro","acid","list",14,[284,286,288],{"lang":285,"count":57},"Go",{"lang":287,"count":231},"Python",{"lang":230,"count":231},[290,294,298],{"slug":88,"title":291,"shot":292,"hue":293},"Янтарь: канбан-доска","\u002Fshots\u002Fkanban-tasks-desktop-sm.webp",344,{"slug":114,"title":295,"shot":296,"hue":297},"Короче: сократитель ссылок","\u002Fshots\u002Flink-shortener-desktop-sm.webp",111,{"slug":54,"title":299,"shot":300,"hue":301},"Запись на приём","\u002Fshots\u002Fbooking-slots-desktop-sm.webp",65,[303,285,304,218],"Docker","SQLite",{"slug":306,"title":307,"blurb":308,"variant":309,"palette":199,"layout":310,"count":76,"langs":311,"preview":315,"stack":328},"cli","CLI-утилиты","Программы для терминала: один бинарник, понятные флаги, код выхода, который можно проверить в скрипте.","film","terminal",[312,314],{"lang":285,"count":313},2,{"lang":287,"count":231},[316,319,324],{"slug":72,"title":317,"shot":318,"hue":91},"GitPulse: аналитика git-репозиториев","\u002Fshots\u002Fgitpulse-desktop-sm.webp",{"slug":320,"title":321,"shot":322,"hue":323},"logslice","logslice: анализ логов без зависимостей","\u002Fshots\u002Flogslice-desktop-sm.webp",160,{"slug":325,"title":326,"shot":327,"hue":49},"envguard","envguard: линтер и сейф .env-файлов","\u002Fshots\u002Fenvguard-desktop-sm.webp",[329,303,218,330],"CLI","stdlib only",[332,350,363,375,390,404,417,435,452,471,493,514,538,564,589,611,630,648,668,688,704,718,737,753,770,789,809,828,844,858],{"slug":88,"title":291,"type":276,"category":276,"lang":285,"kind":333,"stack":334,"description":335,"highlights":336,"run":341,"hue":293,"og":342,"shots":343},"api",[285,304,303],"Многопользовательская канбан-доска: регистрация, доски, колонки, карточки с перетаскиванием. Go + SQLite без CGO, фронт встроен в бинарник.",[337,338,339,340],"PBKDF2 и сессии в HttpOnly-cookie","Изоляция данных пользователей","Тесты API","Docker multi-stage","cd kanban-tasks && go run .","\u002Fog\u002Fkanban-tasks.jpg",{"desktop":344,"desktop_sm":292,"mobile":345,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fkanban-tasks-desktop.webp","\u002Fshots\u002Fkanban-tasks-mobile.webp",1280,800,390,844,{"slug":114,"title":295,"type":276,"category":276,"lang":285,"kind":333,"stack":351,"description":352,"highlights":353,"run":358,"hue":297,"og":359,"shots":360},[285,304,303],"Сокращение ссылок с алиасами и сроком жизни, статистика кликов по дням, браузерам и устройствам, дашборд под токеном. IP не хранятся.",[354,355,356,357],"Редирект и учёт кликов","Лимит запросов","Приватная статистика (хэш с солью)","Тесты и Docker","cd link-shortener && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver","\u002Fog\u002Flink-shortener.jpg",{"desktop":361,"desktop_sm":296,"mobile":362,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Flink-shortener-desktop.webp","\u002Fshots\u002Flink-shortener-mobile.webp",{"slug":54,"title":299,"type":276,"category":276,"lang":285,"kind":333,"stack":364,"description":365,"highlights":366,"run":370,"hue":301,"og":371,"shots":372},[285,304,303],"Онлайн-запись на услуги: свободные слоты с учётом длительности и рабочих часов, защита от двойной записи, админ-панель. Вымышленная студия, демо.",[367,368,369,357],"Расчёт свободных слотов","Без двойных записей","Админка для услуг и расписания","cd booking-slots && go run .","\u002Fog\u002Fbooking-slots.jpg",{"desktop":373,"desktop_sm":300,"mobile":374,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fbooking-slots-desktop.webp","\u002Fshots\u002Fbooking-slots-mobile.webp",{"slug":110,"title":204,"type":376,"category":195,"live_url":377,"stack":378,"description":379,"highlights":380,"run":385,"hue":206,"og":386,"shots":387},"landing","https:\u002F\u002Fewsirdev-studio.pages.dev",[217,216,219],"Лендинг вымышленной студии интерьерного света: тёплая палитра, засечный шрифт, SVG-иллюстрация, FAQ и демо-форма. Адаптивный, без внешних картинок.",[381,382,383,384],"Адаптив 390-1280","SVG вместо картинок","Доступные FAQ и форма","Честная демо-форма","cd landing-studio && python -m http.server 8091","\u002Fog\u002Flanding-studio.jpg",{"desktop":388,"desktop_sm":205,"mobile":389,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Flanding-studio-desktop.webp","\u002Fshots\u002Flanding-studio-mobile.webp",{"slug":106,"title":208,"type":376,"category":195,"live_url":391,"stack":392,"description":393,"highlights":394,"run":399,"hue":210,"og":400,"shots":401},"https:\u002F\u002Fewsirdev-saas.pages.dev",[217,216,219],"Лендинг вымышленного SaaS-продукта: тёмный градиентный hero, макет интерфейса на CSS, тарифы, FAQ, демо-форма. Все цены и названия придуманы.",[395,396,397,398],"Макет интерфейса на CSS","Тарифная сетка","Адаптив","Демо-форма без отправки данных","cd landing-saas && python -m http.server 8092","\u002Fog\u002Flanding-saas.jpg",{"desktop":402,"desktop_sm":209,"mobile":403,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Flanding-saas-desktop.webp","\u002Fshots\u002Flanding-saas-mobile.webp",{"slug":102,"title":212,"type":376,"category":195,"live_url":405,"stack":406,"description":407,"highlights":408,"run":412,"hue":214,"og":413,"shots":414},"https:\u002F\u002Fewsirdev-event.pages.dev",[217,216,219],"Лендинг вымышленной однодневной конференции: плакатная типографика, расписание, спикеры-заглушки, условия, демо-форма записи.",[409,410,397,411],"Расписание дня","Плакатная типографика","Без выдуманных имён спикеров","cd landing-event && python -m http.server 8093","\u002Fog\u002Flanding-event.jpg",{"desktop":415,"desktop_sm":213,"mobile":416,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Flanding-event-desktop.webp","\u002Fshots\u002Flanding-event-mobile.webp",{"slug":145,"title":418,"type":276,"category":276,"lang":285,"kind":419,"stack":420,"description":423,"highlights":424,"run":428,"hue":429,"og":430,"shots":431},"Пульс: монитор доступности","infra",[285,304,421,422,303],"SSE","REST API","Монитор доступности: HTTP и TCP проверки по расписанию, аптайм, p50\u002Fp95, детектор инцидентов, живой дашборд на SSE и публичная статус-страница. Go + SQLite без CGO.",[425,426,427,357],"Горутина-воркер на каждую проверку","Инциденты после серии падений","Дашборд на SSE и публичный \u002Fstatus","cd uptime-monitor && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",101,"\u002Fog\u002Fuptime-monitor.jpg",{"desktop":432,"desktop_sm":433,"mobile":434,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fuptime-monitor-desktop.webp","\u002Fshots\u002Fuptime-monitor-desktop-sm.webp","\u002Fshots\u002Fuptime-monitor-mobile.webp",{"slug":79,"title":436,"type":276,"category":276,"lang":285,"kind":419,"stack":437,"description":439,"highlights":440,"run":445,"hue":446,"og":447,"shots":448},"Конвейер: очередь задач",[285,304,422,421,438,303],"Prometheus","Очередь фоновых задач: приоритеты, отложенные и cron-задачи, ретраи с backoff и jitter, dead-letter, идемпотентные ключи, lease с fencing, метрики Prometheus.",[441,442,443,444],"At-least-once с lease и fencing","Ретраи с backoff и jitter + dead-letter","Собственный cron-парсер","Метрики Prometheus и graceful shutdown","cd job-queue && set API_TOKEN=demo&& set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",249,"\u002Fog\u002Fjob-queue.jpg",{"desktop":449,"desktop_sm":450,"mobile":451,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fjob-queue-desktop.webp","\u002Fshots\u002Fjob-queue-desktop-sm.webp","\u002Fshots\u002Fjob-queue-mobile.webp",{"slug":139,"title":453,"type":276,"category":276,"lang":285,"kind":454,"stack":455,"description":458,"highlights":459,"run":464,"hue":465,"og":466,"shots":467},"Комнаты: чат и доска в реальном времени","realtime",[285,456,304,457,303],"WebSocket","Canvas","Комнаты в реальном времени: чат с историей в SQLite, список «кто онлайн», индикатор «печатает», общая доска со штрихами и курсорами, анонимные ники. WebSocket (RFC 6455) написан на stdlib.",[460,461,462,463],"Свой слой WebSocket (RFC 6455) на stdlib","Отключение медленных клиентов и лимиты частоты","Graceful shutdown с кодом 1001","Нагрузочный тест: 360 соединений в 6 комнатах","cd realtime-rooms && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",46,"\u002Fog\u002Frealtime-rooms.jpg",{"desktop":468,"desktop_sm":469,"mobile":470,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Frealtime-rooms-desktop.webp","\u002Fshots\u002Frealtime-rooms-desktop-sm.webp","\u002Fshots\u002Frealtime-rooms-mobile.webp",{"slug":35,"title":472,"type":276,"category":276,"lang":285,"kind":419,"stack":473,"description":480,"highlights":481,"run":486,"hue":487,"og":488,"shots":489},"Шлюз: API-gateway",[285,330,474,475,476,421,438,477,478,479,303,218],"Reverse proxy","Circuit breaker","Token bucket","slog","Vanilla JS","embed","API-шлюз на чистой stdlib: маршруты по хосту\u002Fпрефиксу из JSON-конфига с горячей перезагрузкой без обрыва соединений, балансировка round-robin и least-conn, health-checks, circuit breaker на узел, ретраи идемпотентных запросов, rate limit, хэшированные API-ключи, метрики Prometheus, живой дашборд на SSE.",[482,483,484,485],"Ноль зависимостей: только stdlib","Горячая перезагрузка конфига без обрыва соединений","Circuit breaker на узел и ретраи идемпотентных запросов","Нагрузочный тест: 4000 запросов, 40 клиентов (демо-замер)","cd api-gateway && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fgateway",200,"\u002Fog\u002Fapi-gateway.jpg",{"desktop":490,"desktop_sm":491,"mobile":492,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fapi-gateway-desktop.webp","\u002Fshots\u002Fapi-gateway-desktop-sm.webp","\u002Fshots\u002Fapi-gateway-mobile.webp",{"slug":118,"title":494,"type":276,"category":276,"lang":285,"kind":495,"stack":496,"description":502,"highlights":503,"run":508,"hue":323,"og":509,"shots":510},"Картотека: заметки с поиском","data",[285,304,497,498,499,422,500,501,478,479,303,218],"FTS5","bm25","modernc.org\u002Fsqlite (без CGO)","Markdown (свой безопасный рендер)","SVG force-layout","База Markdown-заметок на Go и SQLite: вики-ссылки [[заметка]] с обратными ссылками и графом связей, полнотекстовый поиск FTS5 (bm25, подсветка, упрощённая русская морфология), история версий с собственным diff, автосохранение с разрешением конфликтов, экспорт и импорт .md.",[504,505,506,507],"Поиск FTS5 с bm25 и подсветкой","Вики-ссылки, backlinks и граф связей","История версий с собственным diff","Свой безопасный Markdown-рендер с тестом на XSS","cd notes-search && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver","\u002Fog\u002Fnotes-search.jpg",{"desktop":511,"desktop_sm":512,"mobile":513,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fnotes-search-desktop.webp","\u002Fshots\u002Fnotes-search-desktop-sm.webp","\u002Fshots\u002Fnotes-search-mobile.webp",{"slug":96,"title":515,"type":376,"category":195,"live_url":516,"stack":517,"description":524,"highlights":525,"run":531,"hue":532,"og":533,"shots":534},"ОКСО Т1: 3D-лендинг","https:\u002F\u002Fewsirdev-3d.pages.dev",[518,519,478,520,521,522,523,218],"HTML5","CSS3","WebGL2","GLSL ES 3.00","Raymarching\u002FSDF","Scroll choreography","Лендинг вымышленного датчика воздуха (демо): объект рисуется одним фрагментным шейдером на чистом WebGL2 без библиотек, четыре SDF-формы перетекают по скроллу, есть SVG-фолбэк, reduced-motion и пауза вне экрана.",[526,527,528,529,530],"Один фрагментный шейдер","WebGL2 без библиотек","Четыре SDF-формы с морфингом по скроллу","SVG-фолбэк и prefers-reduced-motion","Пауза отрисовки вне экрана","cd landing-3d && python -m http.server 8094",90,"\u002Fog\u002Flanding-3d.jpg",{"desktop":535,"desktop_sm":536,"mobile":537,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Flanding-3d-desktop.webp","\u002Fshots\u002Flanding-3d-desktop-sm.webp","\u002Fshots\u002Flanding-3d-mobile.webp",{"slug":132,"title":539,"type":276,"category":276,"lang":285,"kind":495,"stack":540,"description":549,"highlights":550,"run":557,"hue":558,"og":559,"shots":560},"Плот: KV на Raft",[285,541,542,543,330,544,421,545,546,547,548,478,303,218],"Raft","Distributed systems","Consensus","HTTP\u002FJSON","WAL + fsync","Snapshots","Linearizability","Deterministic simulation testing","Учебная реализация Raft с нуля на чистой stdlib: выборы лидера, репликация лога, коммит по кворуму, лог и term\u002Fvote на диске с fsync, снапшоты с компакцией, линеаризуемые чтения (read-index), редирект фолловера на лидера. Тестируется детерминированным симулятором сети и времени с проверкой линеаризуемости; дашборд умеет убивать лидера и рвать сеть (демо).",[551,552,553,554,555,556],"Raft с нуля на stdlib","без raft-библиотек","Детерминированный симулятор сети и времени + проверка линеаризуемости","Лог и term\u002Fvote с fsync","снапшоты и компакция","Дашборд: убить лидера и разорвать сеть (демо)","cd raft-kv && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fraft-kv",290,"\u002Fog\u002Fraft-kv.jpg",{"desktop":561,"desktop_sm":562,"mobile":563,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fraft-kv-desktop.webp","\u002Fshots\u002Fraft-kv-desktop-sm.webp","\u002Fshots\u002Fraft-kv-mobile.webp",{"slug":45,"title":565,"type":276,"category":276,"lang":285,"kind":566,"stack":567,"description":576,"highlights":577,"run":582,"hue":583,"og":584,"shots":585},"Ключница: сервис аутентификации","auth",[285,568,304,499,569,570,571,572,573,574,575,478,479,303,218],"stdlib crypto","JWT EdDSA\u002FEd25519","JWKS","PBKDF2","TOTP","RBAC","REST","OpenAPI 3","Сервис аутентификации и авторизации на Go: EdDSA-JWT с ротацией ключей и JWKS, refresh-токены с ротацией и обнаружением кражи, TOTP-2FA (RFC 6238) с резервными кодами, RBAC, блокировка при переборе, сброс пароля по одноразовому токену, журнал аудита, список устройств, openapi.yaml. Не прошёл независимый аудит, не production-IdP.",[578,579,580,581],"JWT EdDSA и ротация ключей с JWKS","Refresh-токены с ротацией и reuse-detection","TOTP по RFC 6238 с проверкой на векторах RFC","Журнал аудита только на дозапись (триггеры БД)","cd auth-service && set SEED_DEMO=1&& go run .\u002Fcmd\u002Fserver",20,"\u002Fog\u002Fauth-service.jpg",{"desktop":586,"desktop_sm":587,"mobile":588,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fauth-service-desktop.webp","\u002Fshots\u002Fauth-service-desktop-sm.webp","\u002Fshots\u002Fauth-service-mobile.webp",{"slug":63,"title":590,"type":276,"category":276,"lang":285,"kind":333,"stack":591,"description":598,"highlights":599,"run":604,"hue":605,"og":606,"shots":607},"Книга учёта: личные финансы",[285,304,499,422,592,247,230,593,594,595,596,303,218,571,597],"Nuxt 4","Pinia","SVG-графики","vitest","ESLint","CSV import\u002Fexport","Учёт личных финансов: счета в разных валютах с ручными курсами, доходы, расходы и переводы, бюджеты, платежи по cron-подобному расписанию, импорт CSV с превью, отчёты. Деньги только в целых минорных единицах, данные пользователей изолированы, графики нарисованы на SVG без библиотек. Go + SQLite и фронтенд на Nuxt 4.",[600,601,602,603],"Деньги только целыми минорными единицами","Мультивалютность с ручными курсами","Импорт CSV с превью и пробным прогоном","Свои SVG-графики без библиотек","cd finance-tracker && set SEED_DEMO=1&& go run .",140,"\u002Fog\u002Ffinance-tracker.jpg",{"desktop":608,"desktop_sm":609,"mobile":610,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Ffinance-tracker-desktop.webp","\u002Fshots\u002Ffinance-tracker-desktop-sm.webp","\u002Fshots\u002Ffinance-tracker-mobile.webp",{"slug":124,"title":612,"type":276,"category":276,"lang":285,"kind":454,"stack":613,"description":617,"highlights":618,"run":623,"hue":624,"og":625,"shots":626},"Пиксельная стена: общий холст",[285,330,456,614,478,479,615,616,303,218],"Canvas 2D","Binary protocol","Snapshot + journal","Совместный холст 256×256 в духе r\u002Fplace: 16 цветов, кулдаун на сессию и IP, свой WebSocket-слой на stdlib (RFC 6455) с бинарным протоколом (4 бита на пиксель), снимок и дельты, снапшот плюс журнал с восстановлением, таймлапс, зум и пан, мини-карта, экспорт PNG, админ-инструменты. Пет-проект.",[619,620,621,622],"Свой WebSocket (RFC 6455) на stdlib","Бинарный протокол: 4 бита на пиксель","Снапшот + журнал с восстановлением после падения","Таймлапс по журналу изменений","cd pixel-wall && set SEED_DEMO=1&& set ADMIN_TOKEN=secret&& go run .\u002Fcmd\u002Fserver",320,"\u002Fog\u002Fpixel-wall.jpg",{"desktop":627,"desktop_sm":628,"mobile":629,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fpixel-wall-desktop.webp","\u002Fshots\u002Fpixel-wall-desktop-sm.webp","\u002Fshots\u002Fpixel-wall-mobile.webp",{"slug":72,"title":317,"type":306,"category":306,"lang":285,"stack":631,"description":637,"highlights":638,"run":643,"hue":91,"og":644,"shots":645},[285,330,329,632,633,634,635,636,218,303],"git","html\u002Ftemplate","SVG","ANSI","os\u002Fexec","CLI на Go для анализа git-репозиториев без внешних зависимостей (нужен только git): stats с цветами и спарклайнами в терминале, report — самодостаточный HTML-отчёт с тепловой картой активности, churn и горячими файлами, вкладом авторов, bus factor по каталогам, ростом кода по языкам и периодами тишины (светлая и тёмная темы), diff-hotspots между ревизиями и локальный serve на 127.0.0.1. История читается потоком через git log -z --numstat -M. Пет-проект.",[639,640,641,642],"Только stdlib Go, внешний бинарник один: git","Поток git log -z --numstat -M с учётом .mailmap и переименований","Самодостаточный HTML-отчёт: тепловая карта, churn, bus factor, светлая и тёмная темы","Синтетическая история из 100 000 коммитов анализируется около 5 секунд","cd gitpulse && go run .\u002Fcmd\u002Fgitpulse stats .","\u002Fog\u002Fgitpulse.jpg",{"desktop":646,"desktop_sm":318,"mobile":647,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fgitpulse-desktop.webp","\u002Fshots\u002Fgitpulse-mobile.webp",{"slug":234,"title":235,"type":649,"category":221,"stack":650,"description":655,"highlights":656,"run":663,"hue":237,"og":664,"shots":665},"site",[592,247,230,651,652,653,654,303,218],"Bootstrap 5","Zod","Vitest","Playwright","Реализованный сайт юридической и экспертной компании на Nuxt 4: 65 страниц с серверным рендерингом, JSON-LD разметка и 301-редиректы со старого сайта. Заявки уходят через серверный эндпоинт с проверкой Origin, лимитом размера тела и ограничением частоты запросов.",[657,658,659,660,661,662],"65 маршрутов с SSR, sitemap.xml и robots.txt; индексация включается явным флагом окружения","Форма заявок: серверный эндпоинт, проверка Origin, лимит тела 10 КБ, 3 запроса за 10 минут с одного IP, honeypot, опциональная капча","JSON-LD: LegalService, WebSite, BreadcrumbList","Одношаговые 301-редиректы со старых URL и со слешей на конце, заголовки безопасности (CSP, HSTS)","CI\u002FCD: lint, typecheck, Vitest, сборка, Playwright; затем Docker-образ и выкладка на сервер","210 модульных тестов в 13 файлах и 4 набора e2e-тестов","npm install && npm run build && node .output\u002Fserver\u002Findex.mjs","\u002Fog\u002Flegal-multipage-site.jpg",{"desktop":666,"desktop_sm":236,"mobile":667,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Flegal-multipage-site-desktop.webp","\u002Fshots\u002Flegal-multipage-site-mobile.webp",{"slug":260,"title":261,"type":669,"category":250,"stack":670,"description":677,"highlights":678,"run":683,"hue":263,"og":684,"shots":685},"app",[247,273,593,671,672,673,674,675,676],"Vue Router","GSAP","Express","node:sqlite","JWT (httpOnly cookie)","Resend","Демо-приложение на Vue 3 и Express с SQLite: интерактивная карта зала с бронированием мест, личный кабинет и админ-панель с редактором расстановки. Вход без паролей, по одноразовому коду на e-mail.",[679,680,681,682],"Карта зала с зонами (обычные, тихая, VIP, два монитора), фильтром по типу и статусом мест","Админ-панель: обзор, брони, столы, компьютеры, пользователи и перетаскиваемая расстановка зала","Вход по OTP с ограничением попыток и частоты запросов, роль admin задаётся через переменную окружения","Данные для демо создаются сид-скриптом при первом запуске","npm install && npm run dev","\u002Fog\u002Fbad-club-booking-app.jpg",{"desktop":686,"desktop_sm":262,"mobile":687,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fbad-club-booking-app-desktop.webp","\u002Fshots\u002Fbad-club-booking-app-mobile.webp",{"slug":689,"title":690,"type":376,"category":195,"live_url":691,"stack":692,"description":693,"highlights":694,"run":683,"hue":698,"og":699,"shots":700},"dovod-concept","Довод: концепт лендинга экспертной организации","https:\u002F\u002Fewsirdev-dovod.pages.dev",[592,247,230,216,218],"Концепт лендинга на Nuxt 4 для вымышленной экспертной организации: направления услуг, форма консультации с маской телефона, карусель отзывов и страница политики. Компания, отзывы, цифры и контакты придуманы; форма ничего не отправляет.",[695,696,697],"Форма с маской телефона, валидацией и подсказками по ошибкам; в демо показывает «данные не отправляются»","Бесконечная карусель отзывов со свайпом и автопрокруткой","Мобильная панель действий, адаптивная вёрстка, скелетон поверх серверного HTML",215,"\u002Fog\u002Fdovod-concept.jpg",{"desktop":701,"desktop_sm":702,"mobile":703,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fdovod-concept-desktop.webp","\u002Fshots\u002Fdovod-concept-desktop-sm.webp","\u002Fshots\u002Fdovod-concept-mobile.webp",{"slug":239,"title":240,"type":649,"category":221,"live_url":705,"stack":706,"description":709,"highlights":710,"run":683,"hue":75,"og":714,"shots":715},"https:\u002F\u002Fewsirdev-niche.pages.dev",[247,707,708,218],"Vue Router 4","Vite 8","Vue-каталог из десяти самостоятельных лендингов под разные ниши малого бизнеса: у каждого своя палитра, шрифты и структура секций. Каждый лендинг загружается отдельным чанком; весь контент демонстрационный.",[711,712,713],"10 ниш: медицина, мебель, ремонт, онлайн-школа, глэмпинг, юристы, автосервис, салон красоты, кафе, фитнес","Код-сплиттинг по маршрутам, общий набор SVG-иконок","Плашка «Демо-контент» на каталоге и каждом лендинге","\u002Fog\u002Fniche-landings.jpg",{"desktop":716,"desktop_sm":241,"mobile":717,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fniche-landings-desktop.webp","\u002Fshots\u002Fniche-landings-mobile.webp",{"slug":719,"title":720,"type":376,"category":195,"live_url":721,"stack":722,"description":725,"highlights":726,"run":730,"hue":731,"og":732,"shots":733},"dental-concept","Кварц: концепт лендинга стоматологии","https:\u002F\u002Fewsirdev-dental.pages.dev",[217,216,723,614,724,218],"JavaScript","htmlhint","Концепт одностраничного лендинга вымышленной стоматологии в стиле Liquid Chrome Dark: стеклянные карточки, хромированные заголовки и 3D-блоб в виде зуба на canvas. Один HTML-файл без сборки и зависимостей.",[727,728,729],"Анимированный блоб на canvas с учётом prefers-reduced-motion и видимости на экране","Форма записи с маской телефона и доступными сообщениями об ошибках","CI: htmlhint и проверка локальных ссылок и якорей","python -m http.server 8080",190,"\u002Fog\u002Fdental-concept.jpg",{"desktop":734,"desktop_sm":735,"mobile":736,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fdental-concept-desktop.webp","\u002Fshots\u002Fdental-concept-desktop-sm.webp","\u002Fshots\u002Fdental-concept-mobile.webp",{"slug":320,"title":321,"type":306,"category":306,"lang":287,"stack":738,"description":742,"highlights":743,"run":748,"hue":323,"og":749,"shots":750},[287,330,329,634,739,740,741,218,303],"pytest","ruff","mypy","CLI на Python 3.11+ только на стандартной библиотеке: потоково разбирает логи nginx\u002Fapache (combined), JSON-lines, logfmt и syslog (gz, bz2, xz тоже), считает статистику и топы, кластеризует похожие ошибки, ищет скачки нагрузки по z-score и EWMA и собирает один HTML-отчёт с SVG-графиками и тепловой картой. Пет-проект.",[744,745,746,747],"Только стандартная библиотека, pip install ничего не тянет","Кластеры ошибок по шаблону и аномалии двумя методами (z-score и EWMA)","Один самодостаточный HTML-отчёт: SVG, тепловая карта, светлая и тёмная темы","53 теста, ruff и mypy --strict; 1 млн строк combined за 8,2 с (один прогон, Windows, CPython 3.12.10)","logslice report access.log -o report.html","\u002Fog\u002Flogslice.jpg",{"desktop":751,"desktop_sm":322,"mobile":752,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Flogslice-desktop.webp","\u002Fshots\u002Flogslice-mobile.webp",{"slug":325,"title":326,"type":306,"category":306,"lang":285,"stack":754,"description":759,"highlights":760,"run":765,"hue":49,"og":766,"shots":767},[285,330,329,755,571,756,757,758,218,303],"AES-256-GCM","fuzzing","govulncheck","gitleaks","CLI на Go без внешних модулей: check сверяет .env со схемой, scan ищет секреты в дереве и git-истории, diff и doctor проверяют окружения и git-гигиену, seal и unseal шифруют .env в .env.sealed (AES-256-GCM, PBKDF2 600 тыс. итераций), run запускает команду с чистым окружением, report и serve строят отчёт. Значение секрета не попадает ни в вывод, ни в лог, ни в HTML. Пет-проект.",[761,762,763,764],"Значения секретов не печатаются нигде: только тип находки, файл, строка и маска из 4 символов","seal и unseal: AES-256-GCM, PBKDF2 600 тыс. итераций, подмена любого бита файла отвергается","Fuzz-тесты: 4 цели по 20 секунд без падений; govulncheck и gitleaks без находок","Сборки под windows, linux и darwin, только стандартная библиотека","go run .\u002Fcmd\u002Fenvguard check","\u002Fog\u002Fenvguard.jpg",{"desktop":768,"desktop_sm":327,"mobile":769,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fenvguard-desktop.webp","\u002Fshots\u002Fenvguard-mobile.webp",{"slug":771,"title":772,"type":276,"category":276,"lang":287,"stack":773,"description":776,"highlights":777,"run":782,"hue":783,"og":784,"shots":785},"catalog-api","catalog-api: API каталога с поиском",[287,774,304,497,739,740,741,775,303,218],"FastAPI","bandit","API каталога товаров на Python 3.12 и FastAPI: SQLite с полнотекстовым поиском FTS5 (ранжирование bm25), фасеты по категории, цене, наличию, тегам и характеристикам, курсорная пагинация, ETag, импорт и экспорт CSV, история цен, API-ключи с ролями и аудит-лог. Витрина и админка без фреймворка отдаются самим приложением. Пет-проект.",[778,779,780,781],"Поиск FTS5 с bm25, фасеты и курсорная пагинация","API-ключи с ролями admin, editor и reader; в базе только хэши ключей","511 тестов, покрытие 96%; ruff, mypy --strict, bandit, pip-audit и gitleaks без замечаний","Нагрузка: 339 запросов\u002Fс, p95 50 мс при 8 соединениях (Windows, один процесс)","SEED_DEMO=1 python -m app   # http:\u002F\u002F127.0.0.1:8110",265,"\u002Fog\u002Fcatalog-api.jpg",{"desktop":786,"desktop_sm":787,"mobile":788,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fcatalog-api-desktop.webp","\u002Fshots\u002Fcatalog-api-desktop-sm.webp","\u002Fshots\u002Fcatalog-api-mobile.webp",{"slug":790,"title":791,"type":276,"category":276,"lang":230,"live_url":792,"stack":793,"description":798,"highlights":799,"run":683,"hue":698,"og":804,"shots":805},"paste-vault","Конверт: записки с шифрованием в браузере","https:\u002F\u002Fewsirdev-paste.ewsirdev.workers.dev",[230,794,795,796,273,595,797,218],"Cloudflare Workers","D1","Web Crypto","fast-check","Сервис одноразовых записок на TypeScript, Cloudflare Workers и D1: текст шифруется в браузере (AES-256-GCM), ключ лежит только во фрагменте URL и на сервер не попадает. У записки есть срок жизни, пароль и сгорание после первого прочтения. Пет-проект.",[800,801,802,803],"Шифрование в браузере: AES-256-GCM, ключ только во фрагменте URL","Сгорание после прочтения атомарно: ровно один успех из 40 параллельных чтений","52 теста в рантайме workerd, включая property-тесты и фаззинг схемы","Живая версия на Cloudflare Workers + D1","\u002Fog\u002Fpaste-vault.jpg",{"desktop":806,"desktop_sm":807,"mobile":808,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fpaste-vault-desktop.webp","\u002Fshots\u002Fpaste-vault-desktop-sm.webp","\u002Fshots\u002Fpaste-vault-mobile.webp",{"slug":243,"title":244,"type":649,"category":221,"live_url":810,"stack":811,"description":817,"highlights":818,"run":823,"hue":82,"og":824,"shots":825},"https:\u002F\u002Fewsirdev-docs.pages.dev",[812,813,814,815,816,218],"Node.js","JavaScript (ESM)","zero dependencies","Markdown","Cloudflare Pages","Генератор статических сайтов документации, написанный с нуля на Node.js без зависимостей: собственный Markdown-парсер, подсветка кода и офлайн-поиск. Демо-сайт про вымышленную библиотеку «Сверло» собран из 43 страниц на двух языках (RU и EN) и двух версиях (v1 и v2). Пет-проект.",[819,820,821,822],"Свой Markdown-парсер, подсветка кода и клиентский поиск без библиотек","43 страницы, RU и EN, версии v1 и v2, hreflang, sitemap и RSS","131 тест; в CI проверка битых ссылок и якорей","Сайт читается без JavaScript, поиск работает офлайн","npm test && npm run build","\u002Fog\u002Fdocs-engine.jpg",{"desktop":826,"desktop_sm":245,"mobile":827,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fdocs-engine-desktop.webp","\u002Fshots\u002Fdocs-engine-mobile.webp",{"slug":265,"title":266,"type":669,"category":250,"live_url":829,"stack":830,"description":834,"highlights":835,"run":683,"hue":67,"og":840,"shots":841},"https:\u002F\u002Fewsirdev-typing.pages.dev",[592,247,230,831,832,833,634,595,274,816],"IndexedDB","WebAudio","PWA","Тренажёр слепой печати, который целиком работает в браузере и не обращается к серверу: Nuxt 4, история в IndexedDB, звук клавиш на WebAudio, офлайн через PWA. Режимы времени, слов, цитат, своего текста, кода и «слабых мест», шесть раскладок, метрики WPM, точность и консистентность, графики на чистом SVG. Пет-проект.",[836,837,838,839],"Без сервера и аккаунтов: история в IndexedDB, экспорт и импорт JSON","Шесть раскладок, режимы вплоть до адаптивных упражнений из ваших ошибок","59 unit-тестов и 65 e2e-проверок, axe без нарушений, CLS 0,000","PWA: работает офлайн после первого открытия","\u002Fog\u002Ftyping-lab.jpg",{"desktop":842,"desktop_sm":267,"mobile":843,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Ftyping-lab-desktop.webp","\u002Fshots\u002Ftyping-lab-mobile.webp",{"slug":269,"title":270,"type":669,"category":250,"lang":230,"live_url":845,"stack":846,"description":848,"highlights":849,"run":683,"hue":67,"og":854,"shots":855},"https:\u002F\u002Fewsirdev-budget.ewsirdev.workers.dev",[230,273,794,795,847,595,797,274,218],"WebGL","Веб-приложение учёта общих расходов группы без регистрации: комната по секретной ссылке, деление поровну, по долям, суммам и процентам, расчёт «кто кому» не более n−1 переводов. Пет-проект.",[850,851,852,853],"Без аккаунтов: комната по секретной ссылке в 128 бит, отдельные ссылки «просмотр» и «редактирование»","Четыре способа деления и мультивалюта с ручным курсом; расчёт «кто кому» не более n−1 переводов","Оптимистичная блокировка: из 4 одновременных правок одного расхода проходит одна","60 тестов (vitest в workerd, property-тесты fast-check), CI зелёный, npm audit 0, axe 0 нарушений","\u002Fog\u002Fbudget-split.jpg",{"desktop":856,"desktop_sm":271,"mobile":857,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fbudget-split-desktop.webp","\u002Fshots\u002Fbudget-split-mobile.webp",{"slug":859,"title":860,"type":649,"category":221,"lang":230,"live_url":861,"stack":862,"description":864,"highlights":865,"run":683,"hue":67,"og":870,"shots":871},"kladka-site","kladka-site: «Кладка», демо-сайт студии каркасного строительства","https:\u002F\u002Fewsirdev-kladka.pages.dev",[248,230,863,634,847,274,724,218],"Content collections","Демо-сайт вымышленной студии каркасного строительства: 5 проектов с чертежами, услуги, цены с калькулятором-ориентиром, журнал. Компания, цены и сроки выдуманы, на каждой странице есть пометка.",[866,867,868,869],"24 страницы (19 RU, 4 EN, 404) на Astro 7 со статической сборкой и content collections","Все 20 чертежей рисует код: SVG по данным проекта; 24 картинки OG рендерятся скриптом","Строгий CSP без inline, robots, sitemap с hreflang, llms.txt, security.txt, JSON-LD Organization\u002FService\u002FArticle\u002FFAQPage","756 ссылок и якорей без ошибок, htmlhint 0, axe 0 по всем страницам на 390 и 1280, npm audit 0","\u002Fog\u002Fkladka-site.jpg",{"desktop":872,"desktop_sm":873,"mobile":874,"dw":346,"dh":347,"mw":348,"mh":349},"\u002Fshots\u002Fkladka-site-desktop.webp","\u002Fshots\u002Fkladka-site-desktop-sm.webp","\u002Fshots\u002Fkladka-site-mobile.webp",1793288284275]