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