Files
photocraft/docs/roadmap.md
T
Max MurphyandClaude Opus 5.5 27263bb16d Canvas: zoom is physical at any display scale (#1978)
View zoom now means device pixels per document pixel, so 100% shows one image pixel per physical
display pixel on a scaled (125%, 200%) display, as in Photoshop. Fit, Actual Pixels, pan/zoom anchoring,
scrollbars, the navigator, the pixel grid and every hit tolerance go through canvas_ppp / point_zoom.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 16:10:49 -04:00

21 KiB
Raw Blame History

Roadmap

Status legend: ✅ done · 🟡 in progress · ⬜ not started. Updated 2026-10-08.

Parity metrics. cargo xtask parity measures how much of Photoshop's menu tree is wired to a command and writes parity.md. It does not measure whether those commands behave like Photoshop, feel right, or survive real files. Read it next to the PSD composite oracle, the test count, and the honest parity assessment below, which is the reference answer to "how close are we really". The weighted feature estimate in parity-estimate.md (~82%) counts feature surface and overstates user-facing readiness; treat it as an upper bound.

M Status Where we are
M0 Skeleton ✅ workspace, xtask (layers / wasm / ci / stats / corpus / parity), CI workflow
M1 Foundation ✅ geom, color (27 blend modes), raster (COW tiles, any depth), doc, ops, cms (ICC)
M2 PSD v1 ✅ photocraft-psd: 134/135 real files byte-exact round trip
M3 Viewer app ✅ egui shell (Pro / Studio / Classic themes), 13+ codecs, native and web (trunk) builds
M4 Native format + engine ✅ 500+ commands, .pcraft (incremental, autosave, crash recovery), CLI, persistent preferences
M5 GPU compositor 🟡 wgpu compositor drives the canvas, layer effects, vector masks, artboards, pattern fills and every clip case included (≤1/255 vs CPU); Multichannel documents fall back to the CPU
M6 Paint + select 🟡 brush engine, all selection tools, multi-layer selection, snapping + smart guides, free transform + warp; stylus pressure on Windows (WM_POINTER via winit), the web (Pointer Events, with tilt/twist), macOS (AppKit event monitor: pressure, tilt, rotation, eraser end) and Linux X11 (XInput2 raw valuators); on Linux Wayland a pen opens the window through Xwayland (native tablet-v2 still open, #79)
M7 Adjust + filters 🟡 16 adjustment layers + destructive-only adjustments, 70+ filters incl. Blur Gallery, Actions record/replay, Fade
M8 PSD v2 🟡 adjustments (incl. Selective Color, Color Lookup), fills, effects, patterns, text, shapes, smart objects, alpha channels; oracle 111/170
M9 Text, vector, styles 🟡 type engine + Warp Text, shapes / pen / paths, all 10 effects on CPU and GPU (parity ≤1/255, 30/31 corpus effect files on the GPU)
M10 Smart features 🟡 classical Select Subject / Object, content-aware fill and scale, healing, auto-align / auto-blend; ML backend not started
M11 Automation + formats 🟡 MCP (headless + live bridge), batch, Image Processor, prefs over MCP; DoD test passes (10 agent tasks over MCP, automation/tests/agent_tasks.rs); since 2026-10-07 the CLI rejects unknown flags and answers <subcommand> --help, batch runs report same-name outputs instead of overwriting them, MCP command_batch steps can start background jobs, and headless saves never flatten over the opened file; JP2 / DICOM / DPX / C2PA pending
M12 Pro parity 🟡 CMYK / Lab / Indexed / Bitmap / Duotone, ICC + soft proofing, channels + Quick Mask, smart-object stack modes, artboards, layer comps; print, HDR, photomerge, timeline pending

Menu parity: 532 / 625 (85.1%) on 2026-10-01, up from 224 (35.8%) the day before. See parity.md.

2026-10-08: Affinity .af, .afdesign, .afphoto and .afpub documents (container versions 8–12) open natively (format notes): pages and artboards, layers and groups, curves and geometric shapes with fills, gradients and strokes, text as type layers, placed images as smart objects, pixel layers and masks, as an 8-bit RGB document without a source save path. Measured against the thumbnail Affinity embeds in each file, 21 pinned public documents (cargo xtask corpus --affinity) differ by 0–4.6 of 255 on average. Layer effects, adjustments, live filters, brush strokes, special shapes, master pages and CMYK/Lab/16-bit document colour are approximated or left out, each with a warning; damaged or unknown files fall back to the embedded preview. Affinity writing is not implemented: no Affinity installation was available to check written files, so .af export stays unsupported.

Honest parity assessment (2026-10-05)

This is the reference answer to "how close are we to Photoshop parity, really". Agents: read it before picking work. Update it (with dated measurements) when the numbers move; don't restate the menu-parity number in its place.

Measured numbers live in the scorecard (cargo xtask scorecard, kept current by CI): performance scenarios against their budgets, corpus floors, per-area checklists with done / partial / missing counts, and the number of settings that do nothing. Where the scorecard and the estimates below disagree, the scorecard's numbers supersede them. As of 2026-10-05 it counts 67 of 129 preferences that nothing reads; 3 of the 25 budgeted performance scenarios meet their #209–#211 targets (first baseline, taken on a heavily loaded machine), and the 150-layer nudge scenario crashes the GPU compositor; the open area issues' checklists (#203–#220) are almost entirely missing or partial.

2026-10-07: UI Font Size now applies to interface text, including CJK fallbacks, independently of display and canvas zoom (#532). The current preference audit drops from 59 to 58 unread settings out of 135; see the regenerated scorecard.

2026-10-09: Output-preserving Radial Blur direct sampling measured on a local i7-9750H, 12 workers, 24 MP RGBA8, Good quality, amount 1: Spin 66.10 → 16.43 s (4.02×), Zoom 19.19 → 5.35 s (3.59×), one paired run each, exact output equality. These are local measurements at amount 1; see method and limits.

Bottom line. Two days after 0.2.0 we had merged ~96 PRs and closed ~48 issues, but real Photoshop parity is still well below 50%. The biggest gaps are AI, missing tools, professional workflow depth and the plug-in ecosystem. Most fixes since 0.2.0 have passed our tests but have not yet been validated by users, and this week proved our tests miss what users hit: on first public use they found broken basics (text selection offset, 214 shortcut failures, panels resizing themselves, an immovable crop frame, folders that wouldn't collapse, lag on layout PSDs) that all counted as "live" in parity.md.

Overall. Feature surface: roughly 60–70% of what a typical Photoshop user touches exists in some form. "A professional could switch for daily work": roughly 25–35%. True 1:1 parity is many months of focused work, and some areas need product decisions rather than effort. Confidence: moderate — the next users of 0.2.x will move these numbers either way.

By dimension

Dimension Measured / evidence (2026-10-05) Grade Notes
Menu wiring 626/626 menu items dispatch a command (parity.md) high but shallow Says nothing about behaviour.
PSD fidelity (rendering) Corpus oracle 115/170 (68%): 30 differ, 26 have no usable reference, 1 import error. 2026-10-07: io corpus 146/170, psd-tools corpus 236/309 (was 229: Advanced Blending knockouts), Photoshop oracles 132/258 medium Push to 170/170 under way (effects/strokes, multi-instance effects, 16/32-bit and colour modes, references for skipped files).
PSD round trip 169/169 re-import identically; every adjustment layer and blend mode round-trips high (within corpus) Floors in crates/io/tests/corpus.rs; raise, never lower. Corpora: cargo xtask corpus --all (ours: https://github.com/storytold/photocraft-corpus).
Smart filters / text / effect shapes in PSDs Measured on our Photoshop-authored set (https://github.com/storytold/photocraft-corpus, corpus/photoshop, 258 files): see the per-group floors in crates/io/tests/corpus.rs and crates/engine/tests/photoshop_oracles.rs. Smart objects and smart filters now survive PSD save and open (41 corpus files, 206 smart objects, round trip strict; Photoshop opens our exports with live filters); re-rendering Photoshop's smart filters with ours matches 5/30 (was 1/30) low–medium Remaining re-render gaps are filter maths (Gaussian/Motion Blur, Unsharp Mask, Emboss, Add Noise RNG) and bicubic placement.
Core editing (layers, masks, selections, adjustments, filters, transforms) Broad engine coverage; many interaction bugs fixed after 0.2.0 (adjustment dialogs, Curves, crop, Move/Transform modifiers, gesture origin) medium Fixes not yet user-validated.
UI / UX polish Shortcut audit 214 → 0 failures; dock, Layers rows and menus reworked; first visual-QA sweep found 14 defects (#147–#157). 2026-10-07: the keyboard-only shortcuts with no menu item (⌥[ ⌥] ⌥, ⌥. layer navigation, ⇧⌥[ ⇧⌥] to extend the selection, 1–0 for opacity and ⇧ for flow or fill, ⇧[ ⇧] hardness, ⌥⌘T to transform a copy and ⌥⇧⌘T to step and repeat), ⌥-click colour sampling with painting tools, double-click a Layers row for Layer Style, File › New from Clipboard, a centred main window and remembered Liquify settings (#352, #417, #350, #368, #419, #418). 2026-10-09: canvas zoom is physical at any display scale — 100% is one document pixel per physical display pixel, and every screen-space overlay, cursor, scrollbar, navigator and fit follows it (#1943) low–medium Needs recurring visual QA with realistic documents.
Tools 2026-10-09: Pencil, Mixer Brush, Patch, Content-Aware Move, Vertical Type, Pattern Stamp and Rotate View are toolbar tools. Remaining missing tools include Red Eye, Art History Brush, Freeform/Curvature Pen, Add/Delete Anchor Point tools, single row/column marquee, Color Sampler, Perspective Crop, type masks and Frame low–medium Patch has a live healing preview. Content-Aware Move is partial: Move/Extend, Structure/Color and Sample All Layers exist; Transform On Drop and a live result preview remain missing (TOOL-213-4 in the scorecard). Magic/Background Eraser added; live gradients in progress (#180). Magnetic Lasso added 2026-10-08 (live-wire edge tracing, Width/Contrast/Frequency, select.magneticLasso). Pattern Stamp added 2026-10-08 (S flyout, paint.patternStamp, Aligned / Impressionist). Rotate View (2026-10-09) turns the canvas camera around its centre without rewriting pixels; Reset View and Match Rotation copy the angle. Crop rotation (2026-10-09, #1792): dragging outside the crop frame turns it (⇧ 15° steps, angle readout), and ↵ rotates the document and crops in one undo step (image.crop angle); the frame turns over the image as in Photoshop's Classic Mode, and the options-bar Straighten is still missing.
Painting Brush model and Brush Settings panel near Photoshop; .abr/.grd import; persistent presets; pen pressure/tilt on Windows, web, macOS and X11 medium Native Wayland pen input open (#79; a pen opens the window through Xwayland meanwhile); X11 pressure confirmed by a user, macOS not yet verified on tablet hardware.
Text / typography Engine works; caret placement and size editing fixed; OpenType features, text-on-path editing, composer parity partial medium-low Measure with the Photoshop-authored set.
Colour management Colour-managed canvas (document → monitor), embedded CMYK profiles, linear EXR/HDR, 16-bit float canvas medium-high Monitor profile follows only at launch.
Performance 14k+ px on the GPU at ~⅓ the memory; adjustment preview 285 ms → 4–9 ms; font-size edits 297 ms → 4.6 ms; 2026-10-07: 30 MP TIFF open (banded, parallel strip/tile decode) Deflate 345 → 32 ms, LZW 428 → 43 ms, BigTIFF and every IFD readable; 2026-10-09: 4.2 MP Indexed Color, 256 colours, full-resolution CPU preview p50 3018 → 1061 ms (Ryzen AI 7 350, three measured runs; GPU upload excluded) medium-high on rasters Complex layout documents still laggy (#125/#128); >16384 px GPU tiling in progress (#49). Native Indexed Color previews run on one background worker with stale-result rejection; large palettes can still take about a second to compute. Web previews remain synchronous.
Stability Never-crash lint series, crash guard, panic_hunt fuzzing in the gate medium-high No field crash data yet.
Camera RAW DNG, CR2, Sony ARW (lossless + compressed), Nikon NEF (lossless + lossy compressed), RW2, uncompressed ORF; 2026-10-09: uncompressed Fujifilm RAF, Bayer and X-Trans (edge-directed X-Trans demosaic; 26 MP X-Trans develop 306 ms on 12 cores) medium CR3, compressed RAF, Nikon "lossy after split" and calibrated colour for non-DNG cameras (no Fuji colour calibration: neutral fallback) still open (#50).
AI / generative none ~0% Deferred by decision (#41).
Ecosystem Sandboxed WebAssembly plug-ins instead of .8BF; no ExtendScript/UXP/.atn; no Adobe Fonts/Libraries/cloud docs low By design for 8BF; scripting compatibility open.
Platforms macOS (notarized), Windows, Linux (AppImage/deb/rpm/Flatpak bundle), web medium-high Flathub later (#173); Windows signing material pending.
Localisation 2026-10-07: 10 UI languages; menu, tl!, blend mode, preference and brush-section coverage enforced by tests; live switching and scoped Preferences previews medium Engine errors/status messages still partly English; CJK web fonts, browser-locale detection, and RTL remain open.

2026-10-08: Motion Blur adds adaptive FFT convolution for wide streaks while retaining the row kernel merged in #902 for shorter streaks and unsupported cases. Native release medians of three paired runs on an Intel i7-9750H with 12 Rayon workers, synthetic RGBA8 at 30° / distance 1000: 24 MP 22.594 → 9.785 s (2.31×), and 1.5 MP 2.455 → 0.592 s (4.15×). Full-image comparisons differ by at most one U8 code level; distance 64/256 retain the byte-identical row output. These measure decode/halo/filter/write/prune, excluding UI proxy creation, compositing and upload; the UI remains synchronous. FFT work is scheduled within a conservative 512 MiB working-set estimate, excluding stored Surface tiles and row fallback memory. The crossover is a heuristic; images dominated by near-cutoff alpha can need extra scalar work. These measurements do not establish Photoshop filter parity.

2026-10-08: the tools update above is checked against the current toolbar groups in panels.rs, the Pencil and tool-cycle tests in pencil_tests.rs, Patch's live-preview test in patch_preview.rs, and Vertical Type's point/paragraph creation and undo test in type_tool_tests.rs. These implementations remove the tools from the missing list; they do not establish Photoshop behavioural parity. The historical estimates and corpus measurements in this assessment are unchanged; current measured floors remain in the scorecard.

2026-10-07: Camera Raw PSD mapping covers relative custom white balance, Light/Presence, parametric and four point curves, HSL, Color Grading, sharpening/noise detail, grain and numeric post-crop vignette controls. Two revisions of one supplied Photoshop ACR 18.4 PSD preserve their filter descriptors without edits. The updated revision stays opaque because of active manual Optics and unverified vignette style; a descriptor projection verifies its supported controls. Synthetic 8/16/32-bit PSD → edit → .pcraft → PSD tests preserve the filter stack, mask and undo/redo. Unmapped Camera Raw fields/versions remain opaque; Photoshop acceptance of generated exports and pixel parity are still unverified. Corpus floors above are unchanged.

Where we're going (priority order)

  1. Ship the fixes: cut 0.2.1 once the current batch lands, so users validate them.
  2. PSD fidelity to 170/170 with round trips, plus the Photoshop-authored reference set for smart filters, the text engine and effect shapes (https://github.com/storytold/photocraft-corpus, fetched by cargo xtask corpus --all); enforce floors in corpus.rs.
  3. Workflow acceptance tests: 30–50 real tasks (retouch a portrait, social post with text and effects, composite with masks and adjustment layers, CMYK print prep…) scripted end to end and checked against Photoshop's output on every build. Their pass rate becomes the headline parity number.
  4. Tool coverage and workflow depth: Pen variants (Direct Selection landed, #790) and Perspective Crop; finish Content-Aware Move's Transform On Drop and live result preview. Pencil, Mixer Brush, Patch, Vertical Type, Pattern Stamp and Rotate View are already available on the toolbar.
  5. Complex-document performance (#125/#128) and GPU tiling beyond the texture limit (#49).
  6. Recurring visual QA (cargo run -p photocraft-engine --example designer_psd) and fast turnaround on user reports (OS, document size, layer count, screenshot).
  7. Later / needs decisions: generative AI backend (#41), scripting compatibility (ExtendScript / UXP / .atn), Flathub (#173), Wayland pen pressure (#79).

Current focus (infrastructure before the long tail)

Landed on 2026-10-01:

  • multi-layer selection, live smart objects + smart filters, alpha channels + Quick Mask;
  • patterns, Warp, preferences, snapping, ~33 filters, the remaining core adjustments;
  • Layer Comps and Artboards, GPU layer effects, Liquify / Puppet Warp / Perspective Warp;
  • the PSD fidelity pass (oracle 102 → 111), the M11 MCP acceptance test, and the release pipeline (docs/releasing.md).

Next:

  1. Follow "Where we're going" in the assessment above. 0.2.0 shipped signed and notarized on 2026-10-05 (docs/releasing.md); Windows code-signing material still needs to be obtained.
  2. Fidelity: the PSD oracle (113/170). Modern Brightness/Contrast and grayscale Levels curves; chisel-soft / stroke-emboss bevel shapes; Photoshop's 8-bit blend rounding; non-Normal modes in Lab documents; smart-filter maths against Photoshop's (re-render oracle 5/30).
  3. GPU: only Multichannel documents and regions over the texture limit fall back to the CPU.
  4. Vanishing Point, Camera Raw / Lens Correction, Face-Aware Liquify (needs a landmark model).
  5. Panels: Patterns, Styles, Glyphs, Character/Paragraph Styles, Timeline; Custom Shape tool.
  6. Print, Photomerge, Merge to HDR, video layers.

Milestone definitions

Each milestone has a definition of done (DoD) and must leave main green on all Tier-1 platforms plus a wasm build.

M Name Scope (key items) DoD / acceptance
M0 Skeleton Workspace, all crate stubs, lints, xtask (layers check, ci), CI matrix, testkit cargo test --workspace green; cargo check --target wasm32-unknown-unknown -p photocraft-engine -p photocraft-ui-egui green; layering check passes
M1 Foundation geom, color (formats, blend math for all 27 modes, sRGB/linear), raster (sparse COW tiles, U8/U16/F32), doc (full type model incl. CMYK/Lab/adjust/smart), ops (history) Property tests (proptest) on tile COW and history; blend-mode reference tests against published formulas
M2 PSD v1 photocraft-psd: header, resources, layer records, channel data (raw/RLE/ZIP/ZIP+pred), masks, groups (lsct), unicode names, unknown-block passthrough, merged image, PSB; writer Round-trip byte-stability tests; synthetic PSD generator tests; fuzz target; ≥150 unit tests
M3 Viewer app codecs (png/jpeg/tiff/webp/gif/bmp/tga/pnm/qoi/exr/hdr, all read+write), CPU compositor, egui shell (menu from registry, canvas pan/zoom, layers panel, history), open/save, native + web build Opens PNG/JPEG/PSD, shows layers, toggles visibility, undo/redo, saves PNG/PSD; web build loads a file from the browser
M4 Native format + engine .pcraft bundle, command registry with schemas, jobs/cancellation, snapshots via arc-swap, CLI (convert, run, inspect) CLI parity tests: every GUI command also runs headless
M5 GPU compositor wgpu planner backend, tile residency, parity tests vs CPU (all blend modes), viewport on GPU, mips GPU vs CPU ≤1/255; pan/zoom 60 fps on a 100 MP / 20-layer document
M6 Paint + select platform input (pen: macOS/Windows/Linux/web), brush engine v1, eraser, marquee/lasso/wand, move, free transform, crop Brush latency <1 frame; selection-restricted paint tests
M7 Adjust + filters 16 adjustment layers, first 30 filters, schema-generated dialogs + live preview, actions record/replay Golden tests at 8/16/32f; action replay determinism
M8 PSD v2 adjustment layers, fill layers, lfx2 effects (descriptor parser), text (EngineData) preserve+render, smart objects, vector masks Composite-oracle pass rate ≥90% on corpus
M9 Text, vector, styles parley text layers, shapes/pen/paths, all 10 layer effects on GPU Visual goldens; PSD text round-trip
M10 Smart features ml (ort native / ort-web on the web), Select Subject/Object/Sky, Remove BG, Remove tool, content-aware fill, healing, AI denoise, RAW develop Quality benchmarks on a public dataset; timing budgets
M11 Automation + formats MCP server, batch, scripting, remaining formats (JP2, DICOM, DPX…), C2PA An agent completes 10 scripted edit tasks via MCP
M12 Pro parity CMYK/Lab UI, print, HDR display, photomerge/HDR merge, timeline, layer comps, artboards, symmetry, neural filters xtask parity ≥ 90% of Photoshop menu checklist