Mojito — приложение, которое переписывает само себя
📂 Исходный код на GitHubПланировщик на день, который вы разворачиваете сами и который переписывает сам себя: код приложения правит Claude Code на вашем Mac, а обратная связь из чата превращается в готовые изменения.
Mojito — это планировщик на день, который вы разворачиваете сами и который меняет сам себя. Код приложения правит Claude Code, запущенный на вашем Mac: вы пишете в чат, чего хотите, и агент меняет код, собирает его и отправляет обновление на телефон, на Mac и в веб-версию. Проект называет себя локальной альтернативой облачным персональным ИИ вроде Meta Muse. Лицензия MIT, статус — experimental alpha, всё рассчитано на одного человека.
Принцип: приложение, которое меняет само себя
Обычное приложение — это замороженный код. За вас решает его автор, а вы ждёте следующего релиза. Mojito оставляет только тонкую оболочку, а всё остальное отдаёт агенту, у которого есть весь контекст: ваши данные, ваши логины, а также исходный код приложения и проектные документы к нему.
В основе проекта лежат три правила.
- Тонкий код. Серверная часть (её называют хабом) только хранит ваши данные, отдаёт приложение и шлёт push-уведомления. Все решения и новые функции приходят от агента, а не из новой зашитой в код логики.
- Агент владеет контекстом. Это Claude Code, запущенный на вашем Mac (или на Mac mini). Он берёт то, что уже есть: ваши логины, файлы, почту и календарь, а ещё исходный код и дизайн приложения.
- Приложение развивается вместе с вами. Вы говорите в чате, чего хотите, агент меняет приложение и сообщает, что выкатил. Всё рискованное сначала ждёт вашего «да». Правда, это решение принимает сопровождающий (это отдельная сессия Claude Code, которая правит код) по правилам из документации — сам код пока такую проверку не делает.
| Обычное приложение | Облачный персональный ИИ (Meta AI, Muse) | Mojito | |
|---|---|---|---|
| Кто решает, какие функции будут | Компания-разработчик | Компания: ассистент болтает и что-то делает, но своё приложение изменить не может | Вы, в чате: агент меняет код |
| Как быстро это меняется | На следующем релизе | На следующем релизе вендора | Часто в тот же день, когда вы попросили |
| Где живут данные и логины | На серверах вендора | В облаке вендора | На ваших машинах; то, что прочитал агент, уходит провайдеру модели (сейчас Anthropic) |
Что можно сказать приложению
Часть просьб меняет ваши данные, и у каждого такого изменения есть отмена. Другие меняют само приложение: агент пишет код и выкатывает его. Всё, что уходит наружу, например письмо, готовится только как черновик — отправляете вы сами.
- «Вынеси следующий шаг наверх и выдели его жирным» — меняется интерфейс, обновление уходит на телефон.
- «Мне нужна лента постов RedNote про поездку на следующей неделе» — агент читает RedNote через вашу сессию на Mac, примерно так же, как это сделали бы вы. Автор попросил такую ленту и получил её меньше чем за час. В репозитории источника RedNote нет, его можно попросить добавить.
- «Каждое утро превращай мою почту в одну карточку — что стоит прочитать» — работает из коробки, Gmail только на чтение.
- «Пропусти мою командную встречу во вторник» — убирает ровно одно событие из Google Calendar, с отменой.
Данные остаются на ваших машинах, автору проекта ничего не уходит. Но то, что читает агент, уходит провайдеру модели, которого вы выбрали (сейчас это Anthropic, через Claude Code).
Как устроен цикл самоперестройки
Обратная связь попадает в систему двумя способами. Можно просто сказать о проблеме в чате — агент сам сохранит её, вместе с картинками. А можно открыть System → More → Feedback и приложить скриншоты; текущий экран добавится автоматически.
Дальше сопровождающий решает, выкатывать самостоятельно или спросить. Сами уходят тексты (включая формулировки промптов), стили, вёрстка и явные баги, которые не меняют никакие контракты. Сначала спрашивают изменения API и базы, расписания, уведомлений, новые зависимости, всё, что трогает учётные данные, исходящие сообщения или удаление данных, и всё, в чём сопровождающий не уверен. Текст обратной связи и скриншоты считаются данными, а не инструкциями. Сопровождающий может задать уточняющий вопрос — он появится в чате, ваш ответ уйдёт обратно.
Потом изменение попадает к вам: новая сборка веба оживает на хабе и подхватывается при следующей загрузке, хаб, агент и воркер просто перезапускаются, Android с чистым JavaScript обновляется по воздуху (EAS Update), под нативный код Android нужен новый APK, приложение на Mac ставит сборку на место и предлагает перезапуститься. Подробное описание, включая то, что хаб сегодня проверяет, а что нет, лежит в docs/self-rebuild-loop.md.
Что уже есть
- Today. Всё, что нужно сделать сегодня, плюс ближайший следующий шаг, даже если он на несколько дней дальше. Отдельно показываются просроченное и «молчат» — задачи без следующей даты или просроченные и нетронутые неделю. Рядом — календарь на сегодня и то, что ждёт вашего решения.
- Plan. Цели и планы на две недели. В конце плана Claude черновит разбор и следующий план, и пока вы не посмотрите прошлый, новый не начинается.
- Notes. Текст или фото. Claude превращает заметку в задачу, относит её к проекту или спрашивает, что вы имели в виду.
- Chat. Одно предложение меняет задачи, цели, планы, настройки, подписки и события календаря. Вопросы, которым нужен ваш компьютер, уходят воркеру и возвращаются push-уведомлением.
- Feed. Новые статьи с arXiv и Hugging Face, отобранные под ваш вкус, ежедневная сводка «почты, стоящей чтения» (Gmail, только чтение) и карточки от любой сессии Claude Code. На странице подписок у каждого источника есть время, последний результат, переключатель и кнопка «Run now».
- Projects. Карточка на проект: открытые задачи, недавняя активность и статус в одну строку от Claude.
- Дневной ритм. Утренний бриф, вечерний вопрос «что сегодня продвинулось», недельная сводка и разбор за две недели. На странице System — здоровье источников, статистика за 7 дней и ваши треды с обратной связью.
- Клиенты. Веб-приложение для домашнего экрана с Web Push, приложение на Android (Expo) с виджетами, приложение на Mac (Tauri) с панелью в строке меню. Одна настройка переключает английский и китайский вместе с ответами агента.
Архитектура
| Часть | Где работает | Что делает |
|---|---|---|
hub/ |
На постоянно включённой машине (хватит VPS на 1 ГБ) | FastAPI + SQLite в одном процессе. Единственный владелец ваших данных: хранилище, API, очередь задач, push, календарь и раздача веб-приложения. Он намеренно «глупый» и не принимает решений |
agent/ |
Рядом с хабом | Одна задача за раз: ответы в чате, утренний бриф, вечерний вопрос, запись в Google Calendar. Каждое решение — один вызов claude -p --json-schema без инструментов; скрипты проверяют ответ и выполняют его |
worker/ |
На вашем Mac | Задания, которым нужны локальные данные: заметки в задачи, следующие шаги, разборы планов, ленты и вопросы про ваши репозитории и почту (только чтение) |
| Сопровождающий | На вашем Mac, в приватной копии репозитория | Сессия Claude Code, которая разбирает обратную связь и выкатывает изменения |
mobile/, desktop/ |
Web, Android, macOS | Expo с expo-router — одна кодовая база на веб, PWA и Android; приложение для Mac — оболочка Tauri 2 вокруг веб-сборки |
Правило проекта: скрипты собирают факты, а решения принимает Claude; хаб остаётся глупым; приложение никогда не действует во внешнем мире. Источник правды — файлы docs/design.md и docs/api.md, написанные на китайском.
Запуск
Шаг ноль: держите свою копию приватной. Не нажимайте Fork: форк публичного репозитория остаётся публичным, а цикл самоперестройки коммитит туда вашу обратную связь и личные примеры. Клонируйте репозиторий и отправьте код в новый приватный:
git clone https://github.com/TimeLovercc/mojito.git my-mojito
cd my-mojito
git remote rename origin upstream
git remote add origin <URL of your new, empty, private repository>
git push -u origin main
L0: посмотреть, как это выглядит (около 5 минут, без учётных записей). Нужен Node.js 22. Приложение запускается против фальшивого хаба с вымышленными данными, всё в памяти.
cd mobile
npm install
cp .env.example .env
MOCK_TOKEN=dev PORT=8788 MOCK_LANGUAGE=en npm run mock # терминал 1: фальшивый хаб
npm run web # терминал 2: приложение на http://localhost:8081
В приложении откройте System (значок в правом верхнем углу) → More, укажите адрес хаба http://localhost:8788 и токен dev. Приложение подхватит язык хаба и перезапустится на английском.
L1: свой экземпляр (вечер). Нужна постоянно включённая машина для хаба и агента (небольшой Linux VPS или просто включённый компьютер), свой компьютер для воркера, Python 3.12 с uv, Node.js 22 и Claude Code. Для HTTPS рекомендуют Tailscale. Дальше по шагам: создать каталог секретов ~/.config/mojito/secrets (права 700) и файл с токеном на каждую роль — app, worker, agent, maintainer, source:cards; настроить и запустить хаб по образцу hub/deploy/server.env.example; спрятать его за HTTPS, например tailscale serve --bg 8787; запустить агента по agent/.env.example с токеном из claude setup-token; запустить воркер по worker/.env.example; собрать веб-приложение и положить сборку в веб-каталог хаба. Каждый компонент отказывается стартовать, если какой-то настройки не хватает, и прямо называет, какой. Все шаги с точными командами — в docs/SETUP.md.
L2: включить цикл. Положите токен maintainer в ~/.config/mojito/secrets/maintainer.env (образец — docs/maintainer.env.example). Запустите Claude Code в приватной копии и укажите ему docs/maintainer.md. Дайте ему опрашивать обратную связь через /loop. После этого скажите в приложении «сделай заголовок Today больше» и посмотрите, как это вернётся push-уведомлением. Подробности, настройка прав и стоимость — в docs/self-rebuild-loop.md. Каждое сообщение в чате, заметка и задание по расписанию — это один или несколько вызовов claude -p.
Безопасность и приватность
- Данные остаются на ваших машинах: один файл SQLite с папкой вложений на сервере и то, что воркер читает на вашем Mac. Автору проекта ничего не уходит, статистика на странице System считается на вашем хабе.
- Провайдер модели видит то, что прочитали агенты. Чат, заметки, задачи, планы, события календаря, куски писем, файлы ваших репозиториев и картинки уходят в Anthropic через Claude Code. Можно ли использовать их для обучения, зависит от настроек аккаунта.
- Push идёт через третьих лиц. На Android push работает через Google FCM, и в его служебных данных передаётся заголовок уведомления. Web Push идёт через push-сервис производителя браузера.
- Сопровождающий очень могущественен. Он меняет код и раскатывает изменения на ваш сервер и устройства — относитесь к нему как к root. Решает он сам, выкатывать или спросить, и кодом это пока не проверяется.
- Работа с сайтами идёт под вашей учётной записью. Всё, что вы попросите агента добавить и что работает через приложения и сайты, в которые вы вошли на Mac, действует с вашими логинами. Часть сайтов, включая RedNote, ограничивает автоматический доступ: работа через ваш аккаунт может привести к блокировке.
- Недоверенный текст доходит до агентов. Письма, приглашения в календарь, статьи и скриншоты могут нести подсказки для модели. Вызовы модели у агента и воркера идут без инструментов, исходящие сообщения готовятся только черновиком, у каждого изменения есть отмена. Всё равно прочитайте SECURITY.md, прежде чем подключать почту.
- Держите хаб приватным. Отдавайте его по своему tailnet через
tailscale serve, выдайте каждому устройству свой токен и отзывайте его вместе с устройством. Никогда не включайте цикл в публичном форке: он коммитит вашу личную обратную связь.
Что пока не готово
- Альфа для одного пользователя, заточено под распорядок одного человека.
- Проект зависит от Claude Code, поэтому каждый вызов модели уходит в Anthropic.
- Решение «само или спросить» принимает сопровождающий, а не хаб.
- Интеграций с RedNote и Notion в репозитории нет — их добавляют, попросив агента. У интеграций (Gmail, Google Calendar, Orca, статьи) пока нет переключателей вкл/выкл.
- Воркер в первую очередь под macOS, iPhone поддерживается только через веб-приложение (PWA). Готовых сборок нет: приложения для Android и Mac вы собираете сами.
- Утренний и вечерний запросы ставятся в очередь в пределах 10 минут от своего времени: если хаб в этот момент лежит, они пропускаются.
- Дизайн-документы docs/design.md и docs/api.md написаны на китайском.
Новый десктопный интерфейс уже спроектирован, но его кода пока нет — описание на китайском с английским пересказом в docs/desktop-v2.md. В планах также цикл с настоящей проверкой на стороне хаба, свой выбор модели, включая локальные с открытыми весами, и привязка устройства по QR-коду. Код распространяется под лицензией MIT. Проект независимый и никак не связан с Meta.
Источник: https://github.com/TimeLovercc/mojito