# Photo editor


**Site index:** [https://photoslop.2plot.dev/llms.txt](https://photoslop.2plot.dev/llms.txt) — every page on this site, as Markdown.  
**Network index:** [https://2plot.dev/llms.txt](https://2plot.dev/llms.txt) — The 2plot network; start here to discover sibling sites.  
**Sibling sites:** 14 more in The 2plot network — listed in the site index above.  
**Sitemap:** https://photoslop.2plot.dev/sitemap.xml  

An interactive, layered photo editor that runs in the browser and can be driven by hand, from Python,
or by an AI agent. Open it at /editor.

## What you can do

- Drop one or many images onto the canvas, or use "Add images". Each image becomes its own layer.
- Work in layers: select, hide, lock, reorder, duplicate and delete them; set opacity and one of 16 blend modes.
- Add text, rectangles, ellipses, triangles and lines, or draw with the brush tool.
- Adjust image layers non-destructively with brightness, contrast, saturation, vibrance, hue, blur, sharpen
  and gamma, or apply a look (grayscale, sepia, invert, vintage, kodachrome, technicolor, polaroid,
  black and white, brownie). Original pixels are never modified; effects are re-applied on render and export.
- Crop an image layer interactively (crop tool, key C): drag and resize the window, lock an aspect ratio,
  Enter applies and Escape cancels. The layer keeps its place on the artboard; only its visible pixels change.
- Resize the artboard (up to 16384 px per side) and set its background, including transparent.
- Undo and redo every change. Zoom with Ctrl/Cmd and the wheel, pan with the wheel or by holding Space.
- Save the project as a JSON file and open it again later; the editor also keeps an autosave in the browser.
- Ask the built-in agent (Agent tab) to make edits in plain language. It uses the same commands, applies each
  turn as one undo step, and looks at a rendered preview of the canvas before deciding it is done. It is a
  conversation: answer its questions in the same box and it carries on with everything it has seen so far.
- Fill a shape or text with a CSS gradient (`linear-gradient(180deg, #000, #fff)`, `radial-gradient(…)`) — the
  document keeps the string, the engine paints it across the layer's box.

## Exporting

PNG, JPEG, WebP and SVG are rendered in the browser. TIFF, PDF, AVIF, GIF, BMP and ICO are transcoded by the
server. Each export can go to a browser download, a server directory, or a Cloudflare R2 bucket, at 0.5x, 1x,
2x or 4x scale, for the whole canvas or only the selected layers.

## For agents

Every operation is a JSON command of the form {"id", "type", "payload"}, submitted through the `command`
prop of the DashPhotoCanvas component and acknowledged on `commandResult`. Commands run in order, each id runs
once, and the `batch` command applies several edits as a single undo step. An export with `preview: true`
returns a small JPEG so a vision model can look at the result and correct it.

- Tool definitions (JSON Schema, Anthropic and OpenAI formats): /photo/agent/tools.json
- The same, as readable markdown: /photo/agent/llms.txt
- Guides: /guide/commands, /guide/document-model, /guide/storage-export, /guide/agent-api
