diff --git a/README.md b/README.md index 6aade08..30489b4 100644 --- a/README.md +++ b/README.md @@ -2,295 +2,314 @@
-[![Next.js](https://img.shields.io/badge/Next.js-14-black?style=for-the-badge&logo=next.js&logoColor=white)](https://nextjs.org/) -[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) -[![Prisma](https://img.shields.io/badge/Prisma-5.22-2D3748?style=for-the-badge&logo=prisma&logoColor=white)](https://www.prisma.io/) -[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-3.4-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white)](https://tailwindcss.com/) +![NutriScan Logo](./public/apple-touch-icon.png) + +**Plataforma completa de informações nutricionais alimentares** + +_Descubra o que a comunidade alimentar sabe sobre seus alimentos_ + +[![Next.js](https://img.shields.io/badge/Next.js-14.2.18-black?style=for-the-badge&logo=next.js&logoColor=white)](https://nextjs.org/) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.7.2-blue?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) +[![Prisma](https://img.shields.io/badge/Prisma-5.22.0-2D3748?style=for-the-badge&logo=prisma&logoColor=white)](https://www.prisma.io/) +[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-3.4.15-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white)](https://tailwindcss.com/) [![Open Food Facts](https://img.shields.io/badge/Open_Food_Facts-API-4CAF50?style=for-the-badge&logo=openfoodfacts&logoColor=white)](https://world.openfoodfacts.org/) [![Live Demo](https://img.shields.io/badge/Live_Demo-00B37E?style=for-the-badge&logo=vercel&logoColor=white)](https://nutriscan.evandro.dev.br) [![Report Bug](https://img.shields.io/badge/Report_Bug-E62117?style=for-the-badge&logo=github&logoColor=white)](https://github.com/evandrodevbr/lista-compras/issues) [![Request Feature](https://img.shields.io/badge/Request_Feature-2EA043?style=for-the-badge&logo=github&logoColor=white)](https://github.com/evandrodevbr/lista-compras/issues) -**A comprehensive nutritional information platform powered by Open Food Facts API** -
-## Table of Contents +## 📋 Índice -- [About the Project](#-about-the-project) -- [Features](#-features) -- [Tech Stack](#-tech-stack) -- [Architecture](#-architecture) -- [Getting Started](#-getting-started) -- [Project Structure](#-project-structure) -- [API Integration](#-api-integration) +- [Sobre o Projeto](#-sobre-o-projeto) +- [Demonstração Visual](#-demonstração-visual) +- [Funcionalidades](#-funcionalidades) +- [Stack Tecnológica](#-stack-tecnológica) +- [Arquitetura](#-arquitetura) +- [Instalação e Setup](#-instalação-e-setup) +- [API e Integrações](#-api-e-integrações) - [Database Schema](#-database-schema) -- [Available Scripts](#-available-scripts) -- [Contributing](#-contributing) -- [License](#-license) -- [Contact](#-contact) -- [Acknowledgments](#-acknowledgments) +- [Performance e Otimizações](#-performance-e-otimizações) +- [Deployment](#-deployment) +- [Scripts Disponíveis](#-scripts-disponíveis) +- [Contribuindo](#-contribuindo) +- [Licença](#-licença) +- [Contato](#-contato) +- [Agradecimentos](#-agradecimentos) -## 🚀 About the Project +## 🚀 Sobre o Projeto -NutriScan is a modern web application designed to provide users with comprehensive nutritional information about food products. By leveraging the powerful Open Food Facts API, NutriScan enables users to search for products by barcode or name and access detailed nutritional data, ingredient lists, and health classifications to make informed dietary choices. +**NutriScan** é uma plataforma web moderna que democratiza o acesso a informações nutricionais transparentes e confiáveis. Desenvolvida com foco na experiência do usuário e performance, a aplicação conecta consumidores conscientes à maior base de dados colaborativa de alimentos do mundo. -### 🎯 Mission +### 🎯 Missão -Empower users with accurate, comprehensive nutritional data to make healthier food choices through an intuitive, fast, and reliable platform. +Empoderar usuários com dados nutricionais precisos e abrangentes para tomada de decisões alimentares mais conscientes através de uma plataforma intuitiva, rápida e confiável. -### 🎯 Key Differentiators +### ⭐ Diferenciais -- **Comprehensive Data**: Access to millions of products from the world's largest open food database -- **Advanced Filtering**: Sophisticated search and filter capabilities for precise product discovery -- **Health Classifications**: Nutri-Score and NOVA group ratings for quick health assessment -- **Real-time Updates**: Live data synchronization and instant search results -- **Developer-Friendly**: Clean architecture with modern web technologies +- **Dados Colaborativos**: Acesso a milhões de produtos da maior base de dados open source do mundo +- **Filtros Avançados**: Sistema sofisticado de busca e filtros para descoberta precisa de produtos +- **Classificações de Saúde**: Nutri-Score e NOVA group para avaliação rápida da qualidade +- **Atualizações em Tempo Real**: Sincronização de dados ao vivo e resultados instantâneos +- **Arquitetura Moderna**: Desenvolvida com tecnologias de ponta e foco em performance -## ✨ Features +### 📊 Estatísticas -### 🔍 Nutritional Search +| Métrica | Valor | +| ------------------- | ----- | +| Produtos no banco | 2M+ | +| Países cobertos | 100+ | +| Disponibilidade | 24/7 | +| Dados colaborativos | Sim | -- **Barcode Scanning**: Instant product lookup using barcode numbers -- **Text Search**: Search products by name, brand, or category -- **Advanced Filtering**: Filter by nutrition grades, categories, brands, allergens, and more -- **Real-time Results**: Fast search with instant feedback +## 📱 Demonstração Visual -### 📊 Comprehensive Data +> **Nota**: Screenshots serão adicionados em breve mostrando as principais funcionalidades da aplicação. -- **Nutritional Information**: Complete macronutrient and micronutrient breakdown -- **Health Classifications**: Nutri-Score (A-E) and NOVA group (1-4) ratings -- **Ingredient Analysis**: Detailed ingredient lists with allergen identification -- **Additive Information**: Complete additive and preservative listings +### Principais Telas -### 🛒 Shopping Lists +- **Página Inicial**: Interface de busca com hero section e barra de pesquisa +- **Resultados**: Lista de produtos com filtros avançados e ordenação +- **Detalhes do Produto**: Informações nutricionais completas e classificações +- **Lista de Compras**: Gerenciamento de produtos com quantidades e status +- **Modos de Tema**: Visualização em tema claro e escuro -- **Collaborative Lists**: Create and share shopping lists with others -- **Real-time Updates**: Live synchronization across devices -- **Product Management**: Add, remove, and mark items as purchased -- **Quantity Tracking**: Specify quantities and units for each item +## ✨ Funcionalidades -### 🎨 User Experience +### 🔍 Sistema de Busca Inteligente -- **Responsive Design**: Optimized for desktop, tablet, and mobile devices -- **Dark/Light Themes**: Automatic theme switching with system preferences -- **Accessibility**: WCAG compliant with keyboard navigation and screen reader support -- **Performance**: Optimized loading times with caching and pagination +O NutriScan oferece múltiplas formas de encontrar produtos alimentícios: -### ⚡ Technical Features +- **Busca por Código de Barras**: Reconhecimento automático de códigos de 8-13 dígitos +- **Busca por Nome/Marca**: Pesquisa textual inteligente com sugestões +- **Detecção Automática**: Sistema que identifica o tipo de busca automaticamente +- **Geolocalização**: Priorização de produtos locais baseada na localização do usuário +- **API Proxy**: Chamadas seguras através de rotas Next.js para evitar problemas de CORS -- **Server Actions**: Real-time data updates without page refreshes -- **Caching Strategy**: Intelligent caching for improved performance -- **API Proxy**: Secure API calls through Next.js API routes -- **Type Safety**: Full TypeScript implementation for reliability +### 💾 Sistema de Cache Avançado -## 🛠 Tech Stack +Sistema multi-camada de cache para performance otimizada: -### Core Framework +- **Cache localStorage**: Armazenamento local com TTL configurável +- **Cache de Buscas**: Armazenamento completo de buscas com filtros aplicados +- **Cache JSON**: 218 produtos pré-carregados para uso offline +- **Modo Cache-Only**: Funcionamento completo sem conexão com internet +- **Sincronização Inteligente**: Atualização automática de dados quando online +- **Estatísticas de Storage**: Monitoramento de uso de armazenamento -- **[Next.js 14](https://nextjs.org/)** - React framework with App Router and Server Actions -- **[TypeScript](https://www.typescriptlang.org/)** - Type-safe JavaScript development -- **[React 18](https://react.dev/)** - Modern React with concurrent features +### 🎛️ Filtros e Ordenação -### Database & ORM +Sistema robusto de filtros para descoberta precisa: -- **[Prisma](https://www.prisma.io/)** - Type-safe database ORM -- **[SQLite](https://www.sqlite.org/)** - Lightweight, serverless database +#### Classificações de Saúde -### Styling & UI +- **Nutri-Score**: Filtro por classificação A-E (muito bom a muito ruim) +- **NOVA Group**: Filtro por nível de processamento 1-4 (não processado a ultraprocessado) -- **[Tailwind CSS](https://tailwindcss.com/)** - Utility-first CSS framework -- **[shadcn/ui](https://ui.shadcn.com/)** - Reusable component library -- **[Radix UI](https://www.radix-ui.com/)** - Unstyled, accessible UI primitives -- **[Lucide Icons](https://lucide.dev/)** - Beautiful, customizable icons -- **[Framer Motion](https://www.framer.com/motion/)** - Animation library +#### Filtros de Produto -### External APIs +- **Categorias**: Filtro por tipo de alimento (bebidas, laticínios, snacks, etc.) +- **Marcas**: Filtro por fabricante +- **Alérgenos**: Identificação e filtro por substâncias alergênicas +- **Aditivos**: Filtro por aditivos alimentares e conservantes -- **[Open Food Facts](https://world.openfoodfacts.org/)** - Global food product database -- **Geolocation API** - Location-based product recommendations +#### Filtros Nutricionais -### Development Tools +- **Ranges Personalizados**: Filtros por valores nutricionais (calorias, gorduras, açúcares, etc.) +- **12 Opções de Ordenação**: Por relevância, nutrição, nome, marca, valores nutricionais, etc. -- **[ESLint](https://eslint.org/)** - Code linting and formatting -- **[PostCSS](https://postcss.org/)** - CSS processing -- **[pnpm](https://pnpm.io/)** - Fast, disk space efficient package manager +### 🛒 Listas de Compras Colaborativas -## 🏗 Architecture +Sistema completo de gerenciamento de compras: -### App Router Structure +- **Múltiplas Listas**: Criação e gerenciamento de várias listas de compras +- **Produtos Detalhados**: Adição com quantidade, unidade e observações +- **Status de Compra**: Marcação de itens como comprados +- **Sincronização**: Persistência via Prisma + SQLite +- **Compartilhamento**: Compartilhamento de listas via ID único -The application uses Next.js 14's App Router with the following organization: +### 🎨 Interface e Experiência do Usuário + +Design moderno e acessível: + +- **Design Responsivo**: Mobile-first com adaptação para todos os dispositivos +- **Temas**: Modo claro e escuro com persistência de preferência +- **Animações**: Transições suaves com Framer Motion +- **Acessibilidade**: Componentes Radix UI com suporte completo a leitores de tela +- **Estados de Loading**: Skeletons e indicadores de carregamento +- **Paginação Otimizada**: Carregamento eficiente de grandes listas +- **Imagens Otimizadas**: Lazy loading e otimização automática + +## 🛠 Stack Tecnológica + +### Framework Principal + +- **[Next.js 14.2.18](https://nextjs.org/)** - React framework com App Router e Server Actions +- **[TypeScript 5.7.2](https://www.typescriptlang.org/)** - JavaScript tipado para maior confiabilidade +- **[React 18.3.1](https://react.dev/)** - Biblioteca de interface moderna com recursos concorrentes + +### Banco de Dados e ORM + +- **[Prisma 5.22.0](https://www.prisma.io/)** - ORM type-safe para gerenciamento de dados +- **[SQLite](https://www.sqlite.org/)** - Banco de dados leve e serverless + +### Estilização e UI + +- **[Tailwind CSS 3.4.15](https://tailwindcss.com/)** - Framework CSS utility-first +- **[shadcn/ui](https://ui.shadcn.com/)** - Biblioteca de componentes reutilizáveis +- **[Radix UI](https://www.radix-ui.com/)** - Primitivos acessíveis não estilizados +- **[Lucide Icons 0.460.0](https://lucide.dev/)** - Ícones bonitos e customizáveis +- **[Framer Motion 11.12.0](https://www.framer.com/motion/)** - Biblioteca de animações + +### APIs Externas + +- **[Open Food Facts](https://world.openfoodfacts.org/)** - Base de dados global de produtos alimentícios +- **Geolocation API** - Recomendações baseadas em localização + +### Ferramentas de Desenvolvimento + +- **[ESLint 8.57.1](https://eslint.org/)** - Linting e formatação de código +- **[PostCSS 8.4.49](https://postcss.org/)** - Processamento de CSS +- **[pnpm](https://pnpm.io/)** - Gerenciador de pacotes eficiente + +## 🏗 Arquitetura + +### Estrutura do App Router ``` app/ -├── actions.ts # Server Actions for data mutations -├── api/ # API Routes for external service proxies -│ ├── location/ # Geolocation services -│ ├── products/[barcode]/ # Product lookup proxy -│ └── search/ # Search proxy for Open Food Facts -├── components/ # Feature-specific components -│ ├── landing/ # Landing page sections -│ └── [various components] # Reusable feature components -├── lista/[id]/ # Shopping list pages -├── produto/[barcode]/ # Product detail pages -├── resultados/ # Search results page -└── layout.tsx # Root layout +├── actions.ts # Server Actions para mutações de dados +├── api/ # Rotas de API para proxies de serviços externos +│ ├── cache/sync/ # Sincronização de cache +│ ├── location/ # Serviços de geolocalização +│ ├── products/[barcode]/ # Proxy de busca de produto +│ ├── search/ # Proxy de busca Open Food Facts +│ └── storage-stats/ # Estatísticas de armazenamento +├── components/ # Componentes específicos de funcionalidades +│ ├── landing/ # Seções da página inicial +│ └── [componentes diversos] # Componentes reutilizáveis +├── lista/[id]/ # Páginas de lista de compras +├── produto/[barcode]/ # Páginas de detalhes do produto +├── resultados/ # Página de resultados de busca +└── layout.tsx # Layout raiz ``` -### Component Organization +### Fluxo de Dados -- **UI Components** (`/components/ui/`): Reusable, styled components from shadcn/ui -- **Feature Components** (`/app/components/`): Business logic components -- **Layout Components**: Header, footer, and navigation components +1. **Requisições de Busca**: Entrada do usuário → Rota de API → API Open Food Facts → Resposta +2. **Gerenciamento de Listas**: Ações do usuário → Server Actions → Prisma → Banco de dados +3. **Atualizações em Tempo Real**: Server Actions → Banco de dados → Revalidação → Atualização da UI -### Data Flow +### Sistema de Cache -1. **Search Requests**: User input → API Route → Open Food Facts API → Response -2. **List Management**: User actions → Server Actions → Prisma → Database -3. **Real-time Updates**: Server Actions → Database → Revalidation → UI Update +```mermaid +graph TD + A[Usuário] --> B[Interface] + B --> C{Cache Local?} + C -->|Sim| D[Retornar Dados] + C -->|Não| E[API Route] + E --> F[Open Food Facts API] + F --> G[Salvar no Cache] + G --> D +``` -## 🚦 Getting Started +## 🚦 Instalação e Setup -### Prerequisites +### Pré-requisitos -- **Node.js** 18.0 or higher -- **pnpm** 8.0 or higher (recommended package manager) +- **Node.js** 18.0 ou superior +- **pnpm** 8.0 ou superior (gerenciador de pacotes recomendado) -### Installation +### Instalação Passo a Passo -1. **Clone the repository** +1. **Clone o repositório** ```bash git clone https://github.com/evandrodevbr/lista-compras.git cd lista-compras ``` -2. **Install dependencies** +2. **Instale as dependências** ```bash pnpm install ``` -3. **Set up environment variables** +3. **Configure as variáveis de ambiente** ```bash cp .env.example .env.local ``` - Configure the following variables: + Configure as seguintes variáveis: ```env DATABASE_URL="file:./prisma/db/database.sqlite" NEXT_PUBLIC_SITE_URL="http://localhost:3000" ``` -4. **Initialize the database** +4. **Inicialize o banco de dados** ```bash pnpm db:generate pnpm db:migrate ``` -5. **Start the development server** +5. **Inicie o servidor de desenvolvimento** ```bash pnpm dev ``` -6. **Open your browser** - Navigate to [http://localhost:3000](http://localhost:3000) +6. **Abra seu navegador** + Navegue para [http://localhost:3000](http://localhost:3000) -## 📁 Project Structure +### Troubleshooting -``` -nutriscan/ -├── app/ # Next.js App Router -│ ├── actions.ts # Server Actions -│ ├── api/ # API Routes -│ │ ├── location/ # Geolocation API route -│ │ ├── products/[barcode]/ # Product lookup proxy -│ │ └── search/ # Search proxy for Open Food Facts -│ ├── components/ # Feature components -│ │ ├── landing/ # Landing page sections -│ │ │ ├── Features.tsx -│ │ │ ├── Hero.tsx -│ │ │ ├── HowItWorks.tsx -│ │ │ └── SearchBar.tsx -│ │ ├── pricing/ # Pricing page components -│ │ ├── card.tsx -│ │ ├── FilterSidebar.tsx -│ │ ├── ListaProductCard.tsx -│ │ ├── NutritionChart.tsx -│ │ └── [other components] -│ ├── lista/[id]/ # Shopping list pages -│ ├── produto/[barcode]/ # Product detail pages -│ ├── resultados/ # Search results page -│ ├── pricing/ # Pricing page -│ ├── layout.tsx # Root layout -│ ├── page.tsx # Home page -│ └── providers.tsx # Context providers -├── components/ # Reusable UI components -│ ├── ui/ # shadcn/ui components -│ │ ├── button.tsx -│ │ ├── card.tsx -│ │ ├── input.tsx -│ │ └── [other UI components] -│ └── theme-toggle.tsx -├── hooks/ # Custom React hooks -│ ├── useProductFilters.ts -│ └── useSearchCache.ts -├── lib/ # Utility libraries -│ ├── openFoodFactsApi.ts # Open Food Facts API wrapper -│ ├── cacheManager.ts # Search cache logic -│ ├── geolocation.ts # Location services -│ ├── prisma.ts # Prisma client -│ ├── types.ts # TypeScript definitions -│ └── utils.ts # Utility functions -├── prisma/ # Database configuration -│ ├── migrations/ # Database migrations -│ ├── db/ # SQLite database files -│ └── schema.prisma # Database schema -├── public/ # Static assets -│ └── manifest.json -├── docs/ # Documentation -│ └── openFoodFacts.md -├── package.json # Dependencies and scripts -├── tailwind.config.ts # Tailwind CSS configuration -├── tsconfig.json # TypeScript configuration -└── next.config.mjs # Next.js configuration -``` +**Problema**: Erro de conexão com banco de dados -## 🔌 API Integration +- **Solução**: Verifique se o arquivo `database.sqlite` existe em `prisma/db/` -### Open Food Facts Integration +**Problema**: Erro de build do Prisma -NutriScan integrates with the Open Food Facts API through a custom wrapper (`lib/openFoodFactsApi.ts`) that provides: +- **Solução**: Execute `pnpm db:generate` antes do build -- **Product Search**: Search products by name, brand, or category -- **Barcode Lookup**: Direct product lookup using barcode numbers -- **Advanced Filtering**: Filter by nutrition grades, allergens, additives, and more -- **Caching**: Intelligent caching strategy for improved performance -- **Error Handling**: Comprehensive error handling and fallback mechanisms +**Problema**: Dependências não instaladas -### API Routes +- **Solução**: Use `pnpm install --no-frozen-lockfile` -The application uses Next.js API routes as proxies to avoid CORS issues: +## 🔌 API e Integrações -- **`/api/search`**: Product search endpoint -- **`/api/products/[barcode]`**: Individual product lookup -- **`/api/location`**: Geolocation services for regional product data +### Integração Open Food Facts -### Caching Strategy +O NutriScan integra com a API Open Food Facts através de um wrapper customizado (`lib/openFoodFactsApi.ts`) que fornece: -- **Search Results**: Cached for 1 hour to reduce API calls -- **Product Details**: Cached for 24 hours for frequently accessed products -- **Filter Options**: Cached for 1 week for static data like categories and brands +- **Busca de Produtos**: Pesquisa por nome, marca ou categoria +- **Lookup por Código de Barras**: Busca direta usando códigos de barras +- **Filtros Avançados**: Filtros por notas nutricionais, alérgenos, aditivos e mais +- **Cache**: Estratégia de cache inteligente para melhor performance +- **Tratamento de Erros**: Tratamento abrangente de erros e mecanismos de fallback + +### Endpoints Disponíveis + +| Endpoint | Descrição | Método | +| ------------------------- | ----------------------------- | ------ | +| `/api/search` | Busca de produtos | GET | +| `/api/products/[barcode]` | Busca de produto específico | GET | +| `/api/location` | Serviços de geolocalização | GET | +| `/api/cache/sync` | Sincronização de cache | POST | +| `/api/storage-stats` | Estatísticas de armazenamento | GET | + +### Rate Limits e Cache + +- **Resultados de Busca**: Cache de 1 hora para reduzir chamadas à API +- **Detalhes de Produto**: Cache de 24 horas para produtos frequentemente acessados +- **Opções de Filtro**: Cache de 1 semana para dados estáticos como categorias e marcas ## 🗄 Database Schema -The application uses a simple but effective database schema: +### Schema Prisma ```prisma model Lista { @@ -313,112 +332,208 @@ model Produtos { } ``` -### Key Features +### Características Principais -- **Simple Structure**: Easy to understand and maintain -- **Flexible Lists**: Support for multiple shopping lists -- **Product Tracking**: Quantity and unit management -- **Status Tracking**: Purchase status for each item -- **Timestamps**: Automatic creation and update tracking +- **Estrutura Simples**: Fácil de entender e manter +- **Listas Flexíveis**: Suporte para múltiplas listas de compras +- **Rastreamento de Produtos**: Gerenciamento de quantidade e unidade +- **Rastreamento de Status**: Status de compra para cada item +- **Timestamps**: Rastreamento automático de criação e atualização -## 📜 Available Scripts +## ⚡ Performance e Otimizações -```bash -# Development -pnpm dev # Start development server -pnpm build # Build for production -pnpm start # Start production server -pnpm lint # Run ESLint +### Estratégia de Cache Multi-Camada -# Database -pnpm db:push # Push Prisma schema to database -pnpm db:generate # Generate Prisma Client -pnpm db:migrate # Run database migrations +1. **Cache de Busca**: Armazenamento local de resultados de busca +2. **Cache de Produtos**: Cache JSON de produtos populares +3. **Cache de Imagens**: Lazy loading e otimização automática +4. **Cache de API**: Cache de respostas da API Open Food Facts -# Post-install -pnpm postinstall # Generate Prisma Client after install +### Otimizações de Performance + +- **Lazy Loading**: Carregamento sob demanda de imagens e componentes +- **Code Splitting**: Divisão automática de código por rota +- **Otimização de Bundle**: Minificação e tree-shaking automáticos +- **Server Actions**: Atualizações de dados sem recarregamento de página +- **Image Optimization**: Otimização automática de imagens com Next.js + +### Métricas de Performance + +- **First Load JS**: ~87.3 kB compartilhado +- **Build Time**: Otimizado com Prisma e Next.js +- **Cache Hit Rate**: Monitorado via storage stats API + +## 🚀 Deployment + +### Configuração Dokploy + +O projeto inclui configuração para deployment via Dokploy (`dokploy.yaml`): + +```yaml +build: + pre_build: + - npm install -g pnpm@latest + - export PNPM_HOME="/root/.local/share/pnpm" + - export PATH="$PNPM_HOME:$PATH" + steps: + - name: Verify pnpm + run: which pnpm && pnpm --version + - name: Install dependencies + run: pnpm install --no-frozen-lockfile + - name: Generate Prisma Client + run: pnpx prisma generate + - name: Build application + run: pnpm run build ``` -## 🤝 Contributing +### Configuração Nixpacks -We welcome contributions from the community! Here's how you can help: +Configuração alternativa para deployment (`nixpacks.toml`): -### For Developers +```toml +[phases.setup] +nixPkgs = ['nodejs_18', 'openssl'] +cmds = [ + 'npm install -g pnpm@latest', + 'npm install -g prisma' +] -1. **Fork the repository** -2. **Create a feature branch** +[phases.install] +cmds = [ + 'npx pnpm install --no-frozen-lockfile', + 'mkdir -p prisma', + 'touch prisma/dev.db', + 'chmod -R 777 prisma' +] + +[phases.build] +cmds = [ + 'mkdir -p node_modules/.prisma', + 'mkdir -p .next', + 'chmod -R 777 node_modules/.prisma node_modules/.bin .next prisma', + 'npx prisma generate', + 'npx prisma db push --accept-data-loss', + 'npx pnpm run build' +] + +[start] +cmd = 'npx pnpm start' +``` + +### Checklist de Deployment + +- [ ] Configurar variáveis de ambiente +- [ ] Executar migrações do banco de dados +- [ ] Gerar Prisma Client +- [ ] Build da aplicação +- [ ] Configurar domínio e SSL +- [ ] Testar funcionalidades principais + +## 📜 Scripts Disponíveis + +### Desenvolvimento + +```bash +pnpm dev # Inicia servidor de desenvolvimento (http://localhost:3000) +pnpm build # Build para produção +pnpm start # Inicia servidor de produção +pnpm lint # Executa ESLint +``` + +### Banco de Dados + +```bash +pnpm db:push # Push do schema Prisma para o banco +pnpm db:generate # Gera Prisma Client +pnpm db:migrate # Executa migrações do banco +``` + +### Pós-instalação + +```bash +pnpm postinstall # Gera Prisma Client após instalação +``` + +## 🤝 Contribuindo + +Agradecemos contribuições da comunidade! Aqui está como você pode ajudar: + +### Para Desenvolvedores + +1. **Fork o repositório** +2. **Crie uma branch de feature** ```bash git checkout -b feature/amazing-feature ``` -3. **Make your changes** -4. **Commit your changes** +3. **Faça suas alterações** +4. **Commit suas alterações** ```bash git commit -m 'Add: amazing feature' ``` -5. **Push to the branch** +5. **Push para a branch** ```bash git push origin feature/amazing-feature ``` -6. **Open a Pull Request** +6. **Abra um Pull Request** -### For End Users +### Para Usuários Finais -- **Report Bugs**: Use the [GitHub Issues](https://github.com/evandrodevbr/lista-compras/issues) to report bugs -- **Request Features**: Suggest new features through [GitHub Issues](https://github.com/evandrodevbr/lista-compras/issues) -- **Provide Feedback**: Share your experience and suggestions +- **Reportar Bugs**: Use [GitHub Issues](https://github.com/evandrodevbr/lista-compras/issues) +- **Solicitar Features**: Sugira novas funcionalidades via [GitHub Issues](https://github.com/evandrodevbr/lista-compras/issues) +- **Fornecer Feedback**: Compartilhe sua experiência e sugestões -### Development Guidelines +### Guidelines de Desenvolvimento -- Follow the existing code style and patterns -- Write clear commit messages -- Add tests for new features -- Update documentation as needed -- Ensure all checks pass before submitting PR +- Siga o estilo de código existente +- Escreva mensagens de commit claras +- Adicione testes para novas funcionalidades +- Atualize documentação quando necessário +- Certifique-se de que todos os checks passem antes de submeter PR -## 📄 License +## 📄 Licença -This project is licensed under a **Personal Use License**. +Este projeto está licenciado sob uma **Licença de Uso Pessoal**. -**Permissions:** +### Permissões -- ✅ Personal use on localhost -- ✅ Code inspection and learning -- ✅ Local development and testing +- ✅ Uso pessoal em localhost +- ✅ Inspeção de código e aprendizado +- ✅ Desenvolvimento e teste local -**Restrictions:** +### Restrições -- ❌ Public web deployment -- ❌ Commercial use -- ❌ Redistribution to third parties -- ❌ Creating derivative works for public distribution +- ❌ Deploy público na web +- ❌ Uso comercial +- ❌ Redistribuição para terceiros +- ❌ Criação de obras derivadas para distribuição pública -For the complete license terms, see the [LICENSE](LICENSE) file. +Para os termos completos da licença, consulte o arquivo [LICENSE](LICENSE). -## 📫 Contact +## 📫 Contato -**Author:** Evandro +**Autor:** Evandro **Website:** [evandro.dev.br](https://evandro.dev.br) **GitHub:** [@evandrodevbr](https://github.com/evandrodevbr) **Email:** evandro@evandro.dev.br -**Project Links:** +### Links do Projeto - **Live Demo:** [nutriscan.evandro.dev.br](https://nutriscan.evandro.dev.br) -- **Repository:** [github.com/evandrodevbr/lista-compras](https://github.com/evandrodevbr/lista-compras) +- **Repositório:** [github.com/evandrodevbr/lista-compras](https://github.com/evandrodevbr/lista-compras) - **Issues:** [GitHub Issues](https://github.com/evandrodevbr/lista-compras/issues) -## 🙏 Acknowledgments +## 🙏 Agradecimentos -- **[Open Food Facts](https://world.openfoodfacts.org/)** - For providing the comprehensive food database -- **[shadcn/ui](https://ui.shadcn.com/)** - For the beautiful, accessible component library -- **[Next.js Team](https://nextjs.org/)** - For the amazing React framework -- **[Vercel](https://vercel.com/)** - For hosting and deployment solutions -- **[Prisma](https://www.prisma.io/)** - For the excellent database ORM -- **Contributors** - Thank you to all contributors who help improve this project +- **[Open Food Facts](https://world.openfoodfacts.org/)** - Pela base de dados abrangente de alimentos +- **[shadcn/ui](https://ui.shadcn.com/)** - Pela biblioteca de componentes acessíveis +- **[Next.js Team](https://nextjs.org/)** - Pelo framework React incrível +- **[Vercel](https://vercel.com/)** - Por soluções de hosting e deployment +- **[Prisma](https://www.prisma.io/)** - Pelo excelente ORM +- **Contribuidores** - Obrigado a todos que ajudam a melhorar este projeto ---
-

Developed with ❤️ by evandro.dev.br

-

Made for health-conscious users and developers worldwide

+

Desenvolvido com ❤️ por evandro.dev.br

+

Feito para usuários conscientes com a saúde e desenvolvedores ao redor do mundo

diff --git a/app/components/Footer.tsx b/app/components/Footer.tsx index 74cf19c..26f9c84 100644 --- a/app/components/Footer.tsx +++ b/app/components/Footer.tsx @@ -1,10 +1,10 @@ import { - ScanLine, ExternalLink, Github, Heart, Globe, Shield, + ScanLine, } from "lucide-react"; export function Footer() { @@ -15,9 +15,11 @@ export function Footer() { {/* Brand */}
-
- -
+ NutriScan Logo

NutriScan

diff --git a/app/components/header.tsx b/app/components/header.tsx index 3a8f245..43521d2 100644 --- a/app/components/header.tsx +++ b/app/components/header.tsx @@ -1,7 +1,7 @@ "use client"; import { useState, useEffect } from "react"; import { useTheme } from "next-themes"; -import { Sun, Moon, Menu, X, ScanLine } from "lucide-react"; +import { Sun, Moon, Menu, X } from "lucide-react"; import { Button } from "@/components/ui/button"; export function Header() { @@ -27,9 +27,11 @@ export function Header() {

{/* Logo - compacto em mobile */}
-
- -
+ NutriScan Logo

NutriScan diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fe..3d4916e 100644 Binary files a/app/favicon.ico and b/app/favicon.ico differ diff --git a/app/icon.png b/app/icon.png new file mode 100644 index 0000000..5a99c40 Binary files /dev/null and b/app/icon.png differ diff --git a/app/layout.tsx b/app/layout.tsx index 6785154..afeac94 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -25,6 +25,13 @@ export const metadata: Metadata = { ], authors: [{ name: "Evandro", url: "https://evandro.dev.br" }], creator: "Evandro", + icons: { + icon: [ + { url: "/favicon.ico", sizes: "any" }, + { url: "/icon.png", sizes: "512x512", type: "image/png" }, + ], + apple: [{ url: "/icon.png", sizes: "512x512", type: "image/png" }], + }, openGraph: { type: "website", locale: "pt_BR", @@ -33,6 +40,14 @@ export const metadata: Metadata = { description: "Descubra informações nutricionais completas de milhares de produtos alimentícios.", siteName: "NutriScan", + images: [ + { + url: "/icon.png", + width: 512, + height: 512, + alt: "NutriScan Logo", + }, + ], }, twitter: { card: "summary_large_image", @@ -40,6 +55,7 @@ export const metadata: Metadata = { description: "Descubra informações nutricionais completas de milhares de produtos alimentícios.", creator: "@evandrodev", + images: ["/icon.png"], }, manifest: "/manifest.json", robots: { diff --git a/app/robots.ts b/app/robots.ts index 26c6dae..f5fae1b 100644 --- a/app/robots.ts +++ b/app/robots.ts @@ -1,12 +1,12 @@ -import { MetadataRoute } from 'next' +import { MetadataRoute } from "next"; export default function robots(): MetadataRoute.Robots { - return { - rules: { - userAgent: '*', - allow: '/', - disallow: '/private/', - }, - sitemap: 'https://resenhaitapoa.com.br/sitemap.xml', - } -} \ No newline at end of file + return { + rules: { + userAgent: "*", + allow: "/", + disallow: "/private/", + }, + sitemap: "https://nutriscan.evandro.dev.br/sitemap.xml", + }; +} diff --git a/app/sitemap.ts b/app/sitemap.ts index 772f5ea..46c3b33 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -1,12 +1,12 @@ -import { MetadataRoute } from 'next' +import { MetadataRoute } from "next"; export default function sitemap(): MetadataRoute.Sitemap { - return [ - { - url: 'https://resenhaitapoa.com.br', - lastModified: new Date(), - changeFrequency: 'daily', - priority: 1, - } - ] -} \ No newline at end of file + return [ + { + url: "https://nutriscan.evandro.dev.br", + lastModified: new Date(), + changeFrequency: "daily", + priority: 1, + }, + ]; +} diff --git a/data/products-cache.json b/data/products-cache.json index a8d7080..8a5d620 100644 --- a/data/products-cache.json +++ b/data/products-cache.json @@ -249,8 +249,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421834, - "lastUpdated": 1760004447204, - "updateCount": 12 + "lastUpdated": 1760008661904, + "updateCount": 18 } }, "7622300807399": { @@ -309,8 +309,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421836, - "lastUpdated": 1760004447206, - "updateCount": 12 + "lastUpdated": 1760008661921, + "updateCount": 21 } }, "7896019603430": { @@ -331,8 +331,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421838, - "lastUpdated": 1760004447210, - "updateCount": 12 + "lastUpdated": 1760008661941, + "updateCount": 21 } }, "7899807213606": { @@ -379,8 +379,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421842, - "lastUpdated": 1760004447212, - "updateCount": 12 + "lastUpdated": 1760008661956, + "updateCount": 21 } }, "7898227141018": { @@ -432,8 +432,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421845, - "lastUpdated": 1760004447218, - "updateCount": 10 + "lastUpdated": 1760008661972, + "updateCount": 14 } }, "7891962063874": { @@ -529,8 +529,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421849, - "lastUpdated": 1760004447220, - "updateCount": 10 + "lastUpdated": 1760008661987, + "updateCount": 14 } }, "7891962054100": { @@ -631,8 +631,8 @@ ], "_metadata": { "firstSeen": 1760004421853, - "lastUpdated": 1760004447222, - "updateCount": 10 + "lastUpdated": 1760008662006, + "updateCount": 14 } }, "7891962054124": { @@ -720,8 +720,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421857, - "lastUpdated": 1760004447225, - "updateCount": 10 + "lastUpdated": 1760008662021, + "updateCount": 14 } }, "7891962032450": { @@ -815,8 +815,8 @@ ], "_metadata": { "firstSeen": 1760004421860, - "lastUpdated": 1760004447227, - "updateCount": 10 + "lastUpdated": 1760008662036, + "updateCount": 14 } }, "7891962014999": { @@ -896,8 +896,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421862, - "lastUpdated": 1760004447230, - "updateCount": 10 + "lastUpdated": 1760008662052, + "updateCount": 14 } }, "7891962065885": { @@ -1003,8 +1003,8 @@ ], "_metadata": { "firstSeen": 1760004421865, - "lastUpdated": 1760004447232, - "updateCount": 10 + "lastUpdated": 1760008662070, + "updateCount": 14 } }, "7891962045160": { @@ -1057,8 +1057,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421868, - "lastUpdated": 1760004447234, - "updateCount": 10 + "lastUpdated": 1760008662085, + "updateCount": 14 } }, "7891962014982": { @@ -1118,8 +1118,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421871, - "lastUpdated": 1760004447237, - "updateCount": 10 + "lastUpdated": 1760008662101, + "updateCount": 14 } }, "7891962026831": { @@ -1173,8 +1173,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421873, - "lastUpdated": 1760004447239, - "updateCount": 10 + "lastUpdated": 1760008662118, + "updateCount": 14 } }, "7891962051062": { @@ -1245,8 +1245,8 @@ ], "_metadata": { "firstSeen": 1760004421876, - "lastUpdated": 1760004447242, - "updateCount": 10 + "lastUpdated": 1760008662136, + "updateCount": 14 } }, "7891962037011": { @@ -1316,8 +1316,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421880, - "lastUpdated": 1760004447244, - "updateCount": 10 + "lastUpdated": 1760008662152, + "updateCount": 14 } }, "7891962054780": { @@ -1451,8 +1451,8 @@ ], "_metadata": { "firstSeen": 1760004421881, - "lastUpdated": 1760004447246, - "updateCount": 10 + "lastUpdated": 1760008662168, + "updateCount": 14 } }, "7891962051079": { @@ -1515,8 +1515,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421882, - "lastUpdated": 1760004447248, - "updateCount": 10 + "lastUpdated": 1760008662184, + "updateCount": 14 } }, "7622210575999": { @@ -1606,8 +1606,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421883, - "lastUpdated": 1760004447251, - "updateCount": 12 + "lastUpdated": 1760008662199, + "updateCount": 21 } }, "7622210833389": { @@ -1701,8 +1701,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421884, - "lastUpdated": 1760004447253, - "updateCount": 12 + "lastUpdated": 1760008662218, + "updateCount": 21 } }, "7622300811693": { @@ -1792,8 +1792,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421885, - "lastUpdated": 1760004447256, - "updateCount": 12 + "lastUpdated": 1760008662234, + "updateCount": 21 } }, "7622300988470": { @@ -1861,8 +1861,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421886, - "lastUpdated": 1760004447258, - "updateCount": 12 + "lastUpdated": 1760008662249, + "updateCount": 21 } }, "7622300807283": { @@ -1916,8 +1916,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421887, - "lastUpdated": 1760004447261, - "updateCount": 12 + "lastUpdated": 1760008662268, + "updateCount": 21 } }, "7622210566409": { @@ -1997,8 +1997,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421888, - "lastUpdated": 1760004447264, - "updateCount": 12 + "lastUpdated": 1760008662288, + "updateCount": 21 } }, "7622210535016": { @@ -2076,8 +2076,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421890, - "lastUpdated": 1760004447267, - "updateCount": 12 + "lastUpdated": 1760008662304, + "updateCount": 21 } }, "7622210534569": { @@ -2120,8 +2120,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421892, - "lastUpdated": 1760004447270, - "updateCount": 12 + "lastUpdated": 1760008662345, + "updateCount": 21 } }, "7891000329207": { @@ -2219,8 +2219,8 @@ "product_name": "BISC WAFER BONO LIMAO 110G NESTLE", "_metadata": { "firstSeen": 1760004421893, - "lastUpdated": 1760005269041, - "updateCount": 25 + "lastUpdated": 1760008662366, + "updateCount": 29 } }, "7896412801624": { @@ -2245,8 +2245,8 @@ "product_name": "Biscoito de Água e Sal", "_metadata": { "firstSeen": 1760004421894, - "lastUpdated": 1760004447276, - "updateCount": 10 + "lastUpdated": 1760008662389, + "updateCount": 14 } }, "7898914652384": { @@ -2267,8 +2267,8 @@ "product_name": "Biscoito Amanteigado", "_metadata": { "firstSeen": 1760004421895, - "lastUpdated": 1760004447279, - "updateCount": 10 + "lastUpdated": 1760008662410, + "updateCount": 14 } }, "7896022086787": { @@ -2376,8 +2376,8 @@ "product_name": "Biscoito doce maizena", "_metadata": { "firstSeen": 1760004421896, - "lastUpdated": 1760004447282, - "updateCount": 10 + "lastUpdated": 1760008662430, + "updateCount": 14 } }, "7891203021120": { @@ -2452,8 +2452,8 @@ "product_name": "Biscoito.wind Panco", "_metadata": { "firstSeen": 1760004421897, - "lastUpdated": 1760004447288, - "updateCount": 10 + "lastUpdated": 1760008662468, + "updateCount": 14 } }, "7896283000898": { @@ -2533,8 +2533,8 @@ "product_name": "Biscoito Cookie Vegano Integral Chocolate Com Gotas De Chocolate Jasmine Pacote 120g", "_metadata": { "firstSeen": 1760004421898, - "lastUpdated": 1760004447290, - "updateCount": 10 + "lastUpdated": 1760008662491, + "updateCount": 14 } }, "0742832364256": { @@ -2619,8 +2619,8 @@ "product_name": "Biscoito de Proteína sabor Cookies", "_metadata": { "firstSeen": 1760004421900, - "lastUpdated": 1760004447293, - "updateCount": 10 + "lastUpdated": 1760008662521, + "updateCount": 14 } }, "7891000339558": { @@ -2673,8 +2673,8 @@ "product_name": "Biscoito Cookie Nescau Duo Nestlé Pacote 60g", "_metadata": { "firstSeen": 1760004421901, - "lastUpdated": 1760004447295, - "updateCount": 10 + "lastUpdated": 1760008662550, + "updateCount": 14 } }, "7891000350119": { @@ -2765,8 +2765,8 @@ "product_name": "Biscoito Cookie Alpino Nestlé Pacote 60g", "_metadata": { "firstSeen": 1760004421902, - "lastUpdated": 1760004447297, - "updateCount": 10 + "lastUpdated": 1760008662578, + "updateCount": 14 } }, "7891962067629": { @@ -2820,8 +2820,8 @@ "product_name": "Biscoito Cookie Chocolate Com Gotas Cobertura Chocolate Branco Bauducco Maxi Pacote 96g", "_metadata": { "firstSeen": 1760004421903, - "lastUpdated": 1760004447299, - "updateCount": 10 + "lastUpdated": 1760008662618, + "updateCount": 14 } }, "7891962067674": { @@ -2875,8 +2875,8 @@ "product_name": "Biscoito Cookie Integral Cacau E Avelã Bauducco Cereale Pacote 80g", "_metadata": { "firstSeen": 1760004421904, - "lastUpdated": 1760004447302, - "updateCount": 10 + "lastUpdated": 1760008662643, + "updateCount": 14 } }, "7891962054117": { @@ -2961,8 +2961,8 @@ "product_name": "BISC COOKIES CHOC 100G/110G BAUDUCCO", "_metadata": { "firstSeen": 1760004421905, - "lastUpdated": 1760004447304, - "updateCount": 10 + "lastUpdated": 1760008662669, + "updateCount": 14 } }, "7891000247624": { @@ -3017,8 +3017,8 @@ "product_name": "BISC COOKIE NEGRESCO 60G NESTLE", "_metadata": { "firstSeen": 1760004421907, - "lastUpdated": 1760005269053, - "updateCount": 20 + "lastUpdated": 1760008662713, + "updateCount": 24 } }, "7898945683777": { @@ -3116,8 +3116,8 @@ "product_name": "Biscoito integral de ameixa", "_metadata": { "firstSeen": 1760004421908, - "lastUpdated": 1760004447309, - "updateCount": 10 + "lastUpdated": 1760008662747, + "updateCount": 14 } }, "7891000089279": { @@ -3211,8 +3211,8 @@ "product_name": "Biscoito Nescau", "_metadata": { "firstSeen": 1760004421909, - "lastUpdated": 1760005269160, - "updateCount": 20 + "lastUpdated": 1760008662777, + "updateCount": 24 } }, "7891000329450": { @@ -3283,8 +3283,8 @@ "product_name": "Biscoito maça e canela", "_metadata": { "firstSeen": 1760004421911, - "lastUpdated": 1760004447315, - "updateCount": 10 + "lastUpdated": 1760008662807, + "updateCount": 14 } }, "7891000289747": { @@ -3370,8 +3370,8 @@ "product_name": "Biscoito Nesfit Maçã e Canela", "_metadata": { "firstSeen": 1760004421912, - "lastUpdated": 1760005269171, - "updateCount": 20 + "lastUpdated": 1760008662830, + "updateCount": 24 } }, "7622210661777": { @@ -3457,8 +3457,8 @@ "product_name": "Biscoito Integral Maçã Canela Belvita Caixa 75g 3 Unidades", "_metadata": { "firstSeen": 1760004421913, - "lastUpdated": 1760004447320, - "updateCount": 10 + "lastUpdated": 1760008662850, + "updateCount": 14 } }, "7891000304754": { @@ -3566,8 +3566,8 @@ "product_name": "Biscoito Nesfit Laranja e Cenoura", "_metadata": { "firstSeen": 1760004421914, - "lastUpdated": 1760005269182, - "updateCount": 20 + "lastUpdated": 1760008662877, + "updateCount": 24 } }, "7891000081242": { @@ -3646,8 +3646,8 @@ "product_name": "Biscoito Wafer Recheio Chocolate Passatempo Pacote 20g", "_metadata": { "firstSeen": 1760004421915, - "lastUpdated": 1760004447326, - "updateCount": 10 + "lastUpdated": 1760008662897, + "updateCount": 14 } }, "7891000023808": { @@ -3701,8 +3701,8 @@ "product_name": "Biscoito Chocolate Recheio Baunilha Negresco Pacote 140g", "_metadata": { "firstSeen": 1760004421916, - "lastUpdated": 1760005269196, - "updateCount": 25 + "lastUpdated": 1760008662914, + "updateCount": 29 } }, "7898957617210": { @@ -3782,8 +3782,8 @@ "product_name": "Biscoito de Arroz com Chocolate Amargo", "_metadata": { "firstSeen": 1760004421917, - "lastUpdated": 1760004447332, - "updateCount": 10 + "lastUpdated": 1760008662932, + "updateCount": 14 } }, "7896024760289": { @@ -3868,8 +3868,8 @@ "product_name": "Biscoito doce de leite maltado com cobertura de chocolate 80g", "_metadata": { "firstSeen": 1760004421925, - "lastUpdated": 1760004447334, - "updateCount": 10 + "lastUpdated": 1760008662959, + "updateCount": 14 } }, "7891000345658": { @@ -3923,8 +3923,8 @@ "product_name": "Biscoito Chocolate Recheio Baunilha Negresco Pacote 100g", "_metadata": { "firstSeen": 1760004421927, - "lastUpdated": 1760004447336, - "updateCount": 10 + "lastUpdated": 1760008662981, + "updateCount": 14 } }, "7622300873554": { @@ -3977,8 +3977,8 @@ "product_name": "Biscoito Chocolate Recheio Chocolate Oreo Pacote 90g", "_metadata": { "firstSeen": 1760004421929, - "lastUpdated": 1760004447339, - "updateCount": 10 + "lastUpdated": 1760008663001, + "updateCount": 14 } }, "7891000376843": { @@ -4031,8 +4031,8 @@ "product_name": "Biscoito Recheio Chocolate Bono Pacote 90g", "_metadata": { "firstSeen": 1760004421931, - "lastUpdated": 1760004447341, - "updateCount": 10 + "lastUpdated": 1760008663020, + "updateCount": 14 } }, "7891000051436": { @@ -4136,8 +4136,8 @@ "product_name": "BISC PASSATEMPO LEITE 150G NESTLE", "_metadata": { "firstSeen": 1760004421933, - "lastUpdated": 1760005269065, - "updateCount": 25 + "lastUpdated": 1760008663041, + "updateCount": 29 } }, "7896003738582": { @@ -4202,8 +4202,8 @@ "product_name": "biscoito marilan Leite 350g", "_metadata": { "firstSeen": 1760004421935, - "lastUpdated": 1760004447347, - "updateCount": 10 + "lastUpdated": 1760008663060, + "updateCount": 14 } }, "7891000496367": { @@ -4245,8 +4245,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421937, - "lastUpdated": 1760004447349, - "updateCount": 10 + "lastUpdated": 1760008663168, + "updateCount": 14 } }, "7891962060361": { @@ -4300,8 +4300,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421938, - "lastUpdated": 1760004447352, - "updateCount": 10 + "lastUpdated": 1760008663185, + "updateCount": 14 } }, "7891962056500": { @@ -4376,8 +4376,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421940, - "lastUpdated": 1760004447357, - "updateCount": 10 + "lastUpdated": 1760008663206, + "updateCount": 14 } }, "7891962056678": { @@ -4516,8 +4516,8 @@ ], "_metadata": { "firstSeen": 1760004421942, - "lastUpdated": 1760004447360, - "updateCount": 10 + "lastUpdated": 1760008663226, + "updateCount": 14 } }, "7622300988517": { @@ -4621,8 +4621,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004421944, - "lastUpdated": 1760004447362, - "updateCount": 12 + "lastUpdated": 1760008663245, + "updateCount": 21 } }, "7622210582621": { @@ -4669,8 +4669,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421945, - "lastUpdated": 1760004447365, - "updateCount": 12 + "lastUpdated": 1760008663265, + "updateCount": 21 } }, "7622210584915": { @@ -4717,8 +4717,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421947, - "lastUpdated": 1760004447368, - "updateCount": 12 + "lastUpdated": 1760008663286, + "updateCount": 21 } }, "7622210596635": { @@ -4765,8 +4765,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421951, - "lastUpdated": 1760004447370, - "updateCount": 12 + "lastUpdated": 1760008663304, + "updateCount": 21 } }, "7622210884244": { @@ -4813,8 +4813,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421955, - "lastUpdated": 1760004447373, - "updateCount": 12 + "lastUpdated": 1760008663320, + "updateCount": 21 } }, "7622210976109": { @@ -4861,8 +4861,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421959, - "lastUpdated": 1760004447376, - "updateCount": 12 + "lastUpdated": 1760008663337, + "updateCount": 21 } }, "7622300874124": { @@ -4909,8 +4909,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421962, - "lastUpdated": 1760004447378, - "updateCount": 12 + "lastUpdated": 1760008663356, + "updateCount": 21 } }, "0922140575975": { @@ -4928,8 +4928,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004421966, - "lastUpdated": 1760004447381, - "updateCount": 12 + "lastUpdated": 1760008663372, + "updateCount": 21 } }, "8691066237510": { @@ -4984,8 +4984,8 @@ "product_name": "Heyo Biscoitos de Cacau com Creme de Baunilha", "_metadata": { "firstSeen": 1760004421969, - "lastUpdated": 1760004447383, - "updateCount": 10 + "lastUpdated": 1760008663389, + "updateCount": 14 } }, "7622210641151": { @@ -5074,8 +5074,8 @@ "product_name": "CLUB SOCIAL PIZZA C/6 141G/150G NABISCO", "_metadata": { "firstSeen": 1760004421973, - "lastUpdated": 1760004447386, - "updateCount": 10 + "lastUpdated": 1760008663405, + "updateCount": 14 } }, "7622210568816": { @@ -5123,8 +5123,8 @@ "product_name": "Pack Biscoito Cebola Com Sour Cream Club Social Pacote 141g 6 Unidades", "_metadata": { "firstSeen": 1760004421981, - "lastUpdated": 1760004447388, - "updateCount": 10 + "lastUpdated": 1760008663423, + "updateCount": 14 } }, "7898965716127": { @@ -5177,8 +5177,8 @@ "product_name": "Suco Integral Maçã Com Hibisco, Canela Gengibre Villa Piva Garrafa 1l", "_metadata": { "firstSeen": 1760004422001, - "lastUpdated": 1760004447390, - "updateCount": 10 + "lastUpdated": 1760008663442, + "updateCount": 14 } }, "7622210674357": { @@ -5225,8 +5225,8 @@ "product_name": "Chocolate Branco Com Biscoito Oreo Lacta Laka Pacote 80g", "_metadata": { "firstSeen": 1760004422004, - "lastUpdated": 1760004447393, - "updateCount": 10 + "lastUpdated": 1760008663459, + "updateCount": 14 } }, "7891008117219": { @@ -5247,8 +5247,8 @@ "product_name": "Baton Choco Croc Chocolate ao Leite com Biscoito", "_metadata": { "firstSeen": 1760004422006, - "lastUpdated": 1760004447397, - "updateCount": 10 + "lastUpdated": 1760008663475, + "updateCount": 14 } }, "7891962058733": { @@ -5296,8 +5296,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004422011, - "lastUpdated": 1760004447400, - "updateCount": 10 + "lastUpdated": 1760008663495, + "updateCount": 14 } }, "7891962054810": { @@ -5382,8 +5382,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004422013, - "lastUpdated": 1760004447402, - "updateCount": 10 + "lastUpdated": 1760008663513, + "updateCount": 14 } }, "7891962004921": { @@ -5453,8 +5453,8 @@ "additives_tags": [], "_metadata": { "firstSeen": 1760004422014, - "lastUpdated": 1760004447406, - "updateCount": 10 + "lastUpdated": 1760008663529, + "updateCount": 14 } }, "7891962032290": { @@ -5584,8 +5584,8 @@ ], "_metadata": { "firstSeen": 1760004422016, - "lastUpdated": 1760004447409, - "updateCount": 10 + "lastUpdated": 1760008663544, + "updateCount": 14 } }, "7891962042275": { @@ -5647,8 +5647,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004422019, - "lastUpdated": 1760004447413, - "updateCount": 10 + "lastUpdated": 1760008663560, + "updateCount": 14 } }, "7891962047560": { @@ -5739,8 +5739,8 @@ ], "_metadata": { "firstSeen": 1760004422021, - "lastUpdated": 1760004447416, - "updateCount": 10 + "lastUpdated": 1760008663578, + "updateCount": 14 } }, "7891962037004": { @@ -5794,8 +5794,8 @@ "allergens_tags": [], "_metadata": { "firstSeen": 1760004422023, - "lastUpdated": 1760004447418, - "updateCount": 10 + "lastUpdated": 1760008663594, + "updateCount": 14 } }, "7891962054476": { @@ -5887,8 +5887,8 @@ ], "_metadata": { "firstSeen": 1760004422026, - "lastUpdated": 1760004447421, - "updateCount": 10 + "lastUpdated": 1760008663609, + "updateCount": 14 } }, "7622210568823": { @@ -5950,8 +5950,8 @@ "product_name": "Bolacha Salgada Sabor Cebola com Sour Cream", "_metadata": { "firstSeen": 1760004422030, - "lastUpdated": 1760004447423, - "updateCount": 10 + "lastUpdated": 1760008663626, + "updateCount": 14 } }, "7899480040100": { @@ -6009,8 +6009,8 @@ "product_name": "Bolacha 7capas", "_metadata": { "firstSeen": 1760004422034, - "lastUpdated": 1760004447426, - "updateCount": 10 + "lastUpdated": 1760008663647, + "updateCount": 14 } }, "7896003706635": { @@ -6029,8 +6029,8 @@ "product_name": "Pit Stop original", "_metadata": { "firstSeen": 1760004422037, - "lastUpdated": 1760004447431, - "updateCount": 10 + "lastUpdated": 1760008663667, + "updateCount": 14 } }, "7896058257243": { @@ -6051,8 +6051,8 @@ "product_name": "WAFER PASSION LIMAO 80G ARCOR", "_metadata": { "firstSeen": 1760004422041, - "lastUpdated": 1760004447434, - "updateCount": 10 + "lastUpdated": 1760008663688, + "updateCount": 14 } }, "7622210933454": { @@ -6073,8 +6073,8 @@ "product_name": "Mini Oreo", "_metadata": { "firstSeen": 1760004422044, - "lastUpdated": 1760004447436, - "updateCount": 10 + "lastUpdated": 1760008663706, + "updateCount": 14 } }, "7893333733317": { @@ -6093,8 +6093,8 @@ "nutrition_grades": "unknown", "_metadata": { "firstSeen": 1760004422049, - "lastUpdated": 1760004447438, - "updateCount": 10 + "lastUpdated": 1760008663728, + "updateCount": 14 } }, "7891152802054": { @@ -6146,8 +6146,8 @@ "nutrition_grades": "unknown", "_metadata": { "firstSeen": 1760004422051, - "lastUpdated": 1760004447441, - "updateCount": 10 + "lastUpdated": 1760008663748, + "updateCount": 14 } }, "7897213319714": { @@ -6218,8 +6218,8 @@ "product_name": "Bolachão de Mel", "_metadata": { "firstSeen": 1760004422054, - "lastUpdated": 1760004447443, - "updateCount": 10 + "lastUpdated": 1760008663768, + "updateCount": 14 } }, "7898950172358": { @@ -6316,8 +6316,8 @@ "product_name": "Sequilhos sabor leite condensado", "_metadata": { "firstSeen": 1760004422056, - "lastUpdated": 1760004447445, - "updateCount": 10 + "lastUpdated": 1760008663789, + "updateCount": 14 } }, "7898950172471": { @@ -6418,8 +6418,8 @@ "product_name": "Sequilhos mousse de limão", "_metadata": { "firstSeen": 1760004422058, - "lastUpdated": 1760004447448, - "updateCount": 10 + "lastUpdated": 1760008663807, + "updateCount": 14 } }, "7891000255742": { @@ -6442,8 +6442,8 @@ "product_name": "Cookie integral banana", "_metadata": { "firstSeen": 1760004422061, - "lastUpdated": 1760004447450, - "updateCount": 10 + "lastUpdated": 1760008663832, + "updateCount": 14 } }, "7896003703634": { @@ -6530,8 +6530,8 @@ "product_name": "Rosquinhas Marilan - sabor leite", "_metadata": { "firstSeen": 1760004422063, - "lastUpdated": 1760004447452, - "updateCount": 10 + "lastUpdated": 1760008663850, + "updateCount": 14 } }, "7896050411230": { @@ -6607,8 +6607,8 @@ "product_name": "Wafer Chocolate Village", "_metadata": { "firstSeen": 1760004422066, - "lastUpdated": 1760004447454, - "updateCount": 10 + "lastUpdated": 1760008663870, + "updateCount": 14 } }, "2000000129860": { @@ -6697,8 +6697,8 @@ "product_name": "Rosquinha de Coco - Rancheiro", "_metadata": { "firstSeen": 1760004422068, - "lastUpdated": 1760004447457, - "updateCount": 10 + "lastUpdated": 1760008663883, + "updateCount": 14 } }, "7891103048241": { @@ -6788,8 +6788,8 @@ "product_name": "Rosquinha Sabor Coco - Carrefour", "_metadata": { "firstSeen": 1760004422079, - "lastUpdated": 1760004447459, - "updateCount": 10 + "lastUpdated": 1760008663907, + "updateCount": 14 } }, "7891103048227": { @@ -6877,8 +6877,8 @@ "product_name": "Rosquinha Sabor Leite - Carrefour", "_metadata": { "firstSeen": 1760004422082, - "lastUpdated": 1760004447462, - "updateCount": 10 + "lastUpdated": 1760008663923, + "updateCount": 14 } }, "0192505072184": { @@ -6960,8 +6960,8 @@ "product_name": "Gajeta Açucarada", "_metadata": { "firstSeen": 1760004422086, - "lastUpdated": 1760004447465, - "updateCount": 10 + "lastUpdated": 1760008663936, + "updateCount": 14 } }, "7891962048208": { @@ -7015,8 +7015,8 @@ "product_name": "WAFER MAXI COOKIES BAUDUCCO 117G", "_metadata": { "firstSeen": 1760004422089, - "lastUpdated": 1760004447467, - "updateCount": 10 + "lastUpdated": 1760008663957, + "updateCount": 14 } }, "5601069102961": { @@ -7105,8 +7105,8 @@ "product_name": "Cookies Special Selection", "_metadata": { "firstSeen": 1760004422092, - "lastUpdated": 1760004447470, - "updateCount": 10 + "lastUpdated": 1760008663975, + "updateCount": 14 } }, "7891000109298": { @@ -7129,8 +7129,8 @@ "product_name": "Cookie original + Trento Duo", "_metadata": { "firstSeen": 1760004422095, - "lastUpdated": 1760004447472, - "updateCount": 10 + "lastUpdated": 1760008663991, + "updateCount": 14 } }, "7896011107868": { @@ -7151,8 +7151,8 @@ "product_name": "Cookies Sabor Chocolate com Gotas Sabor Chocolate", "_metadata": { "firstSeen": 1760004422098, - "lastUpdated": 1760004447475, - "updateCount": 10 + "lastUpdated": 1760008664008, + "updateCount": 14 } }, "7896283004513": { @@ -7214,8 +7214,8 @@ "product_name": "Cookies integral", "_metadata": { "firstSeen": 1760004422100, - "lastUpdated": 1760004447478, - "updateCount": 10 + "lastUpdated": 1760008664025, + "updateCount": 14 } }, "7896283001321": { @@ -7276,8 +7276,8 @@ "product_name": "Cookies Castanha-do-Pará Integral", "_metadata": { "firstSeen": 1760004422103, - "lastUpdated": 1760004447480, - "updateCount": 10 + "lastUpdated": 1760008664043, + "updateCount": 14 } }, "7898666241072": { @@ -7369,8 +7369,8 @@ "product_name": "Cookie de Baunilha com gotas de chocolate", "_metadata": { "firstSeen": 1760004422105, - "lastUpdated": 1760004447483, - "updateCount": 10 + "lastUpdated": 1760008664055, + "updateCount": 14 } }, "7896066305769": { @@ -7452,8 +7452,8 @@ "product_name": "Cookies Integrais Aveia, Granola & Castanha-de-Caju", "_metadata": { "firstSeen": 1760004422108, - "lastUpdated": 1760004447485, - "updateCount": 10 + "lastUpdated": 1760008664074, + "updateCount": 14 } }, "7896066305752": { @@ -7536,8 +7536,8 @@ "product_name": "Cookies Integrais Cacau, Avelã & Castanha-do-Pará", "_metadata": { "firstSeen": 1760004422111, - "lastUpdated": 1760004447488, - "updateCount": 10 + "lastUpdated": 1760008664089, + "updateCount": 14 } }, "7898206502717": { @@ -7678,8 +7678,8 @@ "product_name": "Cookies Orgânicos", "_metadata": { "firstSeen": 1760004422114, - "lastUpdated": 1760004447490, - "updateCount": 10 + "lastUpdated": 1760008664105, + "updateCount": 14 } }, "7891000361337": { @@ -7700,8 +7700,8 @@ "product_name": "COOKIE CREAM AO LEITE 78G NESTLE", "_metadata": { "firstSeen": 1760004422117, - "lastUpdated": 1760005269077, - "updateCount": 20 + "lastUpdated": 1760008664119, + "updateCount": 24 } }, "7894321216324": { @@ -7807,8 +7807,8 @@ "product_name": "Quaker Cookie de Aveia", "_metadata": { "firstSeen": 1760004422125, - "lastUpdated": 1760004447498, - "updateCount": 10 + "lastUpdated": 1760008664135, + "updateCount": 14 } }, "7896003706895": { @@ -7902,8 +7902,8 @@ "product_name": "lev cookies integrais cacau e cereais", "_metadata": { "firstSeen": 1760004422128, - "lastUpdated": 1760004447500, - "updateCount": 10 + "lastUpdated": 1760008664152, + "updateCount": 14 } }, "7891000247648": { @@ -7968,8 +7968,8 @@ "product_name": "Classic cookie", "_metadata": { "firstSeen": 1760004422131, - "lastUpdated": 1760004447502, - "updateCount": 10 + "lastUpdated": 1760008664176, + "updateCount": 14 } }, "7896064201148": { @@ -8066,8 +8066,8 @@ "product_name": "Butter Flavored Cookie", "_metadata": { "firstSeen": 1760004422134, - "lastUpdated": 1760004447505, - "updateCount": 10 + "lastUpdated": 1760008664190, + "updateCount": 14 } }, "7891823925426": { @@ -8147,8 +8147,8 @@ "product_name": "Língua de Gato Cookies & Cream", "_metadata": { "firstSeen": 1760004422138, - "lastUpdated": 1760004447507, - "updateCount": 10 + "lastUpdated": 1760008664213, + "updateCount": 14 } }, "7790045825401": { @@ -8283,8 +8283,8 @@ "product_name": "Frutigran Avena, sésamo, amaranto y girasol", "_metadata": { "firstSeen": 1760004422141, - "lastUpdated": 1760004447509, - "updateCount": 10 + "lastUpdated": 1760008664226, + "updateCount": 14 } }, "7891000118610": { @@ -8307,8 +8307,8 @@ "product_name": "Laranja & Cenoura", "_metadata": { "firstSeen": 1760004422146, - "lastUpdated": 1760004447511, - "updateCount": 10 + "lastUpdated": 1760008664247, + "updateCount": 14 } }, "7898066623126": { @@ -8391,8 +8391,8 @@ "product_name": "Bolo amanteigado sabor laranja", "_metadata": { "firstSeen": 1760004422151, - "lastUpdated": 1760004447513, - "updateCount": 10 + "lastUpdated": 1760008664262, + "updateCount": 14 } }, "7790045824893": { @@ -8538,8 +8538,8 @@ "product_name": "Frutigran Chisps de Chocolate", "_metadata": { "firstSeen": 1760004422154, - "lastUpdated": 1760004447516, - "updateCount": 10 + "lastUpdated": 1760008664281, + "updateCount": 14 } }, "07117815": { @@ -8561,8 +8561,8 @@ "product_name": "", "_metadata": { "firstSeen": 1760004422158, - "lastUpdated": 1760004447518, - "updateCount": 10 + "lastUpdated": 1760008664293, + "updateCount": 14 } }, "7622210596413": { @@ -8653,8 +8653,8 @@ "product_name": "Wafers, barras recheadas e tabletes sortidos", "_metadata": { "firstSeen": 1760004422162, - "lastUpdated": 1760004447520, - "updateCount": 10 + "lastUpdated": 1760008664313, + "updateCount": 14 } }, "7891000390078": { @@ -8674,8 +8674,8 @@ "product_name": "Iog Nestle Bi camada 150g", "_metadata": { "firstSeen": 1760004422166, - "lastUpdated": 1760005269089, - "updateCount": 22 + "lastUpdated": 1760008664379, + "updateCount": 31 } }, "7896862000462": { @@ -8694,8 +8694,8 @@ "product_name": "Iogurte Bi Camada Morango Frutap 100g", "_metadata": { "firstSeen": 1760004422170, - "lastUpdated": 1760004447525, - "updateCount": 12 + "lastUpdated": 1760008664392, + "updateCount": 21 } }, "7891000276914": { @@ -8905,8 +8905,8 @@ "product_name": "BISC RECH PASSATEMPO CHOC 130G NESTLE", "_metadata": { "firstSeen": 1760004552162, - "lastUpdated": 1760005269105, - "updateCount": 15 + "lastUpdated": 1760008663077, + "updateCount": 19 } }, "7891000050927": { @@ -9016,8 +9016,8 @@ "product_name": "BISC RECH BONO FININHO CHOC 57G NESTLE", "_metadata": { "firstSeen": 1760004552183, - "lastUpdated": 1760005269136, - "updateCount": 15 + "lastUpdated": 1760008663095, + "updateCount": 19 } }, "7891000357972": { @@ -9071,8 +9071,8 @@ "product_name": "BISC RECH FININHO NEGRESCO 57G NESTLE", "_metadata": { "firstSeen": 1760004552189, - "lastUpdated": 1760005269148, - "updateCount": 15 + "lastUpdated": 1760008663113, + "updateCount": 19 } }, "7891000394847": { @@ -10874,8 +10874,8 @@ "product_name": "Biscoito Combina Com Seu Dia 3 Cereais", "_metadata": { "firstSeen": 1760004552334, - "lastUpdated": 1760005269483, - "updateCount": 15 + "lastUpdated": 1760008663134, + "updateCount": 19 } }, "7891000379691": { @@ -15009,8 +15009,8 @@ "product_name": "Biscoito Aveia e Mel", "_metadata": { "firstSeen": 1760004552868, - "lastUpdated": 1760005270016, - "updateCount": 15 + "lastUpdated": 1760008663152, + "updateCount": 19 } }, "7891000072950": { @@ -15507,8 +15507,8 @@ "product_name": "Nesfit cacao & cereais", "_metadata": { "firstSeen": 1760004552969, - "lastUpdated": 1760005270046, - "updateCount": 15 + "lastUpdated": 1760008664324, + "updateCount": 19 } }, "7613035511576": { @@ -16774,8 +16774,8 @@ "product_name": "Bono", "_metadata": { "firstSeen": 1760004553282, - "lastUpdated": 1760005270154, - "updateCount": 15 + "lastUpdated": 1760008664341, + "updateCount": 19 } }, "7891000035832": { @@ -17135,8 +17135,8 @@ "product_name": "Nestlé Nesfit Integral", "_metadata": { "firstSeen": 1760004553362, - "lastUpdated": 1760005270179, - "updateCount": 15 + "lastUpdated": 1760008664359, + "updateCount": 19 } }, "7891000066560": { @@ -17438,6 +17438,6 @@ } } }, - "lastUpdated": 1760005270218, + "lastUpdated": 1760008664392, "version": "1.0.0" } \ No newline at end of file diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..5a99c40 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..3d4916e Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000..5a99c40 Binary files /dev/null and b/public/icon.png differ diff --git a/public/manifest.json b/public/manifest.json index 98dc39b..4b4ed3f 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -13,6 +13,12 @@ "src": "/favicon.ico", "sizes": "any", "type": "image/x-icon" + }, + { + "src": "/icon.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" } ] }