Skip to content

Repository files navigation

Vibe Photo

A fast, non-destructive RAW photo editor and catalog manager for the desktop.

Develop the RAW, not a JPEG. Layered, local, non-destructive edits on a headless processing core — with a responsive, resizable UI.

License: MIT Python 3.12+ Platforms Tests


Screenshots

The Develop module: canvas, histogram, and adjustment panel
On-canvas crop & straighten Local-adjustment masks
Crop tool Radial mask

Developing RAW files from a Toronto shoot — the develop panel, the on-canvas crop tool (handles, rule-of-thirds grid, dimmed surround), and a radial local-adjustment mask drawn on the photo.


Why Vibe Photo

Most edits you make to a photo are destructive — they bake pixels. Vibe Photo keeps your entire edit as data: a stack of adjustment layers, local masks, crop, and a creative profile, all stored separately from the image. The same resolution-independent pipeline drives both the live preview and the final export, so what you see is what you get. RAW files are demosaiced to 16-bit scene-linear light, so exposure and tone behave photographically and highlights keep real headroom — you are developing the RAW, not editing a flattened preview.

The whole processing engine and catalog are headless: they never import the UI, so they run in CI, on a server, or in a batch job without a display.

Features

RAW develop

  • Scene-linear pipeline — 16-bit linear demosaic; white balance, exposure, and tone run in linear light, then a filmic base tone-map renders to display.
  • Per-camera white balance — Temperature (Kelvin) + Tint with an eyedropper, calibrated to each camera's as-shot illuminant.
  • Highlight recovery — clipped-channel reconstruction at decode and in the pipeline, so blown skies resolve cleanly instead of smearing colour.
  • Creative profiles — ten base looks (Neutral, Standard, Vivid, Portrait, Landscape, Flat, Matte, Warm/Cool Film, Monochrome) applied beneath every adjustment.

Tone, colour & detail

  • Exposure, Contrast, Highlights / Shadows / Whites / Blacks.
  • Presence: Texture, Clarity, Dehaze; Vibrance / Saturation.
  • Parametric and point tone curves (RGB + per-channel).
  • HSL / B&W mixing and 3-way (+ global) colour grading.
  • Detail: sharpening (amount/radius/detail/masking) and luminance/colour noise reduction.

Local adjustments (masking)

  • Radial, graduated (linear), and brush masks — per layer.
  • Add and tune masks from the panel, or draw them directly on the photo: drag a radial's centre/edges, drag gradient endpoints, paint brush strokes.
  • Add/subtract mask components; each layer applies only inside its mask.

Geometry

  • Crop & straighten — centred aspect-ratio presets plus an on-canvas crop tool (drag corners/edges, rule-of-thirds grid, dimmed surround), 90° rotation, and a straighten slider, all from the image footer.

Lens corrections (manual)

  • Distortion (barrel/pincushion), chromatic-aberration defringe, and vignetting — pure geometry, no lens-profile database required.

Library & export

  • Catalog indexing, thumbnails, ratings/flags, and metadata on an embedded database.
  • Import develop presets in the common XMP and legacy Lua-table sidecar formats.
  • Colour-managed export to JPEG / PNG / 16-bit TIFF with an embedded sRGB ICC profile, plus resize and watermark presets.

Workflow & performance

  • Non-destructive adjustment layers; toggle any layer to compare.
  • One-click Auto tone and a single-image HDR look, computed per photo.
  • Smart-preview editing — a low-resolution draft renders live while you drag (skipping the expensive blur stages), then a crisp full-resolution frame lands once the edit settles, keeping the UI responsive on large files.
  • Copy/paste settings, edit-like-last, full undo/redo, and a resizable workspace.

Download (no Python required)

Prebuilt desktop packages are published on the Releases page for every v* tag:

Platform Asset Notes
Windows VibePhoto-Setup.exe Per-user installer (no admin), Start-Menu shortcut, clean uninstaller. Also committed at the repo root for the latest build.
macOS VibePhoto-<version>-macos.zip Unzip → drag VibePhoto.app to Applications. The app is unsigned: on first launch right-click → Open (or allow it under System Settings → Privacy & Security).
Linux VibePhoto-<version>-linux-x86_64.tar.gz tar -xzf, then run VibePhoto/VibePhoto. Needs standard desktop libraries (libegl1, libxkbcommon0).

The macOS and Linux packages are built by the release workflow (.github/workflows/release.yml) — PyInstaller cannot cross-compile, so each platform builds on its own runner.

