How NameGnome names a photograph
Naming a scanned invoice is a text problem, and a solved one. Naming a photograph is not: there is no text on it, and until recently nothing that ran on a laptop could say what was in the picture in words a person would have chosen. This is what it took, what was measured, and what got thrown away.
Where it started: a decision not to pretend
NameGnome 0.1 named photographs from Vision's scene classifier — roughly
1300 labels, stapled together. You got
IMG_9172 2 people luggage backpack table.png,
which is a list of things detected in a room rather than a description of
anything. Apple's on-device text model could not help: it does not take
images. Vision has no captioning request at all.
So the decision at the time was written down as flatly as it could be:
NameGnome does not describe photographs, and will not claim to.
The number that settled it was a superhero photograph on which the
classifier's best guess, costume, scored
0.007.
The bake-off
227 photographs: 200 COCO validation images, which ship with human-written captions to score against, plus the maker's own collection of pictures the scene-label path had got wrong. Scored by consensus-word containment, then read by hand.
| Candidate | Ground-truth hit | Style | Speed | Download | Outcome |
|---|---|---|---|---|---|
| Scene labels (what 0.1.4 shipped) | 20% | Keywords | — | — | Vision's classifier, ~1300 labels. Not a caption at all. |
| LFM2-VL-450M-8bit | 42% | Short, human | ~1 s | ~0.5 GB | Shipped. |
| SmolVLM2-500M | 56% | Accurate but robotic, long | ~1.3 s | ~1 GB | Scored best. Not shipped. |
| LFM2.5-VL-1.6B-4bit | Best seen | Human but wordier | ~9–11 s | ~1 GB | Too slow for a folder watcher. |
One corpus, one scoring method. Read the rows against each other, not as a general accuracy figure for any of these models.
The most accurate model lost
SmolVLM2-500M scored 56% against the shipped model's 42%. It was rejected anyway, and this is the caption that decided it:
SmolVLM2-500M, 56%
woman in a hospital room holding a baby in a blue blanket
LFM2-VL-450M, 42% — shipped
family in hospital room
The first is more accurate. The second is what a person writes on a photograph — and a filename has to be scannable in a list of two hundred others. Accuracy that arrives in an unscannable sentence loses to a plainer truth. It also halves the download, from about a gigabyte to about 500 MB.
A larger model, LFM2.5-VL-1.6B-4bit, gave the best captions anyone saw and took nine to eleven seconds each. For an app that names files as they land in a folder, that is not a trade — it is a queue.
The negative result: it does not touch documents
The obvious next thought was to let the vision model read receipts too, where OCR sometimes fumbles the total. That did not survive measurement. On 29 receipts with known amounts:
- the shipped model found the amount on 5
- SmolVLM2 found it on 24
- the existing Vision-OCR pipeline — already in the app, no model required — already had the digits on 27
So the vision model does not go near documents. The feature that sounded best is the one the numbers deleted.
Three things the bake-off taught, all measured
Never put an example phrase in the prompt
Given a prompt containing like “child eating pizza in restaurant”, both 450M-class models answered nine unrelated photographs with that exact sentence. Small models copy in-context examples wholesale. Constraints survive; examples do not.
Downscale before inference
Handed full-size iPhone photographs, the 450M model took 48 to 255 seconds per image and started hallucinating “collages”. Downscaled to 1280 px it answers in under two seconds and describes the picture. The bug looked like a model problem and was an input problem.
Greedy decoding, plus a repetition penalty
Greedy for determinism — the same picture must caption identically every run, or a filename becomes a coin toss. The penalty of 1.15 is there because pure greedy locked one real photograph into “pick-up-pick-up-…” for the entire token budget.
What actually runs, and what leaves your Mac
The model is mlx-community/LFM2-VL-450M-8bit,
450M parameters at 8-bit, running through MLX on the GPU. It loads on the
first photograph, unloads after 60 seconds of quiet, and peaks around 1.2 GB
of memory while working. Captions are English only.
It is fetched once from huggingface.co, pinned to an exact commit, with a SHA-256 checksum for every file built into the app — a changed file is rejected, not used. That fetch is a download, not an upload: your pictures are never sent there or anywhere, and your files never leave your Mac. Hugging Face learns what any download tells a server, which is that some computer asked for these public files.
The switch is off until you turn it on, an update never turns it on for you, and Remove download deletes the weights. The privacy page lists everything either app sends.
Questions
Why not ship the most accurate model?
Because a filename's first job is to be scannable in a list. SmolVLM2 scored 56% against 42%, and wrote “woman in a hospital room holding a baby in a blue blanket” where the shipped model wrote “family in hospital room”. The first is more accurate and the second is what a person would have typed. Accuracy that arrives in an unscannable sentence loses to a plainer truth.
What does the 42% actually measure?
Consensus-word containment against human captions, on 227 photographs — 200 COCO validation images that ship with human-written ground truth, plus the maker's own collection of pictures the old scene-label path got wrong. Results were also reviewed by hand. It is one corpus and one scoring method, so read it as a comparison between the four rows and not as a general accuracy figure.
Does the model run on my Mac or in a data centre?
On your Mac, through MLX and Metal. The weights are fetched once from Hugging Face — a download, not an upload — and pinned to an exact commit with a SHA-256 checksum for every file, so a changed file is rejected rather than used. Your pictures are never sent anywhere.
Is it deterministic?
Yes. Greedy decoding at temperature 0.0 with a repetition penalty of 1.15, so the same picture captions identically on every run. That is a property worth having in a filename: re-running the app should not quietly produce a different answer.
Do I have to download it?
No. It is offered on first launch and off until you accept; an update never switches it on for you. Without it, photographs are still named from scene labels and file metadata, which is the 20% row — worse, but not nothing. “Remove download” deletes the weights and frees the space.
What NameGnome does, in full · Changelog · Download NameGnome 0.3.2
LFM2-VL is published by Liquid AI under the LFM Open License v1.0. COCO is used here as a validation corpus only.
More from Tidymill
-
Your next Swiss departure, in the menu bar.
-
Clears the near-identical shots out of your Apple Photos library.