Как я сделал спутник для Codex и дошел до разработки из электрички

Утром оставляю ноутбук включенным и еду на работу. По дороге открываю на телефоне режим «удаленно» и обсуждаю с агентом, что еще доделать в моем приложении. Он пишет код, присылает картинки интерфейса и покадровую нарезку анимаций. Я смотрю: норм или не норм. Если готово — выпускаем.
Приложение — маленький пиксельный спутник, который показывает, чем занят Codex. Называется CoPet.
Я работаю аэрокосмическим инженером, люблю все пиксельное и хочу постоянно видеть, что делает мой ИИ‑товарищ. Поэтому спутник с телеметрией в углу рабочего стола кажется мне совершенно естественной потребностью. Такой профессиональный фетиш.
До этого проекта я никогда не собирал самостоятельных приложений. Весь мой опыт программирования помещался в учебные тетрадки Jupyter. Как устроить программу для Windows, как ее запускать и вообще с какой стороны подойти к GitHub — предстояло выяснить.
Начал примерно так: хочу, чтобы Codex работал, а CoPet показывал состояния.
Кодекс пыхтел‑пыхтел, сказал «готово». Проверяем — нифига не работает. Окно есть, состояния не меняются.
И началось.
Зачем мне спутник в углу экрана
Идея появилась, когда я наткнулся на Clawdachi — пиксельного настольного питомца для Claude Code. Он реагирует на работу агента. Мне очень понравилась сама возможность одним взглядом понять, что там происходит.
Я тогда пользовался Codex в VS Code и захотел такую штуку для себя.
Мне неудобно постоянно заглядывать в окно агента. При этом просто уйти и забыть про него тоже не получается: интересно, работает ли он еще, использует инструменты или уже закончил. Уведомление о завершении задачи закрывает только часть этой потребности. Для человека с манией контроля этого маловато.
А спутник можно оставить поверх остальных окон и поглядывать на него.

Внешность я придумал довольно быстро. Небольшое окно Windows, внутри спутник, вокруг надписи с телеметрией. Раскрыты солнечные батареи — агент работает, думает. Выдвинута антенна — использует инструменты.
Потом появились дополнительные индикаторы. Запущены субагенты — загораются лампочки в верхней части окна, рядом отображается их количество. Идет компактизация контекста — спутник складывается, центральная лампочка пульсирует белым, бегущая строка сообщает COMPACTING CONTEXT.
Мне хотелось, чтобы состояние считывалось по самому виду спутника. Посмотрел — примерно понял, чем занят товарищ. И выглядит он офигенно.

Но как вообще приступиться
За спиной у меня был опыт работы в CAD‑программах и немного Python на курсах по Data Science. В Jupyter загружал данные из файлов, чистил их, проверял гипотезы, делил выборки и тренировал модельки. Прикольно, но дальше тетрадки ничего не было. Все для обучения, ничего для прода.
Поэтому было страшновато. Ну, не прямо страшно — скорее вообще непонятно, с чего начинать.
В такие моменты я обычно прошу своего товарища ChatGPT хорошенько подумать и объяснить мне. Да так, чтобы я понял.
Он рассказал, что архитектурно такое приложение можно представить как набор частей. Есть внешнее проявление — спутник и то, как он выглядит. Есть внутренние части: что‑то должно принимать события от Codex, что‑то их обрабатывать. А еще нужна логика, которая связывает происходящее с поведением спутника.
Звучало достаточно понятно, чтобы не желать больше ждать.
Поэтому я жадно приказал ИИ сделать все и сразу. Да так, как мы договаривались. То бишь хорошо.
Получил то самое окно, которое запускалось, но не меняло состояния.
Все сталкивались: просишь у ИИ яблоко, а он приносит робо‑банан. И, конечно, виноват ИИ. Я же не дурак, я нормально описал. Он что, понять не мог?
Я иронизирую, но первая реакция примерно такая.
Что конкретно сломалось в той первой попытке, сейчас уже точно не помню. Кажется, что‑то с обработкой событий. Восстанавливать причину по памяти не буду. Зато помню, что дальше начался гораздо более подробный разговор.
Так, а откуда мы вообще берем события?
Спросил — получил ответ — снова спросил. Постепенно до меня начали доходить вещи, которые в первоначальном «хочу индикатор» вообще не были сформулированы.
Как на тот момент плагин отдавал информацию о своей работе? Как нам ее принимать? Какие события нужны? Что делать, если пришло одно, потом другое? А если ничего больше не приходит?
Для ранней версии мы выбрали OpenTelemetry и передачу событий по OTLP/HTTP. Названия мне сначала мало что говорили. Пришлось разбираться хотя бы в том, кто кому что передает.
В одной из первых сохраненных версий цепочка была такой:
Codex → OpenTelemetry Collector → обработчик событий → файл состояния → окно CoPet.
Коллектор принимал телеметрию и пересылал ее обработчику. Тот разбирал события, определял состояние агента и записывал его в JSON‑файл. Окно CoPet читало этот файл и меняло отображение.
Программа в итоге была написана на C# и.NET. Windows выбрал по очень простой причине: у меня ноутбук на Windows, приложение я делал прежде всего для себя.
По ходу обсуждения возникали и более приземленные вопросы: давай посмотрим, что вообще приходит; давай запишем диагностическую информацию; давай отдельно разберем, какое событие должно означать THINKING, а какое — работу с инструментом.
Мне нужно было понимать устройство программы достаточно, чтобы поставить следующую задачу и проверить результат. Иначе я мог только снова написать «не работает» и ждать очередное «исправил».
Первый сохраненный коммит CoPet датирован 31 января 2026 года. Точную дату появления идеи я уже не восстановил, но в конце января прототип в репозитории был.

