O DentalAI é um ecossistema focado na automação de prontuários e evoluções odontológicas utilizando Inteligência Artificial. O sistema permite que dentistas gravem suas consultas e recebam automaticamente um prontuário estruturado e formatado via e-mail, utilizando modelos avançados de Processamento de Linguagem Natural (LLM).
- Resiliência Offline-First: Gravação segura utilizando IndexedDB (via
idb-keyval) para garantir que nenhum áudio seja perdido em caso de falha de conexão. - Arquitetura Event-Driven (Long-Running): Processamento assíncrono orquestrado pelo Inngest, permitindo lidar com áudios extensos (até 1 hora) sem estourar limites de timeout de requisições web.
- Upload de Baixa Latência: Bypass do servidor principal utilizando Pre-signed URLs do AWS S3 SDK para upload direto no Cloudflare R2.
- Progressive Web App (PWA): Instalação nativa em dispositivos móveis já configurada, proporcionando uma experiência de app mobile para os dentistas.
- Frontend: Next.js 16 (App Router), React 19, Tailwind CSS v4.
- Backend & Workers: Inngest (Job Scheduling & Orquestração).
- Database & Auth: Supabase (PostgreSQL).
- File Storage: Cloudflare R2 (compatível com S3 API).
- AI Engine: Google AI Studio (Modelo:
gemini-2.5-flash). - Email Service: Resend.
O projeto segue princípios de separação de responsabilidades e Clean Architecture através de Custom Hooks:
src/app/hooks/useAudioRecorder.ts: Gerencia a API de MediaRecorder do navegador, o timer e a persistência local (IndexedDB).src/app/hooks/useProntuarioUpload.ts: Orquestra o fluxo de rede (Cloudflare R2 -> Inngest Trigger).src/inngest/functions.ts: Contém o "Worker" (process-audio-and-send-email) que executa o processamento pesado de IA em background.
- Capture: Áudio capturado via navegador e salvo no IndexedDB.
- Storage: Upload direto do navegador para o Cloudflare R2 via Pre-signed URL.
- Trigger: Evento enviado para a fila do Inngest (
audio/process.requested). - Process: O Worker baixa o áudio do R2, envia para a API do Gemini via Google File API e gera a evolução estruturada.
- Persist: O prontuário em texto é salvo na tabela
prontuariosno Supabase. - Notify: O Resend envia o prontuário formatado para o e-mail do dentista.
- Cleanup: O áudio original é removido do R2, do diretório temporário do servidor e do IndexedDB, garantindo máxima conformidade com a LGPD.
O projeto utiliza um arquivo de exemplo para o mapeamento das variáveis de ambiente. Para rodar localmente:
- Duplique o arquivo
.env.examplena raiz do repositório. - Renomeie a cópia para
.env.local. - Preencha as chaves de API correspondentes de cada serviço.
(Nota: Em desenvolvimento local, a variável
INNGEST_DEV=1presente no arquivo de exemplo dispensa o uso de chaves do servidor remoto do Inngest).
- Commits: Sempre em Inglês seguindo o padrão Conventional Commits.
- Branches: *
feature/para novas funcionalidades.fix/para correção de bugs.refactor/para melhorias estruturais de código.
- Versão: Gerenciada via
npm version [patch|minor|major]e refletida nopackage.json.
- Implementação da Arquitetura Multitenant com Row Level Security (RLS) no Supabase.
- Motor de Prompts Dinâmicos customizáveis por Clínica/Inquilino.
- Dashboard de monitoramento de status em Real-time via Supabase WebSockets.