A free, non-destructive RAW photo editor for Windows — a simpler, local alternative to Lightroom and darktable, with a GPU develop pipeline, AI upscaling and motion deblur. No subscription, no account, nothing uploaded.
TypeScript
10
516 commits
updated Sep 22, 2026

Vitrine — the darkroom, behind glass.
Vitrine is a free RAW photo editor for Windows — a simpler, local alternative to Lightroom and darktable, with no subscription and no account. Open a photo straight off your camera — Olympus, Canon, Nikon, Sony, Panasonic, or Adobe DNG — and develop it non-destructively: exposure and colour, tone curves, local masks, lens fixes, GPU denoise, AI upscaling and motion deblur, then export in the format and colour space you need. Every edit is saved per photo and re-applied when you reopen it; your original file is never touched.
Everything runs on your machine — no cloud, no upload, no sign-in — inside a clean full-screen glass workspace that keeps every tool one click away.
Try Vitrine if you want:
Vitrine is probably not for you if you need:
Just want to use Vitrine? Download the latest Vitrine Setup X.Y.Z.exe from the
Releases page and run it — no other
software required. The installer adds a desktop shortcut and a Start Menu entry.
Prefer not to install anything? Grab Vitrine X.Y.Z portable.exe instead — a single
executable that runs from anywhere (Downloads folder, USB stick) with no installation and no
admin rights, and shares the same profile as the installed app. Since both downloads are
currently unsigned, Windows SmartScreen may show an "unknown publisher" prompt the first time
you run them — choose More info → Run anyway. You can verify any download first against
SHA256SUMS.txt (published with every release):
CertUtil -hashfile "Vitrine Setup X.Y.Z.exe" SHA256 # compare with SHA256SUMS.txt
For development, or to build your own installer. Requires Node.js 18+ (the repo uses pnpm; npm also works). Windows is the supported target.
git clone https://github.com/Redrum624/vitrine.git
cd Vitrine
pnpm install # or: npm install
pnpm run electron-dev # Vite dev server + Electron (opens automatically on port 3005)
Build a distributable Windows installer:
npm run build:win # clean -> tsc + vite build -> NSIS installer + portable exe -> collect into installer/
# Output: installer/Vitrine Setup 1.25.0.exe + Vitrine 1.25.0 portable.exe
# (+ SHA256SUMS.txt, README.txt, LICENSE, THIRD-PARTY-LICENSES.md)
npm run build:win:dir # fast unpacked build (no installer, quick iteration)
The user-facing distributables are collected into a clean installer/ folder at the repo root:
the versioned Setup ….exe and … portable.exe, their SHA256SUMS.txt, a plain-text
README.txt, LICENSE, and THIRD-PARTY-LICENSES.md. electron-builder's full staging output
(unpacked app, block maps) stays in release/.
One RAW file, developed non-destructively — straight off the camera on the left, finished on the right.

Colors that match your camera. By default, Vitrine fits each RAW's develop to the camera's own embedded render at decode time — so what you see on open is what the camera meant, not a generic bright decode. Measured against OM Workspace (which uses the in-camera engine) on real ORFs: ΔE76 of 1.2–4.7, where Workspace's own difference to the camera JPEG is ~0.8–1.1. Methodology: default settings on both sides, sRGB exports, untouched files; the only known drift is deep-shadow foliage in backlit scenes (the camera's local tone mapping is position-dependent; a color transform is not). Toggle per photo in the RAW Decode panel — off gives Vitrine's neutral bright starting point.

