Formulários que funcionam sem backend
Adicione um atributo a um formulário do seu site estático e cada envio cai no seu painel. Sem JavaScript, sem widget incorporado, sem serviço de terceiros e sem nada para quem preenche ter que assinar.
Its markup, styles and deploy script are on GitHub — copy it, change the fields, redeploy.
<form harvis-form="contact"> <input name="email" type="email" required> <textarea name="message"></textarea> <button>Send</button> </form>
Três passos, e um deles é publicar de novo
Não há construtor de formulários para aprender nem endpoint para copiar. O atributo é toda a configuração.
- 01
Adicione o atributo
Coloque harvis-form em qualquer formulário do seu HTML. Dê um nome a ele se o site tiver mais de um. Deixe action e method de fora — eles são preenchidos na hora em que a página é servida.
- 02
Publique de novo
Arraste a pasta outra vez ou rode npx harvis. Nada para configurar, nenhuma chave para colar, nenhum botão para ligar antes no painel.
- 03
Leia o que chegar
Os envios aparecem embaixo do seu site no painel, os mais recentes primeiro. Abra uma linha para ler tudo, ou leve o conjunto inteiro em CSV.
A coisa toda são dois atributos
O harvis reescreve o formulário na saída do servidor, então a página que você escreveu continua sendo a página que você escreveu.
<form harvis-form="contact"
data-harvis-redirect="/thanks.html">
<input name="email" type="email" required>
<button>Send</button>
</form><form harvis-form="contact"
data-harvis-redirect="/thanks.html"
action="/__harvis/form/contact" method="post">
<input type="hidden" name="_harvis_redirect" value="/thanks.html">
<input type="text" name="_harvis_hp" tabindex="-1" aria-hidden="true" style="…">
<input name="email" type="email" required>
<button>Send</button>
</form>Os dois atributos
- harvis-form
- Marca o formulário como um dos que devem ser coletados. O valor dá nome a ele, para que vários formulários de um mesmo site não se misturem; sem valor, a coleta vai para “default”.
- data-harvis-redirect
- Opcional. A página do seu site para onde mandar as pessoas depois do envio. Qualquer coisa que aponte para fora do seu site é ignorada.
Quando é o JavaScript que monta o formulário, escreva o endpoint você mesmo
O harvis preenche o action na hora em que a página sai do servidor. Um formulário que só existe depois que seu bundle roda ainda não está na página, então não há o que preencher — você escreve o que a reescrita teria escrito. Continua sendo um post HTML comum, e todo o resto desta página continua valendo.
- React
- Vue
- Svelte
- Angular
<form action="/__harvis/form/contact" method="post">
<input name="email" type="email" required />
<textarea name="message" />
{/* optional — where to land after sending */}
<input type="hidden" name="_harvis_redirect" value="/thanks" />
{/* optional — the decoy harvis would have added */}
<input
type="text"
name="_harvis_hp"
tabIndex={-1}
autoComplete="off"
aria-hidden="true"
style={{ position: "absolute", left: "-9999px", opacity: 0 }}
/>
<button>Send</button>
</form>- action + method
- O endpoint que o harvis teria escrito, mais post. O último trecho é o nome do formulário — letras minúsculas, números e hifens; qualquer outra coisa é recolhida em “default”.
- _harvis_redirect
- Opcional, e a versão escrita à mão do data-harvis-redirect. Um caminho no seu próprio site; qualquer coisa que aponte para fora é ignorada.
- _harvis_hp
- Opcional, e a única coisa que você perde ao escrever o formulário sozinho: a isca que pega robôs. Deixe-a fora da tela em vez de display:none, e vazia — tudo o que a preencher é descartado.
- harvis-form
- Deixe de fora. O atributo é um pedido para o harvis escrever o action, e você acabou de escrever você mesmo.
Deixe o navegador enviar
Sem preventDefault, sem fetch. A resposta é um redirecionamento que o navegador segue sozinho, e é isso que mantém o formulário funcionando quando os scripts não rodam.
Pré-renderizado conta como JavaScript
Se o seu build escreve o formulário no HTML e o seu app assume ele no navegador depois, escreva os campos mesmo assim — os que o harvis inseriu não estão no seu componente, então a hidratação pode jogá-los fora.
O que você ganha
Tudo aqui embaixo já vem ligado. Não existe página de configurações para nada disso.
Sem JavaScript
O formulário envia do jeito que HTML sempre enviou. Continua funcionando com scripts bloqueados, num celular lento e num navegador que só desenha texto.
O spam é filtrado
Todo formulário é servido com um campo-isca que nenhuma pessoa consegue ver, e o que preencher ele é descartado sem aviso. Limites de taxa controlam quanto um visitante, e um site, podem enviar por hora.
Quantos formulários você quiser
Dê nomes a eles — um formulário de contato e um de cadastro no mesmo site mantêm cada um sua própria lista, e você pode filtrar e exportar separadamente.
Sua própria página de obrigado
Aponte o formulário para uma página que você escreveu e é ali que as pessoas caem depois de enviar. Deixe de fora e elas veem uma página de confirmação simples.
Exporte quando quiser
Um botão te dá um CSV com uma coluna para cada campo que alguém já enviou, então um formulário que ganhou uma pergunta no meio do caminho ainda abre como uma tabela só.
Nada fica seguindo ninguém
Sem script de rastreamento, sem cookie, sem terceiros dentro da página. O endereço do visitante passa por hash antes de ser guardado, e só para que o limite de taxa consiga distinguir dois envios.
Os limites
Generosos para um formulário de contato, apertados o bastante para que um script apontado para o seu site não encha sua caixa de entrada.
- Campos por envio
- 30
- Tamanho de um campo
- 5.000 caracteres
- Tamanho de um envio
- 64 KB
- Envios por site
- 60 por hora
- Envios por visitante
- 20 por hora
- Guardados por site
- 1.000, os mais recentes primeiro
Perguntas
O que as pessoas perguntam antes de colocar um formulário num site estático.
O que é um formulário estático?
Um formulário num site que não tem servidor próprio. Normalmente isso quer dizer que o formulário não tem para onde mandar nada, e é por isso que sites estáticos costumam pegar emprestado um serviço de formulários de terceiros. O harvis já serve todas as páginas do seu site, então dá para receber o envio na passagem.
Preciso saber programar?
Você precisa conseguir adicionar uma palavra a uma linha de HTML. Se foi uma IA que escreveu seu site, peça que ela adicione o atributo harvis-form ao formulário — ela sabe como, porque é isso que dizem as instruções que o harvis publica para assistentes de IA.
Funciona com o JavaScript desligado?
Funciona. É justamente por isso que foi feito assim. O formulário faz um post HTML comum e o navegador segue um redirecionamento depois, exatamente como os formulários funcionavam antes de o JavaScript existir.
Posso continuar usando meu próprio endpoint ou outro serviço de formulários?
Pode — é só não adicionar o atributo. Formulários sem harvis-form são servidos exatamente como você escreveu, action e tudo. Num formulário que tem o atributo, o harvis substitui o action, porque adicionar o atributo é justamente o jeito de dizer para onde o envio deve ir.
Funciona com React, Vue ou Svelte?
Funciona, com um passo a mais. Se o formulário está no HTML que o seu build gera, o atributo já basta. Se ele só aparece depois que o JavaScript roda, escreva action="/__harvis/form/contact" e method="post" no componente — mesmo endpoint, mesmo painel, e quem envia continua sendo o navegador.
As pessoas podem anexar arquivos?
Ainda não. Um campo de arquivo num formulário coletado continua funcionando para o visitante, mas o arquivo não é guardado — só os campos de texto ficam.
O que acontece com os envios se eu excluir o site?
Eles vão junto. Os envios pertencem ao site e não a uma publicação, então publicar de novo mantém tudo e excluir o site apaga de vez. Exporte um CSV antes se quiser guardar.
Coloque um site no ar e teste
Publicar é de graça e leva uns dois segundos. Adicione o atributo a um formulário, publique de novo e mande uma mensagem de teste para você mesmo.