Оно работает
На первый рабочий прототип ушло примерно три‑четыре часа суммарно за пару дней.
Это был небольшой прямоугольник поверх остальных окон. Он цветом и надписью показывал состояние агента: простаивает, думает, работает с инструментами, закончил задачу.
Чтобы проверить, я попросил Codex подумать о высоком.
Прямоугольник стал синим. Высветил THINKING.
Я офигел.
Действительно пишет THINKING И TOOL. Вау!
Восторг был детский. Я хотел штуку, которая реагирует на работу агента, — и вот она реагирует. На моем ноутбуке. Проблем было море, но это наконец работало.
Правда, цветастые геометрические фигуры — совсем не то, что я хотел видеть на рабочем столе по паре часов в день. Поэтому настало время придать этому форму.
Франкенштейн фотошопа
Осталось собрать внешний вид. Ну, на самом деле еще куча всего другого осталось, но сейчас не об этом.
В жизни не делал анимации. Особенно пиксельные. Поэтому пришлось разбираться.
Начал с просьбы к ChatGPT создать референс. Потом еще один. И еще.
Так, окей, этот вроде подходит.

Но у спутника была только одна солнечная батарея, а две смотрелись бы лучше. Благо немного пользоваться Photoshop я умел. Сделал вторую батарею и начал кромсать картинку: корпус отдельно, батареи отдельно, антенна отдельно.
Чтобы элементы складывались, перемещал их за корпус на пару пикселей в каждом следующем кадре. Для движения вверх‑вниз тоже нужны были отдельные положения. Все это собирал слоями и сохранял в картинки.
В Photoshop создавать кадры анимации — затея, конечно, неблагодарная. Но в конечном итоге оно того стоило.
Папка с рабочими файлами у меня до сих пор называется «франкенштейн фотошопа».

В раннюю анимированную версию от 6 февраля вошло 56 кадров размером 128 × 128 пикселей. Семь последовательностей по восемь кадров: три состояния и четыре перехода между ними.
Не так много, но это честная работа.

Самое сложное было продумать логику переключений, а затем нарезать под нее кадры.
Простым языком: у каждого состояния есть цикл — последовательность картинок, которая повторяется. Спутник покачивается вверх‑вниз. В ожидании он сложен. Когда агент думает, батареи раскрыты. Когда использует инструменты, выдвинута еще и антенна.
Но агенту все равно, в какой точке движения сейчас находится мой спутник. Событие может прийти в любой момент.
Как поменять состояние, чтобы анимация не была рваной?
Когда мы с ChatGPT разогнали эту идею, договорились о следующем: сигнал приходит, но переход начинается только после завершения текущего цикла. Затем проигрывается отдельная последовательность, в которой раскрываются батареи или антенна. После нее спутник переходит к повторению нового состояния.
Сигнал → закончить цикл → проиграть переход → повторять новый цикл.
Просто и очевидно? Ну, тогда я так не думал.
Это уже была конкретная логика, которую можно объяснить агенту и проверить глазами. Стало понятнее, какие кадры нужны, как они должны стыковаться и что считать правильным результатом. Дальше пошло гораздо быстрее.

