Tudo o que o seu site precisa, num só lugar.
O assistente de IA, as estatísticas, a caixa de contatos, a segurança, a privacidade e as cópias de segurança vêm juntos, no seu servidor. Para a sua equipe de TI, cada recurso tem os seus detalhes técnicos logo abaixo, e a documentação completa está no GitHub.
Assistente de IA
O coração de um site que responde.
Um assistente que atende por você
Ele conversa com os visitantes a qualquer hora, com base nas informações que você forneceu, dentro do limite de gasto que você definiu.
- Você ensina o assistente com textos simples, e ele passa a responder com a informação nova assim que você os atualiza.
- Gasto sob controle: tetos diários para o site todo e para cada visitante.
- Resumos das conversas: anônimos, enviados à sua equipe só quando o visitante escolhe.
- Ele se apresenta como IA, e a conversa fica no navegador do visitante, não no servidor.
- Funciona com OpenAI, OpenRouter, Groq ou um modelo no seu próprio servidor (Ollama).
Detalhes técnicos
- Uma API de chat pública,
POST /api/agent/messages, com qualquer modelo compatível com a OpenAI que suporte chamada de ferramentas. - Instruções na pasta
instructions/de um repositório git, sincronizada como o site. - Limites: tokens de saída por chamada, tokens por dia para todos e por IP, requisições por minuto; uso por dia e por IP no backoffice.
- Histórico assinado com HMAC-SHA256; o Emissario não guarda nenhuma conversa.
- O modelo só pode chamar as URLs que você declarar.
Publicação
Seu site sempre atualizado, sem mexer no servidor.
Publique uma mudança, e ela entra no ar sozinha
Os arquivos do seu site ficam guardados no GitHub (ou em outro serviço do mesmo tipo). O Emissario busca a versão mais nova sozinho e a coloca no ar. Ninguém precisa acessar o servidor para mudar um texto.
- Atualização automática, no intervalo que você escolher, ou na hora, com o botão Sincronizar.
- Se algo der errado na atualização, o site continua no ar como estava.
- O histórico de cada mudança fica guardado no GitHub.
Detalhes técnicos
O Emissario serve a pasta frontend/ de um repositório git, como está no commit, e puxa a branch em um intervalo, ou sob demanda por um botão ou pela API. Publicar o site é um git push.
- repositório
https://,ssh://,git://,file://ouuser@host:path- intervalo
- de 10 segundos a 720 horas, ou sob demanda com Sincronizar
- credenciais
- nenhuma guardada: o git roda com as chaves SSH ou o credential helper do usuário do servidor
- um fetch que falha
- deixa o site como estava
my-site/ └── frontend/ ├── index.html → / ├── about.html → /about ├── blog/index.html → /blog/ ├── not-found.html → 404 └── assets/ → /assets/…Documentação do Website Source
- Alguém edita o site e salva a mudança no GitHub.
- O Emissario percebe a versão nova, no próximo intervalo ou no botão Sincronizar.
- O site é atualizado para todos os visitantes, sem tirar nada do ar.
Visitas e contatos
Conheça o seu público sem rastreá-lo.
Estatísticas de visitas, sem cookies
Saiba quais páginas são mais lidas, de quais países vêm os visitantes, em quais aparelhos e navegadores, e de quais sites eles chegaram. O próprio servidor conta as visitas: nenhum dado vai para empresas de anúncios ou de analytics.
- Gráficos ao longo do tempo, por página, país, aparelho e navegador; cada linha vira um filtro.
- Robôs são contados à parte, para não inflar os números.
- Páginas não encontradas aparecem também, para você corrigir links quebrados.
- Exporte os dados em planilha (CSV).
Detalhes técnicos
- O servidor registra cada visualização (página, horário, país, dispositivo, navegador, sistema, origem) sem cookie, sem script de rastreamento e sem serviço de terceiros.
- O país é consultado localmente, na base DB-IP IP to Country Lite embutida no binário: o IP não vai para lugar nenhum.
- IPs ignorados, retenção de 90 dias por padrão, IP em hash por padrão.
- Um viewer vê os IPs dos visitantes mascarados.
Uma caixa de entrada para os contatos do site
As mensagens do formulário do seu site, e os pedidos de orçamento, chegam a uma caixa de entrada no painel, com data, hora e país.
- Busque por período, país ou qualquer palavra.
- Arquive o que já foi respondido.
- Proteção contra envios em massa: um limite de mensagens por minuto de cada visitante.
- O formulário continua funcionando mesmo durante uma cópia de segurança.
- Desligada até você ligar, depois de um aviso sobre os dados pessoais que ela guarda.
Detalhes técnicos
POST /api/contact-requestsguarda qualquer JSON que o site envie, exatamente como chegou, com horário, IP e país.- 5 requisições por minuto por IP por padrão, um limite diário opcional e corpo máximo de 16 KB por padrão.
- Uma requisição nunca espera o banco. Mantido por 180 dias por padrão.
await fetch("/api/contact-requests", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name, email, message })
});Equipe e segurança
Quem pode entrar, e de onde.
Um painel para a sua equipe
Cada pessoa tem o seu login, em português ou inglês. Administradores mudam as configurações; leitores apenas acompanham.
- Senhas fortes obrigatórias: senhas curtas ou comuns são recusadas.
- Tentativas de login limitadas, para barrar quem tenta adivinhar senhas.
- Sessões que expiram sozinhas.
- Ninguém fica trancado do lado de fora: o último administrador não pode perder a permissão.
Detalhes técnicos
- Um login em
/admincom usuáriosrooteviewer, sessões, tokens de API e um JSON gêmeo de cada página em/api/admin. - Um viewer lê, e vê os e-mails dos outros usuários mascarados.
- Senhas com hash PBKDF2-HMAC-SHA256 (600.000 iterações), no mínimo 12 caracteres.
- Tentativas de login limitadas por IP e por conta.
- Sessões de 30 minutos em cookie HttpOnly, SameSite=Strict, e uma Content Security Policy que não roda script inline.
- Um root não pode remover a si mesmo, e o último root não pode ser rebaixado.
Login com código no celular
Além da senha, cada pessoa pode exigir um código de 6 dígitos gerado por um aplicativo autenticador no celular. Mesmo que alguém descubra a senha, não entra sem o celular.
Leia o QR code
Com o aplicativo autenticador do celular.
Confirme um código
Digite o código de 6 dígitos que o aplicativo mostra.
Entre com os dois
A partir daí, todo login pede um código.
- Perdeu o celular? Um administrador redefine pela página de usuários.
Detalhes técnicos
- TOTP em
/admin/set-totp, com QR code ou o segredo em base32. - Ao ligar, as outras sessões do usuário são encerradas e os tokens de API revogados.
- Os leitores do registro de acesso do Marco Civil entram com dois fatores enquanto o registro exigir (Decreto 8.771/2016, art. 13).
$ emissario reset-backoffice-totp --username adminBloqueie acessos indesejados
Alguém mandando spam pelo formulário, ou abusando do assistente? Bloqueie aquele endereço, uma faixa de endereços ou um país inteiro, por alguns dias ou até você remover o bloqueio.
- Um botão Bloquear ao lado de cada visitante e de cada contato.
- O bloqueio vale para tudo: site, formulário, assistente e login.
- Você nunca bloqueia a si mesmo por engano.
Detalhes técnicos
- Um root bloqueia um IP, uma faixa CIDR, um IP em hash ou um país; as requisições recebem
403antes que qualquer rota as leia. - Um bloqueio dura de 1 a 36.500 dias, ou até um root removê-lo.
emissario remove-ip-blocksé o caminho de volta pela linha de comando.
Privacidade
LGPD, Marco Civil e GDPR, desde o primeiro dia.
Privacidade por padrão
Os controles que a LGPD e o GDPR pedem já vêm no Emissario, ligados desde o início. Quando uma escolha pode expor dados pessoais, o painel avisa antes e cita a lei.
- Tudo o que é guardado fica criptografado, ilegível sem a sua chave.
- Os endereços de internet dos visitantes são guardados embaralhados.
- Dados antigos são apagados sozinhos, no prazo que você define.
- Alguém pediu para ver ou apagar os próprios dados? Localize e apague pelo painel.
- Modelos prontos de configuração para LGPD, GDPR ou os dois, e um rascunho de aviso de privacidade.
- O registro de acesso exigido pelo Marco Civil, quando você precisar.
| Dado | Guardado por padrão |
|---|---|
| Contato | 180 dias |
| Registro de acesso (Marco Civil) | 184 dias |
| Endereço de internet nos registros | 184 dias |
| Visita | 90 dias |
| Resumo de conversa | 90 dias |
| Uso da IA | 90 dias |
Os avisos são informação de produto, não aconselhamento jurídico: quem opera o site continua sendo o controlador dos dados.
Detalhes técnicos
- XChaCha20-Poly1305 com uma chave que você gera;
rotate-encrypt-keytroca por uma nova, snapshots incluídos. - IPs guardados como hash HMAC-SHA256 com uma chave aleatória, por padrão.
- Um registro de acesso do Marco Civil que um root liga, com a porta de origem, leitores nomeados e inventário de leituras.
- Localizar e apagar atende pedidos de acesso e exclusão (LGPD arts. 18–19; GDPR arts. 15 e 17).
- Retenções legais mantêm um registro além do prazo até serem liberadas.
- Os presets
lgpd@1,gdpr@1elgpd-gdpr@1.
Cópias de segurança
Tranquilidade se algo der errado.
Cópias de segurança com um clique
Faça uma cópia de todos os dados quando quiser, baixe para guardar em outro lugar, e restaure se precisar.
- Se uma restauração falhar, tudo volta como estava.
- As cópias continuam criptografadas, e só podem ser abertas com a sua chave.
- O site, o formulário e o assistente continuam funcionando enquanto a cópia é feita.
Detalhes técnicos
- Snapshots de todos os bancos, feitos em segundo plano, depois baixados em zip, enviados e restaurados pelo backoffice.
- O conteúdo de cada arquivo é guardado uma vez, não importa quantos snapshots o contenham.
- Uma restauração primeiro guarda uma cópia dos dados atuais, e a devolve se algo falhar.
- Os snapshots só restauram com a mesma chave de criptografia.
Para desenvolvedores
Automação e integração, para a sua equipe técnica.
Tokens de API
Chaves de acesso para a sua equipe técnica automatizar o painel, cada uma com validade e restrita aos endereços autorizados.
Detalhes técnicos
bo_e 64 caracteres hexadecimais, mostrado uma vez: só o SHA-256 é guardado.- Criar um token pede a senha de novo.
- Expira em 7, 30, 60, 90 ou 365 dias, em uma data, ou nunca; o de um viewer em até 90 dias.
- Pode ser limitado a alguns IPs e faixas CIDR.
- Revogado quando a senha do dono muda ou os dois fatores são ligados.
$ curl -X POST https://example.com/api/admin/list-contact-requests \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"status":"inbox"}'Uma API JSON para tudo
Cada página do backoffice tem um JSON gêmeo em /api/admin, chamado com um token de API. As falhas sempre respondem {"error", "field"}.
/openapi.jsonresponde o documento OpenAPI das rotas, para importar no Postman ou abrir no Swagger UI./healthinforma que o servidor está no ar, para o seu monitoramento.- Cada rota está documentada com uma requisição para rodar e o que volta.
$ curl https://example.com/health
$ curl -o openapi.json https://example.com/openapi.jsonSkills para agentes de código
drop-front-skills e drop-agents-skills escrevem nos repositórios do site e do agente as skills que o Claude Code, o Codex e o Antigravity carregam: as rotas públicas que o site chama e os arquivos que o agente lê.
$ emissario drop-front-skills --path ../my-site # no repositório do site
$ emissario drop-agents-skills --path ../my-agent # no repositório do agente- Escritas em
.claude/skills/e.agents/skills/, no formato Agent Skills. - Rode o comando de novo depois de atualizar o Emissario: a skill sempre corresponde ao binário que a escreveu.
- Este site foi construído com a skill que ele descreve.
Quer tudo isso no seu site?
Receba o Emissario configurado pelo criador, ou instale você mesmo, se tiver uma equipe técnica.