# Product Requirements Document (PRD): MeowSpool # Paper Canva https://app.paper.design/file/01KKM0HA6NBV44VCQDFQHC2MRY ## 1. Visão Geral MeowSpool é uma solução para entusiastas e profissionais de impressão 3D gerenciarem seu estoque de filamentos. O diferencial está na precisão do cálculo de peso líquido (descontando o peso do carretel via presets), na identidade visual inspirada em gatos siameses, e na integração com etiquetas físicas exportáveis (SVG/QR Code/NFC). **Foco do desenvolvimento atual:** App Mobile (React Native) + Backend em Rust. A interface Web é planejada para uma fase posterior, após a estabilização do mobile e da API. --- ## 2. Objetivos * **Precisão:** Eliminar o "chute" de quanto filamento resta no rolo. * **Agilidade:** Facilitar o cadastro e a consulta via dispositivos móveis, mesmo offline. * **Organização:** Centralizar parâmetros técnicos (temperatura/fluxo) para consulta rápida. --- ## 3. Público-Alvo * Hobbistas de impressão 3D. * Donos de "Print Farms" (fazendas de impressão). * Projetistas que trabalham com diversos materiais (PLA, ABS, PETG, etc). --- ## 4. Identidade Visual ### 4.1 Nome e Conceito **MeowSpool** — fusão de "Meow" (gato) e "Spool" (carretel). A identidade visual é inspirada no gato siamês: tons quentes e escuros com detalhes em azul-aço que remetem aos olhos característicos da raça. ### 4.2 Paleta de Cores | Token | Hex | Função na Interface | |---------------|-----------|----------------------------------------------| | `bg-base` | `#1E1B18` | Fundo geral | | `bg-surface` | `#2A2622` | Cards, contêineres, widgets | | `bg-hover` | `#332F2B` | Estados de hover em cards e itens de lista | | `text-primary`| `#F5EEDC` | Títulos, peso líquido (texto importante) | | `text-secondary`| `#C9C1B0`| Descrições, labels (material, marca) | | `accent` | `#38BCC2` | Botões de ação, elementos ativos | | `accent-muted`| `#38BCC226`| Backgrounds de badges e status (10% opacidade)| --- ## 5. Requisitos Funcionais (MVP) ### 5.1 Autenticação * **Métodos suportados:** Email/senha e OAuth via Google. * **Plataformas:** Mobile consome a API de auth do backend Rust. Web utilizará o mesmo sistema em fase futura. * **Sessão:** Token JWT com refresh token. O app mobile persiste a sessão localmente para acesso offline. ### 5.2 Gestão de Inventário * **Cadastro de Filamento:** Campos obrigatórios e opcionais: * Material (tipo): PLA, ABS, PETG, TPU, ASA, PA, PC, etc. * Marca (texto livre) * Modelo (texto livre) * Cor (seletor hex — armazena valor hexadecimal, ex: `#FF5733`) * Temperatura Hotend (°C) * Temperatura Mesa (°C) * Fator de Fluxo/Extrusão (%) * **Calculadora de Peso Líquido:** * Seleção de **Preset de Carretel** (ver 5.3). * Input de **Peso Total** (leitura da balança, em gramas). * Cálculo automático: `Peso_Líquido = Peso_Total - Peso_Carretel`. ### 5.3 Presets de Carretéis * **Presets do Sistema (built-in):** Um conjunto de presets pré-cadastrados com as principais marcas do mercado. Exemplos: | Nome do Preset | Peso do Carretel | |------------------------|-----------------| | Bambu Lab (Plástico) | 250g | | Elegoo (Papelão) | 200g | | Creality (Plástico) | 230g | | Prusament (Plástico) | 201g | | Sunlu (Papelão) | 200g | | Polymaker (Plástico) | 220g | | Genérico Papelão 1kg | 200g | | Genérico Plástico 1kg | 250g | * **Presets Customizados:** O usuário pode criar, editar e excluir seus próprios presets (nome + peso em gramas). Presets customizados são vinculados à conta do usuário e sincronizados. * **Presets do sistema são somente leitura** — não podem ser editados ou excluídos pelo usuário. ### 5.4 Identificação e Etiquetas * **Geração de QR Code:** Cada filamento cadastrado gera um QR Code único apontando para sua página de detalhes no app/web. * **Exportação de Etiqueta em SVG:** O sistema gera um arquivo SVG com os dados do filamento (nome, material, cor, peso líquido, QR Code) para que o usuário importe e imprima na plataforma de sua preferência (Inkscape, Canva, impressoras de etiqueta com suporte a SVG, etc). * Layout padrão: 50mm x 30mm (ajustável via parâmetro). * Conteúdo: cor visual do filamento, nome, material, marca, peso líquido, QR Code. ### 5.5 Interface (UI/UX) * **Design:** Dark mode exclusivo, paleta siamês (ver 4.2). * **Plataforma atual:** Mobile (React Native). * **Filtros e Busca:** Filtragem por material, marca, cor e nível de estoque. * **Dashboard:** Visão geral do inventário com totais por material e alertas visuais de estoque baixo. --- ## 6. Requisitos Técnicos (Stack) ### 6.1 Fase 1 — Mobile + Backend (foco atual) | Camada | Tecnologia | Justificativa | |-------------------|----------------------|------------------------------------------------------------------------------| | **Mobile** | React Native | Performance nativa, suporte offline e acesso a APIs do dispositivo (câmera, NFC). | | **Back-end** | Rust (Axum ou Actix) | Alta performance, segurança de memória e baixo consumo de recursos. | | **Banco de Dados**| PostgreSQL | Robustez para relações entre usuários, marcas, materiais e presets. | | **Auth** | JWT + OAuth (Google) | Padrão seguro, compatível com mobile e preparado para web futura. | | **Banco Local** | SQLite (SQLCipher) | Armazenamento offline seguro no dispositivo móvel. | ### 6.2 Fase 2 — Web (planejado, pós-estabilização) | Camada | Tecnologia | Justificativa | |-------------------|----------------|------------------------------------------------------------| | **Front-end Web** | Next.js | SEO, performance, rotas e suporte a cache via ISR/SSR. | | **Cache (Web)** | Redis / HTTP Cache | Redução de latência nas listagens e dados de inventário.| ### 6.3 Estratégia de Sincronização (Offline-First Mobile) 1. O app mobile utiliza um banco de dados local (SQLite via SQLCipher para segurança). 2. Todas as operações são escritas localmente primeiro (write-ahead). 3. Quando há conexão, o app sincroniza via API REST com o backend Rust (estratégia: last-write-wins com timestamp, com resolução de conflitos simples). 4. A Web (fase 2) consumirá a mesma API REST, sem necessidade de alterações no backend. --- ## 7. Estrutura de Dados (Entidades Principais) ### `users` | Campo | Tipo | Descrição | |--------------|-----------|----------------------------------| | id | UUID | Identificador único | | email | string | Email do usuário | | password_hash| string | Hash bcrypt (nulo se OAuth) | | google_id | string? | ID OAuth Google (opcional) | | created_at | timestamp | | ### `spool_presets` | Campo | Tipo | Descrição | |--------------|-----------|------------------------------------------------| | id | UUID | Identificador único | | name | string | Nome do preset (ex: "Bambu Lab Plástico") | | spool_weight_g| integer | Peso do carretel vazio em gramas | | is_system | boolean | `true` = preset built-in, `false` = customizado| | user_id | UUID? | Nulo para presets do sistema | | created_at | timestamp | | ### `filaments` | Campo | Tipo | Descrição | |------------------|-----------|----------------------------------------| | id | UUID | Identificador único | | user_id | UUID | Dono do filamento | | material | string | PLA, ABS, PETG, etc. | | brand | string | Marca | | model | string? | Modelo/linha | | color_hex | string | Cor em hex (ex: `#FF5733`) | | spool_preset_id | UUID | Preset de carretel usado | | total_weight_g | integer | Peso total medido na balança (gramas) | | net_weight_g | integer | Calculado: total - preset | | temp_hotend_c | integer? | Temperatura do hotend (°C) | | temp_bed_c | integer? | Temperatura da mesa (°C) | | flow_factor_pct | float? | Fator de fluxo (%) | | notes | text? | Observações livres | | updated_at | timestamp | Usado para sync offline | | created_at | timestamp | | --- ## 8. Fluxo do Usuário (User Flow) ### Cadastro de Filamento (Mobile) 1. Usuário abre o App Mobile (autenticado). 2. Clica em "Novo Filamento". 3. Insere Marca, Material, Modelo e seleciona a Cor via seletor hex. 4. Seleciona o Preset do Carretel (ex: "Bambu Lab Plástico — 250g") ou cria um customizado. 5. Coloca o carretel na balança e digita o peso total (ex: "850g"). 6. O sistema calcula e exibe: **600g de filamento disponível**. 7. Salva localmente (offline-first) e sincroniza com o backend quando online. 8. O sistema gera o QR Code e disponibiliza o SVG da etiqueta para exportação. ### Consulta via Web *(Fase 2 — planejado)* 1. Usuário acessa a web autenticado. 2. Dashboard exibe inventário completo com totais e alertas. 3. Dados são servidos via API com cache, garantindo baixa latência. --- ## 9. Roadmap de Funcionalidades Futuras * **Front-end Web (Next.js):** Dashboard e inventário acessível via browser, consumindo a mesma API do backend. * **Escrita de Tags NFC:** Gravação de dados diretamente em tags NFC coladas nos carretéis (via app mobile). * **Histórico de Uso:** Log de gramas consumidas por projeto/impressão. * **Alerta de Estoque Baixo:** Notificações push quando um filamento estiver abaixo de X gramas. * **Custo por Grama:** Registro do custo de cada rolo para cálculo de custo por impressão. * **Importação em Lote:** Upload CSV/JSON para cadastro massivo (útil para print farms). * **Compartilhamento de Presets:** Pool público de presets de carretéis contribuídos pela comunidade.