An open-source image editor that works the way Photoshop does — written in Rust.
The same layout, menus, shortcuts and dialogs as Photoshop 2026, measured point by point,
with image algorithms calibrated against Photoshop's own output.
English · 简体中文
Millions of people have years of Photoshop in their hands: where every panel is, what every shortcut does, how each dialog responds. OpenPhoto aims to be a free editor where all of that carries over unchanged.
OpenPhoto is in early development. What is listed here works today; the roadmap covers what is still missing.
Documents and files
Layers
Selection and transformation
Painting and retouching
Adjustments — every dialog rebuilt after Photoshop 2026
Levels · Curves · Brightness/Contrast · Exposure · Vibrance · Hue/Saturation · Color Balance · Black & White · Photo Filter · Channel Mixer · Selective Color · Gradient Map · Threshold · Posterize · Invert · Desaturate · Equalize · Auto Tone / Contrast / Color
Filters — matched to Photoshop's output, most within one level
Gaussian Blur · Box Blur · Surface Blur · Motion Blur · Blur / Blur More · Unsharp Mask · Sharpen / More / Edges · Add Noise · Despeckle · Dust & Scratches · Median · Minimum · Maximum · High Pass · Offset · Custom · Mosaic · Fragment · Twirl · Pinch · Spherize · Polar Coordinates · Emboss · Find Edges · Solarize · Trace Contour · Wind
![]() | ![]() |
| Hue/Saturation | Gaussian Blur, with its live preview |
OpenPhoto is developed and tested on macOS, where it uses the native menu bar.
git clone https://github.com/yuanzhixiang/openphoto.git
cd openphoto
cargo run --release -- path/to/image.psd
The Rust toolchain is pinned in rust-toolchain.toml and installed automatically by rustup. Without a file argument, OpenPhoto opens a blank document. Files can also be dropped onto the window.
The default Photoshop shortcuts apply. A few of the most used:
| Action | Shortcut |
|---|---|
| New · Open · Save · Save As | ⌘N · ⌘O · ⌘S · ⇧⌘S |
| Undo · Redo · Toggle last state | ⌘Z · ⇧⌘Z · ⌥⌘Z |
| Free Transform | ⌘T |
| Levels · Curves · Hue/Saturation | ⌘L · ⌘M · ⌘U |
| New layer · Group · Merge down | ⇧⌘N · ⌘G · ⌘E |
| Zoom in · Zoom out · Fit · 100% | ⌘= · ⌘- · ⌘0 · ⌘1 |
| Tools | V M L W C I B S Y E G O T U H Z |
| Default colors · Swap colors | D · X |
OpenPhoto is a Cargo workspace. The document model knows nothing about the interface, so every editing operation can be tested without a window.
| Crate | Responsibility |
|---|---|
op-core | Document model: layer tree, 256×256 tiled copy-on-write pixels, blend modes, selections, history, adjustments, filters, transforms, painting |
op-render | wgpu canvas: zoom, mipmaps, checkerboard and pixel grid, embedded in egui through paint callbacks |
op-io | File I/O: a dependency-free PSD reader and writer, plus bitmap formats through image |
op-color | Color models and conversions |
op-tools | Tool definitions and their shortcuts |
op-ui | The egui interface: menus, option bar, toolbar, panels, dialogs and tool interaction |
app | The executable |
cargo test --workspace
About 350 tests guard both halves of the goal:
crates/op-core/fixtures hold Photoshop 2026's output for a probe image under each adjustment and filter. Tests fail if a result drifts by more than the tolerance it was measured to meet, usually one level.egui_kittest: open a dialog from the menu, type into fields, press Enter, and check the document and its history.Major areas that are not there yet, roughly in priority order:
Issues and pull requests are welcome. The guiding rule for any change is simple: a running Photoshop 2026 is the reference. If OpenPhoto looks or behaves differently from it, that is a bug. Please run cargo fmt, cargo clippy --workspace --all-targets and cargo test --workspace before sending a pull request, and add a test for any behavior you change.
Licensed under either of
at your option.
Third-party assets: the interface font is Source Sans 3 (SIL Open Font License, see OFL.txt); icons come from Phosphor Icons (MIT).
OpenPhoto is an independent project. It is not affiliated with, endorsed by or sponsored by Adobe Inc. Adobe and Photoshop are trademarks of Adobe Inc., used here only to describe compatibility.
An open-source image editor that works the way Photoshop does — written in Rust.
The same layout, menus, shortcuts and dialogs as Photoshop 2026, measured point by point,
with image algorithms calibrated against Photoshop's own output.
English · 简体中文
Millions of people have years of Photoshop in their hands: where every panel is, what every shortcut does, how each dialog responds. OpenPhoto aims to be a free editor where all of that carries over unchanged.
OpenPhoto is in early development. What is listed here works today; the roadmap covers what is still missing.
Documents and files
Layers
Selection and transformation
Painting and retouching
Adjustments — every dialog rebuilt after Photoshop 2026
Levels · Curves · Brightness/Contrast · Exposure · Vibrance · Hue/Saturation · Color Balance · Black & White · Photo Filter · Channel Mixer · Selective Color · Gradient Map · Threshold · Posterize · Invert · Desaturate · Equalize · Auto Tone / Contrast / Color
Filters — matched to Photoshop's output, most within one level
Gaussian Blur · Box Blur · Surface Blur · Motion Blur · Blur / Blur More · Unsharp Mask · Sharpen / More / Edges · Add Noise · Despeckle · Dust & Scratches · Median · Minimum · Maximum · High Pass · Offset · Custom · Mosaic · Fragment · Twirl · Pinch · Spherize · Polar Coordinates · Emboss · Find Edges · Solarize · Trace Contour · Wind
![]() | ![]() |
| Hue/Saturation | Gaussian Blur, with its live preview |
OpenPhoto is developed and tested on macOS, where it uses the native menu bar.
git clone https://github.com/yuanzhixiang/openphoto.git
cd openphoto
cargo run --release -- path/to/image.psd
The Rust toolchain is pinned in rust-toolchain.toml and installed automatically by rustup. Without a file argument, OpenPhoto opens a blank document. Files can also be dropped onto the window.
The default Photoshop shortcuts apply. A few of the most used:
| Action | Shortcut |
|---|---|
| New · Open · Save · Save As | ⌘N · ⌘O · ⌘S · ⇧⌘S |
| Undo · Redo · Toggle last state | ⌘Z · ⇧⌘Z · ⌥⌘Z |
| Free Transform | ⌘T |
| Levels · Curves · Hue/Saturation | ⌘L · ⌘M · ⌘U |
| New layer · Group · Merge down | ⇧⌘N · ⌘G · ⌘E |
| Zoom in · Zoom out · Fit · 100% | ⌘= · ⌘- · ⌘0 · ⌘1 |
| Tools | V M L W C I B S Y E G O T U H Z |
| Default colors · Swap colors | D · X |
OpenPhoto is a Cargo workspace. The document model knows nothing about the interface, so every editing operation can be tested without a window.
| Crate | Responsibility |
|---|---|
op-core | Document model: layer tree, 256×256 tiled copy-on-write pixels, blend modes, selections, history, adjustments, filters, transforms, painting |
op-render | wgpu canvas: zoom, mipmaps, checkerboard and pixel grid, embedded in egui through paint callbacks |
op-io | File I/O: a dependency-free PSD reader and writer, plus bitmap formats through image |
op-color | Color models and conversions |
op-tools | Tool definitions and their shortcuts |
op-ui | The egui interface: menus, option bar, toolbar, panels, dialogs and tool interaction |
app | The executable |
cargo test --workspace
About 350 tests guard both halves of the goal:
crates/op-core/fixtures hold Photoshop 2026's output for a probe image under each adjustment and filter. Tests fail if a result drifts by more than the tolerance it was measured to meet, usually one level.egui_kittest: open a dialog from the menu, type into fields, press Enter, and check the document and its history.Major areas that are not there yet, roughly in priority order:
Issues and pull requests are welcome. The guiding rule for any change is simple: a running Photoshop 2026 is the reference. If OpenPhoto looks or behaves differently from it, that is a bug. Please run cargo fmt, cargo clippy --workspace --all-targets and cargo test --workspace before sending a pull request, and add a test for any behavior you change.
Licensed under either of
at your option.
Third-party assets: the interface font is Source Sans 3 (SIL Open Font License, see OFL.txt); icons come from Phosphor Icons (MIT).
OpenPhoto is an independent project. It is not affiliated with, endorsed by or sponsored by Adobe Inc. Adobe and Photoshop are trademarks of Adobe Inc., used here only to describe compatibility.