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.








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



