Receipt Scanner OSS v1.0
ZERO-CLOUD FINANCIAL OCR / EXPO SDK 57 · REACT NATIVE 0.86

No cloud. No account.
Just your receipts.

Receipt Scanner turns physical paper into structured, audit-ready financial records using 100% on-device Google ML Kit OCR. Camera frames, regex parsing, and SQLite storage stay strictly within your phone's memory — never touching an external telemetry endpoint.

NETWORK CALLS
0 Requests
100% Offline
OCR ENGINE
Google ML Kit
Native C++ Binary
DATABASE
Local SQLite
ACID Compliant
VOCABULARY
EN + IT Dual
Zero AI Hallucination
~120 ms
On-device inference
0.00 KB
Remote network egress
100%
Open source (MIT)
ML_KIT_FRAME_BUFFER
ISO-300DPI
ESSELUNGA S.P.A.
VIA MODENA 42 - REGGIO EMILIA
P.IVA 01284590158 · RT 329188
DATE: 14/10/2026 - 18:42:15
1 PANE CASERECCIO 500G 2.45 €
2 LATTE PARZ. SCREM. 1L 3.30 €
1 CAFFE 100% ARABICA 5.80 €
1 PARMIGIANO REGGIANO 8.90 €
1 OLIO EXTRA VERGINE 1L 11.50 €
SUBTOTAL (IMPONIBILE) 28.95 €
IVA (10% TAX) 2.90 €
TOTALE COMPLESSIVO 31.85 €
DOC_ID: IT-098842-9918274-001
5 Token Rows Verified
Δ 0.00 Checksum
Interactive Live OCR Engine Sandbox

Test the heuristic parser in real time.

Select a receipt scenario or paste custom text. Review the line-by-line bounding coordinates, edit line items and prices inline, inspect mathematical checksum validity, and export cleanly formatted JSON or CSV.

All calculations strictly in browser RAM
OPTICAL SENSOR VIEWPORT Analysis Complete · 138ms
Y_PASS: ACTIVE OCR_TOKENS
Local RAM Tensor Memory Tokens detected: 13
Conservative Parsing Philosophy

If optical ambiguity makes a number or tax rate mathematically unverifiable against the line items, the parser returns null and prompts human confirmation rather than hallucinating plausible figures.

IDENTIFIED MERCHANT
ESSELUNGA S.P.A.
Confirmed (99%)
TRANSACTION DATE
14/10/2026 DD/MM/YYYY
SETTLEMENT CURRENCY
EUR (€) Active
ITEMIZED BREAKDOWN (8 items)
Line Items Net Subtotal: € 35.80
Tax / IVA Allocation: Needs review
€ 3.85
Calculated Ledger Total:
Sum matches detected lines exactly
€ 39.65
Writes to local SQLite
Technical Specifications

Engineered under one non-negotiable axiom: zero telemetry.

Every layer of the mobile stack — from native C++ OCR bindings to SQLite indexing — exists to protect sensitive transactional data while providing instantaneous feedback.

Native Google ML Kit OCR

Powered by Google ML Kit's native text recognition engine compiled directly into the binary. Bitmaps are analyzed in volatile memory and immediately deallocated after tokenization.

Latency: ~120ms Zero cloud egress

Zero Cloud, Zero Identity

Paper receipts reveal sensitive location history, healthcare prescriptions, and card numbers. The app contains no user account schema, no tracking pixels, and no remote database.

GDPR / CCPA by design No signup

Dual Vocabulary Heuristics

Receipt language often differs from device locale. Ships with comprehensive English and Italian token models (totale complessivo, imponibile, IVA), expandable by appending typed arrays.

Typed Regex Models Deterministic

Returns Null, Never Guesses

A hallucinated financial figure causes accounting reconciliation failures. If a printed number is smudged or ambiguous, the parser emits null and highlights it for review.

Integrity Verification Human-in-loop

Embedded SQLite Persistence

Driven by Expo SQLite 57. Receipts and item rows are stored locally in relational tables with fast B-tree indexes, ensuring instant search across thousands of historical entries.

expo-sqlite 57.0.2 ACID Storage

Data Sovereignty & Portability

No proprietary database silos or paywalled exports. Export all scans and line items into standard RFC 4180 CSV or structured JSON at any time for Excel, Numbers, or ERP systems.

Standard RFC 4180 1-Click Export
The Privacy Manifesto

Receipt Scanner vs. Cloud Expense Applications.

Many commercial expense apps use "cloud AI" as an architectural justification for aggregating your merchant transaction history into cloud data warehouses. Here is the direct architectural comparison.

