An open-source digital darkroom for film negatives
Turn camera-scanned RAW and scanner TIFF files into positives, one roll at a time.
Download · First roll · Overview · Interface · Features · Documentation · Build · Licence
New users can start with Your first roll, also available offline in Help → documentation → First roll.
OpenRevelare is a standalone desktop application for photographers who digitise film with a camera or scanner. Import a roll, share its base calibration across frames, make individual edits and export your photographs. No subscription or host photo editor is required.
Colour negatives contain an orange base and dye layers. OpenRevelare linearises the input, removes the base, white-balances and inverts it in the Cineon log-density domain, then exports a positive.
- Explainable: base, maximum density and channel-balance parameters have defined meanings.
- Reproducible: settings are stored in a
.ncprojbeside the image; source files remain untouched. - Local-first: image processing works offline without an account. Update checks and optional model downloads use the network. The inversion pipeline runs in the shared CPU Core; supported Windows/macOS systems can accelerate selected resizing, sharpening and LUT operations on the GPU.
- Cross-platform: C# / .NET 8 + Avalonia for Windows, Linux and macOS.
The application is intended for whole-roll camera-copy and scanning workflows, archival parameters and reproducible reprocessing. HDR editing and export are supported; Linux currently keeps the on-screen preview on an explicitly labelled SDR fallback. It does not provide per-roll colour-chart calibration; use DiVERE for heritage, commercial-archive or research work that requires it.
Packages are published on Releases with the .NET runtime included.
| Platform | Package | Status and requirements |
|---|---|---|
| Windows 10/11 x64 | setup.exe |
Stable; no additional dependency |
| Linux x86_64 | .AppImage |
Beta; glibc ≥ 2.35 |
| macOS Apple Silicon | -arm64.dmg |
Beta; macOS 12+, no real-device validation yet |
| macOS Intel | -x86_64.dmg |
Beta; macOS 12+, no real-device validation yet |
Platform notes
-
Windows: if SmartScreen appears, select More info → Run anyway.
-
macOS: approve the first launch under System Settings → Privacy & Security → Open Anyway, or run:
xattr -dr com.apple.quarantine /Applications/OpenRevelare.app
-
Linux:
chmod +x OpenRevelare-*.AppImage && ./OpenRevelare-*.AppImage
Add
--appimage-extract-and-runif the package cannot start directly. Linux currently previews through SDR; HDR editing and export remain available.
| Stage | Scope | Responsibility |
|---|---|---|
| FilmBase | Whole roll | Base transmittance, maximum density, channel balance and inversion parameters |
| SceneBase | Single frame | Temperature, exposure, contrast, saturation and curves |
The separation allows physical parameters to be shared across a roll while frame-level edits remain independent.
- The mask is physical: measure the base; do not replace measurement with visual guessing.
- Density is the computation domain: the mask is approximately a constant offset, making white balance and inversion predictable.
- Restoration and creation are separate: FilmBase provides consistency; SceneBase provides expression.
- Import RAW, scanner TIFF or another supported image and enter roll metadata.
- Calibrate the roll: estimate the base, white balance, shadow endpoint and
d_max; correct manually when required. - Apply FilmBase to the roll or selected frames.
- Edit frames in SceneBase with temperature, exposure, contrast, saturation and curves.
- Export TIFF, JPEG, HEIC, linear DNG or scene-linear ACEScg TIFF. Start with an sRGB JPEG for sharing, or a 16-bit TIFF for further editing.
Changes are written automatically. The .ncproj is placed beside the source when that directory is writable; read-only media use the per-user rolls fallback shown below.
Roll thumbnails, the current frame and shared physical parameters on one page.
Frame-level creative adjustments without changing FilmBase.
![]() |
![]() |
| Roll management, filtering and project recovery | Full-roll contact sheet with sprocket layout and metadata |
![]() |
![]() |
![]() |
| Raw input | NLP automatic reversal | OpenRevelare result |
| Category | Capabilities |
|---|---|
| Reversal | Cineon density-domain inversion, auto-calibration, narrow-band light decoupling (Path A), black-and-white negatives |
| Colour | ACEScg workspace; sRGB, Display P3 and Adobe RGB output; exact ICC management; Stage 2 controls |
| Pre-processing | LCC flat-field, offline Lensfun lens matching, distortion and vignetting correction, sprocket masking and geometry crop in linear light |
| Auto crop | 135 positive / negative auto crop: content 3:2 and 35 mm border 37:35 modes, small-angle straightening, one crop scale and pixel ratio across the roll |
| Workflow | Roll management, roll sync, virtual copies, format presets, 80-step undo/redo, histogram and waveform |
| Output | 16-bit TIFF, JPEG, 10-bit HEIC, linear DNG, 32-bit float scene-linear ACEScg TIFF and HDR gain-map JPEG; templates, scaling and sharpening |
| Look / HDR | Cineon-input .cube print looks, SDR/HDR roll rendering, HDR limit in stops, HDR contact sheets; direct PQ or Adaptive HDR HEIC (viewer support required) |
| Reports | Per-frame report of input domain, base source and inversion parameters |
Inputs include DNG, NEF, CR2/CR3, ARW, RAF, RW2, ORF, PEF, IIQ, Hasselblad/Flextight .fff and TIFF. JPEG/PNG are export or cache formats, not negative-input formats. RAW file-dialog filters accept upper- and lower-case extensions.
Transmittance T is converted to log density:
The core operations are:
The per-frame pipeline is: linearisation → optical correction → optional light-source decoupling → base removal → density-domain white balance → inversion → output. The application includes the complete derivation under Help → Operation guide / Technical theory.
| Content | Windows | Linux / macOS |
|---|---|---|
| Settings and roll index | %APPDATA%\OpenRevelare |
$XDG_CONFIG_HOME/OpenRevelare/ (default ~/.config) |
| Contact-sheet cache | %LOCALAPPDATA%\OpenRevelare\sheets |
$XDG_CACHE_HOME/OpenRevelare/sheets/ (default ~/.cache) |
| DNG decode cache |
.revelare-cache/ beside the source |
Same |
| Print LUT drop-in folder | %LOCALAPPDATA%\OpenRevelare\luts |
$XDG_DATA_HOME/OpenRevelare/luts/ (default ~/.local/share) |
| Project file |
.ncproj beside the source when writable; otherwise %APPDATA%\OpenRevelare\rolls
|
Beside the source when writable; otherwise $XDG_CONFIG_HOME/OpenRevelare/rolls/
|
Cache locations and limits are configurable. Uninstalling does not remove these data.
- Your first roll: import, calibration, editing, export and reopening a project.
- Operation guide: controls and everyday workflows.
- Technical theory: the colour and inversion model.
- Changelog: release history and improvements.
- Contributing · Security policy · Third-party notices.
Can I import JPEG or PNG negatives? No. Use a supported RAW file or TIFF; 16-bit TIFF is preferable to 8-bit for shadow detail.
Do edits change my originals? No. Edits are stored in .ncproj project files. For a complete backup, retain the originals, projects, LUTs and calibration references together; an exported TIFF does not replace them.
Why does HDR look different in another app? HDR display depends on the operating system, display and viewer. Linux uses an SDR preview fallback. Check a sample export in your intended viewer before exporting the full roll.
Is Smart Cast Correction required? No. Deep-WB is optional and downloaded separately after licence acceptance. Its CC BY-NC-SA 4.0 non-commercial licence differs from the application's GPL licence; review model licensing before use.
Requires .NET 8 SDK, Python 3.12+, CMake 3.21+ and a C/C++ toolchain (Visual Studio 2022 C++ on Windows, Xcode command-line tools on macOS, GCC/Clang on Linux). x64 HEIC builds also require NASM 2.13+ on PATH. The first native build downloads checksum-pinned dependencies.
Clone the repository:
git clone https://github.com/Toshihiko-Lin/Open-Revelare.git
cd Open-RevelareBuild native dependencies on Windows (PowerShell):
./packaging/lcms/build-windows.ps1
./packaging/libraw/build-windows.ps1
python packaging/compute/build.py
python packaging/heif/build.py
./packaging/windows/build-win32-presenter.ps1On Linux / macOS:
bash packaging/lcms/build-unix.sh
bash packaging/libraw/build-unix.sh
python3 packaging/compute/build.py
python3 packaging/heif/build.pyThen build, test and run:
dotnet build -c Release -warnaserror
dotnet test -c Release --no-build
dotnet run --project src/OpenRevelare.Gui -c ReleaseLibRaw · Little CMS · HEIC · GPU compute. See RELEASE.md for platform packaging and release checks.
CLI example:
dotnet run --project src/OpenRevelare.Cli -- -i neg.tiff -o pos.tiff --input-linear --color-space sRGB--input-linear and --input-srgb are mutually exclusive input declarations. Legacy --d-max,
--grade, --pivot and --scan-exposure-ev are accepted for old parity scripts but are no-ops;
the current inversion is controlled by the two calibrated density endpoints and output range.
Read CONTRIBUTING.md before development. Calibration experiments are documented in docs/calibration/; colour-management decisions are recorded in docs/color-management-architecture.md.
The code is licensed under GPL-3.0-only; see LICENSE.
Deep-WB is an optional download: accept the license when first using Smart Cast Correction, or run OpenRevelare.Cli --install-deep-wb. Default packages do not include model weights. Downloads automatically fall back to the Gitee mirror if GitHub fails; offline installation is also supported. The ONNX runtime remains bundled.
models/net_awb.onnx is the Deep White-Balance Editing model, distributed under CC BY-NC-SA 4.0 and outside this project's GPL scope. See models/README.md and THIRD_PARTY_NOTICES.txt.
References include LightSourceDecouple, DiVERE and darktable negadoctor.
The project began as a personal film-copying tool. After user feedback and a core rewrite, it was released as a cross-platform open-source project in August 2026. Early development was supported by:
- 豆腐
- Caramello_焦糖玛奇朵
- REPEATER000
- jamais
- hhd
The project is maintained independently and released under GPL-3.0-only. If it is useful to your workflow, support is welcome:
- No per-roll colour-chart calibration.
- 8-bit TIFF may show banding in shadows; 16-bit input is recommended.
- Linux uses an SDR preview fallback; HDR editing and export remain available.
- macOS native presentation still requires real-device validation; TIFF/CPU rendering remains available.
Report issues through GitHub Issues with the OS version, camera or scanner, input format and error details. Do not upload private originals.










