Lightbox
AI photo sorting for a self-hosted library, with keep scores and duplicate stacks.
Built by David Vinkenroye in Geneva.
Filmed on a local copy with made-up data and generated photos.
The story
With a few cameras, a NAS fills up much faster than I can look through the photos. Lightbox runs next to Synology Photos and helps me get from thousands of photos down to the ones worth keeping.
For each photo, one Claude vision call returns a keep score, a caption, tags, technical faults and a one-sentence reason. Near-duplicates and bursts are grouped into stacks with a perceptual hash and a time window, and you can compare them side by side. You can cull with the keyboard from search results, albums or the timeline.
Rejected photos go to a trash album, a sweep deletes them after 30 days, and every action has Undo. Search works with plain sentences, including dates and seasons. It also suggests trip albums based on gaps in the timeline.
The backfill runs through the Message Batches API with a daily cost limit, which is slower but cheaper. A second service serves a passphrase-protected gallery and an MCP server, so Claude can browse the library too. Lightbox runs as one of the services in the Dbrain stack.
What was built
- A Claude vision keep score with a readable reason for every photo
- Duplicate and burst stacks with compare and an AI pick
- Search in plain sentences, with dates and seasons understood
- Reversible culling: trash album, 30-day sweep, Undo on every action
- Trip albums proposed from gaps in the timeline
- Message Batches backfill under a daily cost ceiling
- An MCP server so Claude can browse the library
Key facts
- 9,666 of 9,702 indexed photos scored by AI
- 304 duplicate stacks covering 817 photos
Stack
- TypeScript
- Node.js
- PostgreSQL
- Claude vision
- Message Batches API
- Synology Photos API
- ffmpeg
- exiftool
- hls.js
- Docker Compose
- Cloudflare Access
Themes
AI agents
I wanted a personal AI assistant that can do everything online for me, and it can even make phone calls. I build them with whichever models and tools fit best: Claude, OpenAI, Gemini, open models and plenty of plain code.
Ask before acting
For actions like sending, paying, deleting or taking a photo, my apps wait for a tap from the user. When the AI changes something, you see the change and the reason for it, and where I can, there's an Undo button.
Self-hosting and data sovereignty
Personal data stays on hardware its owner controls. For me that's a NAS behind a tunnel. Each Neonduck customer gets their own isolated server, and if they delete the account, the server is deleted too.
MCP and tool use
I use the Model Context Protocol to connect AI assistants to real things: a camera, a photo library, my own archive and Emineon OS, my recruiting tool. I keep each server small with only a few tools, and read-only where that matters.
Cameras and photos
I take far more photos than I ever sort, so I built some tools for it. Lodestar sets up the camera before I shoot. Lightbox helps me choose which photos to keep, and Retouch Studio edits a whole shoot at once.
Connected work
- Lightbox runs inside Dbrain.
- LodestarAn iPhone and iPad app that sets up a Sony camera from one sentence and takes the shot.
- NeonduckA personal AI assistant that does everything online for you and can even make calls.
- Emineon OSAn AI-native ATS and CRM for recruiters, with CV parsing, matching and a copilot.