Sistema web de chamados para pequenos negócios no Brasil, com abertura pública sem conta, consulta por código/e-mail e painel admin protegido para operar a fila de atendimento.
Status: MVP funcional de portfólio. O projeto demonstra um fluxo realista de help desk single-company, sem prometer multiempresa, RBAC completo, anexos, e-mail automático ou SaaS enterprise.
- Abra a demo: chamadafacil.vercel.app.
- Veja o fluxo público em
/tickets/new: crie um chamado e copie o código gerado. - Consulte o chamado em
/tickets/lookupusando código e e-mail. - Revise o painel admin no README/estudo de caso e, localmente, acesse
/admin/logincom o seed de desenvolvimento. - Confira os pontos técnicos: Server Actions, Supabase Auth, PostgreSQL/RLS, validação server-side, rate limit básico e testes unitários.
Links úteis:
| Recurso | Link |
|---|---|
| Demo | chamadafacil.vercel.app |
| Repositório | github.com/bps2414/chamadafacil |
| Estudo de caso | docs/CASE_STUDY.md |
| Notas de segurança | docs/SECURITY.md |
| Deploy | docs/DEPLOYMENT.md |
| Textos de portfólio | docs/PORTFOLIO_COPY.md |
| README em inglês | README.en.md |
O ChamadaFácil foi criado para resolver um problema comum em pequenos negócios: pedidos de suporte espalhados entre WhatsApp, e-mail, ligações e planilhas. O produto organiza o essencial:
- O solicitante abre um chamado sem criar conta.
- O sistema gera um código único para o chamado.
- O solicitante consulta o andamento com código e e-mail.
- O operador autenticado gerencia fila, status, urgência e respostas.
O escopo atual é single-company/single-tenant: uma empresa usa a ferramenta internamente. Essa decisão mantém o MVP pequeno, avaliável e coerente para portfólio.
Os prints usam dados fictícios e não devem expor variáveis de ambiente, tokens, cookies ou credenciais reais.
| Tela | Preview |
|---|---|
| Landing page | ![]() |
| Abertura de chamado | ![]() |
| Consulta de chamado | ![]() |
| Login admin | ![]() |
| Dashboard admin | ![]() |
| Detalhe admin | ![]() |
Checklist completo em docs/SCREENSHOTS_CHECKLIST.md.
- Landing page em português brasileiro.
- Abertura de chamado sem cadastro.
- Validação server-side de nome, e-mail, telefone, assunto e descrição.
- Geração automática de número no formato
CF-YYYY-00000. - Estado de sucesso com código destacado, botão de copiar e CTA para consulta.
- Consulta por número do chamado e e-mail.
- Resultado com status, urgência, descrição original e respostas públicas.
- Mensagem neutra quando a combinação código/e-mail não encontra chamado.
- Login administrativo com Supabase Auth.
- Rotas
/adminprotegidas por Proxy e checagens server-side. - Dashboard com estatísticas resumidas.
- Lista responsiva: tabela no desktop e cards no mobile.
- Filtros por status, urgência e resposta.
- Busca por número, assunto e solicitante.
- Ordenação por atualização, criação e urgência.
- Destaque para chamados urgentes e sem resposta.
- Detalhe do chamado com dados do solicitante e timeline.
- Atualização de status, urgência e resposta pública ao solicitante.
- PostgreSQL com migrations e constraints.
- Row Level Security nas tabelas do app.
- Server Actions para criação, consulta e mutações admin.
- Validação server-side para formulários públicos e administrativos.
- Same-origin guard nos fluxos públicos.
- Rate limit básico por IP/e-mail com identificadores em hash.
SUPABASE_SERVICE_ROLE_KEYusada apenas em código server-side.- Headers de segurança em
next.config.ts. - Testes unitários com Vitest para validações, filtros e regras puras.
| Camada | Tecnologia |
|---|---|
| Framework | Next.js App Router |
| UI | React, TypeScript e Tailwind CSS |
| Auth | Supabase Auth |
| Banco | Supabase PostgreSQL |
| Segurança de dados | Supabase RLS |
| Mutações | Server Actions |
| Testes | Vitest |
| Deploy alvo | Vercel |
As versões principais estão em package.json.
- O App Router separa a área pública da área admin.
- As Server Actions concentram validação, autorização e mutações.
- O RLS evita acesso direto indevido às tabelas.
- A consulta pública exige código e e-mail para reduzir a exposição de chamados.
- O admin é tratado como ferramenta interna: usuários são criados manualmente no Supabase.
- Os filtros do admin ficam na URL para permitir recarregar e compartilhar o estado.
- Regras puras e validações foram isoladas para testes sem depender do banco.
Requisitos:
- Node.js
20.9.0ou superior. - npm.
- Supabase CLI.
- Docker Desktop, se for rodar o Supabase local.
Instale as dependências:
npm installCrie o arquivo local de ambiente:
cp .env.example .env.localNo Windows PowerShell:
Copy-Item .env.example .env.localPreencha as variáveis em .env.local.
Suba o Supabase local e aplique migrations/seed:
npm run supabase:start
npm run supabase:db:resetRode a aplicação:
npm run devAcesse http://localhost:3000.
Admin local criado pelo seed:
E-mail: [email protected]
Senha: admin123
Esse usuário é apenas para desenvolvimento local. Não publique essa credencial como login de demo em produção.
Chamado local para consulta após o seed:
Ticket: CF-2026-00001
E-mail: [email protected]
Os dados do seed são fictícios.
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
SITE_URL=https://chamadafacil.vercel.app| Variável | Exposição | Uso |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Pública/browser-safe | URL do projeto Supabase. |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Pública/browser-safe | Chave anon pública usada com RLS. |
SUPABASE_SERVICE_ROLE_KEY |
Somente servidor | Fluxos públicos controlados e rate limit. |
SITE_URL |
Pública/canônica | Canonical, Open Graph, robots e sitemap. |
Nunca use NEXT_PUBLIC_ na service role key e nunca coloque segredos reais em README, screenshots, logs ou issues.
npm run dev
npm test
npm run lint
npm run typecheck
npm run build
npm run supabase:start
npm run supabase:stop
npm run supabase:status
npm run supabase:db:reset
npm run supabase:linkComandos finais recomendados antes de publicar:
npm test
npm run lint
npm run typecheck
npm run buildO alvo documentado é a Vercel com Supabase hospedado.
Checklist de produção:
- Configurar
NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY,SUPABASE_SERVICE_ROLE_KEYeSITE_URLno provedor. - Aplicar as migrations no Supabase remoto.
- Desativar public signups no Supabase Auth.
- Criar operadores manualmente em Authentication > Users.
- Não aplicar o seed local em produção.
- Rodar smoke test das rotas públicas e privadas.
Guia completo: docs/DEPLOYMENT.md.
- Não há RBAC; todo usuário autenticado no Supabase é operador/admin.
- Não há multiempresa/multi-tenant.
- Não há contas públicas para solicitantes.
- Não há anexos/upload.
- Não há e-mail transacional.
- Não há SLA, vencimentos ou indicadores de atraso.
- Não há base de conhecimento.
- Não há notas internas para operadores.
- Não há auditoria avançada de mudanças.
Esses pontos são possibilidades futuras, não funcionalidades prontas.
- RBAC com papéis de admin, operador e visualizador.
- Isolamento por empresa/tenant.
- Notificações por e-mail.
- Anexos.
- SLA e indicadores de atraso.
- Exportação CSV.
- Auditoria mais detalhada.
- Base de conhecimento.
- Notas internas.
ChamadaFácil é um help desk full-stack para pequenos negócios, com abertura pública de chamados, consulta por código/e-mail, painel admin autenticado, fila operacional com busca/filtros/ordenação, respostas públicas e documentação pronta para avaliação técnica. O projeto demonstra Next.js, TypeScript, Supabase Auth, PostgreSQL/RLS, Server Actions, validação server-side, rate limit básico e testes em um escopo MVP honesto.





