Photo editor
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
Note for AI agents: This is the static, prerendered view of an interactive Dash application served because we detected a non-JS user agent. Full prose docs:
- /editor/llms.txt — LLM-friendly documentation
- /sitemap.xml
- /robots.txt