Я как ребенок радовался, когда все заработало вместе. Спутник двигается, батареи раскрываются, антенна вылезает. И все это связано с тем, что делает Codex.
Захотелось написать об этом в свой «семейный» Telegram‑канал для друзей. Ну прикольно же!
Настроил программу, включил CoPet. Надо показать его в действии.
Блин, ну подумай о слонах, что ли.
А теперь хочется, чтобы это можно было скачать
Потом захотелось поделиться приложением не только с друзьями. Ну сайт создать и можно всем дать мою приложуху, ыыы.
Тут пришлось заняться тем, что в первом прототипе меня волновало гораздо меньше: как человек получит программу, запустит ее и подключит к Codex.
Ранняя версия состояла из нескольких частей. Отдельный коллектор, обработчик, окно‑индикатор, промежуточный файл состояния. Для распространения мы стали собирать это в более удобный вид.
22 февраля в репозитории появилась версия с одним приложением: прием событий работал внутри процесса CoPet, а программа помогала с первоначальной настройкой. Отдельный коллектор и промежуточный файл между обработчиком и окном больше не требовались.
С сайтом тоже помог ChatGPT: собрать, оформить, запустить страницу со скачиванием. Для демонстрации использовали настоящие кадры спутника.
И вот еще больше полугода периодического допила позади.
Летом добавили интеграцию через событийные хуки и отслеживание субагентов. Потом снова разбирались, как CoPet получает события в разных вариантах запуска Codex. Я начинал с расширения в VS Code, а пользоваться стал и настольным приложением.
Появлялись новые состояния, лампочки, бегущая строка. Возвращались к переходам между анимациями. Правили то, что раньше казалось уже готовым.
Идея по‑прежнему меня дико завораживала. Мне хотелось пользоваться именно этим спутником, поэтому находились и желание, и терпение продолжать.
Ноутбук дома, я в электричке
К последним доработкам я подошел уже с другим порядком работы.
Сначала описываю, что хочу получить. Агент читает AGENTS.md — файл с нашими правилами работы над проектом — и составляет подробный план. После согласования вносит изменения. Затем я проверяю результат.
Визуальные изменения мне особенно важно видеть самому. То, что агент считает красивым или плавным, может вообще не совпасть с тем, что я представлял.
А как быть, если агент кодит на ноутбуке, CoPet работает там же, а я еду на работу в электричке?
Для этого мы сделали MediaLab. Это отдельный инструмент для подготовки изображений: он использует отрисовку самого CoPet и позволяет получать крупные кадры окна и последовательности анимации. В пользовательское приложение он не входит.
Теперь агент присылает мне картинки, а я могу оценить результат с телефона. Для статического изменения хватает отдельного кадра. Для движения нужна последовательность: что было до переключения, как раскрывались элементы, во что все пришло.
Такой порядок записали в AGENTS.md. Сделал визуальную правку — покажи, что получилось.
Я смотрю: норм или не норм. Если не норм — объясняю, что поправить. Если готово — выпускаем.

Правда, даже с доставкой картинок пришлось повозиться. Сначала агент вставлял в отчет ссылку на локальный файл с ноутбука. На телефоне она не открывалась.
Договорились, чтобы он показывал само изображение прямо в разговоре во время работы. В таком виде картинки на моем телефоне отображаются.
Оч удобно. Утром оставляю ноутбук включенным, по дороге открываю удаленное управление, вместе думаем, что доделать. Потом получаю изображения, смотрю, обсуждаем, выпускаем.
До первого проекта я даже не представлял, что буду заниматься подобным по дороге на работу.
Что я из этого вынес
Одним промптом нормальное приложение не напишешь.
По крайней мере, у меня так не получилось. Сначала пришлось самому понять, что я хочу, как это должно работать и как прийти к результату через маленькие шаги, которые я способен проверить лично.
Код пишет агент, но мне все равно нужно принимать решения. Как должен двигаться спутник? Когда убирать антенну? Достаточно ли мне надписи или нужен отдельный индикатор? То, что получилось, вообще решает мою задачу?
Этому я и учился через CoPet.
Сейчас похожим образом делаю следующий проект — КосмоРаг. Если хочу добавить обработку сканов, сначала разбираюсь с инструментом для распознавания документов. Затем мы с агентом делаем небольшую программу, чтобы попробовать разные режимы. Смотрим на результат, делаем выводы, что‑то поправляем. И уже после этого идем внедрять в основной проект.
Проблемы при этом никуда не исчезают. Когда проект разрастается, агент не всегда видит всю картину. После последних изменений в КосмоРаге пришлось делать еще серию исправлений. Поэтому проверка маленького шага для меня остается обязательной, даже когда агент уверенно отчитывается об успехе.
Но сам процесс оказался гораздо ближе к знакомой мне проектной деятельности, чем я ожидал. Ставишь цель, разбираешься в ограничениях, проверяешь гипотезы, смотришь на результат. Что‑то работает, что‑то переделываешь. И получаешь удовольствие, когда наконец получилось.
Мне помогло то, что я очень хотел именно эту вещь. Не абстрактно «научиться программировать», а видеть на рабочем столе своего пиксельного спутника. Ради этого было интересно разбираться и с событиями, и с GitHub, и с кадрами в Photoshop.
Я начинал эту историю с мыслью, что сделать собственное приложение — сложно. Теперь у меня есть приложение, которым я пользуюсь, и следующий проект, за который я уже взялся.
Если вы тоже давно хотите собрать какую‑нибудь свою прикольную вещь, но не понимаете, с чего начать, мой опыт — вот такой. Понадобились терпение, желание и много проверок. Зато синий прямоугольник с надписью THINKING может обрадовать так, как заранее вообще не ожидаешь.
А посмотреть спутник и скачать CoPet можно на странице проекта.

На CoPet я не остановился и теперь собираю КосмоРаг — если интересно, что из этого получится, заглядывайте в мой Telegram‑канал.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.