Hermes Desktop — нативное приложение для macOS, Windows и Linux, построенное вокруг того же ядра Hermes Agent, что и терминальный CLI. Оно разделяет конфигурацию, API-ключи, сессии, навыки и память с CLI-версией. Это не урезанная копия и не отдельный продукт — тот же агент с теми же настройками, но в интерфейсе, спроектированном для одновременной работы с несколькими разговорами, файлами и проектами.
Если вы уже работали с Hermes в терминале, всё настроенное там автоматически доступно в десктопе. И наоборот: любая сессия, начатая в десктопе, открывается в CLI.
Что произошло
У Hermes три интерфейса, и все они обращаются к одному агенту:
- Десктоп-приложение — нативное приложение с полноценным UI для чата, настройки и управления.
- CLI и TUI — терминальные интерфейсы для работы из командной строки.
- Веб-дашборд — панель администрирования в браузере с опциональной вкладкой чата.
Все три разделяют состояние. Можно начать сессию в одном интерфейсе и продолжить в другом.
Запуск десктоп-приложения выполняется одной командой:
hermes desktop
Команда использует текущую конфигурацию, ключи, сессии и навыки. Приложение построено по принципу chat-first: окно чата в центре, навигация — в левом сайдбаре. Дизайн рассчитан на одновременное управление несколькими разговорами агента, настройку провайдеров сообщений, создание артефактов и работу с несколькими проектами.
Контекст
Под капотом десктоп-приложение — это оболочка Electron с нативным React-интерфейсом. При первом запуске оно может установить рантайм Hermes Agent в HERMES_HOME (папка ~/.hermes на macOS/Linux или %LOCALAPPDATA%\hermes на Windows) — тот же layout, что использует CLI-инсталляция, поэтому два интерфейса взаимозаменяемы.
React-рендерер общается с headless-бэкендом, который приложение запускает самостоятельно — процесс hermes serve, предоставляющий tui_gateway JSON-RPC/WebSocket API. Десктоп не встраивает hermes —tui и не требует веб-дашборд: он самодостаточен и запускает свой собственный бэкенд.
Разрешение бэкенда работает по цепочке: сначала учитывается HERMES_DESKTOP_HERMES_ROOT, затем завершённая управляемая установка, затем hermes из PATH (если не указано —ignore-existing / HERMES_DESKTOP_IGNORE_EXISTING=1), и наконец переопределение HERMES_DESKTOP_HERMES для упаковщиков вроде Nix. Логика установки, разрешения бэкенда и самообновления живёт в главном процессе Electron.
Ключевые факты
Чат
Центр приложения. Потоковые ответы с живой активностью инструментов и структурированными сводками вызовов по мере работы агента. История разговоров та же, что в CLI и TUI — сессии, начатые в десктопе, продолжаются в терминале и наоборот.
Дополнительные возможности:
- Перетаскивание файлов в область чата для прикрепления к следующему сообщению.
- Правая панель предпросмотра — рендеринг веб-страниц, файлов и выводов инструментов рядом с чатом.
- История композера и редактирование очереди — стрелки вверх/вниз в пустом композере вызывают предыдущие промпты, а сообщения в очереди можно редактировать до отправки.
Статус-бар
Полоса внизу чата показывает живое состояние сессии и даёт быстрый доступ к настройкам без открытия панели:
- Переключатель YOLO для текущей сессии — включает/выключает обход подтверждений опасных команд. YOLO отключает промпты подтверждения, поэтому нужно понимать, что именно вы отключаете.
Выбор модели
Пикер модели находится в композере, слева от микрофона. Один клик — и можно переключить модель, reasoning effort и fast mode в одном выпадающем списке.
Пикер композера — это липкое UI-состояние, которое не меняет ваш дефолт. Оно запоминается локально на устройстве и сохраняется между новыми чатами и перезапусками. В активном чате смена модели применяется только к этому чату. Выбор никогда не записывается в дефолт профиля. Дефолт задаётся в Settings → Model — это «основная» модель профиля, от которой стартуют новые чаты, кроны, субагенты и вспомогательные задачи.
Для каждой модели десктоп запоминает свой уровень reasoning effort и режим fast mode и применяет их при каждом выборе этой модели. Эти пресеты — удобство десктопа, они не влияют на кроны и субагентов.
Переключение модели внутри активного чата сбрасывает промпт-кэш. Следующее сообщение перечитывает весь разговор по полной цене входных токенов — кэши провайдера привязаны к модели. Если чат длинный, дешевле открыть новый на новой модели, чем переключаться туда-сюда.
Файловый браузер
Просмотр и предпросмотр рабочей директории прямо в приложении — удобно следить за тем, как агент читает, пишет и редактирует файлы. Начальная директория проекта задаётся через hermes desktop —cwd
Голос
Голосовой режим — разговор с Hermes и голосовые ответы. На macOS система один раз запросит доступ к микрофону.
Настройки и онбординг
Управление провайдерами, моделями, инструментами и учётными данными через UI вместо редактирования YAML. Панели настроек покрывают провайдеров и ключи, выбор модели, конфигурацию инструментов, MCP-серверы, шлюз и управление сессиями.
Панель провайдеров — отдельное место для управления inference-провайдерами с UX для входа и хранения учётных данных по каждому провайдеру. Каждый провайдер и модель из каталога hermes model доступны в меню — GUI показывает полный список, а не кураторскую подборку.
Онбординг первого запуска переработан на единой системе overlay-дизайна. Можно выбрать «Choose provider later» — пропустить настройку провайдера и сразу войти в приложение.
- xAI Grok OAuth — Grok работает как OAuth-провайдер первого класса в лаунчере; вход через браузерный поток, как с другими OAuth-провайдерами.
- Установка бэкендов инструментов из GUI — шаги post-setup запускаются прямо в приложении.
- Предупреждение о вспомогательной модели — если переключить основную модель на нового провайдера, пока вспомогательные задачи (титрование, суммаризация) привязаны к другому провайдеру, приложение предупредит, чтобы вы не разделили работу по двум провайдерам случайно.
Панели управления
Десктоп также предоставляет поверхность управления Hermes, чтобы не переходить в терминал:
- Skills — просмотр, установка и управление навыками.
- Cron — просмотр и управление запланированными задачами.
- Profiles — переключение между профилями Hermes (изолированные конфиги, навыки, сессии).
- Messaging — настройка каналов шлюза.
- Agents и Command Center — поверхности оркестрации для multi-agent работы.
Клавиатура и навигация
- Command palette — Cmd+K (Ctrl+K на Windows/Linux) для перехода к действиям и навигации с клавиатуры.
- Переназначаемые шорткаты — панель в Settings позволяет переназначить горячие клавиши.
- Кастомный зум — изменение масштаба интерфейса в полушагах.
- Переключатель языка интерфейса — смена языка в приложении, включая упрощённый китайский (zh-Hans).
Сессии и профили
- Переработанный список сессий с архивированием и управлением гигиеной списка по мере роста.
- Поиск сессий по id — прямой поиск конкретной сессии.
- Параллельные мультипрофильные сессии — запуск сессий в нескольких профилях одновременно с перекрёстными ссылками @session.
Обновление
Приложение проверяет обновления в фоне и предлагает one-click обновление. Ручное обновление также работает через GUI.
Удаление
Settings → About → Danger zone предлагает три уровня удаления:
- Удалить только Chat GUI — убирает десктоп-приложение и его данные; агент, конфигурация и чаты остаются. Эквивалент hermes uninstall —gui.
- Удалить GUI и агента, сохранить данные — убирает приложение и агента, но сохраняет конфиги, чаты и секреты для будущей переустановки. Эквивалент hermes uninstall.
- Удалить всё — убирает приложение, агента и все пользовательские данные. Эквивалент hermes uninstall —full.
Приложение закрывается для завершения удаления — очистка запускается после выхода, чтобы можно было удалить работающий бандл и собственный venv. Опции удаления агента скрыты, когда локальный агент не установлен (например, GUI-only клиент подключён к удалённому бэкенду).
Примечание: запуск hermes uninstall —gui из checkout исходников (dev-сборка hermes desktop) также удаляет workspace node_modules и build-вывод apps/desktop/{dist,release}, поскольку это GUI-артефакты сборки. Они восстанавливаются через hermes desktop (или npm install + пересборку) — но если вы активно дорабатываете десктоп-приложение, ожидайте переустановку зависимостей после.
CLI: hermes desktop
Команда hermes desktop по умолчанию устанавливает Node-зависимости, собирает распакованное Electron-приложение для текущей ОС и запускает его.
| Флаг | Описание |
|---|---|
| —skip-build | Пропустить npm install/сборку и запустить существующее приложение из apps/desktop/release |
| —force-build | Принудительная полная пересборка, даже если stamp контента совпадает |
| —build-only | Собрать приложение, но не запускать (используется hermes update) |
| —source | Запуск через electron . из apps/desktop/dist вместо упакованного приложения |
| —cwd PATH | Начальная директория проекта для чат-сессий (устанавливает HERMES_DESKTOP_CWD) |
| —hermes-root PATH | Переопределить корень исходников Hermes (устанавливает HERMES_DESKTOP_HERMES_ROOT) |
| —ignore-existing | Игнорировать существующий hermes CLI на PATH при разрешении бэкенда |
| —fake-boot | Детерминированные задержки запуска для валидации startup UI |
Подключение к удалённому бэкенду
По умолчанию приложение запускает свой локальный бэкенд. Но можно подключить его к Hermes-бэкенду на другой машине — VPS, домашнем сервере или Mac mini за Tailscale.
Удалённый бэкенд — это запущенный процесс hermes serve на удалённой машине. Десктоп-приложение не запускает его; вы (или systemd) держите hermes serve запущенным на удалённом хосте, а приложение подключается к нему.
Подключение состоит из двух половин: на бэкенде вы защищаете его auth-провайдером, а в приложении вводите URL бэкенда и авторизуетесь. Привязка бэкенда к не-loopback адресу автоматически включает auth-gate.
Два варианта провайдера:
- OAuth (Nous Portal) — предпочтителен для всего, что доступно за пределами вашего компьютера. Регистрация через hermes dashboard register, затем вход из приложения через «Sign in with Nous Research». Self-hosted OIDC работает так же, если у вас свой identity provider.
- Username/password — только для локальной или доверенной сети. Простейший вариант, когда бэкенд в одной LAN или доступен через VPN (например, Tailscale). Не использовать для публичного интернета — для этого нужен OAuth.
Настройка через username/password на бэкенде:
# 1. Установить учётные данные для входа в дашборд
cat >> ~/.hermes/.env << 'EOF'
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=admin
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=choose-a-strong-password
# Рекомендуется: стабильный signing-секрет, чтобы сессии переживали рестарт
HERMES_DASHBOARD_BASIC_AUTH_SECRET=$(openssl rand -base64 32)
EOF
chmod 600 ~/.hermes/.env
# 2. Запустить бэкенд на достижимом адресе
# Привязка к не-loopback адресу включает auth gate
hermes serve --host 0.0.0.0 --port 9119
Держите процесс hermes serve запущенным, пока нужен доступ из десктопа. Запускайте под systemd, tmux или другим процесс-менеджером, чтобы пережить выход и перезагрузки.
Отдельно убедитесь, что шлюз запущен на удалённом хосте, если используете messaging-каналы (Telegram, Discord, Slack) — hermes serve это то, к чему подключается десктоп, а gateway-сессии — отдельный процесс.
Бэкенд читает и пишет ваш .env (API-ключи, секреты) и может запускать команды агента. Настройка username/password показанная выше — только для доверенной сети. Никогда не выставляйте password-protected бэкенд напрямую в открытый интернет — поставьте за VPN. Tailscale — чистый вариант: привяжите к tailscale IP (—host
) и используйте http:// :9119 как Remote URL, чтобы только ваш tailnet мог достичь его. Для доступа через публичный интернет используйте OAuth (Nous Portal).
Предпочитаете не хранить пароль в открытом виде? Установите HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH в scrypt-хэш вместо пароля. Вычисляется командой:
python -c "from plugins.dashboard_auth.basic import hash_password; print(hash_password('PW'))"
Полная поверхность конфигурации (ключи config.yaml, переменные окружения, rate limiter) — в документации Web Dashboard → Username/password provider.
Запуск бэкенда как systemd-сервиса? Укажите в unit-файле EnvironmentFile=%h/.hermes/.env, чтобы учётные данные были в окружении при загрузке.
В приложении: Settings → Gateway → Remote gateway:
- Remote URL — адрес бэкенда, например http://
:9119. - Sign in — приложение определяет провайдера бэкенда и адаптирует кнопку. Для username/password — форма ввода учётных данных. Для OAuth — кнопка «Sign in with
», запускающая браузерный sign-in. - Save and reconnect — переключает десктоп на удалённый бэкенд. Сессия обновляется автоматически; при установленном HERMES_DASHBOARD_BASIC_AUTH_SECRET вы остаётесь авторизованным после рестартов.
URL бэкенда также можно задать через переменную окружения HERMES_DESKTOP_REMOTE_URL перед запуском приложения — она переопределяет настройку в UI.
Хост удалённого шлюза настраивается per-profile — каждый профиль может указывать на свой удалённый бэкенд или оставаться на локальном. Переключение профиля меняет удалённый хост.
Решение проблем с удалённым подключением
- Sign-in fails с 401 / «Invalid credentials» — имя пользователя или пароль не совпадают с HERMES_DASHBOARD_BASIC_AUTH_USERNAME / HERMES_DASHBOARD_BASIC_AUTH_PASSWORD бэкенда. Бэкенд возвращает одинаковую ошибку для неизвестного пользователя и неверного пароля (без oracle перечисления), поэтому перепроверьте оба. Подтвердите, что gate включён: curl -s http://
:9119/api/status | jq ‘.auth_required, .auth_providers’ — должно вернуть true и включать “basic”. - Нет кнопки «Sign in» — просит session token — username/password провайдер бэкенда не активен. /api/status не покажет “basic” в auth_providers. Убедитесь, что и username, и password (или hash) установлены в ~/.hermes/.env и что процесс дашборда их загрузил.
- Вылогинивает на каждом рестарте — установите HERMES_DASHBOARD_BASIC_AUTH_SECRET в стабильное значение. Без него token-signing key регенерируется при каждой загрузке, инвалидируя все сессии.
- Connection refused / timeout — бэкенд привязан к 127.0.0.1 (дефолт) или firewall/VPN блокирует порт. Привяжите к 0.0.0.0 или tailscale IP и откройте порт для вашей доверенной сети.
Решение проблем
Логи запуска находятся в HERMES_HOME/logs/desktop.log — они включают вывод бэкенда и недавние Python tracebacks. Читать через CLI:
hermes logs gui -f
Общие сбросы:
# Принудительная чистая настройка первого запуска (macOS/Linux)
rm "$HOME/.hermes/hermes-agent/.hermes-bootstrap-complete"
# Пересборка сломанного Python venv (macOS/Linux)
rm -rf "$HOME/.hermes/hermes-agent/venv"
# Сброс зависшего промпта микрофона на macOS
tccutil reset Microphone com.nousresearch.hermes
Если «Build desktop app» зависает на скачивании Electron — рантайм Electron (~114 MB) загружается с github.com/electron/electron/releases. Если инсталлятор висит на шаге Build desktop app с сообщением retrying attempt=…, значит GitHub заблокирован или throttled. Инсталлятор самолечится: при неудаче очищает кэш и ретраит, при повторной неудаче пробует зеркало npmmirror.com. Чтобы задать своё зеркало:
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ \
bash -c 'cd "$HOME/.hermes/hermes-agent/apps/desktop" && CSC_IDENTITY_AUTO_DISCOVERY=false npm run pack'
Сборка из исходников
Для разработки — установить зависимости из корня репозитория, затем запустить dev-сервер из apps/desktop:
npm install # из корня репозитория
cd apps/desktop
npm run dev # Vite renderer + Electron, запускает Python бэкенд
Сборка инсталлеров:
npm run dist:mac # DMG + zip
npm run dist:win # NSIS + MSI
npm run dist:linux # AppImage + deb + rpm
npm run pack # распакованное приложение в release/
Подписание и нотаризация на macOS/Windows запускаются автоматически, если в окружении есть соответствующие учётные данные (CSC_LINK, CSC_KEY_PASSWORD, APPLE_* для macOS, WIN_CSC_* для Windows).
Как это влияет на практику
Десктоп-приложение решает несколько реальных болей для тех, кто работает с Hermes Agent регулярно. Во-первых, управление несколькими одновременными разговорами агента — в терминале это требует нескольких окон или tmux, в десктопе это встроенная возможность. Во-вторых, настройка провайдеров, ключей и инструментов через UI вместо YAML — порог входа ниже для тех, кто не хочет редактировать конфиги вручную.
Удалённый бэкенд — наиболее интересная возможность для команд и индивидуальных разработчиков. Запустите hermes serve на VPS или домашнем сервере, подключите десктоп с любого устройства — и работайте с агентом, который всегда на связи, с теми же ключами и сессиями. При этом messaging-шлюз (Telegram, Discord) работает как отдельный процесс на том же хосте.
Переключение моделей mid-chat — удобная, но потенциально дорогая функция. Каждый switch сбрасывает промпт-кэш провайдера, и следующее сообщение перечитывает весь разговор. На длинных чатах это может стоить больше, чем открытие нового чата на новой модели.
Что смотреть дальше
- Развитие management-поверхностей: Agents и Command Center для multi-agent оркестрации — пока что эти панели обозначены, но их функциональность будет расширяться.
- Поддержка дополнительных OAuth-провайдеров помимо Nous Portal — текущая архитектура позволяет подключать self-hosted OIDC.
- Расширение языков интерфейса — пока добавлен упрощённый китайский, ожидается появление других локализаций.
- Эволюция удалённого бэкенда и auth-gate — возможны новые провайдеры аутентификации и упрощение настройки для доверенных сетей.
Ссылки
Ссылки
- Документация: Hermes Agent CLI
- Документация: Electron
- Репозиторий: Electron на GitHub
- Сайт: Tailscale