Darkroom
A phone camera roll is a mix of kids' artwork, paperwork, receipts, screenshots and ordinary photos. Darkroom classifies every image and files it where it belongs.
A deploy stripped the execute bit from two scripts. One failed 206 times in two hours while the dashboard showed green. Health now comes from asking systemd directly, not from the app's opinion of itself.
How it's built
- The phone pushes photos over SFTP into a locked-down drop folder. A watcher picks them up and dedupes by content hash.
- A hosted vision model classifies each image. A local model lost because it fought other workloads for the same hardware. A free-tier model lost because of training rights on family photos.
- Documents get a four-point perspective warp and go to a self-hosted document manager that owns OCR. Artwork goes to an archive with a nightly cloud copy that uses copy, never sync, so a local delete can't remove the backup.
- Everything else goes to a 30-day trash with a sidecar file saying why. Nothing is hard-deleted.
- The dashboard is a static page over a JSON API: a map of where things land, galleries, restore from trash, live settings and a dry-run test bench.
- Python
- OpenCV
- systemd
- Paperless-ngx
- rclone
- Claude vision