Hermes Agent
The self-improving AI agent built by Nous Research. The only agent with a built-in learning loop — it creates skills from experience, improves them during use, nudges itself to persist knowledge, and builds a deepening model of who you are across sessions.
Command-line only / remote gateway
Linux / macOS / WSL2 / Android (Termux)
Install Hermes Agent:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bashWindows
irm https://hermes-agent.nousresearch.com/install.ps1 | iexFallback providers
When your main LLM provider encounters errors — rate limits, server overload, auth failures, connection drops — Hermes can automatically switch to a backup provider:model pair mid-session without losing your conversation.
Run the following command to select a fallback provider and model:
hermes fallback addIf you are attempting to use your xAI SuperGrok subscription but want to fallback to using your API key when you hit your weekly limit, make sure you comment out base_url in ~/.hermes/config.yaml or it’ll be incorrectly ignored as duplicate.
-
Open hermes config in a text editor:
Terminal window nano ~/.hermes/config.yaml -
Comment out the following two lines:
~/.hermes/config.yaml model:default: grok-build-0.1provider: xai-oauthbase_url: https://api.x.ai/v1# base_url: https://api.x.ai/v1fallback_providers:- provider: xaimodel: grok-build-0.1base_url: https://api.x.ai/v1# base_url: https://api.x.ai/v1 -
Press Ctrl + O to save the file and Ctrl + X to exit.
Web Dashboard
Configure basic auth
All secrets should be stored in ~/.hermes/.env/
-
Set a username, replacing
example_usernamewith a unique username:Terminal window hermes config set HERMES_DASHBOARD_BASIC_AUTH_USERNAME example_user -
Enter a secure password and store the hashed value:
Terminal window HASH=$(~/.hermes/hermes-agent/venv/bin/python -c 'from plugins.dashboard_auth.basic import hash_password; import getpass; print(hash_password(getpass.getpass("Password: ")))')hermes config set HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH "$HASH"unset HASH -
Set a randomly generated secret for persistent auth sessions:
Terminal window hermes config set HERMES_DASHBOARD_BASIC_AUTH_SECRET "$(openssl rand -base64 32)" -
Set access-token lifetime for the basic provider to
0if using Hermes Desktop:Terminal window hermes config set HERMES_DASHBOARD_BASIC_AUTH_TTL_SECONDS 0 -
Set the public URL, replacing
hermes.example.comwith your custom domain:Terminal window hermes config set HERMES_DASHBOARD_PUBLIC_URL https://hermes.example.com
You may also add or modify these settings by opening ~/.hermes/.env in a text editor:
nano ~/.hermes/.envMake sure you run the dashboard with --host 0.0.0.0 if using a reverse proxy:
hermes dashboard --host 0.0.0.0 --port 9119 --no-openNote: The --port 9119 part is redundant and can be omitted (as it’s the default port).
Install as a systemd service
The easiest way to have a persistent web dashboard is to set it up exactly like the messaging gateway.
-
Change to the following directory:
Terminal window cd ~/.config/systemd/user -
Copy the existing gateway service:
Terminal window cp hermes-gateway.service hermes-dashboard.service -
Open the new file into a text editor
Terminal window nano hermes-dashboard.service -
Change the following two lines:
hermes-dashboard.service [Unit]Description=Hermes Agent Gateway - Messaging Platform IntegrationDescription=Hermes Agent Web DashboardAfter=network-online.targetWants=network-online.targetStartLimitIntervalSec=0[Service]Type=simpleExecStart=/home/example_user/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main gateway runExecStart=/home/example_user/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main dashboard --host 0.0.0.0 --port 9119 --no-openWorkingDirectory=/home/example_user/.hermesEnvironment="PATH=/home/example_user/.hermes/hermes-agent/venv/bin:/home/example_user/.hermes/hermes-agent/node_modules/.bin:/usr/bin:/home/example_user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"Environment="VIRTUAL_ENV=/home/example_user/.hermes/hermes-agent/venv"Environment="HERMES_HOME=/home/example_user/.hermes"Restart=alwaysRestartSec=5RestartForceExitStatus=75KillMode=mixedKillSignal=SIGTERMExecReload=/bin/kill -USR1 $MAINPIDTimeoutStopSec=210StandardOutput=journalStandardError=journal[Install]WantedBy=default.targetHere’s the exact command to copy and paste:
Terminal window dashboard --host 0.0.0.0 --port 9119 --no-open -
Press Ctrl + O to save the file and Ctrl + X to exit.
-
Run the following commands:
Terminal window systemctl --user daemon-reloadsystemctl --user enable --now hermes-dashboard.servicesystemctl --user status hermes-dashboard.service
Restart dashboard
To restart the web dashboard (e.g., to reload secrets stored in environment variables):
systemctl --user restart hermes-dashboard.serviceDesktop app
-
Download and install the Hermes Desktop app from the official website.
-
Click on
I'll choose a provider laterin the lower left corner. -
Click on the settings gear icon in the top right corner.
-
Click
Gatewaysand underGateway Connection, click onRemote gateway. -
Enter the remote URL for the dashboard backend (E.g., https://hermes.example.com). I strongly recommend connecting over a secure connection.
-
Click
Sign inand enter your Hermes Dashboard username and password. -
Click
Test remote, followed bySave and reconnect. -
Close the settings window by clicking on the smaller
xin the top right corner.
Updating
-
Close the desktop app
-
Open Windows Terminal
-
Run
hermes update -
Wait
Troubleshooting
HTTP 429 errors when running hermes update
Sometimes the GitHub HTTP server isn’t reliable and you need to switch to using the SSH origin:
git -C ~/.hermes/hermes-agent remote set-url origin [email protected]:NousResearch/hermes-agent.gitFailed to fetch updates from origin
Interrupting hermes update too many times seems to break things.
-
Check for git errors
Terminal window cd ~/.hermes/hermes-agentgit fsck --full -
Wipe and start over
Terminal window cd ~/.hermes/hermes-agentrm -rf .gitgit initgit remote add origin [email protected]:NousResearch/hermes-agent.gitgit fetch origin main --depth 1git checkout -B main FETCH_HEADgit reset --hard FETCH_HEAD