Paris--:--:--
Work
05ExperimentsPersonal toolUsed daily

Eagle ML Plugins

Three plugins that add an advanced semantic layer to a 15,000-image reference library.

Type
Personal tool
Status
Used daily
Timeline
2026
Role
Concept, ML design, backend, plugin UI
Team
Solo builder
Context
Personal tool
Impact
  • 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
Stack
Eagle API · CLIP · Python · Flask · NumPy · scikit-learn · HDBSCAN
Eagle ML Plugins: project visual

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.

Image Classifier: ranked folder and tag suggestions with a client-side similarity threshold.

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.

Target Mode: searching the full library for images belonging to a target folder.

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.

Shooting Stars: keyboard-driven rating with live prediction and confidence.

Key decisions

  1. 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.

  2. 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.

  3. 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.