A local, on-device "screenshot to translate" for macOS

Like the macOS screenshot tool, but instead of saving pixels it translates them.

Highlight any region of your screen and you get that exact spot translated into your own language, live, and entirely on your Mac.

The problem

Copying text out of a document, a conversation, or a PDF and pasting it into a translator is annoying. You switch context constantly, and autodetect gets the language wrong as often as it gets it right. Page-level translation sometimes rewrites or breaks the layout of what I am trying to read. On a lot of sites it does not work reliably at all.

What I always wanted was the macOS screenshot experience. A couple of keystrokes, drag a box around the exact thing on screen, done. But with one difference: the thing I select gets translated into my own language instantly, instead of saved as an image.

So I built exactly that.

The mechanics

The whole flow has two halves, and both are meant to feel native to macOS.

Region selection. Grab any region of the screen, the same interaction as Cmd+Shift+4 for screenshots. A crosshair, you drag a rectangle over the exact pixels you care about, and that is what gets worked on. You select content, not a whole page or a whole app, so there is no ambiguity about what you meant and no risk of the layout being touched.

Local translation with llama.cpp. Once you have selected the region, the captured text is sent straight to a local large language model running on your Mac via llama.cpp. No request ever leaves your machine.

A few steps exist for correction. We send the image to the model, and we also run on-device OCR on the same image. That OCR pass helps steer the final output toward a clean reading, so the result is closer to what you would have typed by hand.

The caption-to-text extraction, pulling the words out of the selected pixels, and the translation itself both run locally, using Gemma through llama.cpp. The model is good enough for this to be an instant, useful, everyday translation. Because it is local, that captured screen content is private by construction.

Speed. The model is warmed up the moment region selection is reactivated, so by the time you actually send it, the model is already loaded and ready. The wait you feel shrinks to almost nothing.

Why local models matter here

A translation tool that screenshots parts of your screen is literally in the business of looking at your screen. That is a lot of trust to hand to a cloud service. It is also a lot of unnecessary round-trips when the whole job fits comfortably on a modern Mac.

Running it locally with llama.cpp and Gemma means:

The shift from translating by sending your screen to someone else's server, to translating one region on your own silicon, is the kind of thing that was impractical a few years ago and totally reasonable now.

See it and run it

The working prototype is up on GitHub. Grab the code and try it for yourself: github.com/kivS/live-translatator.