Shan Hannadige's film photography workflow began with loading a 35mm roll into a Canon AE-1P, shooting, sending the film to a lab for development, then cutting the negatives into strips and scanning each frame with a Plustek scanner. After scanning, each negative was opened in darktable to invert colors and make manual edits, a process that took about four hours per 36-exposure roll. As the number of rolls grew, the photographer spent more time processing images than taking them, prompting a search for ways to streamline the workflow.

This image illustrates the initial scanning step of the workflow, where negatives are digitized using a Plustek scanner and VueScan software before automated processing.
To automate the steps after scanning, Hannadige kept the VueScan software for image capture and built a processing pipeline that first converts negatives to positives using a NumPy routine. This routine measures color density across the entire roll and uses the blank leading slot of the film as a reference, ensuring consistent color correction so that frames like a sunset are not radically altered. Dust and scratches are detected by image analysis, with contextual filtering to avoid false positives such as water glints, and marked areas are filled by the LaMa inpainting model that copies detail from surrounding film regions. Graininess is addressed through adjustable exposure, contrast, and temperature controls, allowing the photographer to review and approve corrections individually or in batch.

This image shows the result of the color correction step, where the NumPy routine converts negatives to positives using the film's blank leader as reference.

This image depicts the dust and scratch detection UI, where contextual filtering marks areas for LaMa inpainting to copy detail from surrounding regions.
Once processed, images are tagged automatically by Qwen3-VL running locally in Ollama, which generates descriptive labels in about five seconds per frame. These tags, combined with embedded camera, lens, date, and film stock data, create a searchable library. The approved images are then uploaded to a Cloudflare R2 bucket via Hannadige's personal site, maximizing the free tier's storage and bandwidth. For presentation, an interactive three.js gallery was built that resembles a felt table covered in film canisters with real label art and scuff marks; users can 'pick up' a canister, yank the film out to expose the frames, and watch it fall back onto the table, blending nostalgia with a playful digital experience. The project required 11 days and 64 commits, resulting in a gallery of 22 rolls and 314 photos dating back to 2020.

This image shows the final presentation step, where approved images are prepared for upload to Cloudflare R2 and displayed in the interactive gallery resembling a felt table.