Focusless Edit is a personal desktop photo editor focused on a simple interface, non-destructive editing, and controlled memory usage with large images.
The project currently contains its first working vertical slice:
- Import JPEG, PNG, and WebP images
- Fit, 100% view, zoom, and pan
- Live Temperature and Tint white-balance adjustment
- Perceptual Contrast adjustment from
-100to+100 - Edge-aware Shadows and Highlights adjustments from
-100to+100 - Separate luminance and color denoise adjustments from
0to100 - Perceptual Saturation adjustment from
-100to+100 - Texture, Clarity, and Dehaze adjustments from
-100to+100 - Luminance-only Sharpness adjustment from
0to1000 - Live exposure adjustment from
-3 EVto+3 EV - Interactive five-point tone curve drawn directly over the photo
- Non-destructive ±45-degree straighten dial
- Interactive crop with move, edge/corner resize, Free mode, and aspect presets
- Adjustable export frame with five neutral color presets
- Adjustable luminance vignette from
0to100 - Linear, radial, and brush masks with feathering and local adjustments
- Persistent undo/redo history
- Versioned
.focuslessproject files - Debounced, atomic autosave
- JPEG, PNG, and WebP export
- Viewport-based previews for 50–100 MP images
RAW files, general-purpose layers, and photo catalogs are not implemented yet. See the mask guide for local adjustments and interaction rules.
- Rust 1.97
- Slint desktop UI
- libvips image engine
- LittleCMS-backed ICC color management with a 32-bit float linear scRGB working space
- Native Linux runtime with X11 and Wayland support
- Native Windows x64 runtime and portable packaging
The UI, document model, persistence, and image engine live in separate crates. See the architecture document, the canonical render pipeline, and the performance notes for details.
New developers and AI collaborators should follow the complete development setup and handoff guide. Repository rules for coding agents are in AGENTS.md.
Native Windows development, release builds, and portable packages are covered in the Windows guide.
sudo apt update
sudo apt install -y \
build-essential pkg-config libvips-dev icc-profiles-free \
libfontconfig1-dev libxkbcommon-dev libxkbcommon-x11-dev \
libwayland-dev libgl1-mesa-dev zenityIf Rust is not installed:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shThe repository's rust-toolchain.toml selects the required toolchain and
components automatically.
Clone, verify, and build:
git clone https://github.com/NeoAcar/focusless-edit.git
cd focusless-edit
cargo test --workspace --locked
cargo build --workspace --release --lockedInstall Git, Rustup, and Visual Studio Build Tools with the Desktop development with C++ workload. Then run from a native PowerShell window:
git clone https://github.com/NeoAcar/focusless-edit.git
Set-Location focusless-edit
.\scripts\windows\build.ps1 -PackageThe script downloads and verifies the pinned official libvips runtime, runs
the quality gate, builds the native application, and creates
dist\Focusless-Edit-windows-x64.zip. See the
complete Windows guide for development and
troubleshooting.
cargo run -p focusless-appRun the optimized build:
./target/release/focusless-editImport a photo or project directly:
cargo run -p focusless-app -- /path/to/photo.jpg
cargo run -p focusless-app -- /path/to/edit.focuslessEnable more detailed logs:
RUST_LOG=debug cargo run -p focusless-appOn Linux, logs are stored in the focuslessedit directory below the XDG state
directory. Unsaved work uses a recovery project below the XDG data directory.
| Action | Shortcut |
|---|---|
| Import | Ctrl+O |
| Save / Save As | Ctrl+S / Ctrl+Shift+S |
| Export | Ctrl+E |
| Copy edited image | Ctrl+C |
| Undo / Redo | Ctrl+Z / Ctrl+Y |
| Fit / 100% | 0 / 1 |
| Zoom | Mouse wheel |
| Pan | Drag the photo |
| Move crop | Drag inside the crop frame |
| Resize crop | Drag a crop-frame edge or corner |
| Shape tone curve | Drag any white control point |
The crop tool includes Free, 1:1, 4:3, and 16:9 modes plus a full-image reset. Crop and straighten rotation are stored non-destructively in the project and applied to full-resolution exports. Temperature and Tint use CAT16 chromatic adaptation in linear RGB and preserve alpha. Contrast reshapes OKLab lightness while leaving chroma and extended-range values intact. Shadows and Highlights use an edge-aware guided filter over log OKLab lightness, preserving fine detail, chroma, alpha, and extended-range values. Saturation scales OKLab chroma while preserving perceptual lightness and hue. Denoise uses scale-aware guided filters on OKLab lightness and chroma so fitted previews remain consistent with full-resolution output. Sharpness uses a thresholded unsharp mask on OKLab lightness to avoid color halos. The tone curve works in linear RGB with fixed endpoints, three two-dimensional control points, shape-preserving interpolation, and a live full-image preview. The vignette darkens OKLab lightness radially after sharpening. The frame is composited in linear light after vignette and is included in full-resolution exports.
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --locked -- -D warnings
cargo test --workspace --locked
cargo build --workspace --release --locked
git diff --checkBefore contributing, read CONTRIBUTING.md and the guide for adding an operation.