RAW, handled properly. Choose the demosaic algorithm and highlight-recovery mode per photo, and read camera/lens details straight from the RAW container.
| RAW Decode (per-photo) | Camera & lens, from the RAW |
|---|---|
![]() | ![]() |
Every tool in one consistent card system — a floating glass workspace where each module reads the same.
![]() | ![]() |
| Basic Adjustments — exposure, tone & colour, with mask tools | Enhance — GPU denoise, sharpen, AI upscale & motion-deblur |
![]() | ![]() |
| Tone Curve — master + per-channel RGB | Color Balance — 8-channel HSL grading |
![]() | ![]() |
| White Balance — temp/tint + auto-neutral | Crop & Transform — ratios, rotate, auto-straighten |
dcraw_emu) Bayer demosaic in the Electron main process for 15+ formats (CR2/CR3, NEF, ARW, ORF, DNG, RW2, PEF, …), decoding with DCB demosaic + blended highlight reconstruction by default; libraw-wasm and embedded-JPEG fallbacks ensure every RAW opens._VIT, _VIT_1, …) instead of overwriting.xmp:Rating; a shared rating filter (footer + Gallery) hides lower-rated photos everywhere at once.
dcraw_emu) and
libraw-wasm for RAW; sharp for export resize + encode/ICC/metadata;
onnxruntime-node + DirectML for AI super-resolution (Real-ESRGAN x4plus) in the main processtsc + ESLint; packaging via electron-builderImageProcessingPipeline // module orchestration
rawDecoder.cjs // main-process RAW demosaic (native -> wasm -> embedded JPEG)
imageWriter.cjs // export encode (8/16-bit, ICC, EXIF/XMP) via sharp
ExportService // format/quality/colour-space + wide-gamut conversion
StyleAnalysisService // Copy/Paste Style (histogram matching)
AutoAdjustService // Auto All driven by a user-style profile
LocalAdjustmentsModule // radial/linear masks + per-mask adjustments
npm run dev # dev server (vite) + Electron via scripts/dev.cjs
npm run build # tsc + vite build
npm run typecheck # tsc --noEmit
npm run lint # eslint (0 problems)
npm run test # jest (1834 tests)
npm run test:e2e # Playwright end-to-end tests
git checkout -b feat/your-feature)npm run typecheck, npm run lint, and npm run test greenSampled daily from the GitHub Releases API — the curve builds from launch day forward.
Source-available, non-commercial. Vitrine is licensed under the PolyForm Noncommercial License 1.0.0 — free to use, modify, and share for non-commercial purposes. Commercial use of this project or its derivatives is not permitted. This is not an OSI-approved open-source license.
Bundled third-party components (npm packages, LibRaw, libvips, Electron/Chromium) retain their own licenses and are unaffected by the project license. See THIRD-PARTY-LICENSES.md for the full attribution list and per-license obligations.
Vitrine — a free RAW photo editor for Windows.
505 commits
11 commits
TypeScript
91.8%
JavaScript
7.2%
A free, non-destructive RAW photo editor for Windows — a simpler, local alternative to Lightroom and darktable, with a GPU develop pipeline, AI upscaling and motion deblur. No subscription, no account, nothing uploaded.
TypeScript
10
516 commits
updated Sep 22, 2026

Vitrine — the darkroom, behind glass.
Vitrine is a free RAW photo editor for Windows — a simpler, local alternative to Lightroom and darktable, with no subscription and no account. Open a photo straight off your camera — Olympus, Canon, Nikon, Sony, Panasonic, or Adobe DNG — and develop it non-destructively: exposure and colour, tone curves, local masks, lens fixes, GPU denoise, AI upscaling and motion deblur, then export in the format and colour space you need. Every edit is saved per photo and re-applied when you reopen it; your original file is never touched.
Everything runs on your machine — no cloud, no upload, no sign-in — inside a clean full-screen glass workspace that keeps every tool one click away.
Try Vitrine if you want:
Vitrine is probably not for you if you need:
Just want to use Vitrine? Download the latest Vitrine Setup X.Y.Z.exe from the
Releases page and run it — no other
software required. The installer adds a desktop shortcut and a Start Menu entry.
Prefer not to install anything? Grab Vitrine X.Y.Z portable.exe instead — a single
executable that runs from anywhere (Downloads folder, USB stick) with no installation and no
admin rights, and shares the same profile as the installed app. Since both downloads are
currently unsigned, Windows SmartScreen may show an "unknown publisher" prompt the first time
you run them — choose More info → Run anyway. You can verify any download first against
SHA256SUMS.txt (published with every release):
CertUtil -hashfile "Vitrine Setup X.Y.Z.exe" SHA256 # compare with SHA256SUMS.txt
For development, or to build your own installer. Requires Node.js 18+ (the repo uses pnpm; npm also works). Windows is the supported target.
git clone https://github.com/Redrum624/vitrine.git
cd Vitrine
pnpm install # or: npm install
pnpm run electron-dev # Vite dev server + Electron (opens automatically on port 3005)
Build a distributable Windows installer:
npm run build:win # clean -> tsc + vite build -> NSIS installer + portable exe -> collect into installer/
# Output: installer/Vitrine Setup 1.25.0.exe + Vitrine 1.25.0 portable.exe
# (+ SHA256SUMS.txt, README.txt, LICENSE, THIRD-PARTY-LICENSES.md)
npm run build:win:dir # fast unpacked build (no installer, quick iteration)
The user-facing distributables are collected into a clean installer/ folder at the repo root:
the versioned Setup ….exe and … portable.exe, their SHA256SUMS.txt, a plain-text
README.txt, LICENSE, and THIRD-PARTY-LICENSES.md. electron-builder's full staging output
(unpacked app, block maps) stays in release/.
One RAW file, developed non-destructively — straight off the camera on the left, finished on the right.

