A macOS app for the analog-film workflow, from camera copy or scanning through development
English · 한국어 · 日本語 · 简体中文 · Français · Deutsch
Website · Camera scanning guide · FAQ
negaflow is a macOS app for importing, inverting, and developing scanned film or film copied with a digital camera.
It works with color and black-and-white, negative and positive film. Edits are stored separately from the original file.
It covers the digital film workflow from library and development through printing.
The develop engine is called Chroma Engine. Dust and scratch repair is called GrainMend.
In summary, it is a process that easily supports the entire process of converting analog films into digital.
Scanner controls appear only when a separate plugin is installed.
Technology keeps moving, but the process around analog photography has stood still even as film itself has become popular again.
Unless you make a darkroom print, film has to be converted to digital before most of us can see and share it.
That part of the process is shrinking as film labs and processing shops disappear and the available support narrows.
This project started with things that bothered me in different workflows, and with features I kept wishing existed.
My experience with 35mm and medium-format film became the foundation, and I built every part myself from the ground up.
It began as a toy project for my own use, but negaflow has since grown into something more.In the end, a tool like this has to work well, stay out of the way, move quickly, and handle the routine parts properly.
negaflow is independently developed as a native macOS app, shaped by workflows used both in film labs and at home.Celebrating this summer, the bicentennial of Niépce's first-ever photograph.
Download the current release from GitHub Releases.
For most Macs, use the Universal PKG.
| Download | Mac |
|---|---|
negaflow-1.0.9-1-macOS-universal.pkg |
Apple Silicon and Intel |
negaflow-1.0.9-1-macOS-arm64.pkg |
Apple Silicon only |
- Download the PKG for the Mac.
- Open it and follow the onscreen instructions.
- Launch negaflow from
/Applications.
The PKG installs negaflow.app directly in /Applications.
DMG and ZIP builds are available on the same release page for manual installation.
Current GitHub release files are ad-hoc signed and are not notarized by Apple.
macOS may block the first launch. After attempting to open negaflow, review the warning in
System Settings → Privacy & Security and choose Open Anyway only if the downloaded
file's SHA-256 checksum matches the checksum published with the release.
Scanner hardware requires a separate scanner plugin.
SANE scanners usenegaflow-scanner-sane.
- Film-base measurement and color or black-and-white film inversion
- Exposure, contrast, curves, HSL, color grading, and black-and-white toning
- Sharpening, noise reduction, grain, vignette, and halation
- GrainMend dust and scratch repair, including GrainMend IR driven by a scanner infrared pass, including GrainMend IR driven by a scanner infrared pass
- Rolls, folders, collections, ratings, stacks, and virtual copies
- Zoom, crop, rotation, comparison views, histogram, and clipping display
- Camera, lens, film, and exposure notes written into the EXIF of the exported file
- Roll-level shooting notes, and library search by camera, lens, or film
- JPEG and 16-bit TIFF export, ICC profiles, and print layouts
- Per-layout black/gray/white sheets, common matte/glossy/lustre/silk previews, photo/ISO paper sizes, and optional in/cm rulers
- C-print destination settings and lab ICC soft proof
- Import progress, per-folder process/target development, and batch progress
- Persistent folder expansion, photo drag-and-drop, and live Finder synchronization
- Presets and copy/paste that include process, target, adjustments, crop, and orientation
- Seven print layouts: single image, contact sheet, picture package, custom package, cyanotype, glass plate, and gelatin silver
- Page-aware Print Export and Quick Export: a 39-photo 6 × 7 contact sheet is one composed output, while individual-image layouts are a bounded 39-file batch, with linear progress and percentage
Completed checks are recorded in Project Status.
Chroma Engine is the film inversion and develop engine in the Chromabase module.
Before inverting a negative, it measures the unexposed film base.
If automatic measurement is wrong, you can sample an area with the eyedropper or enter RGB values yourself.
The default is the MAIN target with manual adjustments.
Auto Tone, Auto White Balance, Auto Levels, and Auto Color run only when you ask for them.
Available develop targets:
MAIN: standard developmentPRINT: output through a printer ICC profileHS,SP: minilab-style developmentF135,HR: development styles for those equipment familiesEXPIRED: old-film recovery
Output can use sRGB, Display P3, Adobe RGB, or a custom RGB ICC profile.
See Chroma Engine for the inversion and color-processing order.
GrainMend repairs film defects: dust, pinholes, scratches, and emulsion damage.
| GrainMend RGB | What it does |
|---|---|
| Auto | Finds and repairs defects across the whole photograph. |
| Guided | Searches for defects inside an area you mark. |
| Brush | Lets you paint the place to repair. |
| Clone Stamp | Copies pixels from a source point you choose. |
The Auto and Guided tools in GrainMend RGB fill a defect using nearby texture, and they
also inspect direction and surrounding structure so lines or grids in the scene are not erased as scratches.
Each result is kept as a GrainMend layer.
Auto removes the defects common to a photograph. If candidates crowd in too densely to apply safely, it stops without changing the image and points you to Guided.
Guided is made for the varied dust that scanning introduces. Brush repairs what the automatic passes missed, and Clone Stamp copies the source pixels you pick.
Every GrainMend RGB layer can have its strength changed, its mask inspected, and can be turned off or deleted on its own.
If the scanner plugin supplies an infrared channel, GrainMend IR adds its detection result to the same edit history.
GrainMend RGB is an independent software method, distinct from hardware infrared cleaning, and
GrainMend IR uses the scanner's infrared channel — it is not an implementation of, or compatibility mode for, Digital ICE, iSRD, or SRDx.
See GrainMend for the implementation and its quality and performance checks.
The app includes 15 scanner profiles made from film material shot by the project author.
Together, they contain 928 image observations.
Every profile is currently marked realOnly: it is based on real scans, but has not passed an independent paired-reference accuracy check.
Profiles are never applied from the scanner name alone.
You must choose one yourself.
The app also checks the SHA-256 of each profile and its manifest.
928 is the sum of observations across profile groups, not 928 different photographs.
The same film can appear in more than one scanner group.
I reviewed all 928 source scans directly and excluded files with false detections or missed defects before measuring the data used to build the profiles.
The data and build process are documented in Film Profiles.
- Import an image or scan with an installed plugin.
- Choose the film type and measure the film base.
- Adjust color and tone in Chroma Engine.
- Apply GrainMend where it is needed.
- Check the result with comparison views and the histogram, then print or export it.
The interface was made for people who actually work with photographs, not as a generic AI-generated mockup.
Anyone who enjoys photography should be able to find their way around it.
Import does not develop a photo by default. It first creates the source thumbnail and folder entry. Development starts when you apply a process and target to a folder or enter Develop. Automatic development can be enabled under Workflow in Settings; its default is off.
Collapsed folders stay collapsed after relaunch. Photos can be dragged between folders. If the destination already has the same file name, negaflow adds a number instead of overwriting it. Moving or renaming a source or folder in Finder updates the library by rescanning only the folder that changed.
Develop copy/paste and user presets include process, target, film-base settings, tone, color, detail, crop, rotation, flips, and straightening. When several photos are selected, paste applies to the whole selection.
A printer output profile in Print is applied to the composed page, so repeated placements and mixed-photo packages all receive the same output conversion. It does not change the Develop preview.
See Library to print workflow for the exact behavior and its effect on source files.
- macOS 14.0 or later
- GUI app: Xcode 26
- Engine and CLI: Swift 5.9 or later
- Hardware scanning: a separate scanner plugin
git clone https://github.com/habinsong/negaflow.git
cd negaflow
# Build a Release app and launch it
bash scripts/run-app.sh
# Build without launching
bash scripts/run-app.sh buildThe GUI app is built with xcodebuild.
scripts/run-app.sh builds the code, assembles the app bundle, and signs it locally.
Use swift build when you only need the engine and CLI.
swift build
# Find scanners
.build/debug/negaflow detect
.build/debug/negaflow capabilities <scannerID>
# Develop
.build/debug/negaflow develop in.tiff out.jpg --look rich-neutral --target main
# GrainMend
.build/debug/negaflow develop scan.tif out.jpg --defects 1
.build/debug/negaflow defect-bench ./scans --out ./report
# List profiles and check the engine
.build/debug/negaflow list-scanner-profiles
.build/debug/negaflow selftestRun negaflow without arguments to see every option.
negaflow does not guess features from a scanner model name.
It uses only the resolutions, bit depths, scan areas, exposure controls, and IR support reported by the plugin.
SANE devices are handled by the separate GPL project negaflow-scanner-sane.
The plugin runs as a separate process and talks to the app through JSON.
The main negaflow app does not contain or link SANE code.
| Module | Job |
|---|---|
Chromabase |
Chroma Engine, GrainMend, profiles, and export |
ScannerKit |
Scanner capabilities and external plugin connection |
negaflowApp |
Library, develop, scan, and export interface |
negaflowCLI |
Develop, scan, benchmark, and self-test commands |
See Product Architecture for the data flow between modules.
# Swift tests
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer swift test
# GUI Release build
bash scripts/run-app.sh build
# Full repository gate
bash scripts/ci-gate.shAutomated tests cover code behavior and regressions.
Scanner-specific behavior, final image quality, signing, and notarization are separate checks.
| Document | Contents |
|---|---|
| Chroma Engine | Film base, inversion, color processing, and develop order |
| GrainMend | Detection and repair, IR, edit history, performance, and quality checks |
| Film profiles | Source analysis and profile generation |
| Library-to-print workflow | Import, folder synchronization, batch develop, settings transfer, and print profiles |
| Product architecture | App, engine, scanner, storage, and export |
| Project status | Implementation state, measurements, and work still to verify |
| Real-device QA checklist | Checks that require real hardware or a visual review |
The main negaflow project is distributed under the Apache License 2.0.
negaflow is not affiliated with or sponsored by Kodak, Fujifilm, Noritsu, LaserSoft Imaging, or other trademark owners.
Product names are used only to identify a measured or compatible target.
See Trademark Notice.