receipt-ripper.com
Tus recibos nunca salen de tu dispositivo
Todo lo que nos preguntan, con respuestas más largas de las que cabe en la página principal.
Sí. Sin registro, sin nivel de pago, sin límite de uso, sin bloqueo "premium". El sitio se mantiene con un único banner de Google AdSense encima de la zona para soltar archivos más donaciones opcionales en un clic mediante un Stripe Payment Link antes de las exportaciones. Eso cubre la factura de alojamiento. El conjunto completo de funciones está disponible en cada visita, incluido un número ilimitado de recibos por sesión y cada formato de exportación.
No, y aunque quisieras no podrías — no hay sistema de cuentas. El sitio no tiene concepto de usuario. El estado vive en la pestaña de tu navegador y (opcionalmente) en el IndexedDB de tu navegador si activas "Mantener el lote en este dispositivo". Nada se almacena en nuestros servidores porque nada sale de tu navegador para empezar.
Ejecuta una canalización de seis fases sobre cada recibo que sueltas:
A ninguna parte fuera de tu navegador. Cada fase de la canalización se ejecuta en un Web Worker en tu propio dispositivo. El resultado analizado se mantiene en memoria y se escribe en tu sistema de archivos a través de blob URLs cuando exportas. Ninguna petición — ninguna — lleva bytes de recibo fuera de tu máquina. Abre DevTools → Red durante un escaneo para verificarlo: no verás una subida porque no la hay.
No. GA y AdSense solo ven lo que siempre ven en cualquier sitio web: tu IP (anonimizada por GA), navegador, sistema operativo, URL de referencia y contadores de eventos sin datos personales como "file_uploaded" con el recuento de archivos (nunca nombres de archivo, nunca contenido de recibo). Al espacio publicitario de AdSense solo se le dicen nuestros IDs de editor y unidad. La Política de privacidad lista cada byte que se envía.
Sí, y la aplicación sigue funcionando. El banner de cookies tiene una opción "Rechazar" que impide que GA y AdSense se carguen. Un bloqueador de anuncios estándar, uBlock Origin o la Protección de Rastreo Mejorada de Firefox en modo Estricto también los bloquearán. El procesamiento de recibos funciona igual con o sin esos scripts.
JPG, PNG, WebP, HEIC, HEIF y PDF. También puedes soltar un archivo ZIP que contenga cualquiera de esos — se descomprime en el lado del cliente (con jszip cargado bajo demanda) y cada archivo interior se procesa individualmente. El ZIP original nunca se almacena ni se sube.
Actualmente el analizador solo usa la primera página de un PDF. La mayoría de los recibos enviados por correo son de una sola página; para facturas de varias páginas, divídelas con cualquier herramienta PDF y suelta las páginas relevantes por separado. Podríamos añadir soporte multipágina en una versión futura — vótalo por correo.
No hay límite duro — la restricción es la RAM de tu dispositivo. Hemos probado fotos de iPhone de 20 MB y lotes de 50 páginas sin problema en un portátil de gama media. Safari móvil empieza a sufrir por encima de unos 30 MB por imagen porque iOS mata las pestañas que se acercan a 1 GB de memoria. Reduce las fotos muy grandes antes de soltarlas si tienes problemas.
Sí. Copia una imagen desde cualquier lugar (una aplicación de chat, un correo, una herramienta de captura) y pégala en la página con Ctrl/Cmd+V. La zona para soltar la recoge igual que un arrastrar y soltar.
Inglés, español, francés, alemán, neerlandés, italiano y portugués — son los paquetes de idioma de Tesseract que enviamos. Eliges el idioma con el desplegable en la parte superior de la página; el selector también controla el idioma de la interfaz. La primera vez que cambias a un idioma nuevo, el paquete se descarga (≈3 MB cada uno) y luego se queda en caché indefinidamente.
Actualmente no. Tesseract admite esos alfabetos pero las reglas de análisis de recibos aún no cubren sus diseños y formatos numéricos. Añadir un idioma supone construir un buen número de fixtures. Si usarías uno de estos con regularidad, escríbenos.
EUR, USD, GBP, CHF y JPY se prueban explícitamente. El analizador reconoce tanto el símbolo (€, $, £, ¥, Fr.) como la forma escrita (euro, dólar, franco) y recurre a tu configuración regional si un recibo es ambiguo. Los recibos que mezclan divisas (raros pero pasa con viajes internacionales) se analizan con la divisa dominante y puedes corregir en la tabla de revisión.
Receipt Ripper detecta el formato por número contando los separadores y sus posiciones, no a partir de la configuración regional del navegador. Así que un recibo alemán con "12.345,67 €" y un recibo estadounidense con "12,345.67" se analizan correctamente incluso en la misma sesión del navegador. Internamente todos los importes se almacenan como céntimos enteros para evitar deriva de coma flotante; el redondeo solo ocurre en la exportación.
Para un recibo plano, bien iluminado y fotografiado de frente con un móvil moderno, el analizador acierta proveedor, fecha, total y las líneas casi siempre. Impuesto y subtotal aciertan la mayoría de las veces. A medida que cae la calidad de la foto, los campos numéricos sufren primero — el OCR confunde 8 con 3 y B, 0 con O y D, 5 con 6 y S. Por eso la tabla de revisión marca en amarillo los campos de baja confianza: puedes arreglar la media docena de valores dudosos sin tener que retipear todo el recibo.
La fase de corrección de escaneo detecta los bordes del papel usando un detector de bordes de Canny más una transformada de Hough, escoge las cuatro líneas más exteriores, calcula una transformada de perspectiva y endereza el recibo usando una homografía WebGL. Inclinaciones ligeras (hasta unos 40°) y la mayoría de las marcas de doblez se manejan automáticamente. Para los recibos que el detector no encuentra, cada sesión tiene un botón "Recortar manualmente" que abre un selector interactivo de cuatro esquinas.
Ponlo plano sobre una superficie de contraste (una mesa oscura va bien con papel térmico blanco). Luz por encima, sin sombra cruzando el papel. Móvil paralelo al recibo, no en ángulo. Llena el encuadre pero deja un borde pequeño para que el detector tenga algo con lo que trabajar. El flash a veces ayuda con la impresión térmica descolorida y a veces la quema — prueba ambos.
O el OCR no lo leyó (a menudo porque esa parte del recibo está demasiado descolorida o demasiado pequeña tras el escalado) o el analizador vio texto pero no lo reconoció como el campo. Ambos son editables en la tabla de revisión — haz clic en la celda y escribe.
Sí. Todo el sitio es responsive y funciona en Safari móvil, Chrome móvil y Firefox para Android. La zona para soltar muestra un botón "Hacer foto" que abre la cámara trasera directamente para que puedas escanear y analizar en el momento. El tamaño del pool de workers en móvil se limita a 2 workers para evitar que iOS mate la pestaña por falta de memoria.
El motor OCR y el paquete de idioma inglés juntos suman unos 12 MB. Eso se descarga una vez y luego se queda en caché. La descarga es la parte más lenta de la primera visita en frío — los escaneos posteriores son de unos pocos segundos cada uno.
Sí, se decodifican en el lado del cliente con libheif-js. El primer HEIC de una sesión dispara una pequeña carga bajo demanda del decodificador HEIC. Después son tan rápidos como los JPG.
Una fila por línea de detalle en todos los recibos procesados. Columnas: id del recibo, proveedor, fecha, nombre de la línea, cantidad, precio unitario, total de la línea, después los totales por recibo (subtotal, impuesto, total) repetidos en cada fila de ese recibo para que pivote fácil. Unicode es UTF-8 con BOM para que Excel lo abra bien en Windows.
Dos tipos de hoja. Una hoja "Resumen" agrupa cada recibo por categoría y divisa y da totales generales — lo que típicamente quiere tu contable. Una hoja de desglose por recibo para cada recibo lista cada línea con indicadores de confianza y el texto OCR original en una columna oculta para auditoría. El libro se genera enteramente en el cliente con SheetJS.
Cada imagen original o corregida de perspectiva del recibo, renombrada a YYYY-MM-DD_proveedor.jpg para que los archivos se ordenen cronológicamente. Más el mismo libro de Excel descrito arriba. Todo el paquete usa compresión STORE porque los JPGs y el XLSX ya zipeado no comprimen más.
Las herramientas gratuitas con publicidad cuestan dinero real de alojar. El aviso previo a la exportación ofrece una donación en un clic mediante Stripe antes de que se descargue el archivo. Saltar está justo ahí si tienes prisa — la descarga se dispara en cuanto termina la cuenta atrás, independientemente de si donaste. Las donaciones no están condicionadas por ninguna función.
Sí — el botón "excluir impuesto de las exportaciones" cerca del selector de idioma. Algunas jurisdicciones desaconsejan entregar datos detallados de impuestos a contables externos; activa el botón y las columnas de impuesto desaparecen de las exportaciones CSV / XLSX / ZIP.
Muchos lo hacen. La hoja Resumen de la exportación XLSX está diseñada exactamente para eso — totales agrupados por categoría y divisa, listos para la sección de gastos deducibles del Modelo 130 español, una Anlage EÜR alemana, una SA103 británica o el equivalente. No damos ni podemos dar asesoramiento fiscal; revisa cada valor analizado antes de confiar en él.
Haz clic en la insignia de categoría en cada tarjeta de sesión y elige de la lista. La primera vez que asignas una categoría a un proveedor, la elección se recuerda localmente — los recibos futuros del mismo proveedor pre-rellenan la categoría, con la puntuación de detección automática original sustituida por tu elección explícita.
CSV se abre literalmente en todo. XLSX se abre en Excel, LibreOffice, Numbers, Google Sheets y la mayoría de las plataformas de contabilidad (QuickBooks, Xero, Wave, FreshBooks aceptan importación XLSX). La estructura es intencionadamente aburrida — una fila por línea, columnas con el nombre obvio.
Tres causas comunes. (1) El WASM de Tesseract no se cargó — revisa la consola del navegador por un 404 o un error de tipo MIME en tesseract-core-*.wasm. (2) Tu navegador bloqueó los Web Workers — algunas extensiones de privacidad lo hacen; permite workers para el sitio. (3) La foto es enorme y tu dispositivo se quedó sin RAM — reduce la foto y reintenta.
O la cabecera del recibo está en un alfabeto que el paquete de idioma cargado no cubre, o la parte superior del recibo está demasiado descolorida / recortada para leerla. Edita el campo directamente en la tabla de revisión; el resto del recibo normalmente se analiza bien.
El validador comprueba que suma(totales de línea) + impuesto + propina ≈ total dentro de una tolerancia pequeña. Cuando falla, uno de los totales de línea se leyó mal, el impuesto se leyó mal o el recibo en sí tiene una línea de descuento que el analizador no reconoció. La pista indica qué valor está en desacuerdo con cuál — arréglalo en la tabla y el aviso desaparece.
Eso puede pasar si tu navegador limpió la caché entre visitas (modo privado, limpieza automática de Firefox, herramientas de limpieza de datos del navegador). La navegación normal mantiene el paquete en caché indefinidamente — el almacenamiento de IndexedDB no se purga habitualmente.
React 18 + Vite + Tailwind 4 para la interfaz. Tesseract.js para OCR. pdf.js de Mozilla para renderizado de PDF. libheif-js para decodificación HEIC. SheetJS para escritura de Excel. jszip para empaquetado ZIP. Todo está empaquetado como activos estáticos y servido por nginx dentro de un contenedor Docker. El contenedor no tiene backend de aplicación — solo nginx sirviendo HTML, JS, WASM y paquetes de idioma.
Las dependencias de la canalización (Tesseract.js, pdf.js, libheif-js, SheetJS, jszip) son todas de código abierto — consulta /LICENSES.txt para la atribución completa y el texto de las licencias. El código de la aplicación Receipt Ripper en sí es propietario, aunque gran parte de lo interesante está en el analizador basado en reglas, que es sencillo de reimplementar.
Escribe a contact@receipt-ripper.com con la foto o PDF que se analizó mal y una nota sobre cuál debería haber sido el resultado. Cada recibo problemático que compartes se convierte en un fixture de prueba interna (con datos personales redactados) para que el mismo error no pueda reaparecer después de la siguiente versión.