Media & Creative AI Tools

PhotoMind — a photo library that never leaves your Mac

A local-first, read-only AI photo indexer for macOS. Walks a photo library on disk and runs semantic search, zero-shot tagging, and face detection/clustering entirely on-device — nothing uploaded, nothing modified.

Python + FastAPI CLIP (open_clip) InsightFace React 19 Working Tool

A decade of photos, findable only by scrolling

Years of photos and RAW files sitting on disk are only searchable by folder and date unless they're uploaded to a cloud photo service — which means handing over a personal photo library (including whatever's in it) to a third party in exchange for search. The alternative was to build the same category of tool — semantic search, tagging, face recognition — but keep every byte on the machine it started on.

Index once, search by meaning, never touch the originals

PhotoMind walks a photo library, extracts EXIF metadata and generates thumbnails into a local SQLite database, then runs an entirely on-device AI pipeline: CLIP embeddings for "a dog on the beach"-style natural-language search, zero-shot tagging against a hand-built taxonomy, and face detection/clustering that groups photos by person — all through a FastAPI backend and a React gallery UI at 127.0.0.1:8000.

PhotoMind gallery — a full photo library indexed and tagged, browsable by year with quality/scene/activity filters

The architecture Manzar (its video counterpart) was later modeled on

Originals are read-only, always
The SQLite DB and all generated thumbnails live outside the working tree entirely, in ~/.photo-mind/. Source photos are only ever read, never moved or modified.
Offline-aware volume addressing
Photos are addressed by (volume UUID, relative path), not absolute path — so an external drive can be unplugged and remounted elsewhere without breaking every reference in the database.
Name-preserving face reclustering
Re-running face clustering doesn't wipe out names you've already assigned — it snapshots existing named clusters first and majority-transfers each name onto whichever new cluster holds most of those faces.
RAW files via embedded preview
.NEF files are read through their embedded JPEG preview for speed, falling back to a full demosaic only when no preview exists — keeping indexing fast even across a large RAW library.
Perceptual-hash duplicate detection
A 64-bit perceptual hash on every image finds near-duplicates by Hamming distance — useful after years of importing the same shot from multiple devices.
Self-terminating local server
The FastAPI server shuts itself down after 15 minutes idle unless a rescan is running, and the UI sends a heartbeat to keep it alive only while actually in use.

Under the hood

BackendPython — Click CLI + FastAPI server
FrontendVite + React 19 gallery SPA
Searchopen_clip ViT-B-32-quickgelu, brute-force cosine similarity
FacesInsightFace buffalo_l via CoreML + DBSCAN clustering
StorageSQLite (WAL mode) with an FTS5 search index, entirely outside the repo

Where it stands

A working local tool, in daily personal use, and the reference implementation for Manzar — its video-indexing counterpart, described elsewhere in this list.

← PreviousBayaz Back to the startKafila →

Want AI tooling that doesn't send your data anywhere?

If your data is sensitive by nature — clinical, personal, or otherwise — local-first AI is often more practical than it looks. Happy to talk through what that would take.