Pull a vision model with Ollama and have it read each screenshot before you file it.
ollama pull qwen2.5vl:3b is a 3.2 GB download;
ollama run qwen2.5vl:3b ./shot.png suggest a filename answers in a sentence. Wrap
that in a folder watcher and naming stops being your job. Nothing is uploaded.
The steps
- Pull a model that can see. A text model cannot do this at all.
ollama pull qwen2.5vl:3bto start — it is the smallest of the family and enough for screenshots, which are mostly text and interface. - Test it on one image. Ollama takes the path as an argument:
ollama run qwen2.5vl:3b ./shot.png what is in this image? - Constrain the answer, or the names are useless. This is the entire
difference between a tidy folder and a worse mess. Ask for exactly what a filename is:
A model asked to "describe the image" will hand you a paragraph.ollama run qwen2.5vl:3b ./shot.png \ "Name this screenshot. Lower case, hyphens, no extension, at most six words, no dates, no quotes. Reply with the name only." - Point a watcher at the folder. Apple's own statement of where to look:
"By default, screenshots save to your desktop with the name 'Screen Shot [date] at [time].'"
A
LaunchAgentwithWatchPathsis the no-dependency way to run your script when something lands there. - Rename and move, never overwrite. Keep a date prefix so the folder still sorts chronologically, and if the target name exists already, add a counter rather than replacing anything. A naming script that can lose a file is not worth running.
Which size to pull
| Tag | Download | Reasonable for |
|---|---|---|
qwen2.5vl:3b | 3.2 GB | Interface screenshots, mostly text |
qwen2.5vl:7b | 6.0 GB | Charts, dense dashboards |
qwen2.5vl:32b | 21 GB | Only if you have the memory spare |
All of them take text and images and carry a 125K context window. Measure the time per image on ten of your own screenshots before pointing anything at a thousand: it depends on the model and the Mac, and anyone quoting you a single number has measured a different machine.
What goes wrong
- Names that are descriptions. "a-screenshot-of-a-web-browser-showing" is what you get without the constraint in step three.
- Screenshots of code. A vision model reads the language and the symbol names and often writes a better filename than you would. Screenshots of a mostly-empty dialog are where it has nothing to work with.
- Two shots of the same screen, thirty seconds apart. They will get names that differ by a word, which is correct and still unhelpful. The date prefix is what separates them.
- The watcher firing mid-write. A screenshot being written is briefly a partial file. Wait for the size to stop changing before reading it.
Why this one is worth keeping local
Not on principle — on content. A screenshot is whatever was on the screen: an invoice, a dashboard with revenue on it, a DM, somebody else's name and address. The folder is a collection of exactly the things you were careful about elsewhere. The repositories that rank for this question all offer "local Ollama or ChatGPT" as a switch, and for this particular folder the switch has an obvious setting.
Nico's showcased version is this job as a kept tool: it looks at the picture, writes the filename you would have written, moves it — and because Nico drives Ollama as well as the coding CLIs, nothing in the loop needs a network.
← All notes