Como acessar seu agente Hermes pelo celular
Veja como acessar o dashboard Hermes no celular por Tailscale, HTTPS público ou SSH, com portas, login e revogação de acesso se o aparelho sumir.
As três formas de aceder ao seu agente Hermes a partir do telemóvel
Para aceder ao seu agente Hermes a partir do telemóvel, utiliza o respetivo dashboard web. A decisão principal é escolher o que fica à frente desse dashboard. A primeira opção é uma rede mesh privada, na qual o dashboard escuta apenas num endereço Tailscale e nenhuma porta fica exposta à Internet. A segunda opção é um endpoint público atrás de um reverse proxy com TLS (transport layer security) e um login. Nesse caso, esse login é a única proteção de um terminal no seu servidor. A terceira opção é utilizar SSH (secure shell) numa aplicação de terminal. Esta opção exige menos configuração e concede mais acesso.
Este guia começa onde termina a execução de um agente Hermes no seu próprio VPS. O agente está instalado, responde na linha de comandos e agora pretende tê-lo no telemóvel.
Os comandos abaixo usam como referência a tag v2026.8.3, publicada em 3 August 2026 e identificada como v0.20.0 nas notas da release. O Hermes lança versões com frequência. Por isso, fixe a máquina numa tag em vez de seguir main. O instalador aceita um commit:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --commit 3c27eb6234bf
hermes versionhermes version apresenta o que está realmente instalado. Compare esse valor com a tag antes de confiar em qualquer flag desta página.
O que o repositório disponibiliza e o que não disponibiliza
Não existe uma aplicação para iOS ou Android no repositório Hermes. O cliente nativo é hermes desktop (alias hermes gui), uma aplicação Electron para macOS, Windows e Linux. Pode ligar-se a um agente remoto em vez de um agente local: defina o URL remoto como http://<server-address>:9119 em Settings, na secção Gateway, ou exporte HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119 antes de o iniciar. Isto resolve o caso de um segundo portátil. Não resolve o acesso a partir de um telemóvel.
A interface que utiliza a partir de um telemóvel é hermes dashboard, a interface no browser. Permite gerir a configuração, as sessões, as tarefas cron, as skills, os logs e as plataformas de mensagens. Também inclui um terminal: o servidor inicia hermes --tui atrás de um PTY (pseudo-terminal) e transmite a saída para a página. Num ecrã estreito, o seletor de sessões transforma-se num painel deslizante, pelo que o esquema continua utilizável num telemóvel.
Por predefinição, o dashboard escuta em 127.0.0.1:9119 e abre um separador do browser no próprio servidor, o que não é útil num VPS (virtual private server) sem interface gráfica. Inicie-o sem abrir o browser e consulte o socket:
hermes dashboard --no-open
ss -lntp | grep 9119Um listener em 127.0.0.1:9119 só pode ser acedido a partir do servidor. Um listener em 0.0.0.0:9119 pode ser acedido a partir de todas as redes às quais a máquina está ligada, incluindo a rede pública. Essa única linha determina o nível de exposição, por isso consulte-a em vez de assumir o comportamento.
Opção 1: uma rede mesh privada com Tailscale
Escolha esta opção, exceto se tiver uma razão para não o fazer. O Tailscale é uma VPN mesh (rede privada virtual) baseada no WireGuard. Cada dispositivo que regista recebe um endereço estável e comunica diretamente com os restantes. O seu telefone entra na mesma rede mesh, por isso o dashboard nunca precisa de uma porta pública.
No servidor:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4Instale a aplicação Tailscale no telefone e inicie sessão com a mesma conta. tailscale status no servidor lista agora o telefone pelo nome. Em seguida, associe o dashboard ao endereço apresentado por tailscale ip -4:
hermes dashboard --host 100.101.102.103 --port 9119 --no-openAssociar o serviço ao endereço da rede mesh, em vez de 0.0.0.0, significa que o socket de escuta existe apenas na interface Tailscale. Uma análise às portas do seu endereço IP público não encontra nada na porta 9119, porque não há nenhum serviço a escutar nela. Assim, a firewall deixa de ser a única proteção. Confirme novamente com ss -lntp | grep 9119.
O endereço de associação também determina a autenticação, e esta é a parte que muitas pessoas não consideram. Em 127.0.0.1, o dashboard não tem início de sessão. Em qualquer outro endereço, a barreira de autenticação é obrigatória. Sem um fornecedor configurado, o servidor recusa iniciar. O projeto chama a este comportamento falhar de forma segura. Execute-o interativamente na primeira vez. O programa irá propor a configuração imediata de um nome de utilizador e de uma palavra-passe. O resultado é escrito em ~/.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-stringGere esse segredo com openssl rand -hex 32 e não o altere depois. O segredo assina o cookie de sessão, por isso alterá-lo termina a sessão em todos os dispositivos. O mesmo ficheiro contém as suas chaves de API dos modelos. Mantenha-o privado com chmod 600 ~/.hermes/.env.
Verifique a barreira a partir de outra máquina na rede mesh antes de confiar nela:
curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'true seguido de ["basic"] significa que a barreira está ativa e que o fornecedor de palavras-passe é o componente que está a responder. A documentação do próprio projeto é clara sobre esse fornecedor: destina-se a uma rede de confiança ou a uma VPN e não é adequado para um dashboard exposto à Internet pública. Numa rede mesh, essa é exatamente a situação em que se encontra.
Para usar HTTPS dentro da tailnet, entregue a porta ao Tailscale:
sudo tailscale serve --bg localhost:9119
sudo tailscale serve statusO Tailscale termina o TLS com um certificado emitido para o nome MagicDNS da máquina. Assim, o navegador deixa de apresentar avisos e o cookie de sessão recebe a sua flag Secure. Ative primeiro MagicDNS e HTTPS Certificates na página DNS da consola de administração do Tailscale. Leia também o aviso apresentado: os nomes das máquinas e o nome DNS da sua tailnet são publicados no registo público de transparência de certificados, que qualquer pessoa pode consultar.
O custo real desta opção é o servidor de coordenação. O tráfego entre o telefone e o VPS é cifrado de ponta a ponta e não passa pelo Tailscale. No entanto, a conta que decide quais dispositivos pertencem à rede mesh não está no seu hardware. Se isso for importante, execute o plano de controlo por sua conta com Headscale, o servidor de controlo Tailscale autoalojado e aponte os clientes para ele usando tailscale up --login-server https://headscale.example.com. Se preferir abandonar a rede mesh e configurar os peers manualmente, a comparação entre WireGuard simples e Tailscale explica o que terá de prescindir.
Opção 2: um endpoint HTTPS público e a armadilha que ele contém
Às vezes, uma mesh não está disponível. Um telefone de trabalho pode não permitir a instalação de um cliente VPN. Nesse caso, o dashboard fica atrás de um reverse proxy. Mantenha o dashboard em loopback e deixe o Caddy gerir o certificado:
hermes.example.com {
reverse_proxy 127.0.0.1:9119
}O Caddy obtém e renova o certificado automaticamente. O seu reverse_proxy encaminha atualizações para WebSocket sem diretivas adicionais, algo de que o terminal incorporado no dashboard precisa. No nginx, é necessário adicionar manualmente os cabeçalhos Upgrade e Connection. Emitir um certificado Let's Encrypt com Certbot no nginx explica a parte de TLS desse processo. Indique ao Hermes o seu nome público para que os callbacks de início de sessão apontem para o host correto:
dashboard:
public_url: "https://hermes.example.com"Agora, a armadilha. O mecanismo de autenticação baseia-se no endereço de bind, não no endereço de origem do pedido. Um dashboard ligado a 127.0.0.1 atrás de um proxy vê loopback, conclui que não é necessário iniciar sessão e disponibiliza o serviço a qualquer pessoa que o proxy deixe passar. Verifique o que foi efetivamente publicado:
curl -s https://hermes.example.com/api/status | jq '.auth_required'Se o resultado for false, a Internet fica a uma URL de distância de um terminal no seu servidor. Não é necessário qualquer exploit e nada nos logs irá gerar um alerta. Existem duas correções, e deve aplicar pelo menos uma delas. Coloque a autenticação no proxy, usando Authentik como fornecedor de single sign-on autoalojado à frente do serviço através de forward auth, ou configure o fornecedor OIDC (OpenID Connect) do próprio 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"Mesmo configurada corretamente, esta opção tem um limite mínimo que não pode ser reduzido. Uma página de início de sessão pública pode ser acedida e atacada por qualquer pessoa. Atrás dela existe uma shell no seu VPS. Um nome de utilizador e uma palavra-passe oferecem pouca proteção nesse cenário. Por isso, a documentação recomenda OAuth ou OIDC para binds públicos. Aplique um limite de taxa ao início de sessão, mantenha o ufw fechado para tudo exceto as portas do proxy e o SSH e consulte o access log periodicamente.
Opção 3: SSH e mosh a partir de um terminal móvel
A opção que exige menos trabalho: instale uma aplicação de terminal no telemóvel, carregue uma chave SSH nessa aplicação e use a própria interface de texto do agente.
ssh you@vps.example.com
tmux new -A -s phone
hermes --tuitmux new -A -s phone liga-se a uma sessão chamada phone ou cria-a se não existir. Assim, o agente continua em execução quando a ligação cai e, da próxima vez, regressa ao mesmo local. O padrão é o mesmo usado para controlar o Claude Code a partir de um telemóvel.
O SSH simples através de uma rede móvel é desconfortável, porque a ligação cai sempre que o telemóvel muda de endereço ou entra em suspensão. O mosh resolve esse problema. Funciona através de UDP (user datagram protocol) e sincroniza o estado do terminal em vez de transmitir um fluxo de bytes. Assim, a sessão sobrevive à passagem de Wi-Fi para a rede móvel:
sudo apt install -y mosh
sudo ufw allow 60000:61000/udpNo telemóvel, execute mosh you@vps.example.com. O mosh inicia mosh-server através da sessão SSH existente e, em seguida, transfere a sessão para UDP no intervalo de 60000 a 61000. Por isso, esse intervalo tem de estar aberto.
O custo de segurança é direto. Uma sessão SSH é um shell, e um shell permite tudo o que essa conta pode fazer. Os pedidos de aprovação do agente passam a ser a última barreira entre um telemóvel desbloqueado roubado e os seus ficheiros. Use uma conta dedicada sem privilégios de root e apenas com chave. Antes de colocar uma chave num dispositivo que transporta consigo, siga o guia para proteger o SSH num VPS.
O que falha numa rede móvel
Quatro coisas, e nenhuma delas é um erro que possa ser corrigido com configuração.
O dashboard termina a sua sessão enquanto não está a olhar. Os tokens de acesso têm um TTL (time to live) de 15 minutos e o contrato atual da API não tem token de atualização. Quando o token expira, a página recebe a resposta 401 e volta para /login. Abra o dashboard, guarde o telefone no bolso durante vinte minutos e voltará ao ecrã de início de sessão com tudo o que estava a escrever perdido. Não há nada avariado. Inicie sessão novamente.
O terminal incorporado não sobrevive a um separador em segundo plano. O servidor inicia a TUI (text user interface) atrás de uma PTY e encerra-a corretamente quando o separador é fechado. Ao reabrir, inicia uma nova. Os browsers móveis descartam separadores em segundo plano para recuperar memória, por isso mudar para outra aplicação durante tempo suficiente termina esse terminal. O histórico da conversa está seguro, porque as sessões são armazenadas no servidor e hermes sessions list continua a apresentá-las. Não é possível voltar a ligar-se ao terminal em si. Se precisar de uma sessão que sobreviva, use tmux através de SSH.
As ligações inativas terminam silenciosamente. As operadoras móveis eliminam ligações TCP inativas para libertar entradas da tabela NAT (network address translation), e o telefone deixa praticamente de processar a rede quando o ecrã está desligado. Um WebSocket que esteve silencioso durante algum tempo normalmente já morreu quando desbloqueia o telefone, e a página só volta a ligar-se depois de tocar no ecrã. É por isso que mosh parece funcionar melhor do que SSH num telefone: nunca teve uma ligação para perder.
Nenhuma notificação é enviada. Nem o dashboard nem uma sessão SSH conseguem ativar o telefone. Não existe uma aplicação Hermes no dispositivo, por isso não há caminho para o serviço de notificações push da plataforma. Uma execução longa do agente termina, e só fica a saber disso quando voltar a consultar o telefone.
As notificações chegam através do gateway de mensagens
A solução para o último caso é o gateway, que oferece outra forma de chegar ao agente. hermes gateway liga o agente a plataformas de mensagens, incluindo Telegram, Discord, Slack, WhatsApp, Signal e email. Assim, fala com o agente numa aplicação que já tem um canal push no seu telefone, já trata da entrega em segundo plano e já lida com interrupções da rede.
hermes gateway setup
hermes gateway install
hermes gateway statushermes gateway install regista o gateway como um serviço systemd, para que volte a arrancar depois de um reboot. O instalador do Hermes não cria unidades de serviço, por isso hermes dashboard não volta a arrancar automaticamente depois de um reinício. Crie uma unidade para cada componente de que dependa. O artigo como criar serviços e temporizadores systemd num VPS explica o próprio ficheiro.
Um job agendado pode enviar um resultado da mesma forma, sem envolver uma conversa:
hermes send -t telegram -s "Backup report" -f /home/you/report.txtA autorização segue aqui uma política de negação por defeito. Sem uma allowlist configurada e com GATEWAY_ALLOW_ALL_USERS não definido, todos os utilizadores são recusados. Esse é o ponto de partida correto. Indique as contas que pretende autorizar em ~/.hermes/.env:
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789Também pode ativar o emparelhamento baseado em código, em vez de colar IDs numéricos, definindo unauthorized_dm_behavior: pair em ~/.hermes/config.yaml. Uma conta desconhecida que envie uma mensagem ao agente recebe um código de oito caracteres. Nada mais acontece até o aprovar:
hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789Os códigos expiram ao fim de uma hora. Um utilizador pode solicitar um código a cada dez minutos. Cinco tentativas falhadas bloqueiam essa conta.
Limitando o impacto de um telefone roubado
Um telefone que consegue aceder ao seu agent consegue executar comandos no seu servidor, e os telefones perdem-se. Decida agora o que a pessoa que o tem em mãos pode fazer.
Mantenha as aprovações ativadas. approvals.mode tem o valor predefinido smart, que pede a um modelo auxiliar para avaliar o risco e aprova automaticamente apenas os comandos de baixo risco. Defini-lo como off equivale a executar tudo com --yolo, e HERMES_YOLO_MODE=1 faz o mesmo através do ambiente. Não transporte um telefone que comunica com um agent nesse estado. Defina approvals.cron_mode: deny para impedir que os trabalhos agendados se aprovem a si próprios enquanto dorme.
approvals:
mode: smart
cron_mode: denyDê ao agent um ambiente menor para comprometer. terminal.backend: docker executa comandos dentro de um contentor que remove todas as capacidades Linux, exceto uma lista curta, define no-new-privileges e limita o número de processos, fazendo do contentor a fronteira de segurança em vez do prompt. terminal.cwd fixa o diretório de trabalho. HERMES_WRITE_SAFE_ROOT restringe write_file e patch aos diretórios que indicar, e uma escrita fora desses diretórios é bloqueada sem possibilidade de substituição por uma aprovação.
export HERMES_WRITE_SAFE_ROOT=/home/you/projects:/home/you/.hermesO Hermes já bloqueia escritas em ~/.ssh, ~/.aws, ~/.kube e /etc/sudoers, recusa escrever ficheiros .env em qualquer local do disco e rejeita uma lista rígida de comandos destrutivos, independentemente das definições de aprovação. Considere isto o nível mínimo de proteção, não o seu plano de segurança. Execute o agent como um utilizador normal, nunca como root. O mesmo raciocínio aplica-se a qualquer coding agent deixado em execução sem supervisão, e executar o Claude Code com segurança num VPS explica isto com mais detalhe.
Depois, registe os passos de revogação antes de precisar deles. Remover o dispositivo na consola de administração do Tailscale corta imediatamente o acesso à rede mesh. Alterar HERMES_DASHBOARD_BASIC_AUTH_SECRET e reiniciar invalida todas as sessões do dashboard em todos os dispositivos, porque esse valor assina o cookie de sessão. Eliminar a chave pública do telefone em ~/.ssh/authorized_keys termina o acesso SSH. hermes pairing revoke telegram <user-id> remove uma conta de mensagens. Se o dispositivo tinha algo que pudesse ler as chaves do seu provider, revogue-as com hermes auth logout <provider> e emita novas chaves no serviço correspondente.
Verifique o resultado em vez de o presumir. Estes são comandos para executar no seu próprio servidor, e o que imprimem depende da sua configuração:
tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deepOs logs ficam em ~/.hermes/logs/. Leia-os depois de um incidente e consulte-os ocasionalmente quando não tiver ocorrido nenhum.
FAQ
Existe uma aplicação móvel oficial do Hermes para iOS ou Android?
Não. O repositório Hermes fornece uma interface de linha de comandos, um dashboard web e um cliente desktop Electron para macOS, Windows e Linux. Não existe uma versão oficial para iOS ou Android. Num telemóvel, use o dashboard web num browser, um cliente SSH ou uma plataforma de mensagens ligada através de hermes gateway. Também existem clientes móveis de terceiros. Estes são código de terceiros que armazena credenciais do seu agente. Leia o código-fonte antes de instalar um.
Porque é que o dashboard Hermes termina a sessão no meu telemóvel?
Os tokens de acesso têm um TTL de 15 minutos e o contrato atual da API não tem um token de atualização. Quando o token expira, a página recebe um 401 e navega para /login. Colocar um browser em segundo plano num telemóvel torna este comportamento evidente, porque vinte minutos noutra aplicação são suficientes para o token expirar. Defina HERMES_DASHBOARD_BASIC_AUTH_SECRET com um valor aleatório estável para que a chave de assinatura da sessão se mantenha igual entre reinícios. Isto elimina a segunda causa de encerramento da sessão.
Posso disponibilizar o dashboard Hermes na Internet pública com segurança?
Apenas com uma autenticação que tenha verificado pessoalmente. O mecanismo de autenticação é ativado com base no endereço de bind. Por isso, um dashboard associado a 127.0.0.1 e colocado atrás de um reverse proxy nunca pede um login a partir da Internet. Execute curl -s https://your-host/api/status | jq '.auth_required' e leia o resultado. Use OAuth ou OIDC em vez de um nome de utilizador e uma palavra-passe, porque a documentação do projeto indica que o fornecedor de palavras-passe se destina a redes fidedignas e VPNs. Uma mesh privada elimina esta questão. Por isso, é a opção predefinida mais adequada.
Preciso de uma conta Tailscale ou posso alojar o control plane por conta própria?
Pode alojá-lo por conta própria. O Headscale é uma implementação aberta do servidor de coordenação do Tailscale, e os clientes oficiais do Tailscale ligam-se a ele através de tailscale up --login-server https://headscale.example.com. Assim, passa a controlar a lista de dispositivos autorizados na mesh. O custo é ter de executar e salvaguardar esse servidor. Enquanto estiver indisponível, não poderá inscrever nem voltar a autenticar um dispositivo.
Como recebo uma notificação no telemóvel quando o agente termina um trabalho?
Use o gateway de mensagens. O dashboard e o SSH não conseguem ativar um telemóvel, porque não existe uma aplicação Hermes no dispositivo para receber uma notificação push. Ligue o agente ao Telegram, Signal, Discord ou a outra plataforma suportada através de hermes gateway setup. Depois, deixe a aplicação dessa plataforma entregar a notificação. Um cron job também pode enviar uma única mensagem com hermes send -t telegram -s "Job done" -f /path/to/report.txt. Esta opção envia a mensagem sem chamar o modelo.