Show HN: OCR Buddy: local browser OCR for code, formulas (LaTeX) and tables OCR Buddy, a free and open-source Chrome extension, provides fully local OCR for code, formulas, and tables using PaddleOCR's PP-OCRv5 on ONNX Runtime Web, ensuring no data leaves the user's machine and eliminating hallucinated text common in generative models. The extension runs entirely in-browser via WebAssembly/WebGPU, supports region, viewport, and full-page capture, and bundles models for offline use. Faithful, fully-local OCR for Chrome. Grab text from anything on screen โ€” a region, the viewport, or a whole scrolling page โ€” code in a paused video, a paragraph in a PDF, a formula, a table. Or turn an entire page into clean Markdown for an LLM. No server. No image ever leaves your machine. No hallucinated text. ๐ŸŒ ocr-buddy.com https://ocr-buddy.com ยท ๐Ÿงฉ Chrome extension Manifest V3 ยท ๐Ÿ”“ Free & open source MIT ยท ๐Ÿ›ก๏ธ 100% local, privacy-first Silent autoplay loops. โ–ถ Watch in High Quality Video: demo 1 ยท demo 2. Modern OCR is dominated by large autoregressive vision-language models. They top the benchmarks โ€” and they invent fluent, plausible, wrong text the moment the pixels get unclear. For most uses that's an annoyance. For code, numbers, prices, IDs, or anything you intend to trust , a confidently-wrong transcription is worse than no transcription at all. Those models are also far too heavy to run in a browser tab. OCR Buddy is built on the opposite bet: faithfulness over fluency, and the whole pipeline on your device. The interesting part is that those two goals don't fight โ€” they point at the same engineering choices. Hallucination in OCR is largely architectural . A generative model predicts the next likely token , so when the image is ambiguous it falls back on its language prior and writes something that reads well but isn't there. The classic OCR family โ€” detection + CTC recognition โ€” has no such prior. It transcribes the glyphs that are actually present and, when it can't, it fails to blanks or low-confidence output. It never makes up a sentence. That family is also small, fast, and runs comfortably in WebAssembly/WebGPU. So: In-browserandno-hallucinationare not a tradeoff. Both constraints select the same stack: PaddleOCR'sPP-OCRv5 Apache-2.0 onONNX Runtime Web. Everything below follows from that one decision. content overlay drag-select a region โ”‚ rect + devicePixelRatio โ–ผ service worker coordinator only โ€” no DOM, no model, no inference โ”‚ captureVisibleTab โ†’ crop on an OffscreenCanvas โ†’ PNG data URL โ–ผ offscreen document cross-origin isolated, WebGPU-capable, long-lived โ””โ”€ PP-OCRv5 + pix2text-mfr for formulas on ONNX Runtime Web โ–ผ side panel crop shown beside the result; low-confidence words flagged A few choices worth calling out, because each solved a concrete problem: The service worker only coordinates. MV3 service workers are ephemeral and have no DOM. The heavy, warm OCR engine lives in an offscreen document โ€” a real page I keep alive, made cross-origin isolated COOP/COEP so it can use SharedArrayBuffer for multi-threaded WASM, with WebGPU as the primary backend. Capture uses Grabbing a frame off a cross-origin video taints the canvas and the read fails. chrome.tabs.captureVisibleTab , not