nanoMuse — опенсорсный личный ИИ-агент с телефонным экраном и компьютером вместо рук
📂 Исходный код на GitHubЛичный ИИ-агент с открытым кодом под лицензией GPL-3.0-or-later. Приложения для Android, iOS, macOS, Windows и Linux плюс веб-консоль и relay-сервер — всё в одном репозитории. Агент умеет управлять экраном телефона и компьютера, задачи выполняются в фоне, память хранится в Markdown-файлах. 137 звёзд на GitHub.
nanoMuse — опенсорсный личный ИИ-агент, который работает на ваших собственных устройствах. Один агент с именем и внешним видом: телефонное приложение, приложение для компьютера, веб-консоль и сервер, который связывает их между собой. Всё это лежит в одном репозитории под лицензией GPL-3.0-or-later.
nanoMuse сделан по образцу персонального агента Meta Muse, но с открытым кодом. Главное отличие — агент работает не в облачной виртуальной машине, а на вашем телефоне или компьютере. Он продолжает дело, когда приложение закрыто, помнит вас и спрашивает перед всем, что нельзя отменить.
Проект некоммерческий. На момент публикации — версия 0.1.40 «Clear», 137 звёзд на GitHub, научная работа лежит на arXiv.
Что умеет
Агент не отвечает на вопросы, а выполняет задачи. Вот что он умеет.
Делает, а не советует. У него есть Linux-оболочка, браузер, MCP-серверы и скиллы. Если включить режим «руки», агент получает ещё и экраны: он может смотреть на экран телефона и нажимать в приложениях, а на компьютере — двигать мышь и нажимать клавиши. Это нужно для приложений, у которых нет API.
Спрашивает перед важным. Перед удалением, отправкой сообщения и платежом агент останавливается и показывает карточку. Разрешение можно дать один раз, на текущий чат или навсегда. Пароли, коды из СМС и капчи агент не вводит — эти экраны отдаются вам. Вы вводите код и нажимаете «Готово», агент продолжает.
Достаёт до других ваших устройств. Сказали на телефоне — задача выполняется на компьютере. В начале сообщения можно написать @Mac, и работа уйдёт туда. Подтверждения приходят на то устройство, которое вы держите в руках.
Продолжает сам. Есть цели с расписанием, регулярные дела, которые идут при закрытом приложении, и утренняя сводка, которую агент пишет для вас.
Помнит вас. Как агент выглядит, что он о вас знает и в какое время просыпается — всё это обычные Markdown-файлы. Их можно прочитать и поправить руками.
Живёт в чатах. Агент отвечает в Feishu, DingTalk, WeCom и Telegram.
Имеет свой облик. Опишите внешний вид — модель картинок нарисует её, модель видео покажет, как она двигается. По умолчанию это маленький дракон.
Работает с любой моделью. Можно пользоваться бесплатным лимитом на общественном сервере. Можно взять свой ключ у одного из восемнадцати провайдеров: Alibaba Cloud Bailian, OpenRouter, OpenAI, Gemini, DeepSeek и другие. А можно войти под уже оплаченной подпиской — ChatGPT, Claude, Kimi. Если у выбранного провайдера нет моделей для картинок и видео, эти две функции просто отключаются, и приложение об этом скажет.
Как это устроено
На каждом устройстве живёт свой агент.
- На телефоне агент работает внутри приложения: Alpine Linux под proot, оболочка, браузер, MCP. Это песочница, собранная внутри приватного хранилища приложения.
- На компьютере агент — это плагин к DeepSeek Harness с Python-окружением для работы с экраном.
- В браузере — веб-консоль. Своих рук у неё нет: это входная дверь, через которую управляют остальными устройствами.
Когда вы вошли в один аккаунт, устройства находят друг друга через relay — сервер, который пересылает между ними сообщения. Технически это один исходящий WebSocket с каждого устройства, который держится постоянно. Пробрасывать порты и поднимать общую сеть не нужно. Сервер перекладывает сообщения между устройствами одного аккаунта и не заглядывает внутрь задач. Текст разговоров через него проходит, а файлы и скриншоты остаются там, где были сделаны.
Подробнее про устройства — в docs/every-device.md, про сам сервер — в docs/hub.md.
Экран как рука
Работа с экраном обходится дороже всего, поэтому агент идёт к ней последней. В проекте это называется лестницей: четыре ступени, которые пробуются сверху вниз.
| Ступень | Как | Когда |
|---|---|---|
| 1 | Скилл, CLI-утилита или MCP-сервер | когда такое есть: точно и мгновенно, экран не нужен |
| 2 | Загрузка страницы под вашим логином | когда ответ виден после входа в аккаунт |
| 3 | Встроенный браузер, страница за страницей | когда нужно прокликать сайт |
| 4 | Экран устройства | когда задача живёт только в приложении |
Скилл сам объявляет в описании, на какой ступени работает: api, cli, web, browser, gui или mixed. Скилл для экрана помечается в списке агента как «на экране телефона», и агент сразу понимает, что задача экранная. Если вы сами не просили трогать телефон, агент спросит перед тем, как подняться на верхнюю ступень.
Смотреть на экран и нажимать умеет отдельный внутренний цикл. Он получает картинку, выбирает одно действие и смотрит снова. Координаты модель отдаёт на сетке 999×999, а программа пересчитывает их в пиксели экрана. Для этой работы можно выбрать отдельную модель: она обязана уметь видеть изображения, а температура у неё нулевая. Движению по экрану нужен первый ответ модели, а не случайный.
Всё записанное можно посмотреть. Каждая задача пишет JSONL-трассу: цель, шаги, скриншоты, модельные рассуждения. Команда nanomuse phone trace <id> -o trace.html собирает из неё одну HTML-страницу, где каждый тап нарисован поверх того экрана, который видела модель. Такую страницу можно приложить к issue.
Подробности — в docs/gui.md.
Sentinel: кто разрешает опасное
Агент не выполняет инструменты сам. Каждый вызов сначала проходит через Sentinel — отдельный слой, который решает, можно ли выполнять.
У каждого инструмента есть свой уровень риска:
| Уровень | Что значит | Примеры |
|---|---|---|
safe |
обратимо и локально | чтение файлов в рабочей папке, веб-поиск, память |
moderate |
выходит наружу или меняет состояние | загрузка страницы, выполнение Python, чтение почты |
sensitive |
трудно отменить или видно другим | shell, отправка почты, сохранение скилла |
Решение принимается по порядку: запрет инструмента, потом правила из конфига, потом списки «всегда разрешено» и «всегда спросить», потом проверка на утечку данных, и в конце — уровень риска вместе с режимом. Режимов три: ask (по умолчанию), strict и auto. Предупреждения — например, на rm -rf, sudo или curl | sh — не пропускаются ни режимом, ни списком разрешений. Их можно пропустить только явным правилом.
Отдельная механика — пометка сессии. Как только агент прочитал частные данные (например, сделал скриншот экрана), сессия помечается, и всё, что дальше уходит наружу, проверяется строже. На экране телефона опасным считается не сама команда, а подпись под пальцем: если в словах агента есть «подтвердить оплату», «перевести», «отправить», «удалить», система спрашивает. При этом одно разрешение на отправку не превращается в разрешение на следующую.
Пароли, коды и подтверждения платежа вводит человек. Агент умеет передать экран вам: в чате появляется карточка «Ваш ход», вы вводите данные и жмёте «Готово», агент делает новый скриншот и продолжает с чистого листа. Если в фокусе оказалось поле пароля, передача происходит сама.
Про песочницу и правила целиком — в docs/sentinel.md.
Память и своё железо
Память агента — это Markdown-файлы, которые можно открыть и отредактировать. Цели и расписания тоже свои, без внешней базы.
Запустить всё у себя можно тремя способами.
- Без сервера, со своим ключом. Приложения ходят к провайдеру напрямую. Relay нужен только для входа и для того, чтобы устройства находили друг друга. Ничего ставить и поддерживать не нужно. Список провайдеров и что покрывает каждый ключ — в docs/own-key.md.
- Свой relay. Это один Python-сервис и один файл SQLite с базой. Нужен VPS с 1 vCPU и 1 ГБ памяти, домен с открытыми 80 и 443 и Docker. Всё поднимается одной командой:
git clone https://github.com/nano-muse/nanoMuse.git && cd nanoMuse
bash scripts/self-host.sh
Скрипт спрашивает пять вещей, придумывает секреты, запускает Docker Compose, ждёт готовности и печатает адреса. Без домена и TLS: bash scripts/self-host.sh --local.
- Своё окружение для веб-приложения. Python-рантайм в Docker на машине, которая всегда включена.
Инструкция целиком — в docs/self-hosting.md.
Свои агенты для написания кода
Отдельная интересная возможность: агент видит сессии Cursor, Codex и Claude Code на вашем компьютере и может ими управлять. Он читает их логи с диска, запускает их собственные командные интерфейсы для нового сообщения и показывает, что они делают. Ничего в эти агенты не ставится, и их работа не идёт через чужой сервер.
Это удобно тем, что с телефона можно посмотреть, над чем вы работали, остановить зависший запуск или попросить Codex дописать тест в нужном репозитории. Запрос идёт только между устройствами одного аккаунта, а компьютер может вообще запретить удалённое управление. Ключи API этих агентов nanoMuse никогда не видит. Подробности — в docs/coding-agents.md.
Установка
Готовые сборки лежат в релизах.
| Платформа | Что качать |
|---|---|
| Браузер | demo.nanomuse.dev — демонстрация на виртуальном телефоне после входа |
| Android 8.0+ | APK для arm64, каждая версия подписана тем же ключом и ставится поверх предыдущей |
| iPhone и iPad | TestFlight: бета-сборка, она станет доступна после проверки в Apple |
| macOS 12+ | DMG для Apple Silicon и Intel, нотариализации нет — при первом запуске правый клик и «Открыть» |
| Windows 10+ | EXE, при первом запуске «Выполнить в любом случае» |
| Linux x64 | AppImage, .deb или tar.gz |
| Свой сервер | bash scripts/self-host.sh --local для relay, docker compose up -d app для веб-приложения |
После установки вход по e-mail или по китайскому номеру телефона — и у агента сразу есть модель для размышлений. Телефон, компьютер и браузер работают под одним аккаунтом и показывают одни и те же разговоры.
На чём построено
- OpenMinis — агент, на котором построено телефонное приложение, вместе с proot и Alpine Linux для песочницы.
- DeepSeek Harness — каркас агента, плагином которого является приложение для компьютера.
- UI-TARS-desktop от ByteDance — оператор для рук на компьютере, порт их кода.
Своё лицо у nanoMuse одно: маленький дракон. Проект не связан с Meta и не одобрен ими, слово Muse — их товарный знак.
Как добавить свой инструмент и где в дереве репозитория что лежит — в docs/architecture.md. Правила для кодовых агентов, работающих в этом репозитории, — в CONTRIBUTING.md.
Источник: https://github.com/nano-muse/nanoMuse