Tesseras

Fase 3: Memórias nas Suas Mãos

2026-02-14

As pessoas agora podem segurar suas memórias nas próprias mãos. A Fase 3 entrega o que as fases anteriores construíram: um app mobile onde alguém baixa o Tesseras, cria uma identidade, tira uma foto, e aquela memória entra na rede de preservação. Sem contas na nuvem, sem assinaturas, sem nenhuma empresa entre você e suas memórias.

O que foi construído

tesseras-embedded — Um nó P2P completo que roda dentro de um app mobile. A struct EmbeddedNode é dona de um runtime Tokio, banco SQLite, transporte QUIC, engine Kademlia DHT, serviço de replicação e serviço de tessera — a mesma stack do daemon desktop, compilada como biblioteca compartilhada. Um padrão singleton global (Mutex<Option<EmbeddedNode>>) garante um único nó por ciclo de vida do app. Ao iniciar, ele abre o banco de dados, executa migrações, carrega ou gera uma identidade Ed25519 com proof-of-work para o node ID, faz bind QUIC numa porta efêmera, conecta DHT e replicação, e inicia o loop de reparo. Ao parar, envia um sinal de shutdown e drena graciosamente.

Onze funções FFI são expostas para Dart via flutter_rust_bridge: ciclo de vida (node_start, node_stop, node_is_running), identidade (create_identity, get_identity), memórias (create_memory, get_timeline, get_memory) e status da rede (get_network_stats, get_replication_status). Todos os tipos que cruzam a fronteira FFI são structs planas com apenas String, Option<String>, Vec<String> e primitivos — sem trait objects, sem generics, sem lifetimes.

Quatro módulos adaptadores fazem a ponte entre as ports do core e as implementações concretas: Blake3HasherAdapter, Ed25519SignerAdapter/Ed25519VerifierAdapter para criptografia, DhtPortAdapter para operações DHT, e ReplicationHandlerAdapter para RPCs de fragmentos e atestação recebidos.

A feature flag bundled-sqlite compila o SQLite a partir do código-fonte, necessário para Android e iOS onde a biblioteca do sistema pode não estar disponível. A configuração do Cargokit passa essa flag automaticamente em builds de debug e release.

App Flutter — Uma aplicação Material Design 3 com gerenciamento de estado Riverpod, direcionada para Android, iOS, Linux, macOS e Windows a partir de uma única base de código.

O fluxo de onboarding são três telas: uma tela de boas-vindas explicando o projeto em uma frase ("Preserve suas memórias através dos milênios. Sem nuvem. Sem empresa."), uma tela de criação de identidade que dispara a geração do par de chaves Ed25519 em Rust, e uma tela de confirmação mostrando o nome do usuário e a identidade criptográfica.

A tela de timeline exibe memórias em ordem cronológica reversa com previews de imagem, texto de contexto e chips para tipo de memória e visibilidade. Pull-to-refresh recarrega a partir do nó Rust. Um floating action button abre a tela de criação de memória, que suporta seleção de foto da galeria ou câmera via image_picker, texto de contexto opcional, dropdowns de tipo de memória e visibilidade, e tags separadas por vírgula. Criar uma memória chama o FFI Rust sincronamente, depois retorna à timeline.

A tela de rede mostra dois cards: status do nó (contagem de peers, tamanho da DHT, estado de bootstrap, uptime) e saúde da replicação (total de fragmentos, fragmentos saudáveis, fragmentos em reparo, fator de replicação). A tela de configurações exibe a identidade do usuário — nome, node ID truncado, chave pública truncada e data de criação.

Três providers Riverpod gerenciam o estado: nodeProvider inicia o nó embarcado ao abrir o app usando o diretório de documentos e para ao fazer dispose; identityProvider carrega o perfil existente ou cria um novo; timelineProvider busca a lista de memórias com paginação.

Testes — 9 testes unitários Rust em tesseras-embedded cobrindo ciclo de vida do nó (start/stop sem panic), persistência de identidade entre reinícios, ciclos de reinício sem corrupção do SQLite, streaming de eventos de rede, recuperação de estatísticas, criação de memória e recuperação da timeline, e busca de memória individual por hash. 2 testes Flutter: um teste de integração verificando inicialização do Rust e startup do app, e um smoke test de widget.

Decisões de arquitetura

O que vem a seguir

A infraestrutura está completa. A rede existe, a replicação funciona, e agora qualquer pessoa com um celular pode participar. O que resta é fortalecer o que temos e abrir para o mundo.