Skip to content
reader.me

Notas técnicas

Cómo funciona reader.me

Ningún PDF que abras sale de tu máquina. Esta página explica cómo es posible arquitectónicamente, qué hace cada pieza, y cómo puedes verificar la promesa tú mismo en 30 segundos.

La versión corta

Los navegadores modernos llevan un runtime casi completo: motor JavaScript JIT, WebAssembly, canvas 2D, criptografía, APIs de ficheros y almacenamiento persistente. Suficiente para hacer todo lo que hace un editor PDF de escritorio — sin enviar el fichero a ningún sitio.

reader.me son unos 4 MB de JavaScript y WebAssembly que pegan cuatro librerías open-source en las 20 tools que ves. El PDF que sueltas en el navegador se lee desde el handle File local a un Uint8Array, se manipula en memoria, y el resultado se ofrece como descarga via URL.createObjectURL. En ningún momento hay una petición de red con tu documento.

Qué pasa cuando sueltas un PDF

  1. El navegador pasa el fichero directo a JavaScript. La API drag-and-drop nos da un objeto File apuntando a los bytes ya en disco — no hay upload para llegar a nuestro código.
  2. Leemos los bytes a un typed array. await file.arrayBuffer() nos da los bytes crudos. Todo a partir de aquí opera sobre ese Uint8Array.
  3. La librería adecuada hace el trabajo. Cada tool conecta este array a uno de cuatro motores: pdf-lib (manipulación estructural pura JS), PDF.js (renderizado), Tesseract.js (OCR via WebAssembly), y Comlink Workers para ficheros mayores de 20 MB.
  4. El resultado se convierte en descarga. El Uint8Array de salida se envuelve en un Blob, se crea una URL de objeto temporal, y un <a> invisible con atributo download se clickea programáticamente. El navegador guarda el fichero en tu carpeta de descargas.

Por qué es privacidad estructural, no solo por política

La mayoría de afirmaciones "sin upload" de los servicios PDF en la nube significan algo más débil: el servidor descarta tu fichero tras unas horas. El fichero sí llegó a sus servidores — solo prometen borrarlo.

En reader.me no hay un "después" que descartar, porque no hay upload de partida. La promesa de privacidad no es una política que aplicamos; es una propiedad del sistema. No puedes violarla por accidente sin reescribir la aplicación.

Esa es la diferencia entre privacidad por política ("no lo guardaremos") y privacidad estructural ("nunca llega aquí").

¿Y la analítica?

Cargamos Google Analytics (diferido, post-LCP) para contar tráfico y Cloudflare Web Analytics para performance. Ninguno ve tus PDFs — solo disparan beacons de pageview con la ruta de URL (ej. /merge-pdf), el locale y el user agent estándar. Sin nombres de fichero, sin contenido, sin identificador per-user en nuestro datalayer.

Los robots están explícitamente permitidos (GPTBot, ClaudeBot, Google-Extended, PerplexityBot, etc.) — no hay datos de documentos para scrapear, solo la misma copia pública que estás leyendo.

Verifícalo tú mismo en 30 segundos

  1. Abre las DevTools del navegador (F12 en Windows, ⌥⌘I en macOS) y ve a la pestaña Network.
  2. Borra la lista de peticiones. Marca "preserve log" para que sobrevivan a un recargo.
  3. Suelta un PDF en, por ejemplo, la tool Comprimir. Pulsa "Comprimir PDF".
  4. Mira el panel Network. Verás peticiones de assets (pdf.worker.min.mjs, cacheado tras la primera carga) y el beacon de GA, pero ninguna petición llevando tu fichero — sin POST, sin XHR, nada. La descarga llega como URL blob:, que es una pseudo-URL local del navegador.

Una vez lo ves, es igual para todas las tools. La arquitectura no tiene una ruta server-side para los datos del documento ni aunque quisiéramos.

Trade-offs que aceptamos

Hacer todo en el navegador no es gratis. Lista honesta de limitaciones:

  • Tope de tamaño. 50 MB por fichero en web. El navegador puede con más pero la memoria móvil es justa; el build desktop Tauri (Fase 4) levantará el límite.
  • Sin firmas cualificadas. SES (Firma Electrónica Simple) se puede hacer client-side; QES con certificados FNMT/DNIe requiere APIs de smart-card del SO, también Fase 4.
  • Los datos de idioma OCR son grandes. La primera ejecución OCR en un idioma nuevo descarga ~12 MB del CDN público de Tesseract. Cacheado para siempre después.
  • PDF/A pierde el texto seleccionable. Rasterizamos cada página para garantizar compliance independientemente de las fuentes del input.

Relacionado

reader.me es una idea de David Carrero , construido en Color Vivo Internet S.L.