Comentário no Reel vira DM com link, na sua própria conta.
Você publica um Reel e pede pra pessoa comentar uma palavra. O OpenReply enxerga o comentário, confere se ela segue o perfil e manda a DM com o link. Quem ainda não segue recebe um convite com um botão de "já segui", e o link sai depois disso.
É o mesmo serviço que os perfis grandes pagam no ManyChat. A diferença está em quem hospeda: aqui o código é aberto, o banco é seu e o servidor é seu.
O ManyChat resolve isso por assinatura mensal. O OpenReply resolve pelo trabalho de instalar: seis contas em plano gratuito e um processo que fica de pé sozinho no seu servidor.
O código está aberto no GitHub.
Licença MIT. Eu mantenho um fork em github.com/gt-moraes/openreply, com o original como upstream.
Seis serviços, todos no plano gratuito, e um servidor que não dorme.
Nenhuma etapa aqui custa dinheiro. O que ela custa é atenção: cada serviço devolve uma chave, e três dessas chaves precisam estar iguais em todo lugar onde o projeto roda.
Essa é a ordem que funcionou aqui. Fora de ordem trava, porque o deploy precisa das chaves de banco e de fila antes de subir.
Instala com a sua IA do lado, um passo por vez.
Criar a conta na Oracle, subir o servidor e montar o app na Meta são as partes que mais travam quem está começando. Esse prompt já carrega o contexto inteiro: o que é cada peça, a ordem que funciona e as armadilhas que me custaram horas.
- Copie o prompt e mande no ChatGPT, Claude, Gemini, Codex ou na IA que você já usa.
- Ela vai te fazer quatro perguntas antes de começar e montar um checklist.
- Siga um passo por vez e só avance quando ela confirmar que deu certo. Travou numa tela, manda print.
Quero instalar o OpenReply e preciso que você seja meu guia do começo ao fim. Sou iniciante: nunca subi servidor, nunca criei app na Meta e posso não conhecer os termos técnicos.
O QUE É O OPENREPLY
Ferramenta open source que transforma comentário no Instagram em DM automática com link. Exemplo: alguém comenta uma palavra no meu Reel e recebe na DM o link que eu escolhi. Roda na minha própria conta, com serviços no plano gratuito.
DE ONDE VEM ESSE GUIA
Peguei esse prompt na página do OpenReply no Painel do Entusiasta: https://oentusiasta.com.br/itens/openreply
O código e a documentação oficial estão no repositório do GitHub: https://github.com/diwenne/openreply (o guia oficial de instalação fica em docs/setup.md)
O Painel é a biblioteca pública do Guilherme Teodoro (@gteodoro.ia no Instagram), que traduz inteligência artificial pra quem está fora da bolha e só publica ferramenta que testou na prática. Ele não é o autor do OpenReply: instalou na própria conta, roda com público real desde 18/09/2026 e escreveu esse passo a passo com a ordem que funcionou e os erros que custaram tempo. As armadilhas listadas no fim vieram dessa instalação real.
Se você conseguir acessar a internet, leia as duas páginas antes de começar. Se algo aqui divergir da documentação oficial do repositório, me avise e siga a oficial.
COMO VOCÊ DEVE ME GUIAR
1. Um passo por vez. Me diga exatamente onde clicar ou o que digitar, e espere eu confirmar que deu certo antes de seguir.
2. Explique cada termo técnico na primeira vez que aparecer, em uma frase simples.
3. Se a tela que eu vejo não bater com a sua instrução, peça um print. Painel de Meta, Oracle e Vercel muda com frequência: não invente nome de botão.
4. Segurança: NUNCA me peça pra colar chave, senha, token ou segredo aqui na conversa. Diga onde cada um deve ser colado (arquivo .env, variáveis da Vercel ou .env do servidor). Se eu colar sem querer, me avise e me ensine a gerar uma chave nova.
5. Mantenha um checklist com as 9 etapas abaixo e me mostre o progresso no começo de cada etapa.
6. Antes de começar, me pergunte: (a) qual meu sistema operacional (Windows, Mac ou Linux); (b) se minha conta do Instagram já é profissional, de Criador ou Empresa, porque conta pessoal não funciona; (c) se já tenho conta no GitHub; (d) se você consegue rodar comandos no meu computador ou se eu vou copiar e colar no terminal.
AS PEÇAS
- Painel web (Next.js) hospedado na Vercel: onde crio campanha e vejo os envios. Recebe o login do Instagram em /api/instagram/callback e os avisos da Meta em /api/webhook.
- Worker: processo que fica ligado 24 horas consumindo a fila e mandando as DMs (comando npm run worker). Ele NÃO pode rodar na Vercel, porque lá cada função acorda, responde e morre. Por isso vai num servidor gratuito da Oracle Cloud.
- Banco Postgres no Neon (gratuito).
- Redis Cloud (gratuito) pra fila. Precisa ser Redis com conexão TCP (endereço redis:// ou rediss://). Redis só por HTTP não funciona com a fila (BullMQ).
- Resend pra mandar o link de login por e-mail.
- App na Meta com o produto Instagram.
AS 9 ETAPAS, NESSA ORDEM (fora de ordem trava, porque o deploy precisa das chaves de banco e fila antes de subir)
1. GitHub: fazer fork de https://github.com/diwenne/openreply na minha conta.
2. Neon: criar o projeto e copiar a DATABASE_URL.
3. Redis Cloud: criar o banco gratuito e montar a REDIS_URL (redis://usuario:senha@host:porta).
4. Resend: criar a conta e a RESEND_API_KEY. Sem domínio verificado, o e-mail só chega no endereço dono da conta do Resend, e o remetente pode ser onboarding@resend.dev (EMAIL_FROM). Então devo criar o Resend com o mesmo e-mail que vou usar pra entrar no painel.
5. Gerar os segredos (me ensine a rodar no meu sistema):
- NEXTAUTH_SECRET: openssl rand -base64 32
- ENCRYPTION_KEY: openssl rand -hex 32 (precisa ter exatamente 64 caracteres)
- CRON_SECRET e WEBHOOK_VERIFY_TOKEN: qualquer texto aleatório longo
Me lembre de guardar tudo num lugar seguro: vou precisar de novo no servidor.
6. Vercel: importar o fork e cadastrar as variáveis de ambiente: NEXTAUTH_URL (o endereço https://...vercel.app do projeto, sem barra no final), NEXTAUTH_SECRET, CRON_SECRET, ENCRYPTION_KEY, DATABASE_URL, REDIS_URL, RESEND_API_KEY, EMAIL_FROM, ALLOWED_EMAILS (meu e-mail, pra só eu conseguir entrar), e depois as da Meta: META_GRAPH_API_VERSION (ex.: v25.0), INSTAGRAM_APP_ID, INSTAGRAM_APP_SECRET, FACEBOOK_APP_SECRET, WEBHOOK_VERIFY_TOKEN. O build já roda as migrações do banco sozinho. Atenção: variável nova ou alterada na Vercel só vale depois de um novo deploy (Redeploy). Pode fazer o primeiro deploy sem as da Meta e voltar aqui depois da etapa 7.
7. Meta (a parte mais chata, vá com calma):
- Em developers.facebook.com, criar app do tipo Business e marcar SÓ o caso de uso "Gerenciar mensagens e conteúdo no Instagram". Nada de Marketing API nem Facebook Login: cada caso a mais traz exigência nova e pode travar a publicação.
- Usar a API do Instagram com login do Instagram. INSTAGRAM_APP_ID e INSTAGRAM_APP_SECRET ficam na página do produto Instagram (é um ID diferente do ID do app do Facebook). FACEBOOK_APP_SECRET fica em Configurações do app, Básico.
- URL de redirecionamento do login: https://SEU_ENDERECO/api/instagram/callback (sem barra no final).
- Webhook: URL https://SEU_ENDERECO/api/webhook e o mesmo WEBHOOK_VERIFY_TOKEN da Vercel. Assinar os DOIS campos: comments e messages. Só comments deixa metade do fluxo sem funcionar.
- Me adicionar como testador do Instagram em Funções do app, aba Funções. A tela pode mostrar erro de formulário mesmo quando o convite saiu: confira na lista, onde ele aparece como Pendente. Aceitar em instagram.com/accounts/manage_access pelo navegador do celular. Sem isso o login dá "Insufficient Developer Role".
- Publicar o app (sair do modo de desenvolvimento). Pede URL de privacidade, de exclusão de dados e de termos: use https://SEU_ENDERECO/privacy, /data-deletion e /terms, que já existem no projeto. Em modo de desenvolvimento comentário real NUNCA chega.
- Sem App Review, o acesso padrão funciona pras contas que têm papel no app, e é o que eu preciso pra minha própria conta.
8. Oracle Cloud (o servidor do worker):
- Criar a conta em oracle.com/cloud/free. Ela pede cartão só pra verificar identidade; o plano Always Free não cobra. A região inicial (home region) não muda depois, então escolher uma próxima de mim.
- Criar uma instância VM.Standard.E2.1.Micro (Always Free) com Ubuntu 22.04, baixar a chave SSH e guardar bem. Se der "out of capacity", tentar outro domínio de disponibilidade ou mais tarde.
- Entrar por SSH, instalar Node 22 LTS, git e pm2 (npm install -g pm2).
- git clone do meu fork, depois npm ci e npm run db:generate.
- Criar o arquivo .env na pasta do projeto com as MESMAS variáveis da Vercel. DATABASE_URL, REDIS_URL e ENCRYPTION_KEY precisam ser idênticas nos dois lugares: se a ENCRYPTION_KEY divergir, todo envio falha ao decifrar o token, e o erro não deixa isso claro.
- O worker não carrega o .env sozinho. Criar na pasta do projeto um ecosystem.config.js que inicia o worker com o .env, por exemplo:
module.exports = { apps: [{ name: "openreply-worker", cwd: __dirname, script: "node_modules/.bin/tsx", args: "--env-file=.env worker/dm-worker.ts", interpreter: "none" }] };
- Iniciar: pm2 start ecosystem.config.js && pm2 save, depois pm2 startup (e rodar a linha que ele imprimir) pra religar sozinho se a máquina reiniciar.
- Conferir com pm2 list (online) e pm2 logs (deve aparecer "[DM Worker] Started").
9. Teste de verdade:
- Abrir https://SEU_ENDERECO/api/health: o esperado é status "ok" e o worker como healthy. Se vier "degraded", ver qual peça está com erro.
- Entrar no painel pelo link do e-mail, conectar o Instagram em Configurações e criar uma campanha de teste com uma palavra-chave.
- Comentar a palavra num post meu usando OUTRA conta do Instagram. A DM tem que chegar nessa outra conta, e o envio aparecer como SENT nos logs de DM do painel.
- Só considere instalado quando essa DM chegar de verdade. Página abrindo não prova que o fluxo funciona.
ARMADILHAS CONHECIDAS (me avise delas na hora certa)
- Mudou o .env do servidor? O processo antigo segue com o valor velho na memória. Rodar pm2 restart all --update-env. Se ainda assim o comportamento for de config velha, pm2 delete all e pm2 start ecosystem.config.js de novo, depois pm2 save.
- Nunca deixar dois workers rodando. Se as DMs saírem com link errado (ex.: apontando pra localhost), conferir com pgrep -fc "worker/dm-worker": tem que dar 1. Worker iniciado fora do pm2 vira órfão e continua pegando a fila.
- SSH dando timeout com o servidor funcionando costuma ser a rede bloqueando a porta 22. Testar pelo 4G do celular antes de mexer na Oracle.
- A Meta às vezes bloqueia o app temporariamente por excesso de chamadas. Costuma voltar sozinho; não sair mudando configuração.
- Tudo aqui é gratuito. Se eu desistir da Oracle, a alternativa paga é rodar o worker no Railway (por volta de US$ 5 por mês).
Pode começar pelas perguntas do item 6 de "Como você deve me guiar".
Nenhuma chave passa pela conversa: o prompt manda a IA te dizer onde colar cada uma, e não pedir pra você colar no chat. Se colar sem querer, troque a chave depois.
Neon
Postgres gratuito. Crie o banco e copie a DATABASE_URL. É ela que guarda campanha, conta conectada e registro de cada envio.
Redis Cloud
Fila e limite de envio. Copie a REDIS_URL. É ela que segura o ritmo pro Instagram não bloquear o app.
Resend
Login por link no e-mail. Sem domínio verificado, o link só chega no endereço do dono da conta do Resend.
Vercel
Deploy do painel, onde você cria campanha, vê resultado e recebe aviso da Meta. Cole as chaves nas variáveis do projeto.
Meta
App Business com o caso de uso de mensagens do Instagram, mais o callback, o webhook e os campos assinados.
Oracle Cloud
Uma máquina always free rodando o worker 24 horas sob pm2. É ele que consome a fila e entrega a DM.
Na Meta, marque só o caso de uso de gerenciar mensagens e conteúdo no Instagram. Cada caso a mais traz exigência nova e pode travar a publicação do app.
O callback do login vai em SEU_ENDERECO/api/instagram/callback e o webhook em SEU_ENDERECO/api/webhook. Assine os dois campos: comments é o comentário virando DM, e messages é a resposta dentro da conversa, onde o botão de "já segui" funciona. Assinando só o primeiro, metade do fluxo parece ligada e nunca dispara.
O worker fica fora da Vercel de propósito. Lá cada função acorda, responde e morre, e esse processo precisa continuar acordado consumindo a fila. No servidor, o pm2 religa ele quando cai e quando a máquina reinicia:
$ pm2 start ecosystem.config.js && pm2 save
Depois de mudar qualquer variável no servidor, o processo antigo continua com o valor velho na memória. Reinicie com o ambiente atualizado:
$ pm2 restart all --update-env
Pra conferir o estado, pm2 list diz se o worker está online e pm2 logs mostra o que ele está fazendo agora.
Em modo de desenvolvimento só o botão de teste do console entrega evento. Comentário real não chega, e o painel fica silencioso como se nada estivesse configurado. Esse é o motivo número um de "fiz tudo e não acontece nada".
Sem isso o login devolve Insufficient Developer Role. O convite sai em Funções do app, na aba Funções: a tela mostra erro de formulário mesmo quando envia, então confira na lista, onde ele aparece como Pendente. Aceitar é em instagram.com/accounts/manage_access, pelo navegador do celular.
Local, Vercel e servidor. Se a chave de criptografia divergir, todo envio falha ao decifrar o token, e o erro não diz isso com clareza. Some a isso que variável nova na Vercel só passa a valer depois de um novo deploy: aqui isso custou uma hora com as chaves certas gravadas e o site rodando a versão anterior.
Quando o conteúdo entrega algo e responder na mão não escala.
O ganho aparece no momento em que o comentário deixa de virar tarefa sua e passa a virar entrega automática.
Reel que entrega material
O vídeo apresenta algo e a DM leva o link, sem você responder um por um.
Filtro por quem segue
O portão confere o seguidor antes de entregar, então o material não sai pra quem só passou.
Volume sem mensalidade
Comentário em série não aumenta o custo, porque o plano gratuito dos seis serviços dá conta.
Dado no seu servidor
Contato, token e histórico ficam no banco que é seu, em vez do banco de um intermediário.
O Reel pede a palavra, e a DM entrega a página aqui do Painel.
Cada item do Painel tem uma palavra própria. O Reel fala a palavra, a pessoa comenta, e a DM chega com o link direto da página. Quem chega cai no guia completo, em vez de cair numa bio com quinze botões.
A validação foi em 18/09/2026, com duas pessoas de fora do projeto: as duas comentaram, receberam a DM e abriram a página. No total foram 17 DMs enviadas, nenhuma falhada e nenhuma pulada.
Instagram profissional, e uma conta que tenha papel no app.
Mesmo publicado, o app atende só conta que tem papel dentro dele, o que a Meta chama de Standard Access. Isso cobre o seu perfil e quem você adicionar como testador. Atender conta de cliente exigiria passar pela análise da Meta, que é outro processo.
Do lado do servidor, um Linux always free dá conta: Node instalado e o pm2 cuidando do processo. O Railway faz o mesmo trabalho por volta de cinco dólares por mês, e eu recusei de propósito pra manter o custo em zero.
Custo zero não quer dizer risco zero.
Aconteceu em 18/09/2026, das 19:31 às 22:41: três horas e dez minutos sem explicação. Recuperou sozinha e ninguém ficou sem resposta, porque o sistema tenta de novo a cada cinco minutos e a varredura seguinte recolhe o que atrasou. Ainda assim, o canal depende de uma plataforma que não te consulta.
Se a Meta não responde a checagem depois que a pessoa toca em "já segui", o link sai mesmo assim. No primeiro contato, sem resposta da Meta, não sai nada. Foi escolha minha em 17/09: prefiro entregar pra quem não seguiu do que negar pra quem seguiu de verdade.
Banco, fila, e-mail, deploy, app da Meta e servidor. Cada um tem painel próprio, limite de plano gratuito pra acompanhar e chave que pode expirar. Se o seu tempo vale mais que a mensalidade, o serviço pago é a escolha honesta.
