Instant, in-memory screen OCR, QR code, and barcode scanner for macOS. A fast, 100% offline, open-source TextSniper alternative powered by Apple Vision.
See the code
Instant, in-memory screen OCR, QR code, and barcode recognition for macOS.
Zero temporary files. Zero network calls. Under 50ms on Apple Silicon.
Most screen OCR utilities on macOS work by spawning a screenshot to /tmp, reading the .png file back from disk, and deleting it afterward. On modern macOS, writing an image file to disk immediately wakes up Spotlight (mdwrite) and MADService media analysis daemons, which can stall the capture pipeline for several seconds.
Byakugan Scan skips the filesystem entirely:
SelectionOverlayController) lets you drag a selection rectangle across any display.NSPasteboard memory (/usr/sbin/screencapture -c -x -R<x,y,w,h>) and converted into a CGImage buffer in RAM.VNRecognizeTextRequest / VNDetectBarcodesRequest) runs directly on the Neural Engine and copies the result to your clipboard.CGPreflightScreenCaptureAccess()—never CGWindowListCreateImage—so macOS never traps you in recurring permission prompt loops.The entire app has no network client entitlements, no analytics SDKs, and no external Swift package dependencies.
brew install --cask halcyon-past/tap/byakugan-scan
To upgrade later:
brew upgrade --cask byakugan-scan
Download ByakuganScan.dmg from the latest release, drag Byakugan Scan.app to /Applications, and grant Screen Recording access in System Settings → Privacy & Security → Screen Recording.
Byakugan Scan runs in the macOS menu bar. Trigger a scan from anywhere using global hotkeys (all customizable in Settings (⌘,) → Shortcuts):
| Mode | Default Shortcut | What it does |
|---|---|---|
| Capture Text (OCR) | ⌘ ⇧ 2 | Extracts unselectable text from videos, slides, PDFs, or images into your clipboard |
| Scan QR Code | ⌘ ⇧ 3 | Decodes QR and MicroQR payloads on screen (with one-click Open / Mail / Call actions) |
| Scan Barcode | ⌘ ⇧ 4 | Decodes EAN-8/13, UPC-E, Code 128/39/93, PDF417, Aztec, Data Matrix, and ITF-14 |
| Cancel Selection | Esc | Dismisses the selection overlay without touching your clipboard |
byakugan://)You can trigger Byakugan Scan from Raycast, Alfred, BetterTouchTool, Stream Deck, or macOS Shortcuts without simulating keystrokes:
open "byakugan://scan?mode=text"
open "byakugan://scan?mode=qr"
open "byakugan://scan?mode=barcode"
open "byakugan://scan?mode=last" # Re-copies the most recent scan result
open "byakugan://settings" # Opens the Settings window
open "byakugan://history" # Opens the menu bar popover to History
Byakugan Violet, Tenseigan Cyan, Sharingan Crimson, Sage Emerald, or Nine-Tails Amber) and backdrop dimming opacity (10%–80%), with a live preview in Settings.Open URL, Send Email, Call Number) without cluttering Notification Center.| Col 1 | Col 2 |) or RFC 4180 CSV for instant pasting into spreadsheet apps.super-\ncomputer → supercomputer) while preserving intentional compound words, dashes, subtraction operators, and markdown lists.~/Library/Application Support/ByakuganScan/history.json with category filters (Text, QR, Barcode, Starred) and pinning.Requires macOS 14.0+, Xcode 15+ / Swift 6, and XcodeGen (brew install xcodegen).
git clone https://github.com/halcyon-past/byakugan-scan.git
cd byakugan-scan
# Build and codesign the app bundle
./scripts/build_app.sh
open "build/Byakugan Scan.app"
# Run the Swift unit test suite & Next.js website build check
./scripts/run_tests.sh
Byakugan Scan includes an isolated Development environment for instant local testing without having to download release DMGs or alter your daily production setup:
| Environment | Menu Bar Icon | App Name | Bundle ID | Isolated Storage |
|---|---|---|---|---|
| Production | [👁️] | Byakugan Scan.app | cloud.aritro.byakugan-scan | Standard UserDefaults & ByakuganScan/history.json |
| Development | [👁️ DEV] | Byakugan Scan Dev.app | cloud.aritro.byakugan-scan.dev | Dev UserDefaults & ByakuganScanDev/history.json |
Quick switching between environments:
🔨 To Dev (when in Prod) or ⇄ To Prod (when in Dev) in the popover footer../scripts/switch_to_dev.sh # Terminates Prod and launches Dev (with [👁️ DEV] icon)
./scripts/switch_to_prod.sh # Terminates Dev and restores Prod (with [👁️] icon)
Global hotkeys (⌥2, etc.) transfer cleanly to the active environment with zero conflict.
Note on TCC permissions when building locally:
scripts/build_app.shsigns the bundle with a stable designated requirement (designated => identifier "cloud.aritro.byakugan-scan") andscripts/build_dev.shsigns with (designated => identifier "cloud.aritro.byakugan-scan.dev") so rebuilding locally never resets your macOS Screen Recording permissions. If macOS ever caches a stale signature, reset it with:tccutil reset ScreenCapture cloud.aritro.byakugan-scan
ByakuganScan/
├── App/ # App entry point, menu bar NSStatusItem, hotkey lifecycle
├── Core/
│ ├── Models/ # ScanResult, AppSettings, ThemeAccent, SoundEffect, FeedbackStyle, TableFormat
│ ├── Services/ # OCRService, TableFormatter, BarcodeService, ScreenCaptureService, HotkeyService,
│ │ # ClipboardService, HistoryService, UpdateService, URLRouteService
│ └── Extensions/ # String formatting/regex helpers & NSImage utilities
├── Features/
│ ├── Home/ # Dashboard window
│ ├── Settings/ # 6-tab Settings window (General, Shortcuts, OCR, Clipboard, Appearance, About)
│ └── Legal/ # In-app Privacy Policy & Terms of Service views
└── Shared/
├── Components/ # SelectionOverlayController, FloatingHUDController, MenuBarPopoverView
└── Constants/ # AppConstants
Tests/ # Zero-dependency Swift test runner (RunAllTests.swift)
website/ # Next.js 15 site for byakugan-scan.aritro.cloud
Casks/ # Homebrew Cask definition synced to halcyon-past/homebrew-tap
scripts/ # Build, DMG packaging, test runner, and release automation scripts
Pull requests should target the dev branch using the branch naming convention feature/dev/<short-name> or hotfix/<short-name>. Before opening a PR, make sure ./scripts/run_tests.sh passes cleanly. See CONTRIBUTING.md for details.
MIT © Aritro Saha
Instant, in-memory screen OCR, QR code, and barcode scanner for macOS. A fast, 100% offline, open-source TextSniper alternative powered by Apple Vision.
See the code
Instant, in-memory screen OCR, QR code, and barcode recognition for macOS.
Zero temporary files. Zero network calls. Under 50ms on Apple Silicon.
Most screen OCR utilities on macOS work by spawning a screenshot to /tmp, reading the .png file back from disk, and deleting it afterward. On modern macOS, writing an image file to disk immediately wakes up Spotlight (mdwrite) and MADService media analysis daemons, which can stall the capture pipeline for several seconds.
Byakugan Scan skips the filesystem entirely:
SelectionOverlayController) lets you drag a selection rectangle across any display.NSPasteboard memory (/usr/sbin/screencapture -c -x -R<x,y,w,h>) and converted into a CGImage buffer in RAM.VNRecognizeTextRequest / VNDetectBarcodesRequest) runs directly on the Neural Engine and copies the result to your clipboard.CGPreflightScreenCaptureAccess()—never CGWindowListCreateImage—so macOS never traps you in recurring permission prompt loops.The entire app has no network client entitlements, no analytics SDKs, and no external Swift package dependencies.
brew install --cask halcyon-past/tap/byakugan-scan
To upgrade later:
brew upgrade --cask byakugan-scan
Download ByakuganScan.dmg from the latest release, drag Byakugan Scan.app to /Applications, and grant Screen Recording access in System Settings → Privacy & Security → Screen Recording.
Byakugan Scan runs in the macOS menu bar. Trigger a scan from anywhere using global hotkeys (all customizable in Settings (⌘,) → Shortcuts):
| Mode | Default Shortcut | What it does |
|---|---|---|
| Capture Text (OCR) | ⌘ ⇧ 2 | Extracts unselectable text from videos, slides, PDFs, or images into your clipboard |
| Scan QR Code | ⌘ ⇧ 3 | Decodes QR and MicroQR payloads on screen (with one-click Open / Mail / Call actions) |
| Scan Barcode | ⌘ ⇧ 4 | Decodes EAN-8/13, UPC-E, Code 128/39/93, PDF417, Aztec, Data Matrix, and ITF-14 |
| Cancel Selection | Esc | Dismisses the selection overlay without touching your clipboard |
byakugan://)You can trigger Byakugan Scan from Raycast, Alfred, BetterTouchTool, Stream Deck, or macOS Shortcuts without simulating keystrokes:
open "byakugan://scan?mode=text"
open "byakugan://scan?mode=qr"
open "byakugan://scan?mode=barcode"
open "byakugan://scan?mode=last" # Re-copies the most recent scan result
open "byakugan://settings" # Opens the Settings window
open "byakugan://history" # Opens the menu bar popover to History
Byakugan Violet, Tenseigan Cyan, Sharingan Crimson, Sage Emerald, or Nine-Tails Amber) and backdrop dimming opacity (10%–80%), with a live preview in Settings.Open URL, Send Email, Call Number) without cluttering Notification Center.| Col 1 | Col 2 |) or RFC 4180 CSV for instant pasting into spreadsheet apps.super-\ncomputer → supercomputer) while preserving intentional compound words, dashes, subtraction operators, and markdown lists.~/Library/Application Support/ByakuganScan/history.json with category filters (Text, QR, Barcode, Starred) and pinning.Requires macOS 14.0+, Xcode 15+ / Swift 6, and XcodeGen (brew install xcodegen).
git clone https://github.com/halcyon-past/byakugan-scan.git
cd byakugan-scan
# Build and codesign the app bundle
./scripts/build_app.sh
open "build/Byakugan Scan.app"
# Run the Swift unit test suite & Next.js website build check
./scripts/run_tests.sh
Byakugan Scan includes an isolated Development environment for instant local testing without having to download release DMGs or alter your daily production setup:
| Environment | Menu Bar Icon | App Name | Bundle ID | Isolated Storage |
|---|---|---|---|---|
| Production | [👁️] | Byakugan Scan.app | cloud.aritro.byakugan-scan | Standard UserDefaults & ByakuganScan/history.json |
| Development | [👁️ DEV] | Byakugan Scan Dev.app | cloud.aritro.byakugan-scan.dev | Dev UserDefaults & ByakuganScanDev/history.json |
Quick switching between environments:
🔨 To Dev (when in Prod) or ⇄ To Prod (when in Dev) in the popover footer../scripts/switch_to_dev.sh # Terminates Prod and launches Dev (with [👁️ DEV] icon)
./scripts/switch_to_prod.sh # Terminates Dev and restores Prod (with [👁️] icon)
Global hotkeys (⌥2, etc.) transfer cleanly to the active environment with zero conflict.
Note on TCC permissions when building locally:
scripts/build_app.shsigns the bundle with a stable designated requirement (designated => identifier "cloud.aritro.byakugan-scan") andscripts/build_dev.shsigns with (designated => identifier "cloud.aritro.byakugan-scan.dev") so rebuilding locally never resets your macOS Screen Recording permissions. If macOS ever caches a stale signature, reset it with:tccutil reset ScreenCapture cloud.aritro.byakugan-scan
ByakuganScan/
├── App/ # App entry point, menu bar NSStatusItem, hotkey lifecycle
├── Core/
│ ├── Models/ # ScanResult, AppSettings, ThemeAccent, SoundEffect, FeedbackStyle, TableFormat
│ ├── Services/ # OCRService, TableFormatter, BarcodeService, ScreenCaptureService, HotkeyService,
│ │ # ClipboardService, HistoryService, UpdateService, URLRouteService
│ └── Extensions/ # String formatting/regex helpers & NSImage utilities
├── Features/
│ ├── Home/ # Dashboard window
│ ├── Settings/ # 6-tab Settings window (General, Shortcuts, OCR, Clipboard, Appearance, About)
│ └── Legal/ # In-app Privacy Policy & Terms of Service views
└── Shared/
├── Components/ # SelectionOverlayController, FloatingHUDController, MenuBarPopoverView
└── Constants/ # AppConstants
Tests/ # Zero-dependency Swift test runner (RunAllTests.swift)
website/ # Next.js 15 site for byakugan-scan.aritro.cloud
Casks/ # Homebrew Cask definition synced to halcyon-past/homebrew-tap
scripts/ # Build, DMG packaging, test runner, and release automation scripts
Pull requests should target the dev branch using the branch naming convention feature/dev/<short-name> or hotfix/<short-name>. Before opening a PR, make sure ./scripts/run_tests.sh passes cleanly. See CONTRIBUTING.md for details.
MIT © Aritro Saha