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
+-
+
- Nó embarcado, não cliente-servidor: o celular roda a stack P2P completa, +não um thin client conversando com um daemon remoto. Isso significa que +memórias são preservadas mesmo sem internet. Usuários com um Raspberry Pi ou +VPS podem opcionalmente conectar o app ao seu daemon via GraphQL para maior +disponibilidade, mas não é obrigatório. +
- FFI síncrono: todas as funções flutter_rust_bridge são marcadas como
+
#[frb(sync)]e bloqueiam no runtime Tokio interno. Isso simplifica o lado +Dart (sem complexidade de bridge assíncrono) enquanto o lado Rust lida com +concorrência internamente. A UI thread do Flutter permanece responsiva porque +o Riverpod envolve as chamadas em providers assíncronos.
+ - Singleton global: um global
Mutex<Option<EmbeddedNode>>garante que o +ciclo de vida do nó seja previsível — um start, um stop, sem race conditions. +Plataformas mobile matam processos agressivamente, então simplicidade no +gerenciamento de ciclo de vida é uma feature.
+ - Tipos FFI planos: nenhuma abstração Rust vaza pela fronteira FFI. Todo +tipo é uma struct plana com strings e números. Isso torna os bindings Dart +auto-gerados confiáveis e fáceis de debugar. +
- Onboarding de três telas: a criação de identidade é o único passo +obrigatório. Sem email, sem senha, sem registro em servidor. O app gera uma +identidade criptográfica localmente e está pronto para uso. +
O que vem a seguir
+-
+
- Fase 4: Resiliência e Escala — NAT traversal avançado (STUN/TURN), +Shamir's Secret Sharing para herdeiros, tesseras seladas com criptografia +temporal, ajuste de performance, auditorias de segurança, empacotamento para +Alpine/Arch/Debian/FreeBSD/OpenBSD +
- Fase 5: Exploração e Cultura — Navegador público de tesseras por +era/localização/tema/idioma, curadoria institucional, integração com +genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de +ácido com QR) +
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.
+ +