Architectural Dimension
Receipt Scanner (OSS)
Expensify / QuickBooks / Cloud Apps
OCR Image Processing Location
Where is the camera bitmap parsed?
100% On-Device (Google ML Kit Native) Streamed to cloud vision servers
Account & Personal Identification
Identity linkage & profile building
None. No account system exists. Mandatory email, phone & billing info
Offline Capability
Airplane, remote job site, underground subway
Full scanning & local search offline Fails or queues until connection restored
Pricing & License
Recurring cost structure
100% Free & Open Source (MIT) $5 to $20 / month per seat
Consumer Data Aggregation Risk
Purchase behavior telemetry
Zero risk (serverless on physical device) Subject to privacy policies & acquisitions
Ambiguous Smudge Handling
Degraded or torn thermal receipt printing
Returns null, flags for human review LLMs hallucinate plausible guesses
Persistence Layer
Relational database storage
Local SQLite (expo-sqlite 57) Remote multi-tenant cloud clusters
Physical Device Gallery

Tested on real Android & iOS hardware.

Automated unit tests ensure regex accuracy; physical device builds verify camera buffer handling and ML Kit performance.

Camera Permission Verified
Receipt Scanner Camera Permission Screen

Plain-language explanation of camera usage guaranteeing zero network streaming or photo upload.

Receipt Ledger Verified
Receipt Scanner History Screen

Instant merchant indexing, sort by transaction date/amount, and pull-to-refresh backed by SQLite.

Preferences & Privacy Verified
Receipt Scanner Settings Screen

Multi-currency selection (EUR, USD, GBP, CHF), database purge controls, and privacy auditing.

Software Architecture & Code

How photons transform into relational SQL.

The processing pipeline runs sequentially on the device's native threads, isolated from background network runtimes.

Local Execution Pipeline (01 to 05)
01. Camera Buffer
Viewfinder taps in expo-camera write frame directly to temporary cache.
Zero cloud upload
02. ML Kit OCR
C++ native model tokenizes image into 2D bounding boxes and confidence floats.
~120ms latency
03. Heuristic Rules
Identifies merchant, date formats, currencies, and item rows with decimal normalization.
EN + IT keywords
04. Human Review
Flags low-confidence tags. Inline editing validates checksum math before persistence.
Checksum verification
05. SQLite Store
Written to indexed expo-sqlite relational tables ready for CSV export.
ACID compliance
src/services/parser/keywords.ts TypeScript 6.0
// Dual vocabulary arrays for English & Italian receipts
export const TOTAL_KEYWORDS = [
  'grand total',
  'total due',
  'amount due',
  'total',
  'totale complessivo',
  'totale finale',
  'importo totale',
  'totale',
];

export const SUBTOTAL_KEYWORDS = [
  'subtotal',
  'sub total',
  'sub-total',
  'totale parziale',
  'subtotale',
  'imponibile',
];

export const TAX_KEYWORDS = [
  'vat', 'tax', 'gst', 'sales tax', 'iva'
];

Core Architectural Decisions

01. On-device OCR over Cloud Vision APIs

Financial privacy is the primary purpose of this project, not an afterthought. Remote vision calls were ruled out by design.

02. Position-and-tap over continuous auto-detection

Continuous edge warping consumes significant CPU and battery. A deliberate user tap is faster, predictable, and battery-friendly.

03. Core React Native Animated instead of Reanimated

Relies on standard React Native Animated primitives to prevent Babel worklet incompatibilities across Expo SDK upgrades.

04. Returns null instead of an AI hallucination

An invented total corrupts tax records. Returning null guarantees the human reviewer confirms ambiguous smudges.

Developer Quickstart

Build locally or test in continuous integration.

Because ML Kit is a native binary module, local execution requires an Expo development build, or you can verify headless via the test scripts.

Local Native Device Build Android / iOS

Clone the repository, install dependencies, and generate the native client with ML Kit linked:

git clone https://github.com/mirconegri/receipt-scanner.git
cd receipt-scanner
npm install

npx expo prebuild
npx expo run:android  # or run:ios with Xcode
Verify Without a Device Headless CI

Validate regex parsers, test SQLite engine scripts, and typecheck without connecting hardware:

# Verify parser with realistic mock OCR samples
npm run verify-parser

# Verify SQLite schema against real local engine
npm run verify-sql

# Run strict TypeScript compiler
npm run typecheck
Project Roadmap
Planned Enhancements & Extensions
Live perspective transform Automated category tagging PDF receipt reports German & Spanish locales

Your finances. Your phone. Nothing else.

Explore the source code on GitHub, verify the offline parser test suites, or contribute new locale dictionaries.