RepoPilot

JaidedAI/EasyOCR

Ready-to-use OCR with 80+ supported languages and all popular writing scripts including Latin, Chinese, Arabic, Devanagari, Cyrillic and etc.

Healthy

Healthy across all four use cases

HealthyDependency

Permissive license, no critical CVEs, actively maintained — safe to depend on.

HealthyFork & modify

Has a license, tests, and CI — clean foundation to fork and modify.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture — runnable as-is.

  • Slowing — last commit 5mo ago
  • No CI workflows detected
  • Last commit 5mo ago
  • 28+ active contributors
  • Distributed ownership (top contributor 30% of recent commits)
  • Apache-2.0 licensed
  • Tests present

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/jaidedai/easyocr)](https://repopilot.app/r/jaidedai/easyocr)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/jaidedai/easyocr on X, Slack, or LinkedIn.

Ask AI about jaidedai/easyocr

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: JaidedAI/EasyOCR

Generated by RepoPilot · 2026-06-19 · Source

🎯Verdict

GO — Healthy across all four use cases

  • Last commit 5mo ago
  • 28+ active contributors
  • Distributed ownership (top contributor 30% of recent commits)
  • Apache-2.0 licensed
  • Tests present
  • ⚠ Slowing — last commit 5mo ago
  • ⚠ No CI workflows detected

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

EasyOCR is a production-ready optical character recognition library that detects and recognizes text in 80+ languages across Latin, Chinese, Arabic, Devanagari, Cyrillic and other writing systems. It uses DBNet (a differentiable binarization network) for text detection combined with a recognition model, exposing a simple Python API that returns bounding boxes, recognized text, and confidence scores per detected region. Monolithic architecture with DBNet detection engine in easyocr/DBNet/ containing backbones (ResNet, MobileNetV3), decoders (segmentation detectors, loss functions), and custom CUDA ops (deformable convolutions). Core entry point in easyocr/init.py wraps the detection+recognition pipeline. Character sets for 80+ languages live in easyocr/character/ directory as individual text files.

👥Who it's for

Computer vision engineers and application developers who need to extract text from images in multiple languages without building custom detection/recognition pipelines. Users range from document digitization teams to developers building multilingual document processing applications.

🌱Maturity & risk

Production-ready and actively maintained. Version 1.7.2 released September 2024 with ongoing compatibility fixes. The codebase shows 633k lines of Python plus substantial C++/CUDA optimization code, indicating mature optimization efforts. Large dependency ecosystem (torch, torchvision, opencv) suggests integration with proven deep learning infrastructure.

Moderate risk factors: heavyweight dependencies on PyTorch and torchvision (which carry their own version constraints and CUDA compatibility issues), requires pre-trained model downloads at runtime (network/storage dependency), and limited visibility into test coverage from file structure alone. Last update was September 2024, so current, but the monolithic architecture makes targeted updates difficult.

Active areas of work

Recent activity focused on compatibility fixes (v1.7.2, September 2024). Roadmap indicates handwritten text support is 'coming next'. DBNet implementation appears complete; active maintenance is stability/compatibility focused rather than feature development.

🚀Get running

git clone https://github.com/JaidedAI/EasyOCR.git
cd EasyOCR
pip install -e .

Then test with: python -c "import easyocr; reader = easyocr.Reader(['en']); print(reader.readtext('image.jpg'))" on any JPEG/PNG image.

Daily commands: The library doesn't have a traditional 'dev server' — it's an importable package. To test locally: python -c "import easyocr; r=easyocr.Reader(['en']); print(r.readtext('path/to/image.jpg'))" (first run downloads ~100MB model files to ~/.EasyOCR/). For development, install with pip install -e . to use local code.

🗺️Map of the codebase

  • easyocr/__init__.py — Main entry point exposing the Reader class and public API—every user starts here
  • easyocr/DBNet/model/detector.py — Core text detection model wrapping DBNet backbone and decoder—fundamental to the detection pipeline
  • easyocr/DBNet/DBNet.py — DBNet implementation orchestrating detection workflow with post-processing and polygon extraction
  • easyocr/DBNet/backbones/resnet.py — ResNet backbone for feature extraction—primary deep learning component used in detection
  • easyocr/DBNet/decoders/seg_detector.py — Segmentation decoder producing probability maps from features—critical for binarization logic
  • easyocr/character — Language character sets (80+ languages)—required for recognition model vocabulary and encoding/decoding

🧩Components & responsibilities

  • Reader (easyocr/init.py) (PyTorch, OpenCV, PIL) — Main user-facing API; orchestrates model loading, preprocessing, detection, and recognition; caches models and manages language selection
    • Failure mode: Model download failure, OOM on large batches, invalid language code → user-facing errors or graceful fallback
  • DBNet Detector (easyocr/DBNet/) — Text detection pipeline: accepts image, runs backbone + decoder, extracts text regions as

🛠️How to make changes

Add Support for a New Language

  1. Create a new character set file for the language with one character per line (easyocr/character/{lang_code}_char.txt)
  2. Train or obtain a pretrained recognition model and place in model cache directory (easyocr/__init__.py (Reader class loads models by language code))
  3. Update Reader initialization to reference the new language code in the supported languages list (easyocr/__init__.py)

Replace Detection Backbone with Custom Model

  1. Implement new backbone class inheriting from the existing ResNet/MobileNetV3 pattern (easyocr/DBNet/backbones/{model_name}.py)
  2. Register the backbone in the constructor factory (easyocr/DBNet/model/constructor.py)
  3. Update DBNet_inference.yaml to reference the new backbone architecture (easyocr/DBNet/configs/DBNet_inference.yaml)

Implement Custom Loss Function for Detection Training

  1. Create new loss module with forward() method computing loss from predictions and targets (easyocr/DBNet/decoders/{loss_name}.py)
  2. Register loss in seg_detector_loss.py or model training script (easyocr/DBNet/decoders/seg_detector_loss.py)

Add Post-Processing Step for Detection Output

  1. Implement post-processing logic in the detection pipeline (easyocr/DBNet/decoders/simple_detection.py)
  2. Integrate call to new post-processing in DBNet.py forward or output method (easyocr/DBNet/DBNet.py)

🔧Why these technologies

  • PyTorch + TorchVision — Industry-standard deep learning framework for building and running CNN-based detection and recognition models with GPU acceleration
  • OpenCV (opencv-python-headless) — Efficient image preprocessing, geometric transformations, and polygon operations for text region extraction
  • DBNet (Deformable Convolutional Networks) — State-of-the-art text detection architecture with spatial deformability for handling varied text shapes and orientations
  • Deformable Convolutions (DCN) — Enables model to adaptively learn spatial sampling grids for irregular text geometry; includes optimized CUDA kernels for GPU inference
  • YAML config — Declarative model architecture and hyperparameter specification for reproducible inference pipelines

⚖️Trade-offs already made

  • Single unified Reader class handling both detection and recognition

    • Why: Simplifies user API and internal state management; users call one method to get end-to-end results
    • Consequence: Harder to swap only detection or recognition without subclassing; less modular for advanced users
  • Pre-trained model weights downloaded at runtime into cache

    • Why: Reduces package size and allows lazy loading of only requested languages
    • Consequence: First-run latency; requires internet access for model download; cache management burden on users
  • Language character sets stored as flat text files

    • Why: Simple, human-readable, language-agnostic; easy to extend to new languages
    • Consequence: Linear lookup time for character mapping; no compression or indexing optimization
  • CPU + CUDA dual implementation of DCN operations

    • Why: Supports both GPU and CPU inference paths without runtime overhead
    • Consequence: Code duplication and maintenance burden for two separate implementations

🚫Non-goals (don't propose these)

  • Real-time video OCR streaming (frame-by-frame optimization)
  • On-device model quantization or pruning (not built-in)
  • Active learning or online training (inference-only library)
  • Document segmentation or layout analysis (text region detection only)
  • Handwriting vs. print classification (treats all as general text)
  • License plate or document ID recognition (generic text recognition)

🪤Traps & gotchas

DBNet custom CUDA ops (deformable convolutions) require compilation with a matching PyTorch/CUDA version — mismatches cause silent fallback to CPU with 10-50x slowdown. Model files auto-download to ~/.EasyOCR/ on first run; no way to pre-stage them, causing failures in offline environments. Language codes like 'ch_sim' (simplified Chinese) vs 'ch_tra' (traditional) are case-sensitive and must match easyocr/character/ file names exactly. The library uses python-bidi for right-to-left text but doesn't document language-specific preprocessing requirements (e.g., some scripts need diacritic normalization).

🏗️Architecture

💡Concepts to learn

  • Differentiable Binarization (DBNet) — Core algorithm enabling EasyOCR's text detection; converts continuous segmentation maps to binary text masks without discretization, allowing end-to-end training.
  • Deformable Convolutions (DCN) — Custom CUDA ops in easyocr/DBNet/assets/ops/dcn/ adapt convolutional kernels to irregular text shapes (rotated, curved, skewed); critical for handling diverse writing systems.
  • Segmentation-based Detection vs Region-based Detection — EasyOCR uses dense pixel-level segmentation (DBNet) rather than bounding box regression (Faster R-CNN); better for touching or overlapping characters across languages.
  • Polygon Post-processing with Pyclipper — Converts raw segmentation masks to accurate polygon bounding boxes using Vatti clipping algorithm; visible in easyocr/DBNet/decoders/seg_detector.py and required for rotated text.
  • Balance Cross Entropy Loss — Custom loss function in easyocr/DBNet/decoders/balance_cross_entropy_loss.py handles class imbalance (most pixels are non-text); required for stable detection training.
  • Bidirectional Text (BiDi) Handling — python-bidi dependency handles right-to-left scripts (Arabic, Hebrew); essential for correct character ordering in recognition output, non-trivial in multilingual pipelines.
  • Model Ensemble via Multiple Backbones — easyocr/DBNet/backbones/resnet.py vs mobilenetv3.py allow speed/accuracy trade-offs; users select based on hardware (ResNet for GPU, MobileNetV3 for edge devices).
  • PaddleOCR/PaddleOCR — Direct competitor offering similar 80+ language OCR, uses PaddlePaddle instead of PyTorch; worth comparing for inference speed and deployment flexibility.
  • CRNN-Seq2Seq-OCR/CRNN_Chinese_Characters_deep_learning — Demonstrates alternative CRNN (Convolutional Recurrent Neural Network) architecture for text recognition that complements EasyOCR's DBNet detection.
  • pytorch/vision — Upstream PyTorch computer vision library; EasyOCR depends on torchvision for backbone models and preprocessing utilities.
  • WeChatOCR/StructOCR — Adds structured document understanding on top of text detection/recognition; natural extension for users who need table/layout parsing.
  • tesseract-ocr/tesseract — Historical OCR predecessor that EasyOCR largely replaces for neural approaches, but still relevant for comparison on memory-constrained or CPU-only deployments.

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive unit tests for DBNet decoders and loss functions

The easyocr/DBNet/decoders/ directory contains critical loss functions (balance_cross_entropy_loss.py, dice_loss.py, l1_loss.py, pss_loss.py, seg_detector_loss.py) and feature modules (feature_attention.py, seg_detector.py, seg_detector_asf.py) that lack visible test coverage. These are core training components that need validation to prevent regressions when updating the detection model. Adding tests would ensure numeric stability, gradient flow correctness, and prevent silent failures in model training pipelines.

  • [ ] Create tests/test_dbnet_losses.py with unit tests for each loss function in easyocr/DBNet/decoders/
  • [ ] Create tests/test_dbnet_decoders.py with tests for seg_detector.py, seg_detector_asf.py, and feature_attention.py modules
  • [ ] Add gradient flow verification tests using torch.autograd.gradcheck for differentiable modules
  • [ ] Test edge cases (zero tensors, single pixel images, batch size variations) for each decoder

Add language character set validation and documentation for easyocr/character/ directory

The repo supports 80+ languages with individual character files (ch_sim_char.txt, ar_char.txt, bn_char.txt, etc.) but lacks validation utilities and documentation explaining character set coverage, encoding, and supported Unicode ranges per language. New contributors cannot easily understand which characters are supported for each language or validate custom character sets. Adding a validation tool and documentation would improve usability and reduce support burden.

  • [ ] Create easyocr/character/validate_charsets.py to verify each language file has valid UTF-8 characters and document Unicode ranges covered
  • [ ] Add easyocr/character/CHARSET_README.md documenting the character coverage, encoding standard, and supported scripts for each language
  • [ ] Create tests/test_character_sets.py to validate all character files are properly formatted and have no duplicates
  • [ ] Add a script to generate a comprehensive character coverage report showing which Unicode blocks are supported per language

Add GitHub Actions CI workflow for testing multi-language OCR inference across supported languages

The repo lacks visible CI/CD workflows to validate that OCR inference actually works across the claimed 80+ languages. Without CI, regressions in model loading, character encoding, or language-specific preprocessing can slip through. Adding a matrix-based GitHub Action that tests inference on a representative sample of languages (Latin, CJK, Arabic, Cyrillic, Devanagari) would catch breakages early and validate the multi-language claim.

  • [ ] Create .github/workflows/test-multilingual-ocr.yml with matrix strategy testing representative languages: 'en', 'ch_sim', 'ar', 'ru', 'hi'
  • [ ] Add test fixtures in tests/fixtures/ with small sample images for each tested language
  • [ ] Implement tests/test_inference_multilang.py with basic inference checks (model loading, output structure validation) for each language
  • [ ] Configure workflow to cache downloaded language models to reduce CI runtime and bandwidth usage

🌿Good first issues

  • Add unit tests for easyocr/DBNet/decoders/seg_detector.py's bounding box post-processing logic — currently no test files visible, making it hard to catch regressions when polygon operations change.
  • Document CUDA version constraints and deformable convolution build failures in a troubleshooting guide (easyocr/DBNet/assets/ops/dcn/ has no README despite being complex C++/CUDA) — new contributors hit this silently.
  • Add language-specific character normalization helpers for scripts like Arabic and Devanagari that require preprocessing — currently character/ady_char.txt, character/abq_char.txt exist but no normalization pipeline for non-Latin scripts.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 363afb1 — Update README.md (rkcosmos)
  • c4f3cd7 — update v.1.7.2 (rkcosmos)
  • 3d3852d — Merge pull request #1283 from Yepness/master (rkcosmos)
  • 86094d6 — Fix: import get_display (Yepness)
  • c999505 — v1.7.1 (rkcosmos)
  • 325b5ee — Merge pull request #1127 from yasaslive/master (JaidedTeam)
  • 8ced4fc — Merge pull request #1108 from MLDovakin/master (JaidedTeam)
  • 14f1f4e — Merge pull request #1084 from codemurt/add-udmurt-language (JaidedTeam)
  • ff4777f — Merge pull request #1068 from Plyrs1/master (JaidedTeam)
  • 231fdb2 — Merge pull request #964 from snoop2head/master (JaidedTeam)

🔒Security observations

  • High · Unrestricted Git Clone from User-Controlled Source — Dockerfile, line: RUN mkdir "$service_home" && git clone "https://github.com/$gh_username/EasyOCR.git". The Dockerfile accepts a user-supplied GitHub username (gh_username) as a build argument and directly uses it in a git clone command without validation. This allows an attacker to clone arbitrary repositories, potentially injecting malicious code during the build process. Fix: Validate and sanitize the gh_username argument against a whitelist of allowed repositories. Consider using specific commit hashes or tags instead of relying on git pull. Implement image signing and verification.
  • High · Unvalidated Remote Git Pull Operations — Dockerfile, line: git pull upstream master. The Dockerfile performs an unvalidated git pull from the upstream repository (https://github.com/JaidedAI/EasyOCR.git) during image build without verifying commits or using signed tags. This introduces supply chain attack risks. Fix: Replace 'git pull' with a specific release tag or commit hash. Implement GPG signature verification for git commits. Use a fixed, known-good commit hash instead of tracking branch heads.
  • Medium · Missing Security Updates in Base Image — Dockerfile, line: FROM docker.io/pytorch/pytorch. The Dockerfile uses 'pytorch/pytorch' without specifying a version tag, which pulls the latest image. This base image may contain known vulnerabilities, and the dependency versions in the project are not pinned to specific secure versions. Fix: Specify an explicit version tag for the base image (e.g., pytorch/pytorch:2.0.0-cuda11.7-cudnn8-runtime). Pin all dependencies in setup.py/requirements.txt to specific versions that have been security-audited.
  • Medium · Unpinned Dependency Versions — setup.py/requirements.txt dependencies. Dependencies in the package manifest lack version pinning (e.g., 'torch', 'torchvision>=0.5'). This allows installation of potentially vulnerable newer versions without explicit testing. Many dependencies have known CVEs in various versions. Fix: Pin all dependencies to specific tested versions (e.g., 'torch==2.0.0', 'numpy==1.24.3'). Implement automated dependency scanning with tools like Snyk or Dependabot. Regularly update and test against latest security patches.
  • Medium · C/C++ Extension Compilation Without Integrity Checks — Dockerfile line: python setup.py build_ext --inplace -j 4 and easyocr/DBNet/assets/ops/dcn/src/. The Dockerfile builds native C/C++/CUDA extensions (DCN deformable convolutions) during build with 'python setup.py build_ext --inplace -j 4'. The source files (cpp, cu, h) are not signed or verified for integrity. Fix: Verify source file checksums or GPG signatures before compilation. Use static analysis tools like cppcheck or clang-analyzer on C/C++ code. Consider using pre-compiled wheels instead of in-place compilation.
  • Medium · Excessive APT Cleanup May Hide Vulnerabilities — Dockerfile, apt-get operations. While the Dockerfile performs apt cleanup (autoremove, clean, rm -rf /var/lib/apt/lists), this only reduces image size. It does not prevent the installation of potentially vulnerable packages in the earlier apt-get install step. Fix: Use 'apt-get install --no-install-recommends' and scan installed packages with tools like Trivy before cleanup. Implement multi-stage builds to exclude dev dependencies from final image.
  • Low · Missing Docker Security Best Practices — Dockerfile, missing USER directive and security options. The Dockerfile does not enforce non-root user execution, missing security capabilities dropping, or other hardening measures. Fix: Add 'USER nobody' or create a dedicated non-root user. Use '--cap-drop=ALL' and add back only required capabilities. Consider read-only root filesystem where possible. Use HEALTHCHECK directive.
  • Low · No Input Validation on Language/Character Files — undefined. The codebase loads numerous character definition files (80+ language files in easyocr/character/) Fix: undefined

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/JaidedAI/EasyOCR shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live JaidedAI/EasyOCR repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/JaidedAI/EasyOCR.

What it runs against: a local clone of JaidedAI/EasyOCR — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in JaidedAI/EasyOCR | Confirms the artifact applies here, not a fork | | 2 | License is still Apache-2.0 | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 185 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>JaidedAI/EasyOCR</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of JaidedAI/EasyOCR. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/JaidedAI/EasyOCR.git
#   cd EasyOCR
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of JaidedAI/EasyOCR and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "JaidedAI/EasyOCR(\\.git)?\\b" \\
  && ok "origin remote is JaidedAI/EasyOCR" \\
  || miss "origin remote is not JaidedAI/EasyOCR (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is Apache-2.0" \\
  || miss "license drift — was Apache-2.0 at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "easyocr/__init__.py" \\
  && ok "easyocr/__init__.py" \\
  || miss "missing critical file: easyocr/__init__.py"
test -f "easyocr/DBNet/model/detector.py" \\
  && ok "easyocr/DBNet/model/detector.py" \\
  || miss "missing critical file: easyocr/DBNet/model/detector.py"
test -f "easyocr/DBNet/DBNet.py" \\
  && ok "easyocr/DBNet/DBNet.py" \\
  || miss "missing critical file: easyocr/DBNet/DBNet.py"
test -f "easyocr/DBNet/backbones/resnet.py" \\
  && ok "easyocr/DBNet/backbones/resnet.py" \\
  || miss "missing critical file: easyocr/DBNet/backbones/resnet.py"
test -f "easyocr/DBNet/decoders/seg_detector.py" \\
  && ok "easyocr/DBNet/decoders/seg_detector.py" \\
  || miss "missing critical file: easyocr/DBNet/decoders/seg_detector.py"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 185 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~155d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/JaidedAI/EasyOCR"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/jaidedai/easyocr"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>