Hermes agent bereiken vanaf uw telefoon
Beheer uw Hermes agent op afstand via een privaat mesh-netwerk, een publiek HTTPS-eindpunt of SSH. Leer hoe u veilig toegang verleent en direct intrekt bij verlies van uw toestel.
De drie manieren om uw Hermes agent vanaf uw telefoon te bereiken
Om uw Hermes agent vanaf uw telefoon te bereiken, gebruikt u het webdashboard. De werkelijke beslissing is wat u voor dat dashboard plaatst. Optie één is een privaat mesh-netwerk, waarbij het dashboard alleen op een Tailscale-adres luistert en geen enkele poort naar het internet is gericht. Optie twee is een publiek eindpunt achter een reverse proxy met TLS (transport layer security) en een login, waarbij die login de enige beveiliging is voor een terminal naar uw server. Optie drie is SSH (secure shell) vanuit een terminal-app; dit vereist de minste configuratie en biedt de meeste toegang.
Deze handleiding begint waar het draaien van een Hermes agent op uw eigen VPS eindigt. De agent is geïnstalleerd, reageert op de command line en u wilt deze nu op uw telefoon beschikbaar hebben.
De onderstaande commando's zijn geschreven voor tag v2026.8.3, gepubliceerd op 3 augustus 2026 en gelabeld als v0.20.0 in de release notes. Hermes brengt vaak updates uit, dus pin de machine aan een tag in plaats van main te volgen. Het installatieprogramma accepteert een commit:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --commit 3c27eb6234bf
hermes versionhermes version toont wat er daadwerkelijk is geïnstalleerd. Vergelijk dit met de tag voordat u vertrouwt op een flag op deze pagina.
Wat de repository bevat en wat niet
Er is geen iOS- of Android-app in de Hermes-repository. De native client is hermes desktop (alias hermes gui), een Electron-applicatie voor macOS, Windows en Linux. Deze kan verbinding maken met een externe agent in plaats van een lokale: stel de externe URL in op http://<server-address>:9119 in Settings onder Gateway, of exporteer HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 voordat u de applicatie start. Dat lost het probleem van een tweede laptop op. Voor een telefoon doet het niets.
De interface die u vanaf een telefoon gebruikt is hermes dashboard, de browserinterface. Deze beheert configuratie, sessies, cron jobs, skills, logs en berichtenplatforms, en bevat een ingebouwde terminal: de server start hermes --tui achter een PTY (pseudo-terminal) en streamt de uitvoer naar de pagina. Op een smal scherm klapt de sessiewisselaar in naar een slide-over paneel, waardoor de lay-out bruikbaar blijft op een telefoon.
Standaard luistert het dashboard op 127.0.0.1:9119 en opent het een browsertabblad op de server zelf, wat niet nuttig is op een headless VPS (virtual private server). Start het zonder de browser en controleer de socket:
hermes dashboard --no-open
ss -lntp | grep 9119Een listener op 127.0.0.1:9119 is alleen bereikbaar vanaf de server zelf. Een listener op 0.0.0.0:9119 is bereikbaar vanaf elk netwerk waarmee de machine is verbonden, inclusief het publieke netwerk. Die ene regel bepaalt hoe blootgesteld u bent; lees deze dus in plaats van er zomaar vanuit te gaan.
Optie 1: een privaat mesh-netwerk met Tailscale
Kies voor deze optie, tenzij u een specifieke reden heeft om dit niet te doen. Tailscale is een mesh-VPN (virtual private network) gebaseerd op WireGuard. Elk apparaat dat u aanmeldt, krijgt een stabiel adres en communiceert rechtstreeks met de andere apparaten. Uw telefoon wordt onderdeel van hetzelfde mesh-netwerk, waardoor het dashboard nooit een publieke poort nodig heeft.
Op de server:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4Installeer de Tailscale-app op de telefoon en log in met hetzelfde account. tailscale status op de server toont vervolgens de telefoon bij naam. Koppel het dashboard nu aan het adres dat tailscale ip -4 heeft weergegeven:
hermes dashboard --host 100.101.102.103 --port 9119 --no-openDoor te binden aan het mesh-adres in plaats van aan 0.0.0.0, bestaat de listening socket alleen op de Tailscale-interface. Een poortscan van uw publieke IP-adres vindt niets op 9119 omdat daar niets luistert; uw firewall is dus niet langer de enige beveiligingslaag. Bevestig dit opnieuw met ss -lntp | grep 9119.
Het bind-adres bepaalt ook de authenticatie, en dit is het punt dat vaak over het hoofd wordt gezien. Op 127.0.0.1 heeft het dashboard geen login. Op elk ander adres is de authenticatiepoort verplicht, en als er geen provider is geconfigureerd, weigert de server te starten. Het project noemt dit 'failing closed'. Start het de eerste keer interactief; het biedt dan direct aan om een gebruikersnaam en wachtwoord in te stellen. Het resultaat wordt weggeschreven naar ~/.hermes/.env:
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=you
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=scrypt$16384$8$1$...
HERMES_DASHBOARD_BASIC_AUTH_SECRET=a-long-random-stringGenereer dat geheim met openssl rand -hex 32 en wijzig het daarna niet meer. Het ondertekent de sessie-cookie, dus bij wijziging worden alle apparaten uitgelogd. Hetzelfde bestand bevat uw model API-keys, dus houd het privé met chmod 600 ~/.hermes/.env.
Controleer de toegangspoort vanaf een andere machine in het mesh-netwerk voordat u het vertrouwt:
curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'true gevolgd door ["basic"] betekent dat de toegangspoort actief is en dat de wachtwoordprovider reageert. De documentatie van het project zelf is duidelijk over die provider: deze is bedoeld voor een vertrouwd netwerk of een VPN en is niet geschikt voor een dashboard dat direct aan het publieke internet is blootgesteld. In een mesh-netwerk is dat precies de situatie waarin u zich bevindt.
Voor HTTPS binnen de tailnet, wijst u de poort toe aan Tailscale:
sudo tailscale serve --bg localhost:9119
sudo tailscale serve statusTailscale handelt TLS-termination af met een certificaat dat is uitgegeven voor de MagicDNS-naam van de machine, waardoor de browser geen waarschuwingen meer geeft en de sessie-cookie de Secure-vlag krijgt. Schakel eerst MagicDNS en HTTPS Certificates in op de DNS-pagina van de Tailscale-beheerdersconsole en lees de bevestiging terwijl u daar bent: uw machinenamen en uw tailnet DNS-naam worden gepubliceerd in het publieke certificate transparency-register, dat door iedereen kan worden ingezien.
De eerlijke prijs hiervoor is de coördinatieserver. Verkeer tussen uw telefoon en uw VPS is end-to-end versleuteld en loopt niet via Tailscale, maar het account dat bepaalt welke apparaten tot het mesh-netwerk behoren, bevindt zich niet op uw eigen hardware. Als dat een punt van zorg is, draai dan zelf het control plane met Headscale, de self-hosted Tailscale control server, en verwijs clients ernaar met tailscale up --login-server https://headscale.example.com. Als u liever geen mesh gebruikt en peers handmatig wilt configureren, behandelt de vergelijking tussen standaard WireGuard en Tailscale wat u inlevert.
Optie 2: een publiek HTTPS-eindpunt en de valkuil
Soms is een mesh niet beschikbaar. Een werktelefoon staat het installeren van een VPN-client mogelijk niet toe. In dat geval wordt het dashboard achter een reverse proxy geplaatst. Laat het dashboard op loopback draaien en laat Caddy het certificaat beheren:
hermes.example.com {
reverse_proxy 127.0.0.1:9119
}Caddy haalt en vernieuwt het certificaat zelfstandig, en de reverse_proxy van Caddy staat WebSocket-upgrades toe zonder extra instructies, wat noodzakelijk is voor de ingebouwde terminal van het dashboard. Bij nginx moet u de headers Upgrade en Connection zelf toevoegen, en het uitgeven van een Let's Encrypt-certificaat met Certbot op nginx behandelt het TLS-gedeelte van die taak. Geef Hermes de publieke naam door zodat inlog-callbacks naar de juiste host verwijzen:
dashboard:
public_url: "https://hermes.example.com"Nu de valkuil. De authenticatiepoort baseert zich op het bind-adres, niet op het adres waarvan het verzoek afkomstig is. Een dashboard dat is gebonden aan 127.0.0.1 achter een proxy ziet loopback, besluit dat inloggen niet nodig is en bedient iedereen die door de proxy wordt doorgelaten. Controleer wat u daadwerkelijk heeft gepubliceerd:
curl -s https://hermes.example.com/api/status | jq '.auth_required'Als dit false weergeeft, is het internet slechts één URL verwijderd van een terminal op uw server. Er is geen sprake van een exploit en de logs zullen geen melding maken van onregelmatigheden. Er zijn twee oplossingen en u dient er ten minste één toe te passen. Plaats de authenticatie in de proxy, met Authentik als self-hosted single sign-on provider ervoor via forward auth, of configureer de eigen OIDC (OpenID Connect)-provider van het dashboard:
HERMES_DASHBOARD_OIDC_ISSUER=https://auth.example.com/application/o/hermes/
HERMES_DASHBOARD_OIDC_CLIENT_ID=hermes-dashboard
HERMES_DASHBOARD_OIDC_SCOPES="openid profile email"Zelfs als dit correct wordt uitgevoerd, heeft deze optie een risiconiveau dat u niet verder kunt verlagen. Een publieke inlogpagina is een pagina die iedereen kan bereiken en aanvallen, en daarachter bevindt zich een shell op uw VPS. Een gebruikersnaam en wachtwoord bieden hiervoor slechts beperkte bescherming; daarom adviseren de documentatie OAuth of OIDC voor publieke binds. Beperk de inlogsnelheid (rate limiting), houd ufw gesloten voor alles behalve de proxy-poorten en SSH en controleer regelmatig het toegangslogboek.
Optie 3: SSH en mosh vanaf een mobiele terminal
De route met de minste inspanning: installeer een terminal-app op de telefoon, laad een SSH-sleutel en gebruik de tekstinterface van de agent zelf.
ssh you@vps.example.com
tmux new -A -s phone
hermes --tuitmux new -A -s phone koppelt aan een sessie genaamd phone, of maakt deze aan als deze nog niet bestaat, zodat de agent blijft draaien wanneer de verbinding wegvalt en u de volgende keer op dezelfde plek terugkeert. Het patroon is hetzelfde als dat wordt gebruikt voor Claude Code aansturen vanaf een telefoon.
Standaard SSH over een mobiel netwerk is onprettig, omdat de verbinding verbreekt zodra de telefoon van adres verandert of in de slaapstand gaat. Mosh lost dit op. Het draait over UDP (user datagram protocol) en synchroniseert de terminalstatus in plaats van een bytestroom, waardoor een sessie overleeft wanneer u overschakelt van wifi naar mobiele data:
sudo apt install -y mosh
sudo ufw allow 60000:61000/udpVoer vanaf de telefoon mosh you@vps.example.com uit. Mosh start mosh-server over uw bestaande SSH-login en verplaatst de sessie vervolgens naar UDP in het bereik 60000 tot 61000; daarom moet dat bereik openstaan.
De beveiligingskosten zijn de gebruikelijke. Een SSH-sessie is een shell, en een shell is alles wat dat account kan doen. De goedkeuringsverzoeken van de agent zijn dan het laatste wat staat tussen een gestolen ontgrendelde telefoon en uw bestanden. Gebruik hiervoor een toegewezen account zonder root-rechten, uitsluitend met sleutelauthenticatie, en doorloop SSH beveiligen op een VPS voordat u een sleutel op een apparaat plaatst dat u bij u draagt.
Wat er niet werkt op een mobiel netwerk
Er zijn vier punten, en geen daarvan is een bug die u kunt verhelpen via configuratie.
Het dashboard logt u uit terwijl u niet kijkt. Toegangstokens hebben een TTL (time to live) van 15 minuten en het huidige API-contract bevat geen refresh token. Wanneer het token verloopt, ziet de pagina de 401-respons en navigeert terug naar /login. Open het dashboard, stop de telefoon twintig minuten in uw zak, en u keert terug naar het inlogscherm waarbij alles wat u aan het typen was, verloren is gegaan. Er is niets defect. Log opnieuw in.
De ingebedde terminal overleeft het niet als het tabblad op de achtergrond raakt. De server start de TUI (text user interface) achter een PTY en sluit deze netjes af wanneer het tabblad wordt gesloten; bij het opnieuw openen wordt een nieuwe sessie gestart. Mobiele browsers verwijderen achtergrondtabbladen om geheugen vrij te maken, dus overschakelen naar een andere app voor langere tijd beëindigt de terminal. Uw chatgeschiedenis is veilig, omdat sessies op de server worden opgeslagen en hermes sessions list deze nog steeds toont. De terminal zelf is niet iets waar u opnieuw verbinding mee kunt maken. Als u een sessie nodig heeft die blijft bestaan, gebruik dan tmux via SSH.
Inactieve verbindingen sterven stilletjes. Mobiele providers verbreken inactieve TCP-verbindingen om NAT (network address translation) tabelvermeldingen vrij te maken, en de telefoon stopt bijna volledig met het onderhouden van het netwerk zodra het scherm uit is. Een WebSocket die een tijdje stil is geweest, is meestal al dood wanneer u het scherm ontgrendelt, en de pagina maakt pas opnieuw verbinding nadat u deze aanraakt. Dit is waarom mosh op een telefoon prettiger aanvoelt dan SSH: er is nooit een verbinding die verloren kan gaan.
Niets pusht een notificatie. Noch het dashboard, noch een SSH-sessie kan uw telefoon wakker maken. Er is geen Hermes-app op het apparaat, dus er is geen pad naar de push-service van het platform. Een lange agent-taak wordt voltooid, en u komt er pas achter de volgende keer dat u kijkt.
Notificaties komen binnen via de messaging gateway
De oplossing voor het laatstgenoemde probleem is de gateway, wat een volledig andere manier is om de agent te bereiken. hermes gateway verbindt de agent met messaging-platformen zoals Telegram, Discord, Slack, WhatsApp, Signal en e-mail. U communiceert vervolgens met uw agent binnen een app die al beschikt over een push-kanaal op uw telefoon, achtergrondaflevering afhandelt en netwerkonderbrekingen opvangt.
hermes gateway setup
hermes gateway install
hermes gateway statushermes gateway install registreert de gateway als een systemd-service, zodat deze na een reboot opnieuw opstart. De Hermes-installer maakt geen service-units voor u aan, dus hermes dashboard zal niet uit zichzelf terugkeren na een herstart. Schrijf een unit voor de onderdelen waarvan u afhankelijk bent; het schrijven van systemd-services en timers op een VPS behandelt het bestand zelf.
Een geplande taak kan op dezelfde manier een resultaat pushen, zonder dat daar een gesprek voor nodig is:
hermes send -t telegram -s "Backup report" -f /home/you/report.txtAutorisatie is hier standaard ingesteld op weigeren (deny by default). Zonder ingestelde allowlist en met GATEWAY_ALLOW_ALL_USERS uitgeschakeld, wordt elke gebruiker geweigerd; dit is het juiste uitgangspunt. Benoem de accounts die u wilt toestaan in ~/.hermes/.env:
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789Of schakel code-gebaseerde koppeling in in plaats van het plakken van numerieke ID's, door unauthorized_dm_behavior: pair in te stellen in ~/.hermes/config.yaml. Een onbekend account dat de agent een bericht stuurt, ontvangt een code van acht tekens en er gebeurt niets totdat u dit goedkeurt:
hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789Codes verlopen na een uur, een gebruiker kan elke tien minuten een nieuwe aanvragen en vijf mislukte pogingen blokkeren dat account.
De impact van een gestolen telefoon beperken
Een telefoon die uw agent kan bereiken, is een telefoon die opdrachten op uw server kan uitvoeren, en telefoons raken zoek. Bepaal nu wat de persoon die het toestel in handen heeft, kan doen.
Houd goedkeuringen ingeschakeld. approvals.mode staat standaard op smart, waarbij een hulpmodel het risico beoordeelt en alleen opdrachten met een laag risico automatisch goedkeurt. Het instellen op off is gelijk aan alles uitvoeren met --yolo, en HERMES_YOLO_MODE=1 regelt dit via de omgeving. Draag geen telefoon bij u die in die staat met een agent communiceert. Stel approvals.cron_mode: deny in zodat geplande taken zichzelf niet kunnen goedkeuren terwijl u slaapt.
approvals:
mode: smart
cron_mode: denyGeef de agent een beperktere omgeving om in te werken. terminal.backend: docker voert opdrachten uit in een container die alle Linux-capabilities laat vallen, behalve een korte lijst, stelt no-new-privileges in en beperkt het aantal processen, zodat de container de grens vormt in plaats van een prompt. terminal.cwd zet de werkmap vast. HERMES_WRITE_SAFE_ROOT beperkt write_file en patch tot de mappen die u opgeeft; schrijven buiten deze mappen wordt geblokkeerd zonder mogelijkheid tot goedkeuring.
export HERMES_WRITE_SAFE_ROOT=/home/you/projects:/home/you/.hermesHermes blokkeert al schrijfacties naar ~/.ssh, ~/.aws, ~/.kube en /etc/sudoers, weigert .env-bestanden ergens op de schijf te schrijven en verwerpt een vaste lijst met destructieve opdrachten, ongeacht uw goedkeuringsinstellingen. Beschouw dit als een ondergrens, niet als uw plan. Voer de agent uit als een gewone gebruiker, nooit als root. Dezelfde redenering geldt voor elke codeer-agent die onbeheerd achterblijft, en veilig uitvoeren van Claude Code op een VPS behandelt dit in meer detail.
Schrijf de stappen voor intrekking op voordat u ze nodig heeft. Het verwijderen van het apparaat in de Tailscale-beheerdersconsole verbreekt de mesh-toegang onmiddellijk. Het wijzigen van HERMES_DASHBOARD_BASIC_AUTH_SECRET en het opnieuw opstarten maakt elke dashboardsessie op elk apparaat ongeldig, omdat die waarde het sessie-cookie ondertekent. Het verwijderen van de publieke sleutel van de telefoon uit ~/.ssh/authorized_keys beëindigt SSH. hermes pairing revoke telegram <user-id> verwijdert een messaging-account. Als het apparaat gegevens bevatte waarmee uw providersleutels konden worden gelezen, trek deze dan in met hermes auth logout <provider> en vraag nieuwe aan bij de provider.
Controleer het resultaat in plaats van er zomaar vanuit te gaan. Dit zijn opdrachten die u op uw eigen systeem uitvoert, en wat ze weergeven hangt af van uw configuratie:
tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deepDe logs bevinden zich onder ~/.hermes/logs/. Lees ze na een incident, en lees ze ook af en toe wanneer er niets aan de hand is.
FAQ
Is er een officiële Hermes mobiele app voor iOS of Android?
Nee. De Hermes-repository levert een command line interface, een webdashboard en een Electron desktop-client voor macOS, Windows en Linux. Er is geen first-party build voor iOS of Android. Vanaf een telefoon gebruikt u het webdashboard in een browser, een SSH-client of een berichtenplatform dat is verbonden via hermes gateway. Er bestaan wel mobiele clients van derden, maar dit is code van derden die inloggegevens voor uw agent beheert; lees de broncode voordat u deze installeert.
Waarom logt het Hermes-dashboard mij uit op mijn telefoon?
Toegangstokens hebben een TTL van 15 minuten en het huidige API-contract bevat geen refresh token. Wanneer het token verloopt, ontvangt de pagina een 401-foutmelding en navigeert deze naar /login. Wanneer u een browser op een telefoon naar de achtergrond verplaatst, wordt dit merkbaar, omdat twintig minuten in een andere app voldoende is om de sessie te laten verlopen. Stel HERMES_DASHBOARD_BASIC_AUTH_SECRET in op een stabiele, willekeurige waarde zodat de sessie-ondertekeningssleutel na een herstart gelijk blijft; hiermee wordt de tweede reden voor het uitloggen weggenomen.
Kan ik het Hermes-dashboard veilig op het openbare internet plaatsen?
Alleen met authenticatie die u zelf heeft geverifieerd. De authenticatiepoort wordt ingeschakeld op basis van het bind-adres; een dashboard dat is gebonden aan 127.0.0.1 achter een reverse proxy vraagt het internet daarom nooit om een login. Voer curl -s https://your-host/api/status | jq '.auth_required' uit en lees de uitvoer. Gebruik OAuth of OIDC in plaats van een gebruikersnaam en wachtwoord, aangezien de documentatie van het project vermeldt dat de wachtwoordprovider bedoeld is voor vertrouwde netwerken en VPN's. Een private mesh omzeilt deze vraag volledig, wat de reden is dat dit de betere standaardoptie is.
Heb ik een Tailscale-account nodig, of kan ik de control plane zelf hosten?
U kunt deze zelf hosten. Headscale is een open implementatie van de Tailscale-coördinatieserver en officiële Tailscale-clients maken verbinding hiermee via tailscale up --login-server https://headscale.example.com. U bent dan zelf eigenaar van de lijst met apparaten die toegang hebben tot de mesh. De keerzijde is dat u deze server zelf moet beheren en back-uppen; zolang deze offline is, kunt u geen apparaten aanmelden of opnieuw authenticeren.
Hoe krijg ik een melding op mijn telefoon wanneer de agent een taak voltooit?
Gebruik de messaging gateway. Het dashboard en SSH hebben geen mogelijkheid om een telefoon te wekken, omdat er geen Hermes-app op het apparaat staat om een pushbericht te ontvangen. Verbind de agent met Telegram, Signal, Discord of een ander ondersteund platform via hermes gateway setup, en laat de app van dat platform de melding bezorgen. Een cron job kan ook een enkel bericht versturen met hermes send -t telegram -s "Job done" -f /path/to/report.txt, wat wordt afgeleverd zonder het model aan te roepen.