Linear me levou ao buraco do coelho local-first
(bytemash.net)- Ao usar o Linear, minha visão sobre o desenvolvimento de aplicações web mudou bastante
- O Linear funciona com uma abordagem local-first, oferecendo respostas imediatas e interações sem latência de rede
- Esse modelo faz com que o cliente tenha uma base de dados independente, e as alterações são sincronizadas com o servidor de forma assíncrona
- Mas a dificuldade de implementação para sincronização em ambiente distribuído, resolução de conflitos e tratamento offline é alta
- Soluções diversas do ecossistema local-first, como Jazz, Electric SQL e Zero, estão surgindo, e a experiência do desenvolvedor também está melhorando gradualmente
Visão geral
Ao usar a ferramenta de gerenciamento de projetos Linear, fiquei muito impressionado com a extraordinária velocidade e experiência do usuário do modo local-first. Foi marcante perceber que não se sentia nada de latência de rede, estados de carregamento, atualização de página etc.
Com essa experiência, aprofundei a exploração dos princípios técnicos e dos casos reais de aplicação do paradigma local-first.
Descendo o buraco do coelho
Ao investigar o segredo técnico do Linear, descobri que eles usam o IndexedDB do navegador como um banco de dados de verdade. Todas as mudanças são processadas imediatamente no cliente primeiro e, em seguida, a sincronização ocorre em segundo plano com GraphQL e Websockets.
- O termo local-first pode ser interpretado de diferentes formas, como estratégia de UX (reatividade imediata) ou como uma filosofia de manter os próprios dados em local e sincronizar
- Em um app web tradicional, o servidor era a fonte única da verdade, mas na estrutura local-first cada cliente possui seu próprio banco de dados
- Como a localização do banco de dados se move para perto do usuário, a latência de rede é totalmente removida da interação do usuário
O desafio: isso não é trivial
Ao tentar implementar o mesmo modo do Linear, percebi que a complexidade é considerável.
- Tratamento de troca entre offline e online
- Resolução de conflitos entre clientes distribuídos
- Sincronização parcial (para evitar baixar todos os dados)
- Migração de schema de dados em cache
- Segurança e controle de acesso em ambiente distribuído
- Essas áreas exigem enorme investimento de tempo e esforço de engenharia
O ecossistema local-first em 2025
Em 2025, o ecossistema local-first já conta com várias soluções fortes.
- Electric SQL: motor de sincronização baseado em Postgres
- PowerSync: solução com foco em enterprise
- Jazz: ferramenta que facilita a construção de apps local-first
- Replicache: uma das soluções principais existentes (fim de desenvolvimento)
- Zero: novo direcionamento da equipe do Replicache
- Triplit: sincronização baseada em TripleStore
- Instant: com foco na experiência do desenvolvedor
- LiveStore: fornece uma camada de sincronização em tempo real
Análise aprofundada: Jazz
Jazz chama atenção por prometer que torna um app local-first tão simples quanto uma atualização de estado.
Modelo mental
Jazz introduz os Collaborative Values (CoValues), uma estrutura de colaboração em tempo real.
- Definir schema com Jazz e Zod: essa definição não é apenas um tipo simples, mas funciona como objetos vivos com sincronização automática
- Sem rotas de API separadas, lógica de request/resposta ou DTOs, basta alterar o estado dos objetos para a sincronização acontecer automaticamente
Como o Jazz faz isso
A estrutura interna do Jazz é assim:
- Garantia de unicidade: atribuição automática de IDs únicos para cada dado
- Event sourcing: o histórico de alterações é salvo como eventos, otimizando a eficiência da sincronização em tempo real
- Criptografia ponta a ponta: criptografia no cliente antes da sincronização. O servidor só vê blobs criptografados
- Modelo de permissão por grupo: em vez de ACLs tradicionais, a propriedade é separada com clareza por grupo
Os trade-offs
Essa estrutura é extremamente produtiva para protótipos e desenvolvimento rápido de UI. Mas há aspectos que exigem atenção:
Seu servidor é cego
Com criptografia ponta a ponta, o servidor não pode ler os dados do usuário. Se você não definir com antecedência quais dados o servidor precisa acessar, há limitações para governança, como monitoramento ou prevenção de armazenamento malicioso.
Viagem no tempo é obrigatória
Com event sourcing, todo o histórico de mudanças é mantido de forma permanente. Isso torna Undo/Redo muito prático, mas tem o ponto fraco de dificultar a exclusão quando há exigências legais como GDPR.
Armazenamento dispara
Como nada é removido, o uso de armazenamento cresce progressivamente. Em projetos pequenos isso é aceitável, mas em SaaS em grande escala os custos de armazenamento podem aumentar bastante.
O desenvolvimento local ainda tem detalhes chatos
A autenticação baseada em Passkeys é padrão, mas no desenvolvimento próprio ou em ambiente local há inconvenientes iniciais, como HTTPS, gerenciamento de certificados e migração de chaves. Mesmo assim, há melhorias previstas, como integração com Better Auth.
Mas sinceramente? Ainda vale a pena
Mesmo com essas limitações, a experiência de desenvolvimento e produtividade do Jazz é muito impressionante. Ainda é uma versão inicial, mas há perspectiva de que vários problemas sejam resolvidos gradualmente.
Explorando: Electric SQL e Zero
Diferente do Jazz, Electric SQL e Zero adotam uma abordagem incremental.
- É possível aproveitar as tabelas Postgres existentes
- O Electric SQL permite assinar partes da tabela como uma reactive query (Shape) para sincronizar com a UI
- A forma de tratar mutações é diferente da do Jazz, e há opções diversas, como integração com LiveStore
- Zero é semelhante ao Electric, mas tem suporte embutido para sincronização de mudanças
Quando local-first faz sentido?
A seguir, um resumo do que é adequado e o que é desafiador no paradigma local-first.
Adequado:
- Ferramentas criativas (design, escrita, música etc.)
- Aplicações de suporte à colaboração
- Apps móveis que precisam funcionar offline
- Ferramentas para desenvolvedores
- Aplicativos de produtividade pessoal
Desafiador:
- Lógica de negócio pesada no lado do servidor
- Requisitos rigorosos de auditoria
- Sistemas de análise de alto volume
- Sistemas legacy profundamente integrados
- Sistemas que rejeitam frequentemente solicitações no servidor
Olhando para o futuro
Local-first significa uma mudança de paradigma no desenvolvimento web. O Linear já comprovou um grande impacto na experiência do usuário. Cabe ao desenvolvedor decidir se esses trade-offs estruturais fazem sentido para seu projeto.
Ao criar um app pessoal com Jazz, venho experimentando os prós e contras reais e os limites de abstração na prática. O ecossistema ainda está em fase inicial, e no futuro ferramentas e padrões devem amadurecer e melhorar. No entanto, os benefícios de manter os dados no local são claros e isso parece não desaparecer.
Em novos projetos, se for possível aceitar as restrições, vale muito a pena experimentar local-first. No pior caso, você aprende um novo padrão de arquitetura, e no melhor, consegue criar uma experiência de usuário incrivelmente rápida. Em uma corrida contra respostas de 300ms, isso vira uma vantagem importante.
Ainda não há comentários.