
Um assistente pessoal de IA com foco em segurança.

Stavrobot é um assistente pessoal de IA construído com o princípio de "todo o acesso que um assistente de IA precisa, e nada mais".
Tem todas as funcionalidades interessantes de um assistente de IA, mas foca-se em sandboxing, isolamento e permissões mínimas. É leve e é implementado apenas com um docker compose up.
uv, isolado do ambiente anfitrião.Instalação assistida por IA: Diz à tua IA de programação (Claude Code, Cursor, Windsurf, etc.) para obter e seguir https://stavrobot.stavros.io/INSTALL.md — ela irá guiar-te por toda a configuração de forma interativa.
Instalação manual:
Envia mensagem ao @BotFather no Telegram para criar um bot e copia o token. Envia mensagem ao @userinfobot para obter o teu ID de utilizador do Telegram (este é usado como o chat ID).
Copia env.example para .env e altera POSTGRES_PASSWORD para algo seguro e TZ para o teu fuso horário.
Copia config.example.toml para data/main/config.toml e preenche os campos obrigatórios: apiKey, password, publicHostname, [owner].name, [owner].telegram (o teu chat ID), e [telegram].botToken. Tudo o resto no ficheiro é opcional.
docker compose up --build
É isso. Envia mensagem ao teu bot no Telegram e ele irá responder. Consulta as secções detalhadas de configuração abaixo para Signal, WhatsApp, email e outras opções.
config.example.toml para data/main/config.toml.authFile (ou apiKey) e publicHostname. Tudo o resto é opcional.env.example para .env e define o teu fuso horário (TZ). As credenciais do Postgres e outras definições de ambiente também podem ser substituídas aí. Define sempre POSTGRES_PASSWORD para algo seguro — o valor predefinido é um placeholder fraco e não deve ser usado em produção.Depois de a aplicação arrancar, abre /settings/config para editar config.toml no navegador. A página está protegida por HTTP Basic Auth e mostra a configuração em bruto, incluindo quaisquer segredos que contenha. Uma gravação válida cria uma única cópia de segurança <CONFIG_PATH>.bak, grava o novo conteúdo e reinicia a aplicação; isto interrompe qualquer turno do agente em curso.
plugin-runner, coder, signal-bridge e python-runner leem config.toml apenas quando arrancam. Alterações que os afetem, como a password, exigem reiniciar manualmente esses contentores.
O Stavrobot pode ser apontado para qualquer endpoint compatível com OpenAI (Ollama, LiteLLM, vLLM, etc.) ou um proxy personalizado compatível com Anthropic definindo baseUrl em config.toml. Consulta config.example.toml para os campos obrigatórios e exemplos de configuração. Define reasoning = true apenas para modelos que suportam pensamento, pois é isso que faz com que thinkingLevel se aplique num endpoint personalizado.
A aplicação suporta dois modos de autenticação: chave de API ou OAuth.
apiKey em config.toml. Não é necessário login nem logout.authFile em config.toml (um caminho onde as credenciais serão armazenadas). A página de login funciona com qualquer fornecedor OAuth suportado pelo Pi.
<your-hostname>/login num navegador. Segue as instruções na página, e as credenciais são guardadas no ficheiro de autenticação. O Stavrobot escolhe o método de login headless do fornecedor, por isso nunca és redirecionado para um callback localhost inacessível. Com a Anthropic, depois de selecionares Authorize, a Anthropic mostra um código, que copias e colas na página de login do Stavrobot. Os fornecedores com um fluxo de device-code mostram o código na página do Stavrobot, e tu escreve-lo no site do fornecedor. Se a autenticação expirar enquanto o bot está a correr, ele envia-te uma mensagem com o URL de login através da tua plataforma de mensagens.authFile. O bot irá detetar a ausência de credenciais na mensagem seguinte e pedir-te-á para iniciares sessão novamente.O contentor coder é opcional (necessário apenas para a funcionalidade de auto-programação). Por predefinição usa o Claude Code com autenticação por subscrição (OAuth), separada da chave de API da aplicação principal. Para usar antes um endpoint de API compatível com Anthropic, define tanto [coder].apiKey como [coder].baseUrl em config.toml; o Claude Code usa-os então como ANTHROPIC_API_KEY e ANTHROPIC_BASE_URL. O apiKey/baseUrl de nível superior apenas configuram o modelo da aplicação principal e nunca afetam o coder. Definir apenas uma das duas chaves [coder] é um erro de arranque.
Os perfis do Docker Compose são separados por vírgulas, por isso podes combiná-los (por exemplo, COMPOSE_PROFILES=signal,coder).
COMPOSE_PROFILES no teu ficheiro .env para incluir coder (por exemplo, COMPOSE_PROFILES=coder, ou COMPOSE_PROFILES=signal,coder se também estiveres a usar Signal).docker compose --profile coder up --build[coder].apiKey/[coder].baseUrl): docker compose exec -u coder coder claude (ele irá pedir-te para iniciares sessão se ainda não o fizeste).[coder].model na tua config para um alias de modelo do Claude Code (sonnet, opus, ou haiku).O Signal requer um número de telefone separado — não o teu pessoal. Um SIM pré-pago ou número VoIP funciona.