Skip to content
reader.me

Notes tècniques

Com funciona reader.me

Cap PDF que obris surt de la teva màquina. Aquesta pàgina explica com és possible arquitectònicament, què fa cada peça, i com pots verificar la promesa tu mateix en 30 segons.

La versió curta

Els navegadors moderns porten un runtime gairebé complet: motor JavaScript JIT, WebAssembly, canvas 2D, criptografia, APIs de fitxers i emmagatzematge persistent. Suficient per fer tot el que fa un editor PDF d'escriptori — sense enviar el fitxer a cap lloc.

reader.me són uns 4 MB de JavaScript i WebAssembly que enganxen quatre llibreries open-source a les 20 tools que veus. El PDF que deixes anar al navegador es llegeix des del handle File local a un Uint8Array, es manipula en memòria, i el resultat s'ofereix com a descàrrega via URL.createObjectURL. En cap moment hi ha una petició de xarxa amb el teu document.

Què passa quan deixes anar un PDF

  1. El navegador passa el fitxer directe a JavaScript. L'API drag-and-drop ens dóna un objecte File apuntant als bytes ja al disc — no hi ha upload per arribar al nostre codi.
  2. Llegim els bytes a un typed array. await file.arrayBuffer() ens dóna els bytes crus. Tot a partir d'aquí opera sobre aquest Uint8Array.
  3. La llibreria adequada fa la feina. Cada tool connecta aquest array a un de quatre motors: pdf-lib (manipulació estructural pura JS), PDF.js (renderitzat), Tesseract.js (OCR via WebAssembly), i Comlink Workers per a fitxers més grans de 20 MB.
  4. El resultat es converteix en descàrrega. El Uint8Array de sortida s'embolcalla en un Blob, es crea una URL d'objecte temporal, i un <a> invisible amb atribut download es clica programàticament. El navegador desa el fitxer a la teva carpeta de descàrregues.

Per què és privacitat estructural, no només per política

La majoria d'afirmacions "sense upload" dels serveis PDF al núvol signifiquen alguna cosa més feble: el servidor descarta el teu fitxer després d'unes hores. El fitxer sí que va arribar als seus servidors — només prometen esborrar-lo.

A reader.me no hi ha un "després" per descartar, perquè no hi ha upload de partida. La promesa de privacitat no és una política que apliquem; és una propietat del sistema. No la pots violar per accident sense reescriure l'aplicació.

Aquesta és la diferència entre privacitat per política ("no el guardarem") i privacitat estructural ("mai arriba aquí").

I l'analítica?

Carreguem Google Analytics (diferit, post-LCP) per comptar trànsit i Cloudflare Web Analytics per al rendiment. Cap dels dos veu els teus PDF — només disparen beacons de pageview amb la ruta de URL (ex. /merge-pdf), el locale i el user agent estàndard. Sense noms de fitxer, sense contingut, sense identificador per-usuari al nostre datalayer.

Els robots estan explícitament permesos (GPTBot, ClaudeBot, Google-Extended, PerplexityBot, etc.) — no hi ha dades de documents per scrapejar, només la mateixa còpia pública que estàs llegint.

Verifica-ho tu mateix en 30 segons

  1. Obre les DevTools del navegador (F12 a Windows, ⌥⌘I a macOS) i ves a la pestanya Network.
  2. Esborra la llista de peticions. Marca "preserve log" perquè sobrevisquin a una recàrrega.
  3. Deixa anar un PDF a, per exemple, la tool Comprimir. Prem "Comprimir PDF".
  4. Mira el panell Network. Veuràs peticions d'assets (pdf.worker.min.mjs, en memòria cau després de la primera càrrega) i el beacon de GA, però cap petició portant el teu fitxer — sense POST, sense XHR, res. La descàrrega arriba com a URL blob:, que és una pseudo-URL local del navegador.

Un cop ho veus, és igual per a totes les tools. L'arquitectura no té una ruta server-side per a les dades del document ni encara que volguéssim.

Trade-offs que acceptem

Fer-ho tot al navegador no és gratis. Llista honesta de limitacions:

  • Límit de mida. 50 MB per fitxer al web. El navegador pot amb més però la memòria mòbil és justa; el build desktop Tauri (Fase 4) aixecarà el límit.
  • Sense signatures qualificades. SES (Signatura Electrònica Simple) es pot fer client-side; QES amb certificats FNMT/DNIe requereix APIs de smart-card del SO, també Fase 4.
  • Les dades d'idioma OCR són grans. La primera execució OCR en un idioma nou descarrega ~12 MB del CDN públic de Tesseract. En memòria cau per sempre després.
  • PDF/A perd el text seleccionable. Rasteritzem cada pàgina per garantir el compliment independentment de les fonts de l'input.

Relacionat

reader.me és una idea de David Carrero , construït a Color Vivo Internet S.L.