storytold/photocraft
Media & DesignA native, offline photo editor in pure Rust with layers, masks, live type and layered PSD support.
Overview
PhotoCraft is an open-source image editor written from scratch in pure Rust. It aims to reproduce familiar Photoshop-style workflows: layers, masks, adjustment layers, layer styles, editable type, vector shapes, a brush engine, filters and layered document formats. It runs natively on macOS, Windows, Linux and FreeBSD, and compiles to WebAssembly for the browser.
The design is engine-first: a data-only document model and a command registry sit beneath a thin egui interface, with a CPU compositor as the reference and a wgpu compositor for the GPU canvas. The project describes itself as clean-room, built from public specifications and observed behaviour, and not affiliated with Adobe. It is aimed at people who want an open, offline editing tool and at developers who want to script the engine.
Getting started
Build and run the desktop app from source, with Rust installed:
git clone https://github.com/storytold/photocraft
cd photocraft
cargo run --release -p photocraft -- image.psd
Run the workspace test suite with cargo test --workspace. Japanese fonts for the UI and Type tool come from the optional craft-fonts build input; desktop release builds include it, while source builds fall back to system CJK fonts if it is absent.
If you do not want to build, download installers from the GitHub releases or from the PhotoCraft page. Linux builds are available as AppImage, Flatpak, .deb, .rpm and tarball; a Flatpak run looks like:
flatpak install --user photocraft-<version>-linux-x86_64.flatpak
flatpak run ai.storyteller.photocraft
For headless editing, the bundled CLI accepts command sequences, for example opening a PSD, applying a Smart Sharpen filter and a Curves adjustment layer, then exporting a PNG. The same commands are exposed through a CLI, a JSON control channel and an MCP server, so agents can drive the same engine as the UI.
Constraints and known limitations
The README labels the project early alpha: much of Photoshop's feature surface is wired up, but it is not a daily-driver replacement. Stated gaps include AI/generative features, 15 missing tools, depth in typography and professional workflows, and plug-in compatibility. The parity checklist measures wiring, not behaviour.
RAW processing is not offered: raster images are loaded directly, and RAW work belongs to the separate LightCraft app. Format support is uneven — HEIC is read-only in official builds, AVIF is write-only behind a build feature, AVIF decoding and JPEG XL are unavailable, and Affinity documents open read-only with a warning for unsupported parts. PSD round trips preserve rendering for most but not all test files and are not byte-identical to the source.
On Wayland, file drag and drop does not work yet; use File › Open or paste. Running under XWayland enables drag and drop but blurs the interface at fractional display scales. The macOS CLI binary is signed and notarized but verifies notarization online on first run. The project is dual-licensed MIT or Apache-2.0 at your option.
HotRepo's take
PhotoCraft drew two Hacker News threads in early October 2026, the larger one titled "Adobe Creative Suite Cleanroom Port to Rust" with 144 points and 91 comments. Discussion is sharply split: one commenter calls the RAW gap a "massive hole" for photography and treats PhotoCraft as far-from-complete software 1, while another argues that this is what to expect from v0.3.0 of a tool and that publishing early is how the author gets feedback from daily users 2. The maintainers' own alpha disclaimer lines up with the first camp rather than the marketing framing: the feature surface is broad, but professional parity is explicitly not claimed. For readers, the interesting question is not whether it replaces Photoshop today, but whether the command-driven architecture and PSD handling make it a useful base for scripting and experimentation.
Written by AI from the project's README, updated . The project's own docs are the source of truth.