Install from source

Requires Python 3.12+.

git clone https://github.com/RenderDeMartes/VibePhoto.git && cd VibePhoto

python -m venv .venv
.venv\Scripts\activate        # Windows
# source .venv/bin/activate   # macOS / Linux

# Headless processing core only:
pip install -e .

# Full desktop app (UI + RAW decoding):
pip install -e ".[ui,raw,cv]"

RAW decoding uses LibRaw via rawpy (the raw extra). Without it the app still runs and falls back to embedded previews for RAW files.

Optional extras

Extra Adds
ui The PySide6 desktop application
raw RAW decoding (LibRaw / rawpy)
cv OpenCV-backed computer-vision helpers
dev Test, lint, and type-check tooling
build PyInstaller, for packaging the desktop app

Run

python -m vibephoto          # launch the desktop app (needs the [ui] extra)

Build the desktop packages yourself

pip install -e ".[ui,raw,cv,build]"
python scripts/build_exe.py          # PyInstaller one-folder bundle -> dist/VibePhoto/

The same spec builds on every platform (macOS additionally produces dist/VibePhoto.app). PyInstaller does not cross-compile — build on the OS you are targeting.

Windows installer (extra step):

python scripts/build_installer.py    # -> VibePhoto-Setup.exe (repo root)

build_installer.py builds the bundle and then compiles packaging/VibePhoto.iss with the Inno Setup compiler (free — install from https://jrsoftware.org/isdl.php). The result is a single setup.exe that installs per-user (no admin required) with Start-Menu and optional desktop shortcuts and a clean uninstaller.

macOS: zip the app bundle — ditto -c -k --keepParent dist/VibePhoto.app VibePhoto-macos.zip. Linux: tar the folder — tar -czf VibePhoto-linux-x86_64.tar.gz -C dist VibePhoto.

Releasing

Releases are built by CI (release.yml) from a version tag — one command chain publishes all three platforms:

# 1. Bump the version in pyproject.toml AND src/vibephoto/__init__.py, commit.
# 2. Rebuild + commit the Windows installer (kept current in the repo root):
python scripts/build_installer.py
git add -A && git commit -m "Release vX.Y.Z"

# 3. Tag and push — the tag triggers the release workflow:
git tag vX.Y.Z
git push origin main --tags

CI then runs lint/types/tests, builds the Windows installer, the macOS .app zip, and the Linux tarball, creates the GitHub Release for the tag, and attaches all three artifacts with auto-generated release notes.

Architecture

Strictly layered packages. The cardinal rule: the processing engine and catalog never import the UI. Everything below the UI is fully usable headless.

UI (PySide6)                 canvas, panels, modules
        |
Application / Services       orchestration, view-models, commands
        |
Catalog - Metadata - Presets - Export        domain layers
        |
Processing engine - RAW decode               pure NumPy, headless

The develop pipeline is an ordered, memoizing chain of pure stages: changing one parameter recomputes only that stage and the ones downstream of it, which is what keeps slider drags fast. Edit layers compose bottom-to-top over a once-applied crop/straighten. The full design lives in docs/.

Development

pip install -e ".[ui,raw,cv,dev]"

pytest                 # 349 tests
ruff check src tests   # lint
mypy src               # type-check (strict)

The headless test suite runs with no Qt present; GUI tests use the offscreen Qt platform and are marked gui. RAW integration tests run against a tiny synthetic DNG, with an optional full end-to-end test gated on VIBEPHOTO_TEST_RAW=<path-to-a-real-raw>.

Project layout

src/vibephoto/
  processing/    develop pipeline, RAW decode, layers, masks, geometry, lens, profiles
  catalog/       embedded-database catalog, indexer, repositories
  export/        renderers, presets, ICC tagging
  presets/       XMP / Lua-table preset import
  ui/            PySide6 desktop app (canvas, panels, modules)
docs/            architecture and design documents
packaging/       PyInstaller spec + Inno Setup installer script
scripts/         build helpers
tests/           full test suite

Contributing

Issues and pull requests are welcome. Please run pytest, ruff check, and mypy before submitting. Do not commit third-party preset packs, sample RAW files, or any other content you do not own — presets/ and common media extensions are git-ignored for this reason.

License

Released under the MIT License. © 2026 Vibe Photo contributors.

This project is an independent work. It is not affiliated with, endorsed by, or derived from any other photo-editing product, and all trademarks are the property of their respective owners.

About

A fast, non-destructive RAW photo editor and catalog manager for the desktop

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages