[{"data":1,"prerenderedAt":256},["ShallowReactive",2],{"pages":3},{"about":4,"contacts":69,"player":103,"privacy":142,"request":168,"status":189,"terms":211,"trash":236},{"id":5,"title":6,"available":7,"body":8,"capacity":34,"channels":35,"cta":34,"description":14,"extension":36,"lead":37,"meta":38,"metrics":39,"navigation":52,"nextSlot":34,"note":34,"path":53,"seo":54,"stack":55,"stem":66,"timezone":34,"tracks":67,"updated":34,"utcOffset":34,"__hash__":68},"pages\u002Fpages\u002Fabout.md","Обо мне",false,{"type":9,"value":10,"toc":30},"minimark",[11,15,18,21,24,27],[12,13,14],"p",{},"Виталий Гребеник, фронтенд-разработчик. Санкт-Петербург.",[12,16,17],{},"Работаю там, где интерфейс — инструмент, а не витрина: таск-менеджеры, дашборды,\nконструкторы правил, панели модерации. Это системы, в которых много данных, ролей\nи состояний, и в которых цена ошибки выше цены красивой обложки.",[12,19,20],{},"За три года десять месяцев — три продуктовые команды: таск-менеджер, криптобиржа\nи e-commerce. Из крупного: универсальный конструктор автоматизаций на пятьсот\nс лишним сценариев, календарь уровня Google Calendar, переиспользуемый модуль\nобсуждений уровня мессенджера, миграция продукта с Vue 2 на Vue 3 вместе с UI Kit.",[12,22,23],{},"Параллельно веду два своих проекта: районную сеть для владельцев животных\nна четырёх клиентах и одном ядре и инфраструктурный сервис доступа\nс Telegram-ботом в проде. Оба — с проверками до коммита, а не «когда будет время».",[12,25,26],{},"Работал по обе стороны API: писал небольшие backend-модули на Node.js и настраивал\nокружение на Linux и Nginx. Английский — B1: читаю документацию и переписываюсь.",[12,28,29],{},"Этот сайт — тоже кейс. Оконный менеджер в браузере, который остаётся индексируемым\nдокументом: кейсы читаются без единой строки JS, всё работает с клавиатуры,\nа на телефоне включается отдельная оболочка, а не масштабированный стол.",{"title":31,"searchDepth":32,"depth":32,"links":33},"",2,[],null,[],"md","Сложные системы, не лендинги",{},[40,43,46,49],{"value":41,"label":42},"3г 10м","в разработке",{"value":44,"label":45},"3","продуктовые команды",{"value":47,"label":48},"500+","сценариев в одном модуле",{"value":50,"label":51},"2","своих проекта",true,"\u002Fpages\u002Fabout",{"title":6,"description":14},[56,57,58,59,60,61,62,63,64,65],"Vue 3","TypeScript","React","Nuxt","NestJS","Prisma","Pinia","WebSocket","SCSS","Storybook","pages\u002Fabout",[],"DM-ZTSC5Xhy_FLl9AKHJq-JbHPHnw6Pfv1vsvd6-nCA",{"id":70,"title":71,"available":7,"body":72,"capacity":34,"channels":79,"cta":92,"description":76,"extension":36,"lead":94,"meta":95,"metrics":96,"navigation":52,"nextSlot":34,"note":34,"path":97,"seo":98,"stack":99,"stem":100,"timezone":34,"tracks":101,"updated":34,"utcOffset":34,"__hash__":102},"pages\u002Fpages\u002Fcontacts.md","Контакты",{"type":9,"value":73,"toc":77},[74],[12,75,76],{},"Телеграм — предпочтительный способ связи: там отвечаю быстрее всего.",{"title":31,"searchDepth":32,"depth":32,"links":78},[],[80,84,88],{"label":81,"value":82,"href":83,"primary":52},"Телеграм","@vi_grebenik","https:\u002F\u002Ft.me\u002Fvi_grebenik",{"label":85,"value":86,"href":87},"Почта","vi.grebenik.work@gmail.com","mailto:vi.grebenik.work@gmail.com",{"label":89,"value":90,"href":91},"Телефон","+7 (981) 944-67-49","tel:+79819446749",{"label":93,"href":83},"Написать в телеграм","Санкт-Петербург, UTC+3",{},[],"\u002Fpages\u002Fcontacts",{"title":71,"description":76},[],"pages\u002Fcontacts",[],"xWdUzJ4OD21CYD6WerA0xISn1j1F57KQqYR6NT1kj9c",{"id":104,"title":105,"available":7,"body":106,"capacity":34,"channels":113,"cta":34,"description":110,"extension":36,"lead":114,"meta":115,"metrics":116,"navigation":52,"nextSlot":34,"note":117,"path":118,"seo":119,"stack":120,"stem":121,"timezone":34,"tracks":122,"updated":34,"utcOffset":34,"__hash__":141},"pages\u002Fpages\u002Fplayer.md","Плеер",{"type":9,"value":107,"toc":111},[108],[12,109,110],{},"Плейлист, под который писался этот сайт. Звуковых файлов в проекте нет:\nокно показывает список и переключает трек, но не проигрывает его.",{"title":31,"searchDepth":32,"depth":32,"links":112},[],[],"Фон для рефакторинга",{},[],"Без вокала · 4 ч 12 мин","\u002Fpages\u002Fplayer",{"title":105,"description":110},[],"pages\u002Fplayer",[123,126,129,132,135,138],{"title":124,"meta":125},"Ambient Refactor","38:20",{"title":127,"meta":128},"Deep Focus Loop","41:05",{"title":130,"meta":131},"Night Build","35:48",{"title":133,"meta":134},"Slow Migration","44:12",{"title":136,"meta":137},"Green Tests","29:37",{"title":139,"meta":140},"Zero Warnings","43:10","EEd1AK55mgZECFibaXCCyfCJEWkSESYGYi0F1HSVUbg",{"id":143,"title":144,"available":7,"body":145,"capacity":34,"channels":158,"cta":34,"description":149,"extension":36,"lead":34,"meta":159,"metrics":160,"navigation":52,"nextSlot":34,"note":34,"path":161,"seo":162,"stack":163,"stem":164,"timezone":34,"tracks":165,"updated":166,"utcOffset":34,"__hash__":167},"pages\u002Fpages\u002Fprivacy.md","Политика конфиденциальности",{"type":9,"value":146,"toc":156},[147,150,153],[12,148,149],{},"Сайт собирает только те данные, которые вы отправляете сами: имя, контакт\nи описание задачи.",[12,151,152],{},"Данные используются для ответа на заявку и не передаются третьим лицам.\nАналитика обезличена.",[12,154,155],{},"Чтобы удалить свои данные, напишите на почту из окна «Контакты» — удалю\nв течение трёх рабочих дней.",{"title":31,"searchDepth":32,"depth":32,"links":157},[],[],{},[],"\u002Fpages\u002Fprivacy",{"title":144,"description":149},[],"pages\u002Fprivacy",[],"2026-08-01","j9SrI9hnwFc8Ilxx1ZdhWMTZ9P1PufmQbfW_lN6iw0M",{"id":169,"title":170,"available":7,"body":171,"capacity":34,"channels":178,"cta":34,"description":175,"extension":36,"lead":179,"meta":180,"metrics":181,"navigation":52,"nextSlot":34,"note":182,"path":183,"seo":184,"stack":185,"stem":186,"timezone":34,"tracks":187,"updated":34,"utcOffset":34,"__hash__":188},"pages\u002Fpages\u002Frequest.md","Новая заявка",{"type":9,"value":172,"toc":176},[173],[12,174,175],{},"Чем конкретнее задача, тем полезнее будет первый ответ. Если детали под NDA —\nдостаточно типа системы и сроков, остальное обсудим голосом.",{"title":31,"searchDepth":32,"depth":32,"links":177},[],[],"Расскажите о задаче",{},[],"Отвечаю в течение рабочего дня","\u002Fpages\u002Frequest",{"title":170,"description":175},[],"pages\u002Frequest",[],"AQ7gIM-Khiphq0XGLUB4gxvHi8iKetcdBicq_oW85P4",{"id":190,"title":191,"available":52,"body":192,"capacity":94,"channels":199,"cta":34,"description":196,"extension":36,"lead":200,"meta":201,"metrics":202,"navigation":52,"nextSlot":203,"note":34,"path":204,"seo":205,"stack":206,"stem":207,"timezone":208,"tracks":209,"updated":34,"utcOffset":44,"__hash__":210},"pages\u002Fpages\u002Fstatus.md","Доступность",{"type":9,"value":193,"toc":197},[194],[12,195,196],{},"Пишите в телеграм: обсудим задачу, сроки и то, чем я могу быть полезен.\nЕсли задача пока не сформулирована — это нормально, помогу сформулировать.",{"title":31,"searchDepth":32,"depth":32,"links":198},[],[],"Доступен для проектов",{},[],"Телеграм — быстрее всего","\u002Fpages\u002Fstatus",{"title":191,"description":196},[],"pages\u002Fstatus","Санкт-Петербург",[],"EHIcIEr7jmQEVDHpQSkCOejdRCUY1cThw85TlW-plpw",{"id":212,"title":213,"available":7,"body":214,"capacity":34,"channels":227,"cta":34,"description":218,"extension":36,"lead":34,"meta":228,"metrics":229,"navigation":52,"nextSlot":34,"note":34,"path":230,"seo":231,"stack":232,"stem":233,"timezone":34,"tracks":234,"updated":166,"utcOffset":34,"__hash__":235},"pages\u002Fpages\u002Fterms.md","Условия работы",{"type":9,"value":215,"toc":225},[216,219,222],[12,217,218],{},"Работа идёт спринтами по согласованному плану. Каждый спринт закрывается демо\nи вашим согласованием.",[12,220,221],{},"Предоплата 50% фиксирует спринт в графике. Остаток — после сдачи и передачи\nрепозитория.",[12,223,224],{},"Права на код переходят к заказчику после финальной оплаты. Кейс попадает\nв портфолио, если вы не против.",{"title":31,"searchDepth":32,"depth":32,"links":226},[],[],{},[],"\u002Fpages\u002Fterms",{"title":213,"description":218},[],"pages\u002Fterms",[],"EYwHCLAsYuP6HsexP-Sy2Vzmr_gIxL42iVhzB5PWP_Q",{"id":237,"title":238,"available":7,"body":239,"capacity":34,"channels":246,"cta":34,"description":243,"extension":36,"lead":34,"meta":247,"metrics":248,"navigation":52,"nextSlot":34,"note":249,"path":250,"seo":251,"stack":252,"stem":253,"timezone":34,"tracks":254,"updated":34,"utcOffset":34,"__hash__":255},"pages\u002Fpages\u002Ftrash.md","Корзина",{"type":9,"value":240,"toc":244},[241],[12,242,243],{},"Пусто, и так будет всегда: удалённое сюда не попадает. Окно существует потому,\nчто рабочий стол без корзины — не рабочий стол, а обои с иконками.",{"title":31,"searchDepth":32,"depth":32,"links":245},[],[],{},[],"Корзина — часть метафоры, а не хранилище","\u002Fpages\u002Ftrash",{"title":238,"description":243},[],"pages\u002Ftrash",[],"K-06yZNpt6gEujrw2sktO7hwiVnIJS_zQDErHw_O2tw",1787136563195]