Desktop Companion for Hermes Agent
See the code
English · 简体中文 · 日本語 · Español (LATAM)
This project is in active development. Features may change, and some things might break. If you run into a problem or have an idea, open an issue. Contributions are welcome!
Hermes One is a community maintained native desktop app for installing, configuring, and chatting with Hermes Agent — a self-improving AI assistant with tool use, multi-platform messaging, and a closed learning loop.
Instead of managing the CLI by hand, the app walks through install, provider setup, and day-to-day usage in one place. It uses the official Hermes install script, stores Hermes in ~/.hermes, and gives you a GUI for chat, sessions, profiles, memory, skills, tools, scheduling, messaging gateways, and more.
![]() | Atlas Cloud is a full-modal, OpenAI-compatible AI inference platform. Use it in Hermes One by selecting Atlas Cloud as your provider. The base URL is pre-configured automatically. |
![]() | Greptile is an AI code reviewer. It reviews and tests pull requests with full context of the codebase. It catches bugs, flags regressions, and leaves inline review comments on every PR automatically. |
Windows users: The installer is not code-signed. Windows SmartScreen will warn on first launch — click "More info" → "Run anyway".
WSL users: If the installer stalls at
Switching to root user to install dependencies..., Playwright is waiting for a sudo password that has no TTY to read from. Grant passwordless sudo for the install, then revert when finished:echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/hermes-install # …re-run the installer; once it finishes: sudo rm /etc/sudoers.d/hermes-installTracked in #109.
sudo dnf install ./hermes-desktop-<version>.rpm
Fedora users: The
.rpmis not GPG-signed. If your system enforces signature checking, append--nogpgcheckto the install command. Auto-update is not supported for.rpmbuilds (limitation ofelectron-updater); reinstall the new.rpmto update.
Chat![]() | Profiles![]() |
Models![]() | Providers![]() |
Tools![]() | Discover![]() |
Schedules![]() | Gateway![]() |
Persona![]() | Kanban![]() |
Office![]() | Settings![]() |
127.0.0.1:8642, or connect the desktop app to a remote Hermes API server with URL + API key/usage slash command/new, /clear, /fast, /web, /image, /browse, /code, /shell, /usage, /help, /tools, /skills, /model, /memory, /persona, /version, /compact, /compress, /undo, /retry, /debug, /status, and moreOn first launch, the app:
~/.hermes; if not, runs the official Hermes installer with dependency resolution (Git, uv, Python 3.11+).In local mode, chat requests go through http://127.0.0.1:8642 with SSE streaming. In remote mode, the app talks to your configured remote URL with the same streaming protocol. The desktop app parses the stream in real time, rendering tool progress, markdown content, and token usage as it arrives.
| Screen | Description |
|---|---|
| Chat | Streaming conversation UI with slash commands, tool progress, and token tracking |
| Sessions | Browse, search, and resume past conversations |
| Agents | Create, delete, and switch between Hermes profiles |
| Skills | Browse, install, and manage bundled and installed skills |
| Models | Manage saved model configurations per provider |
| Memory | View/edit memory entries, user profile, and configure memory providers |
| Soul | Edit the active profile's persona (SOUL.md) |
| Tools | Enable or disable individual toolsets |
| Schedules | Create and manage cron jobs with delivery targets |
| Gateway | Configure and control messaging platform integrations |
| Office | Claw3d visual interface setup and management |
| Settings | Provider config, credential pools, backup/import, log viewer, network settings, theme |
| Provider | Notes |
|---|---|
| Atlas Cloud | OpenAI-compatible gateway — DeepSeek, Qwen, GLM, Kimi, MiniMax and more (atlascloud.ai) |
| Provider | Notes |
|---|---|
| OpenRouter | 200+ models via single API (recommended) |
| Anthropic | Direct Claude access |
| OpenAI | Direct GPT access |
| Google (Gemini) | Google AI Studio |
| xAI (Grok) | Grok models |
| Nous Portal | Free tier available |
| Qwen | QwenAI models |
| MiniMax | Global and China endpoints |
| Hugging Face | 20+ open models via HF Inference |
| Groq | Fast inference (voice/STT) |
| Local/Custom | Any OpenAI-compatible endpoint |
Local presets are included for LM Studio, Atomic Chat, Ollama, vLLM, and llama.cpp.
Telegram, Discord, Slack, WhatsApp, Signal, Matrix/Element, Mattermost, Email (IMAP/SMTP), SMS (Twilio & Vonage), iMessage (BlueBubbles), DingTalk, Feishu/Lark, WeCom, WeChat (iLink Bot), Webhooks, and Home Assistant.
Exa Search, Parallel API, Tavily, Firecrawl, FAL.ai (image generation), Honcho, Browserbase, Weights & Biases, and Tinker.
When the app opens for the first time, it will either detect an existing Hermes installation or offer to install it for you.
Supported setup paths in the UI:
OpenRouterAnthropicOpenAILocal LLM via an OpenAI-compatible base URLLocal presets are included for:
Hermes files are managed in:
~/.hermes~/.hermes/.env~/.hermes/config.yaml~/.hermes/hermes-agent~/.hermes/profiles/ — named profile directories~/.hermes/state.db — session history database~/.hermes/cron/jobs.json — scheduled tasksBy default, API keys live in ~/.hermes/.env (the env provider). No
configuration is needed — this is byte-for-byte the historical behavior, and
nothing changes for you.
If you'd rather not keep keys in a plaintext .env, the opt-in command
provider resolves them by running a helper command you configure. Resolution
order everywhere is: process.env → .env → provider → unset.
Per-key helper (the requested key name arrives as $HERMES_SECRET_KEY):
# ~/.hermes/config.yaml
secrets:
provider: command
command: secret-tool lookup hermes "$HERMES_SECRET_KEY"
Or a helper that dumps a dotenv blob (e.g. a vault that unseals into tmpfs):
secrets:
provider: command
command: "cat /run/user/1000/hermes-secrets.env"
The helper's stdout may be either a single bare value (per-key helpers) or
KEY=VALUE lines (dotenv dumps); both shapes are auto-detected.
The command provider is vault-agnostic — it runs whatever helper you
configure and reads its stdout. The helper is the only thing that needs to
talk to your secret store. If you don't have a TPM-sealed keyfile, any of
these work without code changes to Hermes:
secrets.command at a
small kpxc-export.sh script that does
keepassxc-cli ls ~/secrets/hermes.kdbx <<<"$KPXC_PASSWORD" and dumps
the relevant group as dotenv. Prompt the user for the master password
once per session.gpg --batch --passphrase-fd 0 --decrypt ~/.keys/api-keys.gpg works directly as the command value.
Pass the passphrase via a file descriptor or env var, never argv.pass (the standard unix password manager):
command: "pass show hermes/$HERMES_SECRET_KEY" for a per-key helper,
or a small wrapper script for a dotenv dump.secret-tool (libsecret/Gnome Keyring):
command: "secret-tool lookup hermes $HERMES_SECRET_KEY" (already
shown above as the canonical per-key example).bw get item "$HERMES_SECRET_KEY" | jq -r .notes
(after bw unlock in the session).op read "op://vault/$HERMES_SECRET_KEY/credential".command: "cat ~/.config/hermes/secrets.env" with chmod 600 and
the file owned by your user. Not as secure as a vault, but better than
a world-readable .env.The point: any helper that prints a value (per-key) or a dotenv blob (list-mode) on stdout will work, and Hermes imposes a 3-second timeout and 1 MiB output cap on the helper so a misbehaving one can't wedge the app. The provider makes no assumptions about TPM, FIDO2, smart cards, or platform keychains.
Security model:
.env.
It runs via /bin/sh -c, so the command provider is POSIX-only
(Linux/macOS); Windows stays on the env provider.HERMES_SECRET_KEY; the
key name is passed as data, never interpolated into the shell string.list() call, never a per-key
helper loop.Source of truth: src/main/secrets/.
--skip-setup, then completes provider configuration in the GUI.Contributions are welcome! Check out the Contributing Guide to get started. If you're not sure where to begin, take a look at the open issues. Found a bug or have a feature request? File an issue.
This repo is not affiliated to Nous Research. This is a community maintained project.
For the core agent, docs, and CLI workflows, see the main Hermes Agent repository:
(top 24 of 45)
70 followers · starred Jun 2026
795 followers · starred Jul 2026
7 followers · starred May 2026
139 followers · starred Jun 2026
Desktop Companion for Hermes Agent
See the code
English · 简体中文 · 日本語 · Español (LATAM)
This project is in active development. Features may change, and some things might break. If you run into a problem or have an idea, open an issue. Contributions are welcome!
Hermes One is a community maintained native desktop app for installing, configuring, and chatting with Hermes Agent — a self-improving AI assistant with tool use, multi-platform messaging, and a closed learning loop.
Instead of managing the CLI by hand, the app walks through install, provider setup, and day-to-day usage in one place. It uses the official Hermes install script, stores Hermes in ~/.hermes, and gives you a GUI for chat, sessions, profiles, memory, skills, tools, scheduling, messaging gateways, and more.
![]() | Atlas Cloud is a full-modal, OpenAI-compatible AI inference platform. Use it in Hermes One by selecting Atlas Cloud as your provider. The base URL is pre-configured automatically. |
![]() | Greptile is an AI code reviewer. It reviews and tests pull requests with full context of the codebase. It catches bugs, flags regressions, and leaves inline review comments on every PR automatically. |
Windows users: The installer is not code-signed. Windows SmartScreen will warn on first launch — click "More info" → "Run anyway".
WSL users: If the installer stalls at
Switching to root user to install dependencies..., Playwright is waiting for a sudo password that has no TTY to read from. Grant passwordless sudo for the install, then revert when finished:echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/hermes-install # …re-run the installer; once it finishes: sudo rm /etc/sudoers.d/hermes-installTracked in #109.
sudo dnf install ./hermes-desktop-<version>.rpm
Fedora users: The
.rpmis not GPG-signed. If your system enforces signature checking, append--nogpgcheckto the install command. Auto-update is not supported for.rpmbuilds (limitation ofelectron-updater); reinstall the new.rpmto update.
Chat![]() | Profiles![]() |
Models![]() | Providers![]() |
Tools![]() | Discover![]() |
Schedules![]() | Gateway![]() |
Persona![]() | Kanban![]() |
Office![]() | Settings![]() |
127.0.0.1:8642, or connect the desktop app to a remote Hermes API server with URL + API key/usage slash command/new, /clear, /fast, /web, /image, /browse, /code, /shell, /usage, /help, /tools, /skills, /model, /memory, /persona, /version, /compact, /compress, /undo, /retry, /debug, /status, and moreOn first launch, the app:
~/.hermes; if not, runs the official Hermes installer with dependency resolution (Git, uv, Python 3.11+).In local mode, chat requests go through http://127.0.0.1:8642 with SSE streaming. In remote mode, the app talks to your configured remote URL with the same streaming protocol. The desktop app parses the stream in real time, rendering tool progress, markdown content, and token usage as it arrives.
| Screen | Description |
|---|---|
| Chat | Streaming conversation UI with slash commands, tool progress, and token tracking |
| Sessions | Browse, search, and resume past conversations |
| Agents | Create, delete, and switch between Hermes profiles |
| Skills | Browse, install, and manage bundled and installed skills |
| Models | Manage saved model configurations per provider |
| Memory | View/edit memory entries, user profile, and configure memory providers |
| Soul | Edit the active profile's persona (SOUL.md) |
| Tools | Enable or disable individual toolsets |
| Schedules | Create and manage cron jobs with delivery targets |
| Gateway | Configure and control messaging platform integrations |
| Office | Claw3d visual interface setup and management |
| Settings | Provider config, credential pools, backup/import, log viewer, network settings, theme |
| Provider | Notes |
|---|---|
| Atlas Cloud | OpenAI-compatible gateway — DeepSeek, Qwen, GLM, Kimi, MiniMax and more (atlascloud.ai) |
| Provider | Notes |
|---|---|
| OpenRouter | 200+ models via single API (recommended) |
| Anthropic | Direct Claude access |
| OpenAI | Direct GPT access |
| Google (Gemini) | Google AI Studio |
| xAI (Grok) | Grok models |
| Nous Portal | Free tier available |
| Qwen | QwenAI models |
| MiniMax | Global and China endpoints |
| Hugging Face | 20+ open models via HF Inference |
| Groq | Fast inference (voice/STT) |
| Local/Custom | Any OpenAI-compatible endpoint |
Local presets are included for LM Studio, Atomic Chat, Ollama, vLLM, and llama.cpp.
Telegram, Discord, Slack, WhatsApp, Signal, Matrix/Element, Mattermost, Email (IMAP/SMTP), SMS (Twilio & Vonage), iMessage (BlueBubbles), DingTalk, Feishu/Lark, WeCom, WeChat (iLink Bot), Webhooks, and Home Assistant.
Exa Search, Parallel API, Tavily, Firecrawl, FAL.ai (image generation), Honcho, Browserbase, Weights & Biases, and Tinker.
When the app opens for the first time, it will either detect an existing Hermes installation or offer to install it for you.
Supported setup paths in the UI:
OpenRouterAnthropicOpenAILocal LLM via an OpenAI-compatible base URLLocal presets are included for:
Hermes files are managed in:
~/.hermes~/.hermes/.env~/.hermes/config.yaml~/.hermes/hermes-agent~/.hermes/profiles/ — named profile directories~/.hermes/state.db — session history database~/.hermes/cron/jobs.json — scheduled tasksBy default, API keys live in ~/.hermes/.env (the env provider). No
configuration is needed — this is byte-for-byte the historical behavior, and
nothing changes for you.
If you'd rather not keep keys in a plaintext .env, the opt-in command
provider resolves them by running a helper command you configure. Resolution
order everywhere is: process.env → .env → provider → unset.
Per-key helper (the requested key name arrives as $HERMES_SECRET_KEY):
# ~/.hermes/config.yaml
secrets:
provider: command
command: secret-tool lookup hermes "$HERMES_SECRET_KEY"
Or a helper that dumps a dotenv blob (e.g. a vault that unseals into tmpfs):
secrets:
provider: command
command: "cat /run/user/1000/hermes-secrets.env"
The helper's stdout may be either a single bare value (per-key helpers) or
KEY=VALUE lines (dotenv dumps); both shapes are auto-detected.
The command provider is vault-agnostic — it runs whatever helper you
configure and reads its stdout. The helper is the only thing that needs to
talk to your secret store. If you don't have a TPM-sealed keyfile, any of
these work without code changes to Hermes:
secrets.command at a
small kpxc-export.sh script that does
keepassxc-cli ls ~/secrets/hermes.kdbx <<<"$KPXC_PASSWORD" and dumps
the relevant group as dotenv. Prompt the user for the master password
once per session.gpg --batch --passphrase-fd 0 --decrypt ~/.keys/api-keys.gpg works directly as the command value.
Pass the passphrase via a file descriptor or env var, never argv.pass (the standard unix password manager):
command: "pass show hermes/$HERMES_SECRET_KEY" for a per-key helper,
or a small wrapper script for a dotenv dump.secret-tool (libsecret/Gnome Keyring):
command: "secret-tool lookup hermes $HERMES_SECRET_KEY" (already
shown above as the canonical per-key example).bw get item "$HERMES_SECRET_KEY" | jq -r .notes
(after bw unlock in the session).op read "op://vault/$HERMES_SECRET_KEY/credential".command: "cat ~/.config/hermes/secrets.env" with chmod 600 and
the file owned by your user. Not as secure as a vault, but better than
a world-readable .env.The point: any helper that prints a value (per-key) or a dotenv blob (list-mode) on stdout will work, and Hermes imposes a 3-second timeout and 1 MiB output cap on the helper so a misbehaving one can't wedge the app. The provider makes no assumptions about TPM, FIDO2, smart cards, or platform keychains.
Security model:
.env.
It runs via /bin/sh -c, so the command provider is POSIX-only
(Linux/macOS); Windows stays on the env provider.HERMES_SECRET_KEY; the
key name is passed as data, never interpolated into the shell string.list() call, never a per-key
helper loop.Source of truth: src/main/secrets/.
--skip-setup, then completes provider configuration in the GUI.Contributions are welcome! Check out the Contributing Guide to get started. If you're not sure where to begin, take a look at the open issues. Found a bug or have a feature request? File an issue.
This repo is not affiliated to Nous Research. This is a community maintained project.
For the core agent, docs, and CLI workflows, see the main Hermes Agent repository:
(top 24 of 45)
70 followers · starred Jun 2026
795 followers · starred Jul 2026
7 followers · starred May 2026
139 followers · starred Jun 2026