dsh-maclens ๐๐
> Apple's on-device Vision framework, bridged into DeepSeek Harness (dsh) as local tools: OCR, image classification, face detection, document layout, and a combined read โ 100% offline, no API key, no daemon.
| ๐ Privacy | Every pixel stays on your Mac. No network, no upload, no telemetry. |
| โก Speed | Sub-second OCR on typical screenshots (Neural Engine). |
| ๐จ๐ณ Languages | zh-Hans + 30+ recognition languages out of the box. |
| ๐ผ๏ธ Tall images | slice splits long screenshots so small text survives Vision's downscale. |
| ๐งฉ No deps | Swift CLI ships in the npm package โ no build step to install. |
---
๐ค For humans โ quick start (30 seconds)
# 1. Install into your dsh profile
dsh plugin --profile desktop add dsh-maclens
# 2. Restart DSH. Then just ask the model:
# "OCR this screenshot: /Users/me/Desktop/shot.png"The five tools the model can call:
| Tool | One-liner |
|---|---|
maclens_ocr | "Read all the text in this image" โ every line + confidence + box |
maclens_classify | "What kind of image is this?" โ document, chart, photo, โฆ |
maclens_faces | "Are there people in this image?" โ face boxes + count |
maclens_document | "Parse this page" โ OCR + left/right column layout |
maclens_describe | "Give me everything at once" โ OCR + classify + faces + layout |
When to pick maclens vs a VLM: maclens is a CV toolkit โ it transcribes, classifies, detects but does not narrate "what this image is about". Need open-ended understanding? Pair it with a VLM bridge (e.g. modlens + qwen-vl). Need fast, free, private OCR/detection? maclens.
---
๐ค For agents โ precise contract
TL;DR
Plugin: dsh-maclens (npm), installs with dsh plugin add
Runtime: macOS 14+ with Xcode Command Line Tools (Swift 6+)
Tools: maclens_ocr | maclens_classify | maclens_faces | maclens_document | maclens_describe
Input: absolute local image path (string) โ required on every tool
Output: one JSON object on stdout; {"error": "..."} + exit 1 on failure
Binary: bin/maclens in the package (auto-chmod'd), else MACLENS_BIN, else PATH
No network: the CLI makes zero network requestsInstall (exact commands)
# From npm โ includes the prebuilt binary, no build step:
dsh plugin --profile desktop add dsh-maclens
# From a git checkout โ build the Swift bridge first:
cd dsh-maclens && bash scripts/build.sh # produces bin/maclens
dsh plugin --profile desktop add ./dsh-maclensBinary resolution order: bin/maclens in the package โ $MACLENS_BIN โ swift/.build/release/MaclensBridge โ maclens on PATH. The plugin chmods the found binary to 0755 at resolve time (npm tarballs drop the exec bit).
Tool schemas
All five tools take path (required, string). OCR-family tools additionally accept:
| Field | Type | Default | Meaning |
|---|---|---|---|
languages | string | zh-Hans,en-US | Comma-separated recognition languages |
maxLines | number | โ | Cap returned OCR lines (large screenshots) |
slice | boolean | false | Slice tall images into overlapping strips |
sliceHeight | number | 4096 | Strip height in px when slicing |
top | number | 5 | Classify only: how many categories to return |
Output contract
maclens_ocr returns:
{
"task": "ocr",
"language": ["zh-Hans", "en-US"],
"full_text": "่ทจๅขๅข้ฟ็ ็ฉถๅฎค\nไปไธไธช้ฎ้ข๏ผๆต่พพไธไธชๅณๅฎใ",
"lines": [
{
"text": "่ทจๅขๅข้ฟ็ ็ฉถๅฎค",
"confidence": 1.0,
"bbox": { "x": 0.055, "y": 0.519, "width": 0.517, "height": 0.144 }
}
],
"line_count": 2,
"truncated": false,
"sliced": false
}bboxis normalized (0โ1), origin top-left (converted from Vision's bottom-left so it is intuitive).- With
slice: true, tall images are split into overlapping strips, each strip OCR'd, results stitched back to whole-image coordinates, and duplicate lines in the overlap band de-duplicated. Output adds"sliced": trueand"slice_count": N. maclens_document=ocr+layout.columns(left/right) +layout.image_dimensions.maclens_describe=ocr+classification.observations+faces+layout.maclens_facesโfaces[]+face_count;maclens_classifyโobservations[](identifier,confidence).
Error contract
| Exit | Meaning |
|---|---|
| 0 | Success |
| 1 | Runtime error โ stdout is {"error": "..."} (e.g. file does not exist: <path>) |
| 2 | Usage / unknown task โ stdout is {"error": "usage: ..."} |
Raw CLI (for testing outside dsh)
bin/maclens ocr --image /path/to/img.png
bin/maclens classify --image /path/to/img.png --top 3
bin/maclens faces --image /path/to/img.png
bin/maclens document --image /path/to/img.png --slice
bin/maclens describe --image /path/to/img.png --slice --top 2---
๐๏ธ How it works
dsh (text-only model)
โโ maclens_* tools (lib/index.js)
โโ bin/maclens (Swift CLI, spawned per call โ no daemon, no ports)
โโ Apple Vision: VNRecognizeTextRequest / VNClassifyImageRequest /
VNDetectFaceRectanglesRequest โ on-device, offline๐งช Development
cd swift && swift build -c release
swift test --package-path swift # 6 behavioral testsCI (GitHub Actions): Swift release build + smoke tests on macOS, plugin-load + pack-contents check on Ubuntu. All green on main.
๐ Docs
- [
AGENTS.md](AGENTS.md) โ the agent-facing quick reference (mirrors this section). - [
CHANGELOG.md](CHANGELOG.md) โ version history. - [
SECURITY.md](SECURITY.md) โ security model & reporting.
License
MIT โ see [LICENSE](LICENSE).