Executando verificação de segurança...
1

Pitch: Privacidade por padrão: Como manipulei PDFs e fiz OCR sem enviar um único byte para o servidor

Introdução

Muitas ferramentas online de PDF funcionam como uma "caixa preta": você faz o upload de documentos sensíveis (comprovantes, contratos, documentos pessoais) e espera que o servidor faça o trabalho. Mas por que precisamos de um servidor para tarefas que o hardware do usuário já consegue resolver?

Decidi focar o desenvolvimento do Crow Docs em uma arquitetura 100% client-side. O objetivo é simples: o arquivo entra no navegador, é processado na memória RAM local e sai transformado, sem nunca tocar em um banco de dados ou bucket S3.

A Pilha Técnica

Para quem gosta de saber quais ferramentas tornam isso possível, aqui estão as principais bibliotecas que utilizei para manter tudo no navegador:

Manipulação de PDF (pdf-lib): Para mesclar, dividir e modificar documentos, utilizo a pdf-lib. Ela é fantástica porque permite criar e modificar documentos PDF inteiramente em JavaScript, o que é essencial para manter a promessa de privacidade.

OCR Local (Tesseract.js): Extrair texto de imagens ou PDFs escaneados costuma ser uma tarefa pesada de servidor. O Tesseract.js é um port do motor Tesseract original para WebAssembly (WASM), permitindo que o navegador do usuário faça o reconhecimento óptico de caracteres localmente.

Conversão de Markdown: Para a ferramenta de Markdown para Slides, utilizo lógica de parsing para transformar a sintaxe em estruturas visuais, garantindo que o fluxo de trabalho acadêmico ou técnico seja rápido e seguro.

Interface: Todo o projeto é construído com Next.js e Tailwind CSS, o que garante que a experiência seja fluida mesmo com processamentos pesados ocorrendo em segundo plano.

Por que o foco em Client-Side?

Segurança e Confiança: O usuário tem a garantia técnica de que seus dados não estão sendo coletados.

Custo de Infraestrutura: Como o processamento é feito pelo hardware do cliente, o custo de manutenção do site cai drasticamente, permitindo que a ferramenta continue gratuita.

Latência: Não há tempo de upload ou download do servidor. O gargalo é apenas o processamento local.

O desafio de criar ferramentas serverless (de verdade) é lidar com as limitações de memória do navegador, mas o ganho em privacidade compensa cada linha de código extra.

Gostaria de saber da comunidade: vocês costumam confiar em ferramentas online para documentos sensíveis? Que outras funcionalidades "locais" vocês sentem falta hoje na web?

Carregando publicação patrocinada...
3

Achei bem legal a ideia, mas será que funciona em computadores mais fracos? Eu acompanhando meus clientes e a maioria são computadores fracos e antigos, e no Brasil é bem comum comprar computador novo, maas com mais de 5 anos de defasagem

1

Com certeza, você tem toda razão em pontuar isso. Eu tenho total ciência dessa limitação e esse é, inclusive, um dos meus maiores focos no momento.

Eu estou trabalhando na versão mobile, que está sendo desenhada para ser ainda mais leve e acessível, permitindo que quem não tem um PC potente consiga realizar as tarefas direto pelo celular com agilidade.

O objetivo é que a tecnologia seja uma facilitadora, e não uma barreira por causa do equipamento.

1

Não vi vantagem real no que foi feito.

A proposta de "privacidade por padrão" soa bem no pitch, mas não se sustenta tecnicamente. O processamento client-side resolve apenas uma parte do problema e nem a mais crítica. O Tesseract rodando em WebAssembly é significativamente mais lento que qualquer solução servidor, e para documentos com múltiplas páginas o custo é real: consumo elevado de RAM, risco de travar a aba do navegador e degradação severa em dispositivos mais modestos. Além disso, arquivos sensíveis carregados na memória do browser ficam expostos a vulnerabilidades de side-channel como Spectre e Meltdown, sem nenhum mecanismo de limpeza segura de buffer após o processamento. O que foi apresentado como vantagem, na prática, transfere o custo computacional para o hardware do usuário sem garantir que esse ambiente seja mais seguro.

1

Sobre "resolve só parte do problema":

O processamento client-side resolve exatamente a parte que 99% das alternativas do mercado não resolvem: custódia de dados pelo operador. Quando um PDF é enviado para iLovePDF, SmallPDF, Adobe Online etc., o arquivo passa por servidores de terceiros com logs, backups, funcionários com acesso, obrigações legais de retenção (Marco Civil, LGPD, subpoena internacional) e uma superfície de ataque considerável. Eliminar essa custódia não é parte pequena do problema — é o vetor principal de vazamento de documentos em serviços SaaS. 100% dos vazamentos de OCR/PDF dos últimos anos (MyHeritage, Dropbox, etc.) foram server-side.

Sobre performance do Tesseract WASM:

Correto. WASM é ~3-5x mais lento que um worker nativo no servidor. Trade-off consciente e explícito. Para documentos de 1-20 páginas a diferença em segundos é aceitável. Para OCR em 500+ páginas, a recomendação apropriada é solução desktop (Tesseract CLI, OCRmyPDF local). A ferramenta não se propõe a ser a mais rápida — se propõe a não transferir custódia.

Sobre Spectre/Meltdown em buffers do browser:
Argumento desatualizado. Desde 2018, navegadores implementam:

  • Site Isolation (Chrome) — cada origem em processo separado, impedindo leakage cross-origin
  • COOP/COEP — necessários para habilitar SharedArrayBuffer, que é o vetor crítico
  • Timer precision reductionperformance.now() degradado para 100µs, inviabilizando timing attacks práticos
  • Cross-Origin-Resource-Policy — isolamento de recursos

Para um PWA estático, sem scripts de terceiros, sem ads, sem trackers, com CSP restritivo, o vetor Spectre é teoricamente interessante mas praticamente inexplorado há 6+ anos. Em comparação, um servidor processando o mesmo arquivo tem CVEs ativos anuais em libpng, libjpeg, pdfium, poppler, tesseract-server e todo o stack de rede.

Sobre limpeza segura de buffer:
JS não tem memset_s explícito, mas:

  • Buffers são garbage-collected ao sair de escopo
  • Canvas é invalidado com canvas.width = 0 (libera backing store)
  • ArrayBuffers são rehidratados pelo alocador do V8, que zera páginas antes de remapear
  • Não há persistência: tudo vive apenas enquanto a aba está aberta (sem localStorage, sem IndexedDB para arquivos, sem cookies de estado)

Um servidor que processa o mesmo PDF possui logs, swap, core dumps, backups de disco, snapshots de VM e métricas com samples de payload — nenhum desses vetores existe no client-side. Zeroização explícita é feature de sistemas críticos (HSM, kernels militares), não baseline de SaaS de OCR.

Sobre transferir custo computacional para o hardware do usuário:

Esse é o modelo padrão de software local desde 1985 (Word, Photoshop, VLC, IDEs, compiladores). A alternativa é devolver o custo ao servidor — e junto com ele, o controle, a visibilidade e a confiança. No modelo client-side, o browser é uma sandbox conhecida e auditável, o código é estático e inspecionável (Ctrl+U), e não há estado persistente server-side.

Nenhuma ferramenta é perfeita, mas "processa no device e some quando a aba fecha" é um modelo de ameaça substancialmente mais simples de auditar do que "confie que o backend não guarda nada". O código-fonte está na página — verificação é trivial.