
# NutriScan
**Busca de produtos alimentícios sobre o Open Food Facts — por código de barras
ou nome, com filtros de Nutri-Score e NOVA, cache em camadas e listas de compras
por ID.**



[Demo](https://nutriscan.evandro.dev.br) · [Recursos](#recursos) · [Como funciona](#como-funciona) · [Execução local](#execu%C3%A7%C3%A3o-local) · [Licença](#licen%C3%A7a)
> [!NOTE]
> **Estado do projeto:** redesign completo concluído em 2026-07-16 (`feat: complete
> NutriScan redesign`), seguido de correções de deploy com Prisma/SQLite e de
> integração do Rybbit Analytics. A instância pública do autor roda em
> [nutriscan.evandro.dev.br](https://nutriscan.evandro.dev.br). Não há suíte de
> testes automatizados no repositório; o único check disponível é `pnpm lint`.
> [!IMPORTANT]
> **Licença de Uso Pessoal:** o código só pode ser usado para fins pessoais e não
> comerciais, **apenas em localhost**. É proibido fazer deploy público,
> redistribuir, usar comercialmente ou criar obras derivadas para distribuição
> (texto completo em [`LICENSE`](LICENSE)). A instância pública acima é a do
> próprio autor.
## Recursos
| Recurso | O que faz |
|---|---|
| **Busca por código de barras ou nome** | O tipo é detectado sozinho: entrada com 8 a 13 dígitos é tratada como código de barras, o resto como nome/marca |
| **Filtros** | Nutri-Score A–E, grupos NOVA 1–4, categorias, marcas, alérgenos e aditivos (incluir/excluir, ou "sem aditivos"), faixas por 100 g de energia, gordura, carboidratos, proteínas, açúcares, fibras e sódio, e países |
| **12 critérios de ordenação** | Relevância, Nutri-Score, nome, marca, energia, gordura, açúcares, completude, com imagem, com dados nutricionais, Eco-Score e grupo NOVA, em ordem crescente ou decrescente |
| **Cache em camadas** | `localStorage` no navegador (TTL padrão de 1 hora) e um cache JSON no servidor (`data/products-cache.json`, 232 produtos no repositório) que é consultado antes do Open Food Facts |
| **Modo cache-only** | Em produção, o usuário pode ligar um switch para o servidor responder só com o cache JSON, sem consultar o Open Food Facts |
| **País por IP** | A rota `/api/location` descobre o país do visitante e a busca prioriza produtos dele; o resultado fica 7 dias no `localStorage`, com Brasil como fallback |
| **Listas de compras** | Várias listas acessíveis por ID em `/lista/[id]`; cada item tem nome, quantidade, unidade e status de comprado, persistidos com Prisma + SQLite |
| **Interface** | Tema claro/escuro, componentes shadcn/ui sobre Radix UI, animações com Framer Motion, skeletons, paginação e manifest de PWA |
Páginas: `/` (landing), `/resultados`, `/produto/[barcode]`, `/lista/[id]` e `/sobre`.
## Como funciona
```mermaid
flowchart LR
U["Navegador