Colors that match your camera. By default, Vitrine fits each RAW's develop to the camera's own embedded render at decode time — so what you see on open is what the camera meant, not a generic bright decode. Measured against OM Workspace (which uses the in-camera engine) on real ORFs: ΔE76 of 1.2–4.7, where Workspace's own difference to the camera JPEG is ~0.8–1.1. Methodology: default settings on both sides, sRGB exports, untouched files; the only known drift is deep-shadow foliage in backlit scenes (the camera's local tone mapping is position-dependent; a color transform is not). Toggle per photo in the RAW Decode panel — off gives Vitrine's neutral bright starting point.

RAW, handled properly. Choose the demosaic algorithm and highlight-recovery mode per photo, and read camera/lens details straight from the RAW container.
| RAW Decode (per-photo) | Camera & lens, from the RAW |
|---|---|
![]() | ![]() |
Every tool in one consistent card system — a floating glass workspace where each module reads the same.
![]() | ![]() |
| Basic Adjustments — exposure, tone & colour, with mask tools | Enhance — GPU denoise, sharpen, AI upscale & motion-deblur |
![]() | ![]() |
| Tone Curve — master + per-channel RGB | Color Balance — 8-channel HSL grading |
![]() | ![]() |
| White Balance — temp/tint + auto-neutral | Crop & Transform — ratios, rotate, auto-straighten |
dcraw_emu) Bayer demosaic in the Electron main process for 15+ formats (CR2/CR3, NEF, ARW, ORF, DNG, RW2, PEF, …), decoding with DCB demosaic + blended highlight reconstruction by default; libraw-wasm and embedded-JPEG fallbacks ensure every RAW opens._VIT, _VIT_1, …) instead of overwriting.xmp:Rating; a shared rating filter (footer + Gallery) hides lower-rated photos everywhere at once.
dcraw_emu) and
libraw-wasm for RAW; sharp for export resize + encode/ICC/metadata;
onnxruntime-node + DirectML for AI super-resolution (Real-ESRGAN x4plus) in the main processtsc + ESLint; packaging via electron-builderImageProcessingPipeline // module orchestration
rawDecoder.cjs // main-process RAW demosaic (native -> wasm -> embedded JPEG)
imageWriter.cjs // export encode (8/16-bit, ICC, EXIF/XMP) via sharp
ExportService // format/quality/colour-space + wide-gamut conversion
StyleAnalysisService // Copy/Paste Style (histogram matching)
AutoAdjustService // Auto All driven by a user-style profile
LocalAdjustmentsModule // radial/linear masks + per-mask adjustments
npm run dev # dev server (vite) + Electron via scripts/dev.cjs
npm run build # tsc + vite build
npm run typecheck # tsc --noEmit
npm run lint # eslint (0 problems)
npm run test # jest (1834 tests)
npm run test:e2e # Playwright end-to-end tests
git checkout -b feat/your-feature)npm run typecheck, npm run lint, and npm run test greenSampled daily from the GitHub Releases API — the curve builds from launch day forward.
Source-available, non-commercial. Vitrine is licensed under the PolyForm Noncommercial License 1.0.0 — free to use, modify, and share for non-commercial purposes. Commercial use of this project or its derivatives is not permitted. This is not an OSI-approved open-source license.
Bundled third-party components (npm packages, LibRaw, libvips, Electron/Chromium) retain their own licenses and are unaffected by the project license. See THIRD-PARTY-LICENSES.md for the full attribution list and per-license obligations.
Vitrine — a free RAW photo editor for Windows.
505 commits
11 commits
TypeScript
91.8%
JavaScript
7.2%