Todos os projetos
Case corporativoSelf-hosted

IA de reuniões no seu servidor

Notetaker de Reuniões

O notetaker com IA que fica no seu servidor: grava Meet, Teams e Zoom e converte cada conversa em decisões e tarefas.

Papel
Autor · arquitetura, backend e operação
Período
jul a out 2026
Stack
  • TypeScript
  • Node.js
  • Playwright
  • FFmpeg
  • Next.js
  • PostgreSQL
  • Prisma
  • Redis
  • BullMQ
  • Docker
  • LLMs
plataformas: Meet, Teams e Zoom
3
commits em 11 semanas
296
arquivos de teste
140
migrações de banco
34

Números medidos no repositório.

Ambiente local com dados fictícios.

Contexto e problema

Times comerciais passam o dia em reunião, e quase nada do que é dito sobrevive a ela. Anotar compete com conduzir a conversa, gravar depende de alguém lembrar, e as ferramentas prontas de notetaker guardam o conteúdo, às vezes sensível, fora do controle do time.

O notetaker cobre o caminho todo, da agenda até um resumo que dá para compartilhar. Um bot entra na reunião sozinho, grava, transcreve identificando quem falou e entrega notas com marcações de tempo clicáveis, decisões, itens de ação e riscos. Tudo fica hospedado pelo próprio time, com o banco, o storage e o modelo de IA que ele escolher.

Restrições que eu me impus

  • Self-hosted e plugável. Storage (qualquer S3 compatível, como AWS, Backblaze e MinIO, ou SharePoint), transcrição e LLM (Anthropic, OpenAI ou Google) são provedores trocáveis, configuráveis pelo próprio painel.
  • Entrar como convidado. O bot não pode depender de conta corporativa em cada plataforma para funcionar.
  • Nenhuma gravação duplicada. Dois bots escrevendo na mesma gravação é pior do que perder a reunião.
  • Status honesto. Quem olha a lista precisa saber por que uma reunião não gravou, sem ler log de container.
  • Dados escopados por papel (admin, gestor, membro) direto nas consultas, não só na interface.

Decisões que definiram o produto

Arquitetura

GatilhoAgenda ou "Gravar agora"FilaEntrada agendadaBotNavegador headlessCapturaFFmpeg ou MediaRecorderQualidadeffprobe · PASS/FAILStorageS3 · SharePointTranscriçãoFalantes identificadosLLMNotas, decisões, riscosBuscaFull-text em portuguêsSala de esperaCheca a cada 3 sPolítica de retrySó antes de gravar

A agenda ou o botão "Gravar agora" colocam a reunião na fila. Um navegador headless entra como convidado e captura áudio e vídeo. Cada arquivo passa por um portão de qualidade antes do upload. Depois vêm a transcrição com falantes, as notas e os insights gerados pelo LLM, e a indexação para busca.

Tudo roda como um monólito modular em contêineres: API, scheduler e workers de gravação compartilham código e banco, e escalam por réplicas. O bot nunca espera a rede “ficar ociosa” no Teams, porque a plataforma mantém websockets abertos para sempre. Um teste de guarda impede que alguém reintroduza essa espera.

Meu papel

Desenhei e implementei o pipeline de ponta a ponta e cuidei da operação: CI em runner próprio (de 10 min para cerca de 3 min), imagens sem vulnerabilidades altas e watchdogs que marcam como falha qualquer etapa travada, em vez de deixá-la presa para sempre.

O que o produto entrega

  • Entrada automática pelo calendário do Microsoft 365, pelo botão “Gravar agora”, por convite de e-mail ou por extensão de navegador.
  • Transcrição com falantes (AssemblyAI ou Deepgram, com retry e backoff) e notas com marcações de tempo que levam ao momento exato do vídeo.
  • Insights estruturados (resumo, decisões, itens de ação e riscos), com prompts por time e um painel para perguntar à IA sobre a reunião.
  • Busca, pastas e compartilhamento por e-mail, domínio, time ou link público, com papéis e escopo por time.

O que eu faria diferente

  • Começar pelo bot autenticado no Teams. Entrar como convidado foi uma restrição consciente e simplificou tudo, mas reuniões restritas a usuários da organização não deixam o bot entrar. Hoje esse é o maior limitador da taxa de gravação.
  • Não construir a arquitetura multi-worker antes da hora. Ela existe e está testada, mas o volume ainda não justifica; réplicas do monólito bastaram.
  • Tornar visível a falha de transcrição. Hoje uma transcrição que falha em segundo plano não aparece com destaque na interface.

Quer algo parecido no seu time?

Falar comigo