Dieta e Treino: bot Telegram e painel web
Registro de alimentação e treino pelo Telegram, painel sob demanda, grupos opcionais e período de teste no Stripe.
Caminho rejeitado: Construir no WhatsApp Business API / Cloud API (mais custo operacional nesta escala e caso de uso)
Visão geral
Dieta e Treino parte de uma ideia simples: manter alimentação e treino no chat que as pessoas já usam e abrir um painel só quando for preciso ver o panorama. O mesmo bot funciona em conversa privada ou em grupos do Telegram. Refeições passam pela Ana (texto, foto ou voz); treinos pelo Renan. Quando alguém quer totais do dia, consistência de cerca de 70 dias ou uma comparação leve com o grupo, pede o painel e abre o link. O registro do dia a dia fica no chat; o aplicativo web cobre as visões agregadas, a página institucional e a cobrança.
Problema
A memória puxa para os extremos. Sem registro constante, fica difícil ver o que de fato se come ao longo dos dias, ou como volume e frequência de treino evoluem. Aplicativos de dieta pedem instalação e login que quebram o hábito antes mesmo de começar.
Restrições
- Runner de workflows hospedado por mim para o bot (sem conta cloud gerenciada). Produção sobe como um worker empacotado, enquanto o repositório segue modular.
- A entrega do webhook do Telegram tem limite de tempo; o handler precisa terminar a tempo e ser idempotente para uma nova tentativa não gravar duas vezes. Em grupos o ruído sobe: heurísticas pegam comida e treino sem exigir comando em cada mensagem.
- Acesso ao painel é um link de curta duração vindo do bot. Acesso privilegiado ao banco fica no servidor. Ranking em grupo é adesão explícita no bot, nunca automático; pares veem agregados, não o texto das refeições.
- Bot e painel precisam concordar no dia calendário local de cada usuário. UI sensível a relógio renderiza no cliente para evitar descompasso entre SSR e hidratação.
- Caminho comercial espelha o StackBrief (Checkout / Portal / webhooks, teste de 14 dias sem cartão, bloqueio suave de escritas do bot depois do teste) mantendo uma identidade Telegram = uma assinatura e as regras de privacidade intactas.
Arquitetura
Telegram dispara um webhook no Windmill hospedado por mim; um job Bun empacotado roda o bot. Gemini interpreta e transcreve; Postgres (Supabase) guarda o estado. O webhook responde com segurança depois de persistir, para novas tentativas não sujarem o banco. O painel é Next.js na Vercel, com landing em português (Ana/Renan, preços, FAQ) e acesso por token: macros, mapas de consistência, volume de treino, grupos e assinatura. Eventos estruturados alimentam um resumo de qualidade agendado; Sentry opcional cobre erros de produção. Alertas leves de operação ficam fora do caminho do usuário.
Decisões principais
Telegram em vez de WhatsApp como superfície de chat
As pessoas já vivem em apps de mensagem; a ideia era menos atrito, não um app novo. A Bot API do Telegram encaixa produto pequeno e iterativo: webhooks diretos, bots em chats privados e grupos, e espaço para evoluir o comportamento sem fluxo pesado de console Business. O caminho do WhatsApp para automação parecida é mais pesado (Business API, regras de mensagem mais rígidas e sinais de custo que não combinaram com este produto).
- Construir no WhatsApp Business API / Cloud API (mais custo operacional nesta escala e caso de uso)
- App mobile próprio (rejeitado: instalação extra e login separado)
Windmill hospedado por mim em vez de cloud ou serviço Node custom
Fluxos, novas tentativas e agendas num lugar só; o custo é a máquina que eu já tenho. O preço é operar essa máquina.
- Windmill Cloud ou Railway/Fly com workers manuais (custo extra ou cola para o mesmo resultado)
Agentes nomeados (Ana / Renan) em vez de voz genérica única
Alimentação e treino são intenções diferentes no chat. Agentes nomeados deixam essa divisão clara no bot e na página inicial.
- Um assistente sem nome para tudo (copy mais barata, modelo mental mais fraco)
Gemini para texto, imagem e voz; heurísticas para o ruído em grupo
Uma API key e uma quota. Palavras-chave e padrões filtram o grupo para não chamar modelo em toda linha irrelevante.
- Só comandos com barra ou classificador em toda mensagem (fricção ou custo)
Lançar com período de teste no Stripe e assinatura pelo Telegram
Os primeiros usuários validaram o fluxo; o site público e o plano pago precisam das mesmas regras de acesso do StackBrief, sem quebrar o hábito de começar pelo bot. O período de teste começa na autorização; depois dele, as escritas são bloqueadas de forma suave, enquanto o painel ainda oferece a tela de assinatura.
- Manter produto só por convite, sem cobrança
- Forçar cadastro web antes de qualquer uso no Telegram (rejeitado: quebra a promessa central)
Stack
- TypeScript (Bun on Windmill)
- Windmill (self-hosted)
- Supabase (PostgreSQL, RLS)
- Google Gemini
- Telegram Bot API
- Next.js (App Router, Server Components)
- React, Tailwind CSS
- Stripe Checkout / Portal / Webhooks (BRL)
- Vercel (landing + dashboard)
Impacto
O registro fica no Telegram, sem segunda instalação ou login. Macros do dia, consistência de cerca de 70 dias e volume de treino abrem atrás de um link de curta duração; a comparação com o grupo só depois de adesão explícita. A cobrança segue teste → Checkout → bloqueio suave, enquanto o bot permanece a superfície principal.
Aprendizados
- Afinar quem fica em silêncio num grupo de chat pediu mais iterações do que trocar de modelo.
- Lógica de data duplicada, com um teste, foi mais confiável do que um pacote compartilhado que não manteríamos.
- Server Components e tipos estreitos fazem a maior parte do trabalho de privacidade antes do navegador rodar.
- Nesta escala, eventos estruturados e um resumo semanal superam vasculhar logs brutos para erros e latência.
- Quando o fluxo funciona, nome e texto da página inicial ainda precisam soar como produto, sem prometer precisão clínica.
- Em um produto com foco no Telegram, a cobrança é sobretudo regras de acesso; o Checkout não deveria entrar antes do comportamento de teste e do bloqueio suave.
Capturas do produto
Em produção em dietaetreino.erbsu.com. O registro fica no Telegram; o painel abre por um link do bot. As telas abaixo são do produto ao vivo (interface em português).
Telegram com Ana e Renan
Pergunte à Ana pelos macros do dia (ou ao Renan pelo treino). Ela responde no chat e oferece Ver no Dashboard quando você quer o resumo completo.

Resumo e consistência da dieta


Progresso nos treinos


Grupos e progresso entre pares
Se você autorizar grupos do Telegram no bot, a aba Grupos lista esses chats e mostra a consistência de dieta e treino de cada membro lado a lado: o mesmo tipo de mapa da sua visão, mais totais seguros para ver quem está constante ou esfriando; não o texto completo das refeições de outra pessoa. A autorização é explícita (nunca automática).

Assinatura
