SteevePommier
Theme
Menu background
Background pattern
Reveal
Reveal size 10
Density 50
Colour
Menu position
Analytics

Winnow04

A self-hosted pipeline that indexes, culls and exports the RAW photos and video sitting on the NAS — without ever reading the originals twice.

Ongoingphotographyself-hostedmedia pipelinehome lab
geotag example
Geotagging
info-panel
EXIF info panel
sift
Tinder like media swipe
Map triage
Machine learning search (using immicjh ml container)
People search
Timeline
Jun 2026 —
Role
design + build
Author
Steeve Pommier
Stack
Next.js, TypeScript, PostgreSQL, Redis, BullMQ, sharp, exiftool, MinIO, Docker
AI
Vibecoded

Footage arrives from four devices — a Sony A7C II, a DJI drone, an iPhone and Ray-Ban Metas — and used to pile up on the NAS with no way to go through it from anywhere but the desk. Winnow is the answer to that: index once, then browse and cull from any screen in the house.

The one rule

The filesystem and the RAWs are touched once, during indexing and derivative generation. Every read after that goes through Postgres and a derivative cache, and culling always happens on proxies — never on the originals. Already-filed NAS sessions are mounted read-only so the rule is enforced by the mount, not by discipline.

Shape

An indexer walks the volumes and writes sessions and assets to Postgres, then enqueues work on a Redis/BullMQ queue. Derivative workers run exiftool and sharp to produce thumbnails and proxies. A Next.js app is the culling UI — picks, rejects, stars, tags, geotagging — and export workers copy the selected RAWs out for Capture One or push them to Immich, keeping the source-to-export lineage either way.

It carries its own accounts: viewer, editor and admin roles, invite links so an administrator never types anyone else's password, and server-side session revocation.