receipt-ripper.com
Vos reçus ne quittent jamais votre appareil
Tout ce qu'on nous demande, avec des réponses plus longues que ne le permet la page d'accueil.
Oui. Pas d'inscription, pas de palier payant, pas de limite d'usage, pas de verrouillage « premium ». Le site est financé par une seule bannière Google AdSense au-dessus de la zone de dépôt plus des dons optionnels en un clic via Stripe Payment Link avant les exports. Cela paie l'hébergement. L'ensemble des fonctionnalités est disponible à chaque visite, y compris un nombre illimité de reçus par session et chaque format d'export.
Non, et vous ne pourriez même pas — il n'y a pas de système de comptes. Le site n'a aucune notion d'utilisateur. L'état vit dans votre onglet et (éventuellement) dans l'IndexedDB de votre navigateur si vous activez « Conserver le lot sur cet appareil ». Rien n'est stocké sur nos serveurs car rien ne quitte votre navigateur au départ.
Il exécute un pipeline en six étapes sur chaque reçu déposé :
Nulle part hors de votre navigateur. Chaque étape du pipeline tourne dans un Web Worker sur votre propre appareil. Le résultat analysé est conservé en mémoire et écrit sur votre système de fichiers via blob URLs lors de l'export. Aucune requête — pas une — ne transporte d'octets de reçu hors de votre machine. Ouvrez DevTools → Réseau pendant un scan pour le vérifier : vous ne verrez aucun envoi parce qu'il n'y en a aucun.
Non. GA et AdSense voient uniquement ce qu'ils voient sur n'importe quel site : votre IP (anonymisée par GA), navigateur, OS, URL de référence et compteurs d'événements non personnels comme « file_uploaded » avec le nombre de fichiers (jamais les noms de fichiers, jamais le contenu). L'emplacement publicitaire AdSense ne connaît que nos identifiants d'éditeur et d'unité. La politique de confidentialité liste chaque octet envoyé.
Oui, et l'application fonctionne toujours. La bannière cookies a une option « Refuser » qui empêche GA et AdSense de se charger. Un bloqueur de publicités standard, uBlock Origin ou la Protection Renforcée Contre le Pistage de Firefox en mode Strict les bloque aussi. Le traitement des reçus fonctionne de la même façon avec ou sans ces scripts.
JPG, PNG, WebP, HEIC, HEIF (photos iPhone) et PDF. Vous pouvez aussi déposer une archive ZIP contenant l'un ou l'autre — elle est décompressée côté client (via jszip chargé à la demande) et chaque fichier interne est traité individuellement. Le ZIP d'origine n'est jamais stocké ni téléversé.
Actuellement l'analyseur n'utilise que la première page d'un PDF. La plupart des reçus envoyés par e-mail tiennent sur une page ; pour des factures multi-pages, séparez-les avec n'importe quel outil PDF et déposez les pages pertinentes séparément. Nous pourrions ajouter le support multi-pages dans une version future — votez pour par e-mail.
Pas de limite dure — la contrainte est la RAM de votre appareil. Nous avons testé des photos iPhone de 20 Mo et des lots de 50 pages sans souci sur un portable de milieu de gamme. Mobile Safari commence à galérer au-delà d'environ 30 Mo par image car iOS tue les onglets qui approchent 1 Go de mémoire. Réduisez les très grandes photos avant de les déposer si vous rencontrez ce problème.
Oui. Copiez une image depuis n'importe où (un chat, un e-mail, un outil de capture) et collez-la sur la page avec Ctrl/Cmd+V. La zone de dépôt la récupère exactement comme un glisser-déposer.
Anglais, espagnol, français, allemand, néerlandais, italien et portugais — ce sont les packs de langue Tesseract que nous livrons. Vous choisissez la langue avec le menu déroulant en haut de page ; le sélecteur contrôle aussi la langue de l'interface. La première fois que vous passez à une nouvelle langue, le pack se télécharge (≈3 Mo chacun) puis reste en cache indéfiniment.
Pas pour l'instant. Tesseract supporte ces alphabets mais les règles d'analyse de reçus ne couvrent pas encore leurs mises en page et formats numériques. Ajouter une langue représente un volume significatif de fixtures. Si vous en utiliseriez une régulièrement, écrivez-nous.
EUR, USD, GBP, CHF, JPY sont explicitement testées. L'analyseur reconnaît à la fois le symbole (€, $, £, ¥, Fr.) et la forme écrite (euro, dollar, franc) et se rabat sur votre locale si un reçu est ambigu. Les reçus mélangeant devises (rare mais courant en voyage international) sont analysés avec la devise dominante et vous pouvez corriger dans le tableau de relecture.
Receipt Ripper détecte le format par nombre en comptant les séparateurs et leurs positions, pas depuis la locale du navigateur. Donc un reçu allemand avec « 12.345,67 € » et un reçu américain avec « 12,345.67 » s'analysent correctement même dans la même session. En interne, tous les montants sont stockés en centimes entiers pour éviter la dérive virgule flottante ; l'arrondi n'a lieu qu'à l'export.
Pour un reçu plat, bien éclairé et photographié de face avec un smartphone moderne, l'analyseur sort commerçant, date, total et lignes presque à chaque fois. TVA et sous-total sortent juste la plupart du temps. À mesure que la qualité de la photo baisse, les champs numériques souffrent en premier — l'OCR confond 8 avec 3 et B, 0 avec O et D, 5 avec 6 et S. C'est pour ça que le tableau de relecture marque en jaune les champs à faible confiance : vous corrigez la demi-douzaine de valeurs douteuses sans retaper tout le reçu.
L'étape de correction du scan détecte les bords du papier via un détecteur de Canny plus une transformée de Hough, choisit les quatre lignes les plus externes, calcule une transformation de perspective et redresse le reçu via une homographie WebGL. Les inclinaisons légères (jusqu'à environ 40°) et la plupart des marques de pliage sont gérées automatiquement. Pour les reçus que le détecteur ne trouve pas, chaque session a un bouton « Recadrer manuellement » qui ouvre un sélecteur interactif de quatre coins.
Posez-le à plat sur une surface contrastante (une table sombre va bien avec le papier thermique blanc). Lumière du dessus, pas d'ombre en travers du papier. Téléphone parallèle au reçu, pas en biais. Remplissez le cadre mais laissez une petite marge pour que le détecteur de bords ait de quoi travailler. Le flash aide parfois avec l'impression thermique fanée et parfois la crame — testez les deux.
Soit l'OCR ne l'a pas lu (souvent parce que cette partie du reçu est trop délavée ou trop petite après réduction), soit l'analyseur a vu du texte mais ne l'a pas reconnu comme le champ. Les deux sont éditables dans le tableau de relecture — cliquez sur la cellule et tapez.
Oui. Tout le site est responsive et fonctionne sur Safari mobile, Chrome mobile et Firefox pour Android. La zone de dépôt affiche un bouton « Prendre une photo » qui ouvre directement l'appareil arrière pour que vous puissiez scanner et analyser sur place. La taille du pool de workers est plafonnée à 2 sur mobile pour éviter la mort d'onglet par manque de mémoire.
Le moteur OCR et le pack de langue anglais totalisent environ 12 Mo. Cela se télécharge une fois puis reste en cache. Le téléchargement est la partie la plus lente de la première visite à froid — les scans suivants prennent quelques secondes chacun.
Oui, décodées côté client via libheif-js. Le premier HEIC d'une session déclenche un petit chargement à la demande du décodeur HEIC. Après, ils sont aussi rapides que des JPG.
Une ligne par article sur l'ensemble des reçus traités. Colonnes : id du reçu, commerçant, date, libellé, quantité, prix unitaire, total ligne, puis les totaux par reçu (sous-total, TVA, total) répétés sur chaque ligne de ce reçu pour pivoter facilement. Unicode UTF-8 avec BOM pour qu'Excel l'ouvre correctement sous Windows.
Deux types de feuille. Une feuille « Résumé » regroupe chaque reçu par catégorie et devise et donne les totaux généraux — ce que votre comptable veut généralement. Une feuille détail par reçu pour chaque reçu liste chaque article avec les indicateurs de confiance et le texte OCR d'origine dans une colonne masquée pour audit. Le classeur est généré entièrement côté client avec SheetJS.
Chaque image originale ou corrigée du reçu, renommée YYYY-MM-DD_commerçant.jpg pour que les fichiers se trient chronologiquement. Plus le même classeur Excel décrit ci-dessus. Le tout utilise une compression STORE car les JPG et le XLSX déjà compressé ne gagnent rien sous DEFLATE.
Les outils gratuits financés par la publicité coûtent de l'argent à héberger. La fenêtre pré-export propose un don en un clic via Stripe avant que le fichier ne soit téléchargé. Passer est juste à un clic si vous êtes pressé — le téléchargement démarre à la fin du compte à rebours, que vous ayez donné ou non. Les dons ne déverrouillent aucune fonctionnalité.
Oui — l'interrupteur « exclure la TVA des exports » près du sélecteur de langue. Certaines juridictions découragent de transmettre des données détaillées de TVA à des tiers ; activez l'interrupteur et les colonnes de TVA disparaissent des exports CSV / XLSX / ZIP.
Beaucoup le font. La feuille Résumé de l'export XLSX est conçue exactement pour ça — totaux groupés par catégorie et devise, prêts pour la section des dépenses déductibles d'une déclaration BNC française, d'une Anlage EÜR allemande, d'une SA103 britannique ou l'équivalent. Nous ne donnons pas et ne pouvons pas donner de conseil fiscal ; vérifiez chaque valeur avant de vous y fier.
Cliquez sur le badge de catégorie de chaque carte de session et choisissez dans la liste. La première fois que vous attribuez une catégorie à un commerçant, le choix est mémorisé localement — les prochains reçus du même commerçant pré-remplissent la catégorie, le score d'auto-détection initial étant remplacé par votre choix explicite.
Le CSV s'ouvre littéralement partout. Le XLSX s'ouvre dans Excel, LibreOffice, Numbers, Google Sheets et la plupart des plateformes de comptabilité (QuickBooks, Xero, Wave, FreshBooks acceptent l'import XLSX). La structure est volontairement ennuyeuse — une ligne par article, des colonnes nommées de façon évidente.
Trois causes fréquentes. (1) Le WASM Tesseract n'a pas chargé — vérifiez la console du navigateur pour un 404 ou une erreur de type MIME sur tesseract-core-*.wasm. (2) Votre navigateur a bloqué les Web Workers — certaines extensions de confidentialité le font ; autorisez les workers pour le site. (3) La photo est énorme et votre appareil a manqué de RAM — réduisez la photo et réessayez.
Soit l'en-tête du reçu est dans un alphabet que le pack de langue chargé ne couvre pas, soit le haut du reçu est trop délavé / coupé pour être lu. Modifiez le champ directement dans le tableau de relecture ; le reste du reçu s'analyse en général correctement.
Le validateur vérifie que somme(totaux de ligne) + TVA + pourboire ≈ total dans une faible tolérance. Quand ça échoue, soit un total de ligne a été mal lu, soit la TVA a été mal lue, soit le reçu lui-même contient une ligne de remise non reconnue. L'indication précise quelle valeur ne tombe pas juste — corrigez dans le tableau et l'avertissement disparaît.
Cela peut arriver si votre navigateur a vidé le cache entre visites (mode privé, nettoyage automatique de Firefox, outils de nettoyage de données). La navigation normale garde le pack en cache indéfiniment — le stockage IndexedDB n'est pas purgé habituellement.
React 18 + Vite + Tailwind 4 pour l'interface. Tesseract.js pour l'OCR. pdf.js de Mozilla pour le rendu PDF. libheif-js pour le décodage HEIC. SheetJS pour l'écriture Excel. jszip pour l'archivage. Tout est packagé en assets statiques servis par nginx dans un conteneur Docker. Le conteneur n'a aucun backend applicatif — juste nginx servant HTML, JS, WASM et packs de langue.
Les dépendances du pipeline (Tesseract.js, pdf.js, libheif-js, SheetJS, jszip) sont toutes open source — voir /LICENSES.txt pour l'attribution et le texte des licences. Le code applicatif Receipt Ripper lui-même est propriétaire, même si l'essentiel de l'intérêt est dans l'analyseur basé sur des règles, qui est simple à réimplémenter.
Écrivez à contact@receipt-ripper.com avec la photo ou le PDF mal analysé et une note sur ce que le résultat aurait dû être. Chaque reçu problématique partagé devient une fixture interne (données personnelles caviardées) afin que la même erreur ne puisse pas réapparaître après la sortie suivante.