
NegPy
[](https://github.com/marcinz606/NegPy/actions/workflows/ci.yml)
[](https://github.com/marcinz606/NegPy/releases)
[](https://github.com/marcinz606/NegPy/releases)
[](LICENSE)
[](#getting-started)
[](docs/PIPELINE.md)
[](docs/USER_GUIDE.md)
[](pyproject.toml)
[](negpy_core)
[](docs/PIPELINE.md)
[](https://www.riverbankcomputing.com/software/pyqt/)
[](https://github.com/astral-sh/uv)
[](https://github.com/astral-sh/ruff)
[](https://github.com/marcinz606/NegPy/stargazers)
[](https://github.com/marcinz606/NegPy/graphs/contributors)
[](https://discord.gg/JySNzUWgwy)
NegPy turns scans of film negatives and slides into finished pictures. I wrote it because I wanted a tool made for film scans that does more than invert them. It models film and photographic paper, and adds the conveniences of a lab scanner. It runs on Linux, macOS and Windows.

The [User Guide](docs/USER_GUIDE.md) covers every panel and control (the ⓘ on each panel opens it in the app). [PIPELINE.md](docs/PIPELINE.md) explains the math.
## Languages
The desktop interface and panel guides support English, Simplified Chinese (简体中文), Japanese (日本語), Korean (한국어) and German (Deutsch). Choose a language in **Preferences → Interface → Language**, then restart NegPy. **System Default** follows your system language and uses English for unsupported languages. Missing panel translations fall back to English. See [CONTRIBUTING.md](CONTRIBUTING.md#translations) to update or add a translation.
## Features
### Conversion
* The orange mask is removed from each channel's own sensitometry: no camera profiles, no border color picking.
* The print is built in density space on an H&D curve (toe, straight section, shoulder) and graded in ISO-R points like darkroom paper.
* Auto Density and Auto Grade meter each frame to adjustable targets.
* Paper profiles from Ilford, Kodak, Foma and Fuji datasheets.
* Color negative, B&W and slide modes. Slides open as captured, with optional Auto Density and Auto Grade for faded film and HDR merging of bracketed exposures.
### Rolls
* The library is a list of rolls: imported folders, or virtual rolls built from any frames.
* Roll-wide defaults for film mode, crop, calibration, metering, raw decode, lens and metadata, with per-frame overrides.
* Roll Analysis gives every frame of a roll, or of a scene within it, the same baseline.
* Keep/reject triage, half-frame splitting, stitching, and search by metadata or (opt-in) content.
### Capture
* Film scanners: Plustek OpticFilm 8200i SE, 8100 V2, 8300i SE and 7600i v1 over USB, Nikon Coolscan, Reflecta, Pacific Image, and anything SANE supports.
* Tethered camera scanning (macOS and Linux), including narrowband RGB captures with a [Scanlight](https://github.com/jackw01/scanlight) and a sub-pixel Trichrome merge ([guide](docs/CAMERA_SCANNING.md)).
* Flat-field correction, sensor calibration for narrowband light, and lens correction read from the file.
* Camera RAWs, TIFF, DNG, JPEG XL and scanner formats such as Pakon, Coolscan NEF, Flextight FFF and Noritsu.
### Editing
* Dodge and burn with polygon, oval and card-edge masks, each with its own strength, feather, contrast grade and tone limit.
* Dust, hair and scratch removal: automatic, from the IR channel or painted, keeping the film grain.
* Darkroom tools: test strips, ring-around, step wedge, zone overlay, spot densitometer and zone placement.
* Contrast mask, tilt and swing, edge burn, filed carrier and print mats.
* Lith, cyanotype and toners for B&W.
* GPU rendering through wgpu (Vulkan, Metal or DX12), and a multi-core CPU path in Rust that gives the same result.
### Output
* ICC color management, monitor profile detection and soft proofing.
* Export to JPEG, TIFF, PNG, WebP and JPEG XL, with borders, presets, contact sheets and [filename templates](docs/TEMPLATING.md).
* A flat 16-bit TIFF master for other editors, or a linear export that skips the pipeline.
* Gear and capture metadata written to EXIF and XMP.
### Your data
* Non-destructive: source files are never modified.
* Edits live in a local SQLite database keyed by file content, so files can move. Optional `.negpy` sidecars sit next to the scans.
* Undo history and named work prints survive a restart.
* [Keyboard shortcuts](docs/KEYBOARD.md) can be remapped.
## Getting started
The recommended way is to run NegPy from source: you get each fix as soon as it is on `main`, and your system shows no warning for an unsigned app. [CONTRIBUTING.md](CONTRIBUTING.md#development-setup) has the steps: install `uv` and `rustup`, then run `make install` and `make run`.
You can also download the build for your OS from the [Releases page](https://github.com/marcinz606/NegPy/releases). When a new version is out, a dot shows on the ⋯ menu, and **Update to vX.Y.Z…** in its Help menu installs it. The builds are not signed, so expect a warning on first run.
### Linux
Make the `.AppImage` executable with `chmod +x` and run it.
Optional, for SANE and camera scanning:
```
sudo apt install libsane # Debian/Ubuntu
sudo pacman -S sane libgphoto2 # Arch
```
### Nix
```bash
nix run github:marcinz606/NegPy
```
Or add it as a flake input:
```nix
{
inputs.negpy.url = "github:marcinz606/NegPy";
outputs = { self, nixpkgs, negpy, ... }: {
# negpy.packages.