Native Rust desktop photo browser/editor for image management and color grading.
Photograph focuses on practical desktop workflows: browsing folders, opening images, applying non-destructive edits, and exporting rendered files.
Active project (MVP is usable and still evolving).
Current support intent: Ubuntu Linux and macOS.
- Folder browser with thumbnail grid
- Full image viewer/editor windows (egui/eframe)
- EXIF metadata display
- Non-destructive edits stored as sidecar JSON (
<image>.json) - Geometry edits: rotate, flip, crop, straighten, keystone
- Color/tone edits: exposure, white balance, HSL, selective color, graduated filter, highlight/shadow recovery
- Export rendered images as
JPG,PNG, orWebPwith quality/compression and optional resize - Background rendering/export progress UI
- RAW decode via
rawler:RAF,DNG,NEF,CR2,ARW - Standard image formats via
imagecrate fast path (for exampleJPG,PNG,TIFF,WebP,BMP) - The browser also recognizes
HEICandAVIFextensions, but actual decode support depends on the image stack available in the current build
Download the latest .dmg from GitHub Releases, open it, and drag Photograph into your Applications folder.
sudo snap install photographcargo run --bin photographThe app opens a native window and remembers UI state/config between runs.
For local runs and debugging, install Vulkan user-space tools and verify adapter visibility:
sudo apt update
sudo apt install -y vulkan-tools
vulkaninfo --summaryIf vulkaninfo cannot detect a Vulkan GPU adapter, fix driver/runtime setup before running Photograph.
For .deb packaging from the Makefile:
sudo apt install -y dpkg-devBuild, run, and test:
cargo build
cargo run --bin photograph
cargo testLive-reload dev loop (requires cargo-watch):
cargo install cargo-watch
make devPhotograph stores config at:
- Linux:
~/.config/photograph/config.toml - macOS:
~/Library/Application Support/photograph/config.toml
Current persisted settings include window sizes/positions, last browsed path, and preview backend preference.
Example:
browse_path = "/path/to/photos"
preview_backend = "auto" # auto | gpu | gpu_pipeline | cpu (debug only)You can also override preview backend at runtime:
PHOTOGRAPH_PREVIEW_BACKEND=gpu_pipeline cargo run --bin photographCPU fallback is debug-only and requires:
PHOTOGRAPH_DEBUG_ALLOW_CPU_FALLBACK=1 PHOTOGRAPH_PREVIEW_BACKEND=cpu cargo run --bin photographThe Makefile supports Linux (.deb) and macOS (.app bundle / .dmg) packaging. make build and make install auto-detect the current platform.
Icon assets are derived from the SVG source at packaging/linux/photograph.svg:
make iconsThis regenerates the embedded runtime PNG (assets/photograph-icon-128.png). On macOS it also builds the .icns bundle with squircle background.
Common targets:
make build # platform-aware packaging build
make install # platform-aware install
make build-linux # build .deb on Linux
make build-macos # build .app bundle on macOS
make package-macos # create .dmg disk imageLinux packaging assets live under packaging/linux/. macOS bundle metadata lives under packaging/macos/.
There is a CLI benchmark helper for raw preview/export throughput:
cargo run --bin perf_probe -- /path/to/raws [count] [auto|cpu|gpu_pipeline]cpu mode in perf_probe also requires PHOTOGRAPH_DEBUG_ALLOW_CPU_FALLBACK=1.
It prints METRIC ... lines for preview latency and export throughput.
Pipeline and architecture decisions are documented in /docs:
These docs include Mermaid diagrams (flowcharts and sequence diagrams) for preview processing, export processing, and backend policy enforcement.
src/application code (browser,viewer,editor, processing pipeline)src/bin/perf_probe.rsbenchmark helperdocs/architecture notes and design decisionsassets/embedded app assets (including icon)packaging/Linux and macOS packaging filesMakefiledev/build/install/package commands
GPL-2.0-only. See LICENSE.
