Find any face. Find any object. Across millions of photos. In milliseconds.
PhotoFinder V2 (Enterprise Lens) is a production-grade visual search platform. Upload your photo library once, and from then on you can search it by face, by object, or by scene โ using nothing but a query image. It's built for event photographers, archivists, and anyone drowning in a photo library that's too large for human eyes.
The system runs a two-lane AI pipeline โ faces go through ArcFace + AdaFace (512-D embeddings, fused for accuracy), objects go through SigLIP + DINOv2 + YOLOv11-seg. Vectors live in Pinecone, images live in Cloudinary, identity clusters live in Supabase, and the whole stack is wired up so users bring their own keys (BYOK) โ no central data lake, no privacy compromise.
| ๐ Live App | photofinderv2.vercel.app |
| ๐ฌ Presentation Website | Canva-Presentation-link (includes blog, docs and walkthrough) |
| ๐ฆ Frontend Repository | GitLab โ photofinderv2/frontend (hosted on Vercel) |
| ๐ค Backend API | adarshdrc-visual-search-api.hf.space (hosted on Hugging Face Spaces) |
Hi, I'm Adarsh โ the engineer behind Enterprise Lens. I built this project to push two-lane biometric retrieval onto a free-tier infra stack and prove it can hold its own against far more expensive setups.
| ๐ง Email | [email protected] |
| ๐ผ LinkedIn | linkedin.com/in/adarsh-dau |
| ๐ GitHub | github.com/Adarsh-Works-In-Data |
| ๐ฆ GitLab | gitlab.com/adarsh.ambastha |
| ๐ค Hugging Face | https://huggingface.co/spaces/AdarshDRC |
| ๐ฆ X / Twitter | @adarsh |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Frontend (React 19 + Vite) โ โ Backend (FastAPI) โ
โ โ HTTPS โ โ
โ โข Hosted on Vercel โ โโโโโโโบ โ โข Hosted on Hugging Face Spacesโ
โ โข Source on GitLab โ CORS โ โข Docker image (Python 3.10) โ
โ โข Supabase Auth (Google PKCE) โ โ โข CPU-only inference (2 vCPU) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ
โผ โผ โผ
โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
โ AI Models (CPU) โ โ Vector DB โ Pinecone โ โ Object Storage โ
โ โ โ โ โ Cloudinary CDN โ
โ โข SCRFD detector โ โ โข faces-arcface (512) โ โ โ
โ โข ArcFace-R100 โ โ โข faces-adaface (512) โ โ โข Image hosting โ
โ โข AdaFace โ โ โข enterprise-objects โ โ โข Auto thumbnails โ
โ โข SigLIP-B/16 โ โ (fused 768-D) โ โ โข Folder browsing โ
โ โข DINOv2-base โ โ Per-user keys (BYOK) โ โ Per-user URL โ
โ โข YOLOv11-seg โ โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
โ ONNX-quantised โ
โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
โ Supabase (Postgres) โ โ Upstash Redis โ
โ โ โ โ
โ โข user_settings โ โ โข Job queue โ
โ โข face_clusters โ โ โข Inference cache โ
โ (HDBSCAN output) โ โ โข Rate limiting โ
โ โข Auth + admin flags โ โ REST API (HTTP) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
When an image arrives, we don't run one model. We run two parallel pipelines with separate semaphores so face detection and object embedding don't fight for the same CPU cores:
After indexing, HDBSCAN clusters all face vectors per user and writes the cluster IDs back to Supabase. Result: the "People View" tab and cluster-aware search โ when a face matches with high confidence, we expand the result set to include every image already known to belong to that identity cluster (near-100% recall on well-indexed people).
faces-arcface, faces-adaface, enterprise-objects) on your Pinecone project automatically.Privacy note: your keys are encrypted at rest in Supabase and only ever leave the browser to talk to your own Pinecone/Cloudinary projects. The backend is stateless w.r.t. your data โ it acts as an inference proxy.
This monorepo holds both codebases. See the per-folder READMEs for full instructions:
TL;DR:
# Frontend
cd frontend
npm install
cp .env.local.example .env.local # then fill in your Supabase keys
npm run dev # http://localhost:5173
# Backend
cd ../backend
cp .env.example .env # then fill in your secrets
docker build -t enterprise-lens .
docker run -p 7860:7860 --env-file .env enterprise-lens
| Layer | Tooling |
|---|---|
| Frontend | React 19, Vite 7, vanilla CSS (theme-token driven), Supabase JS SDK |
| Auth | Supabase Auth (Google OAuth, PKCE flow) |
| Backend | FastAPI, Uvicorn, Python 3.10, Docker |
| AI / ML | PyTorch CPU, ONNX Runtime, InsightFace (SCRFD + ArcFace), AdaFace, SigLIP, DINOv2, YOLOv11-seg, HDBSCAN |
| Vector DB | Pinecone Serverless |
| Storage | Cloudinary |
| Metadata DB | Supabase Postgres |
| Cache / Queue | Upstash Redis (HTTP REST) |
| Hosting | Vercel (frontend) ยท Hugging Face Spaces (backend, free CPU tier) |
| Repos | GitLab (frontend) ยท HF Spaces (backend) |
photofinderv2/
โโโ frontend/ # React 19 SPA โ see frontend/README.md
โ โโโ src/
โ โ โโโ App.jsx # Tab router + auth state
โ โ โโโ components/ # home, search, upload, people, explorer, settings, admin, blog, docs
โ โ โโโ context/ # GlobalDBContext (encrypted key storage)
โ โ โโโ hooks/ # useDrivePicker, useLogger, useTheme, useSound, useReveal
โ โ โโโ utils/ # api.js, constants.js, soundEngine, helpers
โ โ โโโ supabaseClient.js # PKCE-mode Supabase client
โ โ โโโ App.css # Theme tokens + global styles
โ โโโ package.json # Vite + React 19, no Tailwind
โ โโโ vite.config.js
โ โโโ .env.local.example # Copy to .env.local and fill in
โ
โโโ backend/ # FastAPI inference service โ see backend/README.md
โ โโโ main.py # FastAPI app + lifespan (model loading, semaphores)
โ โโโ src/
โ โ โโโ api/ # Routers โ system, search, upload, explorer, people, jobs, danger
โ โ โโโ core/ # config, security (BYOK key parsing), logging
โ โ โโโ services/ # ai_manager, db_client, clustering, jobs, cache, onnx_models
โ โ โโโ common/ # Shared utilities
โ โโโ scripts/ # convert_to_onnx.py, calibrate_threshold.py, โฆ
โ โโโ Dockerfile # Python 3.10-slim โ builds ONNX models at image build
โ โโโ requirements.txt
โ โโโ .env.example # Copy to .env and fill in
โ
โโโ .gitlab-ci.yml # CI โ HF Spaces warmup ping
โโโ LICENSE # MIT
โโโ README.md # โ you are here
The backend (FastAPI) lives in backend/ and is mirrored to Hugging Face Spaces for deployment. See backend/README.md for endpoint docs and deployment instructions.
MIT โ feel free to fork, learn, and remix.
Built by Adarsh during a deep-dive into modern face/object retrieval. Special thanks to the maintainers of InsightFace, AdaFace, SigLIP, DINOv2, and Ultralytics โ without their open weights, none of this would be free.
Got questions, ideas, or want to collaborate? Email me at [email protected].
Find any face. Find any object. Across millions of photos. In milliseconds.
PhotoFinder V2 (Enterprise Lens) is a production-grade visual search platform. Upload your photo library once, and from then on you can search it by face, by object, or by scene โ using nothing but a query image. It's built for event photographers, archivists, and anyone drowning in a photo library that's too large for human eyes.
The system runs a two-lane AI pipeline โ faces go through ArcFace + AdaFace (512-D embeddings, fused for accuracy), objects go through SigLIP + DINOv2 + YOLOv11-seg. Vectors live in Pinecone, images live in Cloudinary, identity clusters live in Supabase, and the whole stack is wired up so users bring their own keys (BYOK) โ no central data lake, no privacy compromise.
| ๐ Live App | photofinderv2.vercel.app |
| ๐ฌ Presentation Website | Canva-Presentation-link (includes blog, docs and walkthrough) |
| ๐ฆ Frontend Repository | GitLab โ photofinderv2/frontend (hosted on Vercel) |
| ๐ค Backend API | adarshdrc-visual-search-api.hf.space (hosted on Hugging Face Spaces) |
Hi, I'm Adarsh โ the engineer behind Enterprise Lens. I built this project to push two-lane biometric retrieval onto a free-tier infra stack and prove it can hold its own against far more expensive setups.
| ๐ง Email | [email protected] |
| ๐ผ LinkedIn | linkedin.com/in/adarsh-dau |
| ๐ GitHub | github.com/Adarsh-Works-In-Data |
| ๐ฆ GitLab | gitlab.com/adarsh.ambastha |
| ๐ค Hugging Face | https://huggingface.co/spaces/AdarshDRC |
| ๐ฆ X / Twitter | @adarsh |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Frontend (React 19 + Vite) โ โ Backend (FastAPI) โ
โ โ HTTPS โ โ
โ โข Hosted on Vercel โ โโโโโโโบ โ โข Hosted on Hugging Face Spacesโ
โ โข Source on GitLab โ CORS โ โข Docker image (Python 3.10) โ
โ โข Supabase Auth (Google PKCE) โ โ โข CPU-only inference (2 vCPU) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ
โผ โผ โผ
โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
โ AI Models (CPU) โ โ Vector DB โ Pinecone โ โ Object Storage โ
โ โ โ โ โ Cloudinary CDN โ
โ โข SCRFD detector โ โ โข faces-arcface (512) โ โ โ
โ โข ArcFace-R100 โ โ โข faces-adaface (512) โ โ โข Image hosting โ
โ โข AdaFace โ โ โข enterprise-objects โ โ โข Auto thumbnails โ
โ โข SigLIP-B/16 โ โ (fused 768-D) โ โ โข Folder browsing โ
โ โข DINOv2-base โ โ Per-user keys (BYOK) โ โ Per-user URL โ
โ โข YOLOv11-seg โ โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
โ ONNX-quantised โ
โโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
โ Supabase (Postgres) โ โ Upstash Redis โ
โ โ โ โ
โ โข user_settings โ โ โข Job queue โ
โ โข face_clusters โ โ โข Inference cache โ
โ (HDBSCAN output) โ โ โข Rate limiting โ
โ โข Auth + admin flags โ โ REST API (HTTP) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ
When an image arrives, we don't run one model. We run two parallel pipelines with separate semaphores so face detection and object embedding don't fight for the same CPU cores:
After indexing, HDBSCAN clusters all face vectors per user and writes the cluster IDs back to Supabase. Result: the "People View" tab and cluster-aware search โ when a face matches with high confidence, we expand the result set to include every image already known to belong to that identity cluster (near-100% recall on well-indexed people).
faces-arcface, faces-adaface, enterprise-objects) on your Pinecone project automatically.Privacy note: your keys are encrypted at rest in Supabase and only ever leave the browser to talk to your own Pinecone/Cloudinary projects. The backend is stateless w.r.t. your data โ it acts as an inference proxy.
This monorepo holds both codebases. See the per-folder READMEs for full instructions:
TL;DR:
# Frontend
cd frontend
npm install
cp .env.local.example .env.local # then fill in your Supabase keys
npm run dev # http://localhost:5173
# Backend
cd ../backend
cp .env.example .env # then fill in your secrets
docker build -t enterprise-lens .
docker run -p 7860:7860 --env-file .env enterprise-lens
| Layer | Tooling |
|---|---|
| Frontend | React 19, Vite 7, vanilla CSS (theme-token driven), Supabase JS SDK |
| Auth | Supabase Auth (Google OAuth, PKCE flow) |
| Backend | FastAPI, Uvicorn, Python 3.10, Docker |
| AI / ML | PyTorch CPU, ONNX Runtime, InsightFace (SCRFD + ArcFace), AdaFace, SigLIP, DINOv2, YOLOv11-seg, HDBSCAN |
| Vector DB | Pinecone Serverless |
| Storage | Cloudinary |
| Metadata DB | Supabase Postgres |
| Cache / Queue | Upstash Redis (HTTP REST) |
| Hosting | Vercel (frontend) ยท Hugging Face Spaces (backend, free CPU tier) |
| Repos | GitLab (frontend) ยท HF Spaces (backend) |
photofinderv2/
โโโ frontend/ # React 19 SPA โ see frontend/README.md
โ โโโ src/
โ โ โโโ App.jsx # Tab router + auth state
โ โ โโโ components/ # home, search, upload, people, explorer, settings, admin, blog, docs
โ โ โโโ context/ # GlobalDBContext (encrypted key storage)
โ โ โโโ hooks/ # useDrivePicker, useLogger, useTheme, useSound, useReveal
โ โ โโโ utils/ # api.js, constants.js, soundEngine, helpers
โ โ โโโ supabaseClient.js # PKCE-mode Supabase client
โ โ โโโ App.css # Theme tokens + global styles
โ โโโ package.json # Vite + React 19, no Tailwind
โ โโโ vite.config.js
โ โโโ .env.local.example # Copy to .env.local and fill in
โ
โโโ backend/ # FastAPI inference service โ see backend/README.md
โ โโโ main.py # FastAPI app + lifespan (model loading, semaphores)
โ โโโ src/
โ โ โโโ api/ # Routers โ system, search, upload, explorer, people, jobs, danger
โ โ โโโ core/ # config, security (BYOK key parsing), logging
โ โ โโโ services/ # ai_manager, db_client, clustering, jobs, cache, onnx_models
โ โ โโโ common/ # Shared utilities
โ โโโ scripts/ # convert_to_onnx.py, calibrate_threshold.py, โฆ
โ โโโ Dockerfile # Python 3.10-slim โ builds ONNX models at image build
โ โโโ requirements.txt
โ โโโ .env.example # Copy to .env and fill in
โ
โโโ .gitlab-ci.yml # CI โ HF Spaces warmup ping
โโโ LICENSE # MIT
โโโ README.md # โ you are here
The backend (FastAPI) lives in backend/ and is mirrored to Hugging Face Spaces for deployment. See backend/README.md for endpoint docs and deployment instructions.
MIT โ feel free to fork, learn, and remix.
Built by Adarsh during a deep-dive into modern face/object retrieval. Special thanks to the maintainers of InsightFace, AdaFace, SigLIP, DINOv2, and Ultralytics โ without their open weights, none of this would be free.
Got questions, ideas, or want to collaborate? Email me at [email protected].