Eagle ML Plugins
Three plugins that add an advanced semantic layer to a 15,000-image reference library.
- Personal tool
- Used daily
- 2026
- Concept, ML design, backend, plugin UI
- Solo builder
- Personal tool
- More than 50 hours of image categorization saved in 2 months after plugins creation
- Up to 100 images rated per minute
- Around 80% of predictions accepted
- Eagle API · CLIP · Python · Flask · NumPy · scikit-learn · HDBSCAN
Context
Design work generates a constant stream of reference imagery: inspirational images, screenshots, saved posts, competitor work, client references, photoshoot exports. Once that library passes a few thousand items, two things break at once.
Filing becomes inconsistent, because tagging every new image correctly takes time nobody has, so it gets skipped and the library turns into a junk drawer. And rating, separating "strong reference" from "noise" so future retrieval works, never happens, because doing it one image at a time with a mouse does not scale to a backlog.
Eagle already handled storage, browsing, folders and tags well. The gap was semantic and faster input options.
Constraint
Three constraints shaped every decision. It had to run entirely locally, for speed, and to avoid unnecessary commercial API cost each time whole 15.000+ library need to be analyzed again . It had to work on an existing, unlabelled library from day one. And it had to be fast enough to actually get used, which for the rating problem meant closer to machine-gun speed than to a review interface.
What I made
Two plugins interfaces, both sharing the same indexes and Python backend.
The user flow stays simple:
Select images → receive ranked destinations → adjust threshold → approve suggestions.
Image Classifier: where does this belong?
Select images, get ranked suggestions for existing folders and tags. Every folder and tag with enough sample images gets a mean embedding, the normalised average of everything already inside it, and each new image is scored against all of them by cosine similarity.
Nothing is auto-applied. Every suggestion is a checkbox.
Target Mode: the inverse question
Point at a folder or tag and search the entire library for images that belong in it but are not in it yet. Useful when starting a mood board, or auditing a folder for gaps.
This needed its own index. The suggestion index stores one vector per folder, enough to score a handful of selected images, useless for searching in the other direction. Target Mode required one embedding per image across the whole library, built incrementally so new images are added, deleted ones dropped, and only genuinely modified files recomputed.
Shooting Stars: rating at keyboard speed
A single full-bleed image, number keys to rate, automatic advance, undo on the usual shortcut, and a filmstrip preloading what is next so there is no dead time between images. A status bar shows progress, rolling average time per rating and an ETA, turning an open-ended chore into something with a visible finish line.
The interesting half is that the model predicts the rating before you give it. As soon as a batch loads, every unrated image gets a predicted score based purely on ratings already given in that session, shown as a confidence badge. Pressing Enter accepts it. Every actual rating recomputes the remaining predictions, so it sharpens as the session runs.
Key decisions
A pretrained embedding space instead of a trained classifier
Every feature here is similarity search and light statistics over CLIP's embedding space, with no training pipeline, no labelled dataset, no GPU cost and no MLOps. Adding one image to a folder immediately improves suggestions for that folder, with no retraining step. Less accurate than a fine-tuned classifier could theoretically be; immediately useful on an existing unlabelled library, which is the constraint that actually mattered.
Blend two prediction strategies rather than pick one
Rating prediction blends k-nearest-neighbours, softmax-weighted over similarity, so the closest neighbours dominate without drowning the rest, with per-star class centroids. Confidence rewards a high top similarity, more rated neighbours, and clear separation between the first and second closest match, because tight consensus among near-duplicates is a stronger signal than one lonely close match.
No server-side threshold
The backend returns the full ranked list and the similarity slider filters client-side. "How strict should suggestions be" stays an interactive question answered instantly, rather than a backend parameter requiring a round trip to change.
Impact
Those plugins run daily against a live library. Rating a backlog went from a task that was permanently deferred to one with a measurable finish line. Sessions can rate up to 100 images per minute, around 80% of model predictions are accepted, and indexing 15,000 images takes about 20 minutes on a Mac M4.
Two experimental utilities grew on the same indexing foundation: a split mode that clusters a catch-all folder's embeddings to propose more specific sub-folders, and a perceptual duplicate finder.
Limitations and next steps
This is personal tooling hardened as the pain showed up, not a product. The indexing layer is the reusable part. The next test would be to polish user interactions and to make those plugins open-source, or share them on Eagle public plugins library.

