---
title: "Powerful OCR CLI for Images and Scanned Documents"
url: https://stacklist.com/card/0799fb81-2973-4fed-8cd0-16976489a8c4
source_url: "https://x.com/privatenumbr/status/2065818889213407239?s=12&t=XbHIyGOIRcX87MtXr6jNHQ"
stack: https://stacklist.com/stack/c72111b0-4443-4bd1-9ec1-2bff45866298
summary: "Private Number Status Update announces a powerful OCR CLI tool that leverages Apple's Vision Framework for local processing of images with text and scanned documents. The tool can be used with agents to reduce vision token consumption via the command npx mac-ocr ./image.png."
tags: "ocr, cli-tool, vision-framework, mac-ocr, document-scanning, text-extraction, developer-tool"
key_entities: "Hiroki Osame (person), mac-ocr (technology), Apple Vision Framework (technology), OCR (technology), vision tokens (concept)"
classification: "snippet"
content_hash: "sha256:98b84f717e3688194f2462eea76e6ae700dbca65a95fa6aab4106295d4e35cc0"
acp_version: "0.2"
token_counts_approximate: 628
visibility: public
agent_accessible: true
status: "final"
---

# Powerful OCR CLI for Images and Scanned Documents

Hiroki Osame @privatenumbr If you work with images with text, or scanned documents, here&#x27;s a small but powerful OCR CLI It leverages Apple&#x27;s Vision Framework so it&#x27;s completely local Tip: give it to your agent to save on vision tokens! → npx mac-ocr ./image.png github.com/privatenumber/… 3:29 PM · Jun 13, 2026 29.4K Views :host{display:inline-block;direction:ltr;white-space:nowrap;line-height:var(--number-flow-char-height, 1em) !important}span{display:inline-block}:host([data-will-change]) span{will-change:transform}.number,.digit{padding:round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) 0}.symbol{white-space:pre} 8 number-flow-react > span{font-kerning:none;display:inline-block;line-height:var(--number-flow-char-height, 1em) !important;padding:calc(round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) * 2) 0} 8 :host{display:inline-block;direction:ltr;white-space:nowrap;line-height:var(--number-flow-char-height, 1em) !important}span{display:inline-block}:host([data-will-change]) span{will-change:transform}.number,.digit{padding:round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) 0}.symbol{white-space:pre} 2 5 number-flow-react > span{font-kerning:none;display:inline-block;line-height:var(--number-flow-char-height, 1em) !important;padding:calc(round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) * 2) 0} 25 :host{display:inline-block;direction:ltr;white-space:nowrap;line-height:var(--number-flow-char-height, 1em) !important}span{display:inline-block}:host([data-will-change]) span{will-change:transform}.number,.digit{padding:round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) 0}.symbol{white-space:pre} 3 9 9 number-flow-react > span{font-kerning:none;display:inline-block;line-height:var(--number-flow-char-height, 1em) !important;padding:calc(round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) * 2) 0} 399 :host{display:inline-block;direction:ltr;white-space:nowrap;line-height:var(--number-flow-char-height, 1em) !important}span{display:inline-block}:host([data-will-change]) span{will-change:transform}.number,.digit{padding:round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) 0}.symbol{white-space:pre} 6 0 5 number-flow-react > span{font-kerning:none;display:inline-block;line-height:var(--number-flow-char-height, 1em) !important;padding:calc(round(nearest, calc(var(--number-flow-mask-height, 0.25em) / 2), 1px) * 2) 0} 605 Read 8 replies
