[{"data":1,"prerenderedAt":221},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:ru":3,"api:\u002Fapi\u002Fprofile:":8,"api:\u002Fapi\u002Fabout:ru":19,"api:\u002Fapi\u002Fcategories:ru":63},{"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.",{"honest":20,"how":28,"intro":44,"lang":5,"principles":47},[21,22,23,24,25,26,27],"Почти все проекты учебно-демонстрационные; один сайт — реализованный клиентский, имя клиента не называется. Отзывы и цифры по заказам здесь не заявляются.","Десять новых бэкендов (Rust, Python, TypeScript) развёрнуты на сервере и работают вживую; до выкатки проверены локально и в Docker. Rust-проект flag-store собирался и тестировался в контейнере, на моём ПК cargo не ставился.","Сайты bike-workshop-react, landscape-bureau-nuxt, letterpress-ts, ceramics-vue и приложения habit-tracker, flashcards-sm2, scratch-notes это концепты и демо с вымышленными данными; dupfind на Windows вручную не запускался.","Race-детектор (go test -race) на моей рабочей машине не запускается из-за отсутствия C-компилятора; он выполняется в CI.","Свой слой WebSocket не проходил Autobahn Test Suite: корректность проверена собственными тестами. В продакшене разумнее брать проверенную библиотеку.","Демо-данные в проектах (история мониторинга, ссылки, задачи) сгенерированы и помечены в интерфейсах как демо.","Контакты: Telegram, ссылка на GitHub и почта djrciv@gmail.com.",[29,32,35,38,41],{"title":30,"text":31},"Разговор","Выясняем задачу, аудиторию и ограничения. Если сайт не нужен, скажу об этом сразу.",{"title":33,"text":34},"Договорённости","Состав работ, сроки и что считается готовым. Письменно, без сюрпризов.",{"title":36,"text":37},"Сборка","Короткие итерации: промежуточный результат можно открыть и потрогать.",{"title":39,"text":40},"Проверка","Тесты, мобильные экраны, доступность, нагрузка на форму и API.",{"title":42,"text":43},"Запуск","Docker-образ или статика, инструкция по запуску, передача кода.",[45,46],"Я веб-разработчик: делаю лендинги, сайты, веб-приложения и бэкенды, чаще всего на Go, а также на Rust, Python и TypeScript. В каталоге 50 проектов: 6 лендингов, 8 многостраничных сайтов, 6 веб-приложений, 24 бэкендов и 6 CLI-утилит; 43 из них работают вживую: 19 на Cloudflare и 24 серверных проекта на собственном VPS (ewsir.space). Почти все проекты учебно-демонстрационные: бренды вымышленные, данные демо, код приватный и открывается по запросу. Исключение — один реализованный клиентский сайт (клиента не называю).","Здесь нет отзывов и цифр о заказах: показываю только то, что можно проверить, то есть работающий код, тесты и README с ограничениями. Безопасность проверяю отдельно: подход и таблица закрытых классов уязвимостей на странице «Инженерия».",[48,51,54,57,60],{"title":49,"text":50},"Просто и проверяемо","Стандартная библиотека Go, понятная структура пакетов, тесты на то, что действительно важно: конкурентный захват задач, двойная бронь, протокол WebSocket.",{"title":52,"text":53},"Честные ограничения","В каждом README есть раздел «Ограничения»: один токен вместо ролей, один процесс, at-least-once вместо exactly-once. Лучше сказать заранее, чем объяснять потом.",{"title":55,"text":56},"Доступность по умолчанию","Контраст по WCAG AA, видимый фокус, работа с клавиатуры, уважение к prefers-reduced-motion, mobile-first вёрстка.",{"title":58,"text":59},"Без секретов в коде","Настройки идут через переменные окружения, токены генерируются при старте, если не заданы.",{"title":61,"text":62},"Один бинарник","Фронтенд встроен в Go-сервис через embed, запуск не требует установки зависимостей; для SQLite используется драйвер без CGO.",[64,93,124,152,188],{"slug":65,"title":66,"blurb":67,"variant":68,"palette":69,"layout":70,"count":71,"preview":72,"stack":88},"landings","Лендинги","Одна страница, одна задача. Вёрстка без фреймворков, где это возможно, и один WebGL-эксперимент.","drop","ice","shots",6,[73,78,83],{"slug":74,"title":75,"shot":76,"hue":77},"landing-studio","Полутон: студия света","\u002Fshots\u002Flanding-studio-desktop-sm.webp",212,{"slug":79,"title":80,"shot":81,"hue":82},"landing-saas","Рубильник: трекер подписок","\u002Fshots\u002Flanding-saas-desktop-sm.webp",182,{"slug":84,"title":85,"shot":86,"hue":87},"landing-event","Малый масштаб: конференция","\u002Fshots\u002Flanding-event-desktop-sm.webp",124,[89,90,91,92],"CSS","HTML","GitHub Actions","JS",{"slug":94,"title":95,"blurb":96,"variant":97,"palette":98,"layout":99,"count":100,"langs":101,"preview":105,"stack":121},"sites","Многостраничные сайты","Сайты со своей структурой, маршрутами и формами: от клиентского проекта до набора нишевых страниц.","merge","violet","frames",8,[102],{"lang":103,"count":104},"TypeScript",5,[106,111,116],{"slug":107,"title":108,"shot":109,"hue":110},"legal-multipage-site","Многостраничный сайт юридической компании","\u002Fshots\u002Flegal-multipage-site-desktop-sm.webp",250,{"slug":112,"title":113,"shot":114,"hue":115},"niche-landings","Каталог демо-лендингов под 10 ниш","\u002Fshots\u002Fniche-landings-desktop-sm.webp",32,{"slug":117,"title":118,"shot":119,"hue":120},"docs-engine","Сверло: генератор документации на Node.js","\u002Fshots\u002Fdocs-engine-desktop-sm.webp",25,[91,103,122,123],"Cloudflare Pages","axe",{"slug":125,"title":126,"blurb":127,"variant":128,"palette":129,"layout":130,"count":71,"langs":131,"preview":134,"stack":149},"apps","Веб-приложения","Приложения, в которые входят: с сервером, авторизацией и письмами или офлайн-first PWA, где данные остаются в браузере.","torus","mint","phone",[132],{"lang":103,"count":133},4,[135,140,145],{"slug":136,"title":137,"shot":138,"hue":139},"bad-club-booking-app","Bad Club: бронирование мест в игровом коворкинге","\u002Fshots\u002Fbad-club-booking-app-desktop-sm.webp",150,{"slug":141,"title":142,"shot":143,"hue":144},"typing-lab","typing-lab: тренажёр слепой печати","\u002Fshots\u002Ftyping-lab-desktop-sm.webp",45,{"slug":146,"title":147,"shot":148,"hue":144},"budget-split","budget-split: «Поровну», учёт общих расходов","\u002Fshots\u002Fbudget-split-desktop-sm.webp",[103,150,123,151],"Vite","vitest",{"slug":153,"title":154,"blurb":155,"variant":156,"palette":157,"layout":158,"count":159,"langs":160,"preview":169,"stack":185},"backend","Бэкенды","Сервисы с API, базой и тестами: на Go, Rust, Python и TypeScript. Фильтр по языку внутри раздела.","crystal","steel","list",24,[161,164,166,168],{"lang":162,"count":163},"Go",12,{"lang":165,"count":133},"Python",{"lang":167,"count":133},"Rust",{"lang":103,"count":133},[170,175,180],{"slug":171,"title":172,"shot":173,"hue":174},"kanban-tasks","Янтарь: канбан-доска","\u002Fshots\u002Fkanban-tasks-desktop-sm.webp",344,{"slug":176,"title":177,"shot":178,"hue":179},"link-shortener","Короче: сократитель ссылок","\u002Fshots\u002Flink-shortener-desktop-sm.webp",111,{"slug":181,"title":182,"shot":183,"hue":184},"booking-slots","Запись на приём","\u002Fshots\u002Fbooking-slots-desktop-sm.webp",65,[186,91,187,162],"Docker","SQLite",{"slug":189,"title":190,"blurb":191,"variant":192,"palette":193,"layout":194,"count":71,"langs":195,"preview":202,"stack":218},"cli","CLI-утилиты","Программы для терминала: один бинарник, понятные флаги, код выхода, который можно проверить в скрипте.","swarm","champagne","terminal",[196,198,200,201],{"lang":162,"count":197},3,{"lang":165,"count":199},1,{"lang":167,"count":199},{"lang":103,"count":199},[203,208,213],{"slug":204,"title":205,"shot":206,"hue":207},"gitpulse","GitPulse: аналитика git-репозиториев","\u002Fshots\u002Fgitpulse-desktop-sm.webp",7,{"slug":209,"title":210,"shot":211,"hue":212},"logslice","logslice: анализ логов без зависимостей","\u002Fshots\u002Flogslice-desktop-sm.webp",160,{"slug":214,"title":215,"shot":216,"hue":217},"envguard","envguard: линтер и сейф .env-файлов","\u002Fshots\u002Fenvguard-desktop-sm.webp",35,[91,219,186,220],"CLI","stdlib only",1793746967793]