Minhas Listas
Lista de compras offline-first em Flutter + Drift: sem conta, sem nuvem e com os dados 100% no aparelho.
Contexto
Começou como exercício de arquitetura local-first: um app que resolvesse a lista de compras sem conta e sem servidor. Virou um produto único e multiplataforma (Android, iOS, Web e desktop), com documentação de produto, design system, testes e CI. O app está completo, mas ainda não foi publicado nas lojas.
O desafio
Manter o mesmo modelo de dados e a mesma experiência em quatro plataformas, com o banco local como única fonte da verdade — incluindo migrações, backup fiel, categorização automática sem serviço externo e privacidade por padrão. No navegador, isso significa rodar SQLite via WASM e persistir sem backend.
Papel e responsabilidades
- Arquitetura offline-first com Drift/SQLite como fonte da verdade; escrita sempre local e IDs UUID gerados no cliente
- Modelo de domínio com quantidades fracionárias, enum fechado de unidades, categorias e ordenação personalizável
- Categorização local em camadas (memória por nome → dicionário estático → 'outros'), sem chamadas de rede
- Importação por texto com parser determinístico e pré-visualização editável; adição por voz com o reconhecedor do sistema
- Histórico de compras com snapshot por ida, estatísticas de gasto e comparação de preços por mercado
- O mesmo banco em Android, iOS, desktop e Web (WASM com OPFS/IndexedDB), além de backup e restauração em JSON
Stack e arquitetura
Flutter 3.44 + Dart 3.12 no app; Drift 2.34 sobre SQLite no armazenamento local (WASM no navegador); Material 3; speech_to_text, share_plus e qr_flutter nos recursos de voz e compartilhamento; GitHub Actions para CI.
Destaques
- Privacidade radical: sem conta, analytics, anúncios ou chamadas de rede — os dados não saem do aparelho
- Um único modelo de dados rodando em mobile, desktop e navegador, com o mesmo Drift e fallback de persistência
- Categorização e importação resolvidas localmente, sem IA ou serviço externo
- Produto tratado como produto: design system, onboarding com tour, alvos de 48dp, contraste AA e documentação normativa
Aprendizados
Local-first simplifica a infraestrutura — não há backend para operar — mas desloca a complexidade para migrações, backup e experiência de recuperação. Aprendi que privacidade por padrão é uma decisão de arquitetura, não uma tela de configurações.