MVP de emissão e validação de certificados para ligas acadêmicas — leve, gratuito e simples de manter. Inspirado na documentação técnica de um sistema baseado em Google Apps Script, mas reescrito do zero com uma arquitetura serverless que roda inteira em free tiers.
- Next.js (App Router) — frontend + backend (API Routes) no mesmo projeto → deploy único na Vercel
- Supabase — Postgres (banco), Storage (PDFs) e Auth, tudo no free tier
- @react-pdf/renderer — gera o PDF programaticamente, sem navegador headless (leve o suficiente para função serverless)
- qrcode — gera o QR Code de validação
- Resend (opcional, a integrar) — envio de e-mail transacional
A documentação original (Google Apps Script) usava Google Docs/Sheets como banco e motor de templates, com limite de 6 min de execução por script. Aqui trocamos por:
| Original | Aqui | Ganho |
|---|---|---|
| Google Sheets como "banco" | Postgres (Supabase) | Consultas indexadas, sem limite de linhas de planilha |
| Google Docs + cópia de template | @react-pdf/renderer |
PDF gerado em memória, sem cota de API do Google |
| MailApp/GmailApp (100–1500/dia) | Resend (3.000/mês grátis) | Sem cota diária baixa |
| Nenhuma fila / RBAC | Loop sequencial simples | Suficiente para lotes de dezenas/centenas — sem a complexidade de filas (SQS/Redis) que o público industrial exigiria |
- Crie uma conta em https://supabase.com e um novo projeto.
- Vá em SQL Editor e rode o conteúdo de
supabase/schema.sql. - Vá em Storage e crie um bucket chamado
certificates(pode deixar privado — a validação pública usa signed URLs temporárias). - Vá em Project Settings > API e copie:
Project URL,anon public key,service_role key.
cp .env.example .env.local
# preencha com os valores do Supabasenpm install
npm run devAcesse http://localhost:3000/validar para ver a página pública de validação.
- Suba o projeto para um repositório no GitHub.
- Importe o repositório na Vercel (free tier).
- Configure as mesmas variáveis de ambiente do
.env.localno painel da Vercel. - Atualize
NEXT_PUBLIC_APP_URLpara a URL final (ex:https://certifica-facil.vercel.app) — ela é usada dentro do QR Code.
src/
app/
validar/page.tsx → página pública de validação
dashboard/ → (a construir) painel do admin da liga
api/
participants/import/route.ts → importação de participantes via CSV
certificates/generate/route.ts → geração em lote (PDF + hash + QR + storage)
validate/route.ts → endpoint consultado pela página /validar
lib/
supabase/client.ts → cliente para uso no navegador (chave pública)
supabase/server.ts → cliente para uso nas API Routes (chave secreta)
certificates/
hash.ts → gera o código de validação não-sequencial
qrcode.ts → gera o QR Code apontando para /validar
CertificateTemplate.tsx → layout visual do PDF
supabase/
schema.sql → schema completo do banco (rodar no SQL Editor)
- Autenticação do admin — Supabase Auth (email/senha ou magic link) protegendo
/dashboarde as API Routes de escrita. - Telas do dashboard — formulário de criar evento, upload de CSV, botão "gerar certificados", listagem de status.
- Envio de e-mail — endpoint que usa o Resend para notificar cada participante após a geração.
- Componente de import CSV no frontend — hoje a rota
/api/participants/importjá funciona via multipart/form-data; falta a tela que faz esse upload.
- Assinatura digital ICP-Brasil/Autentique (só necessária para documentos de SST/eSocial)
- Fila de processamento (SQS/Redis) — desnecessária para lotes de dezenas/centenas de certificados
- Multi-tenant / múltiplas organizações
- Editor visual drag-and-drop de template (o layout é um componente React fixo em
CertificateTemplate.tsx)