English · 한국어
Redrob Canvas is an agentic graphics editor: photo, vector and page layout in one window, with an AI tools layer across all three and an agent that edits the document beside you.
It is one desktop application (apps/redrob-canvas, Rust and egui) with three modes, each a complete
editor, under editors/ and built from source (where the code came from: SOURCE_ORIGINS.md and
NOTICE):
| Mode | Kind | What it is for |
|---|---|---|
| Photo | raster | Layers, masks, adjustment layers, layer styles, brushes, type, colour management; real PSD files |
| Vector | vector | Paths, booleans, text on paths, gradients, artboards; SVG, AI, EPS, PDF, DXF |
| Layout | page layout | Master pages, threaded text frames, hyphenation; IDML, PDF, PPTX, EPUB |
The shell owns the window, the mode switch (Ctrl+1 / Ctrl+2 / Ctrl+3, or --mode photo|vector|layout),
one config directory (ai.redrob.canvas) and the agent. Switching modes keeps every editor's open
documents. The shared docking, colour-management and printing code the three editors have in common
lives in editors/shared.
The same binary is the command line: redrob-canvas photo|vector|layout ARGS converts, inspects,
runs command batches and serves MCP on stdio without opening the window
(redrob-canvas photo --help).
Two layers sit across the modes rather than inside any one of them:
- Agent (
crates/redrob-agent): a chat panel whose model edits the document through typed tool calls, each reviewable before it lands. Requires Redrob Code. The agent talks to the one shared Redrob Code daemon on this machine (~/.redrob/run/server.json, started withredrob service start) at<daemon>/v1/chat/completions, OpenAI-compatible and streaming, withx-redrob-app: canvas. The daemon holds the Redrob console key; this app never has a key of its own and has no direct path to the console. Sign in once, in Redrob Code, in Redrob Launcher, or here. Without Redrob Code the panel says so and links to the launcher's latest release. - AI tools (
crates/redrob-ai, in progress for 0.7): inpaint, outpaint, erase, upscale, remove background and select subject through a local IOPaint engine the app installs and runs on127.0.0.1; vectorize for the Vector mode. Everything runs on the machine; nothing is uploaded.
While the window is open it hands its own tools to the shared Redrob Code daemon
(redrob-app-bridge, MCP on 127.0.0.1), so the agent in any Redrob surface -- a phone chat
included -- can drive the open document as MCP server app:canvas. Without a daemon the app runs as
before. The tools:
document_info-- path (or untitled), active mode (raster, vector, design), size, layer count, unsaved changes.open_file {path}-- opens the file in the editor its type belongs to; answers the mode.switch_mode {mode: raster|vector|design}-- switches the window, as Ctrl+1/2/3 do.list_layers {max?}-- the active document's layers: id, name, visible, selected.select_layer {id|name}-- makes a layer the active one.set_layer_visible {id, visible}-- shows or hides a layer.export {format: png|svg|pdf, path?, scale?}-- exports the current page or artboard; answers the path (svg in vector mode only).save-- saves to the document's own file; an untitled document is refused with Save As named.
What each mode opens and saves comes from its editor. The short list:
| Mode | Open | Save / export |
|---|---|---|
| Photo | PSD, PSB, .rphoto, ORA, KRA, layered TIFF, PDN, SVG, PNG, JPEG, TIFF, WebP, GIF, BMP, OpenEXR, HDR, HEIF/HEIC (read), camera RAW, Affinity (read) |
.rphoto, PSD, PSB, ORA, TIFF, PNG, JPEG, WebP, GIF, BMP, OpenEXR, AVIF (optional feature) |
| Vector | .rvector, SVG, SVGZ, AI (PDF-compatible), EPS, PDF, DXF, EMF/WMF, raster images, PSD/PSB as merged image |
.rvector, SVG, PDF (with PDF/X), AI, EPS, DXF, PNG, JPEG, WebP, PSD, Print, Package |
| Layout | .rlayout, IDML, images, PDFs and vectors as placed assets |
.rlayout, PDF (PDF/X-4, PDF/A-2b), IDML, PPTX, EPUB, PNG |
docs/formats.md says how the shell routes a file to a mode, where each editor's format tables
live in the code, and which legacy extensions (.pcraft, .vectorcraft, .designcraft)
still open.
Rust 1.95 (rust-toolchain.toml pins it; rustup picks it up). On Linux the egui, wgpu and rfd
stack needs the X11, Wayland, GL and GTK development headers:
sudo apt-get install -y libxkbcommon-dev libwayland-dev libx11-dev libxrandr-dev libxi-dev libgl1-mesa-dev libgtk-3-dev
cargo build --release -p redrob-canvas
target/release/redrob-canvasThe gates every pull request must pass, as CI runs them (.github/workflows/ci.yml: the checks
job, then rust over our crates only with --profile ci):
cargo fetch --locked && python3 tools/generate_distribution_artifacts.py --check
python3 tools/check_design_system.py
python3 -m unittest discover -s tools/tests -p "test_*.py"
cargo fmt --all -- --check
cargo clippy -p redrob-canvas -p redrob-ai -p redrob-agent --all-targets --locked --profile ci -- -D warnings
cargo test -p redrob-canvas -p redrob-ai -p redrob-agent --locked --profile ciThere is no Qt, CMake or Node anywhere in the build. The root Cargo.toml is the one workspace
manifest for the shell, the editors and their libraries.
apps/redrob-canvas/ The shell: window, mode switch, services, agent panel (egui / eframe)
crates/redrob-agent/ Redrob Code client: streaming chat completions, tool loop, approvals
crates/redrob-ai/ AI tools layer (IOPaint engine, vectorize); in progress
editors/photo/ Photo mode
editors/vector/ Vector mode
editors/layout/ Layout mode
editors/shared/ Shared UI, colour management, print and PDF crates
installer/ macOS disk image and Windows setup
tools/ Notice generator, design-system guard, release packaging
docs/ Architecture, formats, licensing
The editors started as four MIT OR Apache-2.0 projects and are no longer synced with them; they are
developed here. Their authors keep their copyright: the licence and NOTICE files stay intact under
editors/<name>/ and are reproduced in NOTICE and COPYRIGHT, and
SOURCE_ORIGINS.md records each origin and commit. Their original names and
logos are trademarks of their authors, not open source, and are not used or shipped here.
Where the project is going, milestone by milestone: ROADMAP.md. The change history is CHANGELOG.md.
Push a vMAJOR.MINOR.PATCH tag on main, then run
gh workflow run release.yml --ref main -f tag=vMAJOR.MINOR.PATCH. The workflow
(.github/workflows/release.yml) checks the tag against origin/main, Cargo.toml and the
changelog, runs every gate, builds redrob-canvas for each platform with cargo build --release,
signs and notarizes macOS with the organization's Developer ID, signs Windows through Azure Artifact
Signing with the job's OpenID Connect login (the executable before the zip, then the uninstaller,
then the setup), and hands the artifacts to the shared redrob-labs publish job
(redrob-labs/.github/.github/workflows/release-publish.yml), which writes SHA256SUMS.txt and
redrob-launcher.json and publishes the release as latest. -f dry_run=true builds and signs the
dispatched branch and publishes nothing. Which platforms a run builds is decided by
tools/release_matrix.py; Windows x64 is built only once the repository variable
WINDOWS_SIGNING_READY is "true", never unsigned.
| Platform | Assets | Signing |
|---|---|---|
| Linux x86_64 | .tar.gz, .deb (tools/release/make_deb.py) |
none; verify the published SHA-256 sums |
| macOS arm64 (Apple silicon) | .dmg (installer/macos/), .zip |
Developer ID, hardened runtime, notarized and stapled, app and disk image each |
| Windows x64 | -setup.exe (installer/windows/), -portable.zip |
Azure Artifact Signing (OIDC) on the app, the uninstaller and the setup |
| Platform | Download | Install | Remove |
|---|---|---|---|
| Windows | …-windows-x64-setup.exe |
Run it. Per user, no administrator rights | Settings > Apps > Redrob Canvas |
| macOS | …-macos-arm64.dmg |
Open it and drag Redrob Canvas onto Applications | Open Uninstall Redrob Canvas on the disk image |
| Linux | …-linux-x86_64.deb |
sudo apt install ./redrob-canvas-…-linux-x86_64.deb |
sudo apt remove redrob-canvas |
Redrob Launcher installs from the -portable.zip on Windows, the .dmg on macOS and the .tar.gz
on Linux. Asset names follow redrob-canvas-<version>-<os>-<arch>[-portable].<ext>. Every archive
carries LICENSE-MIT, LICENSE-APACHE, COPYRIGHT, NOTICE and THIRD_PARTY_NOTICES.md beside
the binary.
MIT OR Apache-2.0, at your option: LICENSE-MIT, LICENSE-APACHE, COPYRIGHT. Third-party attribution is in NOTICE, SOURCE_ORIGINS.md and the generated THIRD_PARTY_NOTICES.md; the policy is in docs/licensing.md.