Open-Source Cold Email & Warmup Platform
Warmbly 是开源的冷邮件平台:温暖您的邮箱、发送活动、并对每条回复进行分流。可在我们的云端运行,也可自行托管整套系统。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Automação de atendimento no WhatsApp. Você desenha o fluxo, o bot conduz a conversa, o lead cai numa tela. IA é opcional. Produto da 4YU. Banco de produção compartilhado: AutoFluxos e Verandi usam o mesmo projeto Supabase. O AutoFluxos mora em public; a Verandi, em app_verandi. Antes de mexer em migration, Auth, RLS, Storage, extensão ou Data API, leia docs/BANCO-COMPARTILHADO.md. Nunca rode supabase db push contra produção.查看完整 README ↗
Automação de atendimento no WhatsApp. Você desenha o fluxo, o bot conduz a conversa, o lead cai numa tela. IA é opcional.
Produto da 4YU.
Banco de produção compartilhado: AutoFluxos e Verandi usam o mesmo projeto Supabase. O AutoFluxos mora em
public; a Verandi, emapp_verandi. Antes de mexer em migration, Auth, RLS, Storage, extensão ou Data API, leia docs/BANCO-COMPARTILHADO.md. Nunca rodesupabase db pushcontra produção.
Produto-base construído e expansão 0–5 concluída. Dá para desenhar o fluxo arrastando blocos, testar a conversa ao lado, publicar (versão numerada e imutável), receber mensagem pelo webhook e ver o lead cair na tela com o que o bot coletou. O que resta está consolidado no plano mestre; parte é código e parte depende das liberações da Meta.
No ar em https://autofluxos.4yu.com.br (painel protegido por senha).
Retomando o trabalho — humano ou agente? Comece por docs/ESTADO.md. A seção "Leia isto primeiro" tem o estado atual, as três regras que não se quebram, a fila do que fazer em seguida, e as armadilhas que já custaram caro nesta base.
Para escolher e executar a próxima atividade, use docs/PLANO-MESTRE.md, que reúne dívida, expansão, gatilhos externos e critérios de aceite sem duplicar tarefas concluídas.
Veja docs/ARQUITETURA.md para o desenho completo e as decisões por trás dele. O que o bot já responde sobre a agenda do cliente — e o que ainda não — está em docs/PLANO-AGENDA.md.
npm install
cp .env.example .env # valores em 4yu-apps/.secrets/4yu.env (prefixo AUTOFLUXOS_)
npm run dev # http://localhost:3000
npm test # 252 testes
npm run typecheck
Não precisa de Docker. O banco é Supabase na nuvem (projeto autofluxos,
região São Paulo).
Sem .env os testes que falam com o banco se pulam sozinhos, e o resto roda
normal — dá para clonar e rodar npm test sem credencial nenhuma.
Migrations em supabase/migrations/, aplicadas pela Management API do Supabase.
Este não é mais um projeto Supabase exclusivo. A Verandi usa o mesmo projeto de
produção no schema app_verandi; os objetos deste produto permanecem em
public. Auth, Storage, extensões, Data API, cotas e backup são compartilhados.
A fonte de verdade operacional é
docs/BANCO-COMPARTILHADO.md.
A última migration atual é 0011; a próxima é 0012. Não reutilize os
números antigos citados em planos. Nunca aplique migrations da Verandi por este
repositório e nunca use supabase db push em produção.
clients, flows e flow_versions (passos 3 e 5); channels, contacts,
sessions, messages e handoffs (passo 6, criadas só quando já se sabia o
formato real do que o WhatsApp manda — tabela criada "por garantia" e nunca
usada só acumula divergência entre o desenho e o código).
A tela de leads lê a view leads (0004), que junta o contato com a última
mensagem e o handoff aberto. Ela é security_invoker = true: view é o jeito
clássico de furar RLS sem perceber, e sem isso a chave que vai para o navegador
leria a conversa de todo mundo.
RLS está ligada e sem nenhuma política, de propósito. A chave publishable
(que pode chegar ao navegador) não lê nem escreve nada; todo acesso passa pelo
servidor com a chave secret. Enquanto não existir login, esse é o estado
seguro. As políticas entram junto com o login, e não antes.
Abra um cliente → um fluxo. A tela tem três partes: a barra de blocos à esquerda, o desenho no meio, e à direita duas abas — Bloco (editar o que está selecionado) e Testar (conversar com o fluxo).
Para ramificar, arraste a bolinha ao lado de uma opção até o bloco de destino. A setinha que você arrasta É a ramificação — não existe tela de configurar branch em lugar nenhum.
Salva sozinho depois de uma pausa na digitação. Rascunho pela metade pode ser salvo; o que o validador barra é a publicação.
O rascunho é mutável e é o que você edita. Publicar tira uma foto dele e
guarda numa linha de flow_versions numerada que o banco se recusa a alterar —
não por convenção, por gatilho.
Por que isso importa: sem versão, você edita o fluxo às 15h e a conversa que começou às 14h se vê num bloco que não existe mais. Quebra silenciosa, difícil de reproduzir, e quem descobre é o cliente.
O botão só habilita se o validador deixar, mas a checagem de verdade está no
servidor (publicar() no repo). Botão desabilitado é conveniência; um fluxo
sem saída para humano tem que ser recusado venha a chamada de onde vier.
A aba Testar conversa com o fluxo em memória, então dá para experimentar uma mudança antes de ela ser salva. Coisas que vale testar:
O bloco API chama um endereço durante a conversa, guarda pedaços da resposta em variáveis e segue o fluxo. É um bloco só, e é de propósito: ele cobre planilha do Sheets (via Apps Script publicado), qualquer webhook, e n8n/Make/Zapier — que sozinhos carregam os milhares de apps que nunca vamos integrar na mão.
Ele nasce chamando o ViaCEP, então dá para arrastar o bloco e ver a integração respondendo na aba Testar antes de configurar qualquer coisa.
Três coisas que o produto garante, e que não dependem de quem desenha lembrar:
X-AutoFluxos-Teste: 1, para o sistema do
cliente separar teste de movimento real.continua mesmo assim é escolha explícita, para enriquecimento
que pode faltar sem prejuízo.Para o que pede chave — CRM, ERP —, existem as Credenciais. Cada cliente cadastra as dele uma vez, o bloco aponta pela referência, e o valor mora num cofre fora do banco. Não existe campo onde digitar token dentro do fluxo, então ele não tem como entrar na versão publicada, que é imutável. Trocar a chave depois não exige republicar nada.
O desenho está em docs/NO-API.md e docs/CONEXOES.md.
src/core/ não sabe o nome de nenhum cliente, não importa nada de Next, do
WhatsApp ou do banco, e não faz chamada de rede. Tudo que ele precisa entra por
parâmetro; tudo que ele decide sai no retorno.
executar(fluxo, sessao, entrada) → { acoes, sessao }
Consequências práticas:
Quando alguém pedir uma feature, o teste é: isso é um nó/configuração, ou é
um cliente específico? Se for cliente específico, vai para o JSON do fluxo —
nunca para o src/.
O formato é o nativo do React Flow, sem camada de tradução. A aresta que você arrasta no editor é a ramificação:
{
"inicio": "boas-vindas",
"nodes": [
{ "id": "boas-vindas", "type": "mensagem", "position": { "x": 0, "y": 0 },
"data": { "texto": "Oi! Sou o assistente virtual 👋" } },
{ "id": "assunto", "type": "pergunta", "position": { "x": 0, "y": 160 },
"data": { "texto": "O que você procura?", "salvarEm": "assunto",
"opcoes": [{ "id": "orcamento", "rotulo": "Orçamento" }] } }
],
"edges": [
{ "id": "e1", "source": "boas-vindas", "target": "assunto" },
{ "id": "e2", "source": "assunto", "sourceHandle": "orcamento", "target": "..." }
]
}
Sete tipos de nó: mensagem, pergunta, condicao, salvar-campo, ia,
handoff, http.
Ninguém precisa lembrar de desenhar isso — o sistema faz sozinho:
Este repositório é público. .env está no .gitignore e chave nenhuma entra
aqui — nem temporariamente. Em produção a chave de IA é do cliente (BYOK) e mora
no Supabase Vault; o banco guarda só uma referência.
Veja .env.example para os nomes